From 8d440e263ee0592de08aafc23ba1470b055824a5 Mon Sep 17 00:00:00 2001 From: dortega Date: Thu, 15 Nov 2018 10:20:26 +0100 Subject: [PATCH 01/21] #55 Upgrading Java and ZooKeeper roles to latest versions and using Hostmanager plugin to manage network instead of landrush --- .gitignore | 1 + CHANGELOG.md | 2 ++ README.md | 8 ++++---- molecule.yml | 16 +++++++++++----- tests/requirements.yml | 4 ++-- 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 903e0c8..dd1a390 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ tests/__pycache__ .molecule .vagrant .cache +.python-version diff --git a/CHANGELOG.md b/CHANGELOG.md index b2f40ba..a419942 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. ## [Unreleased](https://github.com/idealista/solrcloud-role/tree/develop) +### Changed +- *[#55](https://github.com/idealista/solrcloud-role/issues/55) Upgrading Java and ZooKeeper roles to latest versions and using Hostmanager plugin to manage network instead of landrush* @dortegau ## [1.9.0](https://github.com/idealista/solrcloud-role/tree/1.9.0) (2018-02-12) [Full Changelog](https://github.com/idealista/solrcloud-role/compare/1.8.0...1.9.0) diff --git a/README.md b/README.md index cf6048e..dafb803 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ These instructions will get you a copy of the role for your ansible playbook. On Ansible 2.2.1.0 version installed. Inventory destination should be a Debian environment. -For testing purposes, [Molecule](https://molecule.readthedocs.io/) with [Vagrant](https://www.vagrantup.com/) as driver (with [landrush](https://github.com/vagrant-landrush/landrush) plugin) and [VirtualBox](https://www.virtualbox.org/) as provider. +For testing purposes, [Molecule](https://molecule.readthedocs.io/) with [Vagrant](https://www.vagrantup.com/) as driver (using [hostmanager](https://github.com/devopsgroup-io/vagrant-hostmanager) plugin) and [VirtualBox](https://www.virtualbox.org/) as provider. ### Installing @@ -96,7 +96,7 @@ Playbook example showing how to provision from scratch a solrcloud cluster plus solr_host: "{{ ansible_hostname }}" - hosts: solr - vars: + vars: solr_replicas: "{{ 1 if groups['solr'] | length == 1 else 2 }}" solr_shards: "{{ groups['solr'] | length }}" solr_collection_home: /var/solr @@ -115,7 +115,7 @@ Playbook example showing how to provision from scratch a solrcloud cluster plus mode: 0644 - name: Create mycollection collection - become: yes + become: yes when: "inventory_hostname == groups['solr'][0]" become_user: solr shell: | @@ -126,7 +126,7 @@ Playbook example showing how to provision from scratch a solrcloud cluster plus -shards {{solr_shards}} \ -replicationFactor {{solr_replicas}} \ && touch {{solr_collection_ok_file}} - + register: command_output args: executable: /bin/bash diff --git a/molecule.yml b/molecule.yml index ea63214..b0d1eca 100644 --- a/molecule.yml +++ b/molecule.yml @@ -32,9 +32,13 @@ ansible: # configuration options for the internal call to vagrant vagrant: raw_config_args: - - "landrush.enabled = true" - - "landrush.tld = 'vm'" - - "landrush.guest_redirect_dns = true" + - "hostmanager.enabled = true" + # Enable for debug purpose + # - "hostmanager.manage_host = true" + - "hostmanager.manage_guest = true" + - "hostmanager.ignore_private_ip = false" + - "hostmanager.include_offline = true" + # molecule's --platform option will look for these names platforms: - name: Debian9 @@ -53,14 +57,16 @@ vagrant: - name: zookeeper.vm interfaces: - network_name: private_network - type: dhcp + type: static + ip: 172.28.128.61 auto_config: true - name: solrcloud.vm ansible_groups: - group01 interfaces: - network_name: private_network - type: dhcp + type: static + ip: 172.28.128.62 auto_config: true docker: diff --git a/tests/requirements.yml b/tests/requirements.yml index cf30f8d..b0e7f2f 100644 --- a/tests/requirements.yml +++ b/tests/requirements.yml @@ -1,7 +1,7 @@ - src: idealista.java-role - version: 1.2.0 + version: 3.0.2 name: java - src: idealista.zookeeper-role - version: 1.1.0 + version: 1.2.0 name: zookeeper From 435868628c02f4d55ca36cfb3dc3f803e9428641 Mon Sep 17 00:00:00 2001 From: dortega Date: Thu, 15 Nov 2018 10:44:34 +0100 Subject: [PATCH 02/21] #55 Retrying with Ansible 2.5.3 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3c3cc19..9f1842a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ language: python services: - docker install: - - pip install ansible==2.3.1.0 + - pip install ansible==2.5.3.0 - pip install molecule==1.25.0 - pip install docker script: From 0d912455f3c96572c90f28ead56210b4acc17c01 Mon Sep 17 00:00:00 2001 From: dortega Date: Thu, 15 Nov 2018 10:54:42 +0100 Subject: [PATCH 03/21] #55 Upgrading Readme to set Ansible 2.5.3.0 as minimum version --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dafb803..a8df667 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ These instructions will get you a copy of the role for your ansible playbook. On ### Prerequisities -Ansible 2.2.1.0 version installed. +Ansible 2.5.3.0 version installed. Inventory destination should be a Debian environment. For testing purposes, [Molecule](https://molecule.readthedocs.io/) with [Vagrant](https://www.vagrantup.com/) as driver (using [hostmanager](https://github.com/devopsgroup-io/vagrant-hostmanager) plugin) and [VirtualBox](https://www.virtualbox.org/) as provider. @@ -150,7 +150,7 @@ See molecule.yml to check possible testing platforms. ## Built With -![Ansible](https://img.shields.io/badge/ansible-2.2.1.0-green.svg) +![Ansible](https://img.shields.io/badge/ansible-2.5.3.0-green.svg) ## Versioning From c7c67152cffab9b5f72a7487a9630f9c9489e11c Mon Sep 17 00:00:00 2001 From: dortega Date: Thu, 15 Nov 2018 13:44:34 +0100 Subject: [PATCH 04/21] #55 Deleting .vm tld and adding test-requirements file --- .gitignore | 2 ++ .travis.yml | 7 +++---- CHANGELOG.md | 2 +- README.md | 3 ++- molecule.yml | 10 +++++----- test-requirements.txt | 3 +++ tests/group_vars/group01.yml | 4 ++-- tests/playbook.yml | 4 ++-- 8 files changed, 20 insertions(+), 15 deletions(-) create mode 100644 test-requirements.txt diff --git a/.gitignore b/.gitignore index dd1a390..90215e8 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ tests/__pycache__ .vagrant .cache .python-version +Pipfile +Pipfile.lock diff --git a/.travis.yml b/.travis.yml index 9f1842a..a963d61 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,11 +6,10 @@ language: python services: - docker install: - - pip install ansible==2.5.3.0 - - pip install molecule==1.25.0 - - pip install docker + - pip install pipenv + - pipenv install -r test-requirements.txt --python 2.7 script: - - molecule test --driver docker + - pipenv run molecule test notifications: webhooks: https://galaxy.ansible.com/api/v1/notifications/ diff --git a/CHANGELOG.md b/CHANGELOG.md index a419942..477be01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ All notable changes to this project will be documented in this file. ## [Unreleased](https://github.com/idealista/solrcloud-role/tree/develop) ### Changed -- *[#55](https://github.com/idealista/solrcloud-role/issues/55) Upgrading Java and ZooKeeper roles to latest versions and using Hostmanager plugin to manage network instead of landrush* @dortegau +- *[#55](https://github.com/idealista/solrcloud-role/issues/55) Upgrading Java and ZooKeeper roles to latest versions, using Hostmanager plugin to manage network instead of landrush, adding test-requirements.txt for execution under pipenv and upgrading to Ansible 2.5.3.0* @dortegau ## [1.9.0](https://github.com/idealista/solrcloud-role/tree/1.9.0) (2018-02-12) [Full Changelog](https://github.com/idealista/solrcloud-role/compare/1.8.0...1.9.0) diff --git a/README.md b/README.md index a8df667..e3e4370 100644 --- a/README.md +++ b/README.md @@ -143,7 +143,8 @@ Look to the defaults properties file to see the possible configuration propertie ## Testing ``` -molecule test --platform=Debian9 +$ pipenv install -r test-requirements.txt -python 2.7 +$ pipenv run molecule test ``` See molecule.yml to check possible testing platforms. diff --git a/molecule.yml b/molecule.yml index b0d1eca..99b9983 100644 --- a/molecule.yml +++ b/molecule.yml @@ -54,13 +54,13 @@ vagrant: cpus: 1 instances: - - name: zookeeper.vm + - name: zookeeper interfaces: - network_name: private_network type: static ip: 172.28.128.61 auto_config: true - - name: solrcloud.vm + - name: solrcloud ansible_groups: - group01 interfaces: @@ -71,7 +71,7 @@ vagrant: docker: containers: - - name: zookeeper.vm + - name: zookeeper hostname: zookeeper image: geerlingguy/docker-debian9-ansible image_version: latest @@ -83,7 +83,7 @@ docker: - '/sys/fs/cgroup:/sys/fs/cgroup:ro' command: '/lib/systemd/systemd' - - name: solrcloud.vm + - name: solrcloud hostname: solrcloud ansible_groups: - group01 @@ -96,7 +96,7 @@ docker: volume_mounts: - '/sys/fs/cgroup:/sys/fs/cgroup:ro' links: - zookeeper.vm: zookeeper.vm + zookeeper: zookeeper command: '/lib/systemd/systemd' verifier: diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 0000000..866e695 --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1,3 @@ +ansible==2.5.3.0 +molecule==1.25.0 +python-vagrant==0.5.15 diff --git a/tests/group_vars/group01.yml b/tests/group_vars/group01.yml index b04969f..cd5203a 100644 --- a/tests/group_vars/group01.yml +++ b/tests/group_vars/group01.yml @@ -4,5 +4,5 @@ java_implementation: openjdk solr_cloud_version: 7.0.0 solr_port: 8983 -solr_zookeeper_hosts: zookeeper.vm:2181 -solr_host: "{{ hostvars[ansible_nodename + '.vm']['ansible_' + ansible_default_ipv4.alias]['ipv4']['address'] }}" +solr_zookeeper_hosts: zookeeper:2181 +solr_host: "{{ hostvars[ansible_nodename]['ansible_' + ansible_default_ipv4.alias]['ipv4']['address'] }}" diff --git a/tests/playbook.yml b/tests/playbook.yml index 6009dd1..f34eaba 100644 --- a/tests/playbook.yml +++ b/tests/playbook.yml @@ -1,11 +1,11 @@ --- -- hosts: zookeeper.vm +- hosts: zookeeper roles: - role: java - role: zookeeper -- hosts: solrcloud.vm +- hosts: solrcloud roles: - role: java - role: solrcloud-role From fcac45471680a60912ef7e5a517d44f4d8b0a10a Mon Sep 17 00:00:00 2001 From: dortega Date: Thu, 15 Nov 2018 13:49:40 +0100 Subject: [PATCH 05/21] #55 Trying to use driver docker instead Vagrant in travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a963d61..d24706e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ install: - pip install pipenv - pipenv install -r test-requirements.txt --python 2.7 script: - - pipenv run molecule test + - pipenv run molecule test --driver docker notifications: webhooks: https://galaxy.ansible.com/api/v1/notifications/ From b2e7468b15205b392edde222b3b5691ec1a5f317 Mon Sep 17 00:00:00 2001 From: dortega Date: Thu, 15 Nov 2018 13:58:17 +0100 Subject: [PATCH 06/21] #55 Adding docker-py dependency --- test-requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/test-requirements.txt b/test-requirements.txt index 866e695..9f4195a 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,3 +1,4 @@ ansible==2.5.3.0 molecule==1.25.0 +docker-py==1.10.6 python-vagrant==0.5.15 From 7ae845200cc8ba05f36ebe1aac2b71c359020d9a Mon Sep 17 00:00:00 2001 From: dortega Date: Thu, 15 Nov 2018 14:16:45 +0100 Subject: [PATCH 07/21] #55 Adding docker 2.2.1 dependency (that is used by molecule 1.25.0) --- test-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-requirements.txt b/test-requirements.txt index 9f4195a..8425b83 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,4 +1,4 @@ ansible==2.5.3.0 molecule==1.25.0 -docker-py==1.10.6 +docker==2.2.1 python-vagrant==0.5.15 From 2966c454f5fcef0b3ab551e22715c35599943c93 Mon Sep 17 00:00:00 2001 From: dortega Date: Thu, 15 Nov 2018 17:20:21 +0100 Subject: [PATCH 08/21] [WIP] changing to molecule 2.19.0 --- .travis.yml | 1 - .yamllint | 13 +++ LICENSE.txt => LICENSE | 0 README.md | 4 +- defaults/main.yml | 27 +++-- molecule.yml | 106 ------------------ molecule/default/Dockerfile.j2 | 13 +++ molecule/default/INSTALL.rst | 16 +++ molecule/default/create.yml | 69 ++++++++++++ molecule/default/destroy.yml | 33 ++++++ .../default/group_vars/solrcloud_group.yml | 1 + .../default/group_vars/zookeeper_group.yml | 6 + molecule/default/molecule.yml | 38 +++++++ {tests => molecule/default}/playbook.yml | 0 molecule/default/prepare.yml | 5 + {tests => molecule/default}/requirements.yml | 2 + molecule/default/tests/test_default.yml | 23 ++++ molecule/default/verifier.yml | 61 ++++++++++ tasks/config.yml | 30 ++--- tasks/install.yml | 6 +- tasks/service.yml | 2 +- test-requirements.txt | 7 +- tests/.flake8 | 2 - tests/host_vars/zookeeper/main.yml | 3 - tests/test_ansible.py | 33 ------ 25 files changed, 323 insertions(+), 178 deletions(-) create mode 100644 .yamllint rename LICENSE.txt => LICENSE (100%) delete mode 100644 molecule.yml create mode 100644 molecule/default/Dockerfile.j2 create mode 100644 molecule/default/INSTALL.rst create mode 100644 molecule/default/create.yml create mode 100644 molecule/default/destroy.yml rename tests/group_vars/group01.yml => molecule/default/group_vars/solrcloud_group.yml (99%) create mode 100644 molecule/default/group_vars/zookeeper_group.yml create mode 100644 molecule/default/molecule.yml rename {tests => molecule/default}/playbook.yml (100%) create mode 100644 molecule/default/prepare.yml rename {tests => molecule/default}/requirements.yml (96%) create mode 100644 molecule/default/tests/test_default.yml create mode 100644 molecule/default/verifier.yml delete mode 100644 tests/.flake8 delete mode 100644 tests/host_vars/zookeeper/main.yml delete mode 100644 tests/test_ansible.py diff --git a/.travis.yml b/.travis.yml index d24706e..7e47c69 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,6 @@ language: python python: "2.7.13" sudo: required -language: python services: - docker install: diff --git a/.yamllint b/.yamllint new file mode 100644 index 0000000..3a2255e --- /dev/null +++ b/.yamllint @@ -0,0 +1,13 @@ +extends: default + +rules: + braces: + max-spaces-inside: 1 + level: error + brackets: + max-spaces-inside: 1 + level: error + line-length: disable + # NOTE(retr0h): Templates no longer fail this lint rule. + # Uncomment if running old Molecule templates. + # truthy: disable diff --git a/LICENSE.txt b/LICENSE similarity index 100% rename from LICENSE.txt rename to LICENSE diff --git a/README.md b/README.md index e3e4370..104b4ca 100644 --- a/README.md +++ b/README.md @@ -169,8 +169,8 @@ See also the list of [contributors](https://github.com/idealista/solrcloud-role/ ![Apache 2.0 Licence](https://img.shields.io/hexpm/l/plug.svg) -This project is licensed under the [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0) license - see the [LICENSE.txt](LICENSE.txt) file for details. +This project is licensed under the [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0) license - see the [LICENSE](LICENSE) file for details. ## Contributing -Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us. +Please read [CONTRIBUTING.md](https://github.com/idealista/mysql-role/blob/master/.github/CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us. diff --git a/defaults/main.yml b/defaults/main.yml index 6c97796..75864aa 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -10,7 +10,7 @@ solr_user: solr solr_group: solr # start on boot -solr_service_enabled: yes +solr_service_enabled: true # current state: started, stopped solr_service_state: started @@ -62,10 +62,14 @@ solr_jetty_http_selectors: -1 solr_jetty_http_acceptors: -1 # ZOOKEEPER -zookeeper_hosts: localhost:2181 # Deprecated -zookeeper_hosts_solr_path: solr # Deprecated -zk_host: "{{ zookeeper_hosts }}/{{ zookeeper_hosts_solr_path }}" # Deprecated -zookeeper_client_path: /opt/solr/server/scripts/cloud-scripts # Deprecated +# Deprecated +zookeeper_hosts: localhost:2181 +# Deprecated +zookeeper_hosts_solr_path: solr +# Deprecated +zk_host: "{{ zookeeper_hosts }}/{{ zookeeper_hosts_solr_path }}" +# Deprecated +zookeeper_client_path: /opt/solr/server/scripts/cloud-scripts solr_zookeeper_hosts: "{{ zookeeper_hosts }}" solr_zookeeper_hosts_solr_path: "{{ zookeeper_hosts_solr_path }}" @@ -74,16 +78,19 @@ solr_zookeeper_client_path: "{{ zookeeper_client_path }}" solr_zookeeper_client_timeout: 15000 # LOG -log_root_level: WARN # Deprecated -log_file_size: 500MB # Deprecated -log_max_backup_index: 9 # Deprecated +# Deprecated +log_root_level: WARN +# Deprecated +log_file_size: 500MB +# Deprecated +log_max_backup_index: 9 solr_log_root_level: "{{ log_root_level }}" solr_log_file_size: "{{ log_file_size }}" solr_log_max_backup_index: "{{ log_max_backup_index }}" # MOUNT -#mount_name: # Deprecated -#mount_source: # Deprecated +# mount_name: # Deprecated +# mount_source: # Deprecated solr_mount_name: "{{ mount_name }}" solr_mount_source: "{{ mount_source }}" diff --git a/molecule.yml b/molecule.yml deleted file mode 100644 index 99b9983..0000000 --- a/molecule.yml +++ /dev/null @@ -1,106 +0,0 @@ ---- -molecule: - # directory in CWD to place all temp files, etc. - molecule_dir: .molecule - - # where temporary state will be stored (lives under molecule_dir) - state_file: state - - # name of temporary vagrantfile created during runs (lives under molecule_dir) - vagrantfile_file: vagrantfile - - # directories to ignore when doing trailing whitespace checks on files during verify command - ignore_paths: - - .git - - .vagrant - - .molecule - - # directory to look for testinfra tests - testinfra_dir: tests - - # directory containing group_vars to use with ansible - group_vars: ../tests/group_vars - -dependency: - name: galaxy - requirements_file: tests/requirements.yml - -# ansible related configuration -ansible: - playbook: tests/playbook.yml - -# configuration options for the internal call to vagrant -vagrant: - raw_config_args: - - "hostmanager.enabled = true" - # Enable for debug purpose - # - "hostmanager.manage_host = true" - - "hostmanager.manage_guest = true" - - "hostmanager.ignore_private_ip = false" - - "hostmanager.include_offline = true" - - # molecule's --platform option will look for these names - platforms: - - name: Debian9 - box: debian/stretch64 - - name: Debian8 - box: debian/jessie64 - - providers: - - name: virtualbox - type: virtualbox - options: - memory: 512 - cpus: 1 - - instances: - - name: zookeeper - interfaces: - - network_name: private_network - type: static - ip: 172.28.128.61 - auto_config: true - - name: solrcloud - ansible_groups: - - group01 - interfaces: - - network_name: private_network - type: static - ip: 172.28.128.62 - auto_config: true - -docker: - containers: - - name: zookeeper - hostname: zookeeper - image: geerlingguy/docker-debian9-ansible - image_version: latest - # All these parameters are needed for Docker testing with systemd - privileged: True - cap_add: - - SYS_ADMIN - volume_mounts: - - '/sys/fs/cgroup:/sys/fs/cgroup:ro' - command: '/lib/systemd/systemd' - - - name: solrcloud - hostname: solrcloud - ansible_groups: - - group01 - image: geerlingguy/docker-debian9-ansible - image_version: latest - # All these parameters are needed for Docker testing with systemd - privileged: True - cap_add: - - SYS_ADMIN - volume_mounts: - - '/sys/fs/cgroup:/sys/fs/cgroup:ro' - links: - zookeeper: zookeeper - command: '/lib/systemd/systemd' - -verifier: - name: testinfra - options: - connection: ansible - ansible-inventory: .molecule/ansible_inventory diff --git a/molecule/default/Dockerfile.j2 b/molecule/default/Dockerfile.j2 new file mode 100644 index 0000000..9f689d9 --- /dev/null +++ b/molecule/default/Dockerfile.j2 @@ -0,0 +1,13 @@ +# Molecule managed + +{% if item.registry is defined %} +FROM {{ item.registry.url }}/{{ item.image }} +{% else %} +FROM {{ item.image }} +{% endif %} + +RUN if [ $(command -v apt-get) ]; then apt-get update && apt-get upgrade -y && apt-get install -y python sudo bash ca-certificates && apt-get clean; \ + elif [ $(command -v dnf) ]; then dnf makecache && dnf --assumeyes install python sudo python-devel python2-dnf bash && dnf clean all; \ + elif [ $(command -v yum) ]; then yum makecache fast && yum update -y && yum install -y python sudo yum-plugin-ovl bash && sed -i 's/plugins=0/plugins=1/g' /etc/yum.conf && yum clean all; \ + elif [ $(command -v zypper) ]; then zypper refresh && zypper update -y && zypper install -y python sudo bash python-xml && zypper clean -a; \ + elif [ $(command -v apk) ]; then apk update && apk add --no-cache python sudo bash ca-certificates; fi diff --git a/molecule/default/INSTALL.rst b/molecule/default/INSTALL.rst new file mode 100644 index 0000000..e26493b --- /dev/null +++ b/molecule/default/INSTALL.rst @@ -0,0 +1,16 @@ +******* +Install +******* + +Requirements +============ + +* Docker Engine +* docker-py + +Install +======= + +.. code-block:: bash + + $ sudo pip install docker-py diff --git a/molecule/default/create.yml b/molecule/default/create.yml new file mode 100644 index 0000000..0b9eb15 --- /dev/null +++ b/molecule/default/create.yml @@ -0,0 +1,69 @@ +--- +- name: Create + hosts: localhost + connection: local + gather_facts: false + # no_log: "{{ not lookup('env', 'MOLECULE_DEBUG') | bool }}" + vars: + molecule_file: "{{ lookup('env', 'MOLECULE_FILE') }}" + molecule_ephemeral_directory: "{{ lookup('env', 'MOLECULE_EPHEMERAL_DIRECTORY') }}" + molecule_scenario_directory: "{{ lookup('env', 'MOLECULE_SCENARIO_DIRECTORY') }}" + molecule_yml: "{{ lookup('file', molecule_file) | molecule_from_yaml }}" + tasks: + - name: Create Dockerfiles from image names + template: + src: "{{ molecule_scenario_directory }}/Dockerfile.j2" + dest: "{{ molecule_ephemeral_directory }}/Dockerfile_{{ item.image | regex_replace('[^a-zA-Z0-9_]', '_') }}" + with_items: "{{ molecule_yml.platforms }}" + register: platforms + + - name: Discover local Docker images + docker_image_facts: + name: "molecule_local/{{ item.item.name }}" + with_items: "{{ platforms.results }}" + register: docker_images + + - name: Build an Ansible compatible image + docker_image: + path: "{{ molecule_ephemeral_directory }}" + name: "molecule_local/{{ item.item.image }}" + dockerfile: "{{ item.item.dockerfile | default(item.invocation.module_args.dest) }}" + force: "{{ item.item.force | default(true) }}" + with_items: "{{ platforms.results }}" + when: platforms.changed or docker_images.results | map(attribute='images') | select('equalto', []) | list | count >= 0 + + - name: Create docker network(s) + docker_network: + name: "{{ item }}" + state: present + with_items: "{{ molecule_yml.platforms | molecule_get_docker_networks }}" + + - name: Create molecule instance(s) + docker_container: + name: "{{ item.name }}" + hostname: "{{ item.name }}" + image: "molecule_local/{{ item.image }}" + state: started + recreate: false + log_driver: json-file + command: "{{ item.command | default('bash -c \"while true; do sleep 10000; done\"') }}" + privileged: "{{ item.privileged | default(omit) }}" + volumes: "{{ item.volumes | default(omit) }}" + capabilities: "{{ item.capabilities | default(omit) }}" + exposed_ports: "{{ item.exposed_ports | default(omit) }}" + published_ports: "{{ item.published_ports | default(omit) }}" + ulimits: "{{ item.ulimits | default(omit) }}" + networks: "{{ item.networks | default(omit) }}" + dns_servers: "{{ item.dns_servers | default(omit) }}" + register: server + with_items: "{{ molecule_yml.platforms }}" + async: 7200 + poll: 0 + + - name: Wait for instance(s) creation to complete + async_status: + jid: "{{ item.ansible_job_id }}" + register: docker_jobs + until: docker_jobs.finished + retries: 300 + with_items: "{{ server.results }}" diff --git a/molecule/default/destroy.yml b/molecule/default/destroy.yml new file mode 100644 index 0000000..ec4da49 --- /dev/null +++ b/molecule/default/destroy.yml @@ -0,0 +1,33 @@ +--- +- name: Destroy + hosts: localhost + connection: local + gather_facts: false + no_log: "{{ not lookup('env', 'MOLECULE_DEBUG') | bool }}" + vars: + molecule_file: "{{ lookup('env', 'MOLECULE_FILE') }}" + molecule_yml: "{{ lookup('file', molecule_file) | molecule_from_yaml }}" + tasks: + - name: Destroy molecule instance(s) + docker_container: + name: "{{ item.name }}" + state: absent + force_kill: "{{ item.force_kill | default(true) }}" + register: server + with_items: "{{ molecule_yml.platforms }}" + async: 7200 + poll: 0 + + - name: Wait for instance(s) deletion to complete + async_status: + jid: "{{ item.ansible_job_id }}" + register: docker_jobs + until: docker_jobs.finished + retries: 300 + with_items: "{{ server.results }}" + + - name: Delete docker network(s) + docker_network: + name: "{{ item }}" + state: absent + with_items: "{{ molecule_yml.platforms | molecule_get_docker_networks }}" diff --git a/tests/group_vars/group01.yml b/molecule/default/group_vars/solrcloud_group.yml similarity index 99% rename from tests/group_vars/group01.yml rename to molecule/default/group_vars/solrcloud_group.yml index cd5203a..ce8f2fe 100644 --- a/tests/group_vars/group01.yml +++ b/molecule/default/group_vars/solrcloud_group.yml @@ -1,4 +1,5 @@ --- + java_implementation: openjdk solr_cloud_version: 7.0.0 diff --git a/molecule/default/group_vars/zookeeper_group.yml b/molecule/default/group_vars/zookeeper_group.yml new file mode 100644 index 0000000..fb0d219 --- /dev/null +++ b/molecule/default/group_vars/zookeeper_group.yml @@ -0,0 +1,6 @@ +--- + +zookeeper_hosts: + # the machine running + - host: "{{inventory_hostname}}" + id: 1 diff --git a/molecule/default/molecule.yml b/molecule/default/molecule.yml new file mode 100644 index 0000000..7686524 --- /dev/null +++ b/molecule/default/molecule.yml @@ -0,0 +1,38 @@ +--- +dependency: + name: galaxy +driver: + name: docker +platforms: + - name: zookeeper + groups: + - zookeeper_group + image: geerlingguy/docker-debian9-ansible:latest + privileged: true + capabilities: + - SYS_ADMIN + volumes: + - '/sys/fs/cgroup:/sys/fs/cgroup:ro' + command: '/lib/systemd/systemd' + - name: solrcloud + groups: + - solrcloud_group + image: geerlingguy/docker-debian9-ansible:latest + privileged: true + capabilities: + - SYS_ADMIN + volumes: + - '/sys/fs/cgroup:/sys/fs/cgroup:ro' + links: + zookeeper: zookeeper + command: '/lib/systemd/systemd' +provisioner: + name: ansible + lint: + name: ansible-lint +scenario: + name: default +verifier: + name: goss + lint: + name: yamllint diff --git a/tests/playbook.yml b/molecule/default/playbook.yml similarity index 100% rename from tests/playbook.yml rename to molecule/default/playbook.yml diff --git a/molecule/default/prepare.yml b/molecule/default/prepare.yml new file mode 100644 index 0000000..5358b3b --- /dev/null +++ b/molecule/default/prepare.yml @@ -0,0 +1,5 @@ +--- +- name: Prepare + hosts: all + gather_facts: false + tasks: [] diff --git a/tests/requirements.yml b/molecule/default/requirements.yml similarity index 96% rename from tests/requirements.yml rename to molecule/default/requirements.yml index b0e7f2f..325e6bc 100644 --- a/tests/requirements.yml +++ b/molecule/default/requirements.yml @@ -1,3 +1,5 @@ +--- + - src: idealista.java-role version: 3.0.2 name: java diff --git a/molecule/default/tests/test_default.yml b/molecule/default/tests/test_default.yml new file mode 100644 index 0000000..33ba7ba --- /dev/null +++ b/molecule/default/tests/test_default.yml @@ -0,0 +1,23 @@ +--- +group: + {{ solr_user }}: + exists: true + +user: + {{ solr_user }}: + exists: true + groups: + - {{ solr_group }} + +file: + /lib/systemd/system/solrcloud.service: + owner: {{ solr_user }} + group: {{ solr_group }} + exists: true + filetype: file + mode: "0755" + +service: + solr: + enabled: true + running: true diff --git a/molecule/default/verifier.yml b/molecule/default/verifier.yml new file mode 100644 index 0000000..84c11b2 --- /dev/null +++ b/molecule/default/verifier.yml @@ -0,0 +1,61 @@ +--- +# This is an example playbook to execute goss tests. +# Tests need distributed to the appropriate ansible host/groups +# prior to execution by `goss validate`. +# +# The goss ansible module is installed with molecule. The ANSIBLE_LIBRARY +# path is updated appropriately on `molecule verify`. + +# Details about ansible module: +# - https://github.com/indusbox/goss-ansible + +- name: Verify + hosts: all + vars: + goss_version: v0.3.5 + goss_arch: amd64 + goss_dst: /usr/local/bin/goss + goss_url: "https://github.com/aelsabbahy/goss/releases/download/{{ goss_version }}/goss-linux-{{ goss_arch }}" + goss_test_directory: /tmp + goss_format: documentation + + vars_files: + - ../../defaults/main.yml + - ../../vars/main.yml + - ./group_vars/zookeeper_group.yml + - ./group_vars/solrcloud_group.yml + + tasks: + - name: Download and install goss + get_url: + url: "{{ goss_url }}" + dest: "{{ goss_dst }}" + mode: 0755 + + - name: Copy tests to remote + template: + src: "{{ item }}" + dest: "{{ goss_test_directory }}/{{ item | basename }}" + with_fileglob: + - "{{ playbook_dir }}/tests/test_*.yml" + + - name: Register test files + shell: "ls {{ goss_test_directory }}/test_*.yml" + register: test_files + + - name: Execute Goss tests + command: "goss -g {{ item }} validate --format {{ goss_format }}" + register: test_results + with_items: "{{ test_files.stdout_lines }}" + ignore_errors: true + + - name: Display details about the goss results + debug: + msg: "{{ item.stdout_lines }}" + with_items: "{{ test_results.results }}" + + - name: Fail when tests fail + fail: + msg: "Goss failed to validate" + when: item.rc != 0 + with_items: "{{ test_results.results }}" diff --git a/tasks/config.yml b/tasks/config.yml index 8db98cd..ec84e9b 100644 --- a/tasks/config.yml +++ b/tasks/config.yml @@ -22,37 +22,37 @@ - name: SolrCloud | Configuring jetty server template: - src: jetty.xml.j2 - dest: /opt/solr/server/etc/jetty.xml - force: yes + src: jetty.xml.j2 + dest: /opt/solr/server/etc/jetty.xml + force: true notify: restart SolrCloud - name: SolrCloud | Configuring jetty server http template: - src: jetty-http.xml.j2 - dest: /opt/solr/server/etc/jetty-http.xml - force: yes + src: jetty-http.xml.j2 + dest: /opt/solr/server/etc/jetty-http.xml + force: true notify: restart SolrCloud - name: SolrCloud | Configuring SolrCloud init script template: - src: solr.in.sh.j2 - dest: /etc/default/solr.in.sh - force: yes + src: solr.in.sh.j2 + dest: /etc/default/solr.in.sh + force: true notify: restart SolrCloud - name: SolrCloud | Configuring SolrCloud properties template: - src: solr.xml.j2 - dest: "{{ solr_data_dir }}/solr.xml" - force: yes + src: solr.xml.j2 + dest: "{{ solr_data_dir }}/solr.xml" + force: true notify: restart SolrCloud - name: SolrCloud | Configuring logging template: - src: log4j.properties.j2 - dest: /opt/solr/log4j.properties - force: yes + src: log4j.properties.j2 + dest: /opt/solr/log4j.properties + force: true notify: restart SolrCloud - name: SolrCloud | Create NFS folder (Install dependencies) diff --git a/tasks/install.yml b/tasks/install.yml index 29cbabe..d622b05 100644 --- a/tasks/install.yml +++ b/tasks/install.yml @@ -10,7 +10,7 @@ name: "{{ solr_user }}" group: "{{ solr_group }}" home: /bin/false - createhome: yes + createhome: true - name: SolrCloud | Ensure solr dirs exists file: @@ -24,9 +24,11 @@ - name: SolrCloud | Check if service is running command: systemctl status solr.service - ignore_errors: yes + ignore_errors: true changed_when: false register: service_solrcloud_status + tags: + - skip_ansible_lint - name: SolrCloud | Check installed version action: > diff --git a/tasks/service.yml b/tasks/service.yml index 14e5d1c..8101110 100644 --- a/tasks/service.yml +++ b/tasks/service.yml @@ -5,4 +5,4 @@ name: solr state: "{{ solr_service_state }}" enabled: "{{ solr_service_enabled }}" - daemon_reload: yes + daemon_reload: true diff --git a/test-requirements.txt b/test-requirements.txt index 8425b83..30bf294 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,4 +1,5 @@ ansible==2.5.3.0 -molecule==1.25.0 -docker==2.2.1 -python-vagrant==0.5.15 +molecule==2.19.0 +docker-py==1.10.6 +wheel==0.30.0 +python-vagrant diff --git a/tests/.flake8 b/tests/.flake8 deleted file mode 100644 index e44b810..0000000 --- a/tests/.flake8 +++ /dev/null @@ -1,2 +0,0 @@ -[flake8] -ignore = E501 diff --git a/tests/host_vars/zookeeper/main.yml b/tests/host_vars/zookeeper/main.yml deleted file mode 100644 index 09e0e45..0000000 --- a/tests/host_vars/zookeeper/main.yml +++ /dev/null @@ -1,3 +0,0 @@ -zookeeper_hosts: - - host: "{{inventory_hostname}}" # the machine running - id: 1 diff --git a/tests/test_ansible.py b/tests/test_ansible.py deleted file mode 100644 index 88bab62..0000000 --- a/tests/test_ansible.py +++ /dev/null @@ -1,33 +0,0 @@ -import pytest - - -@pytest.fixture() -def AnsibleDefaults(Ansible): - return Ansible("include_vars", "defaults/main.yml")["ansible_facts"] - - -@pytest.fixture() -def AnsibleVars(Ansible): - return Ansible("include_vars", "tests/group_vars/group01.yml")["ansible_facts"] - - -@pytest.fixture() -def Hostname(TestinfraBackend): - return TestinfraBackend.get_hostname() - - -def test_solr_version(File, AnsibleVars, Hostname): - if Hostname in ("solrcloud"): - version = AnsibleVars["solr_cloud_version"] - assert File("/opt/solr-" + version).exists - assert File("/opt/solr").is_symlink - assert File("/opt/solr").linked_to == "/opt/solr-" + version - - -def test_solr_service(File, Service, Socket, AnsibleVars, Hostname): - if Hostname in ("solrcloud"): - port = AnsibleVars["solr_port"] - assert File("/etc/init.d/solr").exists - assert Service("solr").is_enabled - assert Service("solr").is_running - assert Socket("tcp://:::" + str(port)).is_listening From 15d0a2093fb356ef1ec82f343244fa23d44543e9 Mon Sep 17 00:00:00 2001 From: dortega Date: Thu, 22 Nov 2018 15:50:13 +0100 Subject: [PATCH 09/21] #55 upgrading to java role 3.1.0 --- meta/main.yml | 2 +- molecule/default/create.yml | 2 +- molecule/default/molecule.yml | 2 ++ molecule/default/requirements.yml | 2 +- tasks/install.yml | 14 +++++++------- test-requirements.txt | 2 -- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/meta/main.yml b/meta/main.yml index 86c688a..9d1f61f 100644 --- a/meta/main.yml +++ b/meta/main.yml @@ -2,7 +2,7 @@ galaxy_info: company: Idealista S.A. description: SolrCloud role - min_ansible_version: 2.2.1.0 + min_ansible_version: 2.5.3.0 license: Apache 2.0 platforms: - name: Debian diff --git a/molecule/default/create.yml b/molecule/default/create.yml index 0b9eb15..9cedc65 100644 --- a/molecule/default/create.yml +++ b/molecule/default/create.yml @@ -3,7 +3,7 @@ hosts: localhost connection: local gather_facts: false - # no_log: "{{ not lookup('env', 'MOLECULE_DEBUG') | bool }}" + no_log: "{{ not lookup('env', 'MOLECULE_DEBUG') | bool }}" vars: molecule_file: "{{ lookup('env', 'MOLECULE_FILE') }}" molecule_ephemeral_directory: "{{ lookup('env', 'MOLECULE_EPHEMERAL_DIRECTORY') }}" diff --git a/molecule/default/molecule.yml b/molecule/default/molecule.yml index 7686524..6264aa8 100644 --- a/molecule/default/molecule.yml +++ b/molecule/default/molecule.yml @@ -5,6 +5,7 @@ driver: name: docker platforms: - name: zookeeper + hostname: zookeeper groups: - zookeeper_group image: geerlingguy/docker-debian9-ansible:latest @@ -15,6 +16,7 @@ platforms: - '/sys/fs/cgroup:/sys/fs/cgroup:ro' command: '/lib/systemd/systemd' - name: solrcloud + hostname: solrcloud groups: - solrcloud_group image: geerlingguy/docker-debian9-ansible:latest diff --git a/molecule/default/requirements.yml b/molecule/default/requirements.yml index 325e6bc..72e5a39 100644 --- a/molecule/default/requirements.yml +++ b/molecule/default/requirements.yml @@ -1,7 +1,7 @@ --- - src: idealista.java-role - version: 3.0.2 + version: 3.1.0 name: java - src: idealista.zookeeper-role diff --git a/tasks/install.yml b/tasks/install.yml index d622b05..eb3a227 100644 --- a/tasks/install.yml +++ b/tasks/install.yml @@ -38,7 +38,7 @@ register: solrcloud_check changed_when: false ignore_errors: true - when: service_solrcloud_status | success + when: service_solrcloud_status is success - name: SolrCloud | Download SolrCloud binaries get_url: @@ -46,8 +46,8 @@ dest: /tmp/{{ solr_cloud_package }} when: | service_solrcloud_status.rc > 0 or - service_solrcloud_status | success and - (solrcloud_check | failed or + service_solrcloud_status is success and + (solrcloud_check is failed or "{{ solr_cloud_version }}" not in solrcloud_check.content) - name: SolrCloud | Extract SolrCloud installation script in the current directory @@ -56,8 +56,8 @@ chdir: /tmp when: | service_solrcloud_status.rc > 0 or - service_solrcloud_status | success and - (solrcloud_check | failed or + service_solrcloud_status is success and + (solrcloud_check is failed or "{{ solr_cloud_version }}" not in solrcloud_check.content) tags: - skip_ansible_lint @@ -66,8 +66,8 @@ shell: /tmp/install_solr_service.sh /tmp/{{ solr_cloud_package }} -f -u {{ solr_user }} -n when: | service_solrcloud_status.rc > 0 or - service_solrcloud_status | success and - (solrcloud_check | failed or + service_solrcloud_status is success and + (solrcloud_check is failed or "{{ solr_cloud_version }}" not in solrcloud_check.content) tags: - skip_ansible_lint diff --git a/test-requirements.txt b/test-requirements.txt index 30bf294..648f0be 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,5 +1,3 @@ ansible==2.5.3.0 molecule==2.19.0 docker-py==1.10.6 -wheel==0.30.0 -python-vagrant From 1a86526ab4876dd8a70a627d1b55fb30097e27a9 Mon Sep 17 00:00:00 2001 From: dortega Date: Mon, 26 Nov 2018 19:21:50 +0100 Subject: [PATCH 10/21] #55 fixing molecule config to link containers properly --- CHANGELOG.md | 2 +- .../default/group_vars/solrcloud_group.yml | 2 -- molecule/default/molecule.yml | 28 ++++++++++++------- molecule/default/tests/test_default.yml | 21 +++++++++++--- 4 files changed, 36 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 477be01..2f5f348 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ All notable changes to this project will be documented in this file. ## [Unreleased](https://github.com/idealista/solrcloud-role/tree/develop) ### Changed -- *[#55](https://github.com/idealista/solrcloud-role/issues/55) Upgrading Java and ZooKeeper roles to latest versions, using Hostmanager plugin to manage network instead of landrush, adding test-requirements.txt for execution under pipenv and upgrading to Ansible 2.5.3.0* @dortegau +- *[#55](https://github.com/idealista/solrcloud-role/issues/55) Upgrading Java and ZooKeeper roles to latest versions, using hostmanager plugin to manage network instead of landrush, adding test-requirements.txt for execution under pipenv and upgrading to Ansible 2.5.3.0* @dortegau ## [1.9.0](https://github.com/idealista/solrcloud-role/tree/1.9.0) (2018-02-12) [Full Changelog](https://github.com/idealista/solrcloud-role/compare/1.8.0...1.9.0) diff --git a/molecule/default/group_vars/solrcloud_group.yml b/molecule/default/group_vars/solrcloud_group.yml index ce8f2fe..e310a1c 100644 --- a/molecule/default/group_vars/solrcloud_group.yml +++ b/molecule/default/group_vars/solrcloud_group.yml @@ -1,7 +1,5 @@ --- -java_implementation: openjdk - solr_cloud_version: 7.0.0 solr_port: 8983 diff --git a/molecule/default/molecule.yml b/molecule/default/molecule.yml index 6264aa8..5101e18 100644 --- a/molecule/default/molecule.yml +++ b/molecule/default/molecule.yml @@ -5,29 +5,37 @@ driver: name: docker platforms: - name: zookeeper - hostname: zookeeper - groups: - - zookeeper_group - image: geerlingguy/docker-debian9-ansible:latest + image: geerlingguy/docker-debian9-ansible + image_version: latest privileged: true capabilities: - SYS_ADMIN volumes: - '/sys/fs/cgroup:/sys/fs/cgroup:ro' + groups: + - zookeeper_group command: '/lib/systemd/systemd' + networks: + - name: solr-network + aliases: + - zookeeper - name: solrcloud - hostname: solrcloud - groups: - - solrcloud_group - image: geerlingguy/docker-debian9-ansible:latest + image: geerlingguy/docker-debian9-ansible + image_version: latest privileged: true capabilities: - SYS_ADMIN volumes: - '/sys/fs/cgroup:/sys/fs/cgroup:ro' - links: - zookeeper: zookeeper + groups: + - solrcloud_group command: '/lib/systemd/systemd' + networks: + - name: solr-network + aliases: + - solrcloud + links: + - zookeeper:zookeeper provisioner: name: ansible lint: diff --git a/molecule/default/tests/test_default.yml b/molecule/default/tests/test_default.yml index 33ba7ba..81a9096 100644 --- a/molecule/default/tests/test_default.yml +++ b/molecule/default/tests/test_default.yml @@ -1,6 +1,6 @@ --- group: - {{ solr_user }}: + {{ solr_group }}: exists: true user: @@ -10,12 +10,25 @@ user: - {{ solr_group }} file: - /lib/systemd/system/solrcloud.service: + {{ solr_log_dir }}: + owner: {{ solr_user }} + group: {{ solr_group }} + exists: true + filetype: directory + {{ solr_home }}: owner: {{ solr_user }} group: {{ solr_group }} exists: true - filetype: file - mode: "0755" + filetype: directory + {{ solr_data_dir }}: + owner: {{ solr_user }} + group: {{ solr_group }} + exists: true + filetype: directory + +port: + tcp6:{{ solr_port }}: + listening: true service: solr: From 9af5584b289f3bf7e2ae048450c1edbb05b6af47 Mon Sep 17 00:00:00 2001 From: dortega Date: Mon, 26 Nov 2018 19:31:31 +0100 Subject: [PATCH 11/21] =?UTF-8?q?#55=20Fixing=20some=20references=20to=20m?= =?UTF-8?q?ysql-role=20(=C2=BFC&P=3F)=20and=20deleting=20--driver=20option?= =?UTF-8?q?=20in=20.travis.yml=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .travis.yml | 2 +- README.md | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7e47c69..b539c7a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ install: - pip install pipenv - pipenv install -r test-requirements.txt --python 2.7 script: - - pipenv run molecule test --driver docker + - pipenv run molecule test notifications: webhooks: https://galaxy.ansible.com/api/v1/notifications/ diff --git a/README.md b/README.md index 104b4ca..08a54c9 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ These instructions will get you a copy of the role for your ansible playbook. On Ansible 2.5.3.0 version installed. Inventory destination should be a Debian environment. -For testing purposes, [Molecule](https://molecule.readthedocs.io/) with [Vagrant](https://www.vagrantup.com/) as driver (using [hostmanager](https://github.com/devopsgroup-io/vagrant-hostmanager) plugin) and [VirtualBox](https://www.virtualbox.org/) as provider. +For testing purposes, [Molecule](https://molecule.readthedocs.io/) with [Docker](https://www.docker.com/) as driver. ### Installing @@ -34,7 +34,7 @@ Create or add to your roles dependency file (e.g requirements.yml): ``` - src: idealista.solrcloud-role - version: 1.8.0 + version: 1.9.0 name: solrcloud ``` @@ -147,7 +147,7 @@ $ pipenv install -r test-requirements.txt -python 2.7 $ pipenv run molecule test ``` -See molecule.yml to check possible testing platforms. +See [molecule.yml](https://github.com/idealista/solrcloud-role/blob/master/molecule/default/molecule.yml) to check possible testing platforms. ## Built With @@ -157,7 +157,7 @@ See molecule.yml to check possible testing platforms. For the versions available, see the [tags on this repository](https://github.com/idealista/solrcloud-role/tags). -Additionaly you can see what change in each version in the [CHANGELOG.md](CHANGELOG.md) file. +Additionaly you can see what change in each version in the [CHANGELOG.md](https://github.com/idealista/solrcloud-role/blob/master/CHANGELOG.md) file. ## Authors @@ -173,4 +173,4 @@ This project is licensed under the [Apache 2.0](https://www.apache.org/licenses/ ## Contributing -Please read [CONTRIBUTING.md](https://github.com/idealista/mysql-role/blob/master/.github/CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us. +Please read [CONTRIBUTING.md](https://github.com/idealista/solrcloud-role/blob/master/.github/CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us. From 431ab7c3b537cf879d85bba8221de079fe68d800 Mon Sep 17 00:00:00 2001 From: dortega Date: Wed, 5 Dec 2018 19:21:09 +0100 Subject: [PATCH 12/21] #55 Fixing CI --- molecule/default/molecule.yml | 10 ++++++---- molecule/default/playbook.yml | 10 ++++++++-- molecule/default/requirements.yml | 6 +----- molecule/default/tests/test_default.yml | 5 ++++- molecule/default/{verifier.yml => verify.yml} | 5 ++--- test-requirements.txt | 2 +- 6 files changed, 22 insertions(+), 16 deletions(-) rename molecule/default/{verifier.yml => verify.yml} (95%) diff --git a/molecule/default/molecule.yml b/molecule/default/molecule.yml index 5101e18..f62ad5c 100644 --- a/molecule/default/molecule.yml +++ b/molecule/default/molecule.yml @@ -5,8 +5,8 @@ driver: name: docker platforms: - name: zookeeper - image: geerlingguy/docker-debian9-ansible - image_version: latest + hostname: zookeeper + image: idealista/java-debian-ansible:3.2.0-debian9 privileged: true capabilities: - SYS_ADMIN @@ -20,8 +20,8 @@ platforms: aliases: - zookeeper - name: solrcloud - image: geerlingguy/docker-debian9-ansible - image_version: latest + hostname: solrcloud + image: idealista/java-debian-ansible:3.2.0-debian9 privileged: true capabilities: - SYS_ADMIN @@ -36,6 +36,8 @@ platforms: - solrcloud links: - zookeeper:zookeeper + published_ports: + - 0.0.0.0:8983:8983/tcp provisioner: name: ansible lint: diff --git a/molecule/default/playbook.yml b/molecule/default/playbook.yml index f34eaba..914e905 100644 --- a/molecule/default/playbook.yml +++ b/molecule/default/playbook.yml @@ -2,10 +2,16 @@ - hosts: zookeeper roles: - - role: java - role: zookeeper + pre_tasks: + - name: installing required libs + apt: + pkg: "{{ item }}" + state: present + with_items: + - net-tools + - netcat - hosts: solrcloud roles: - - role: java - role: solrcloud-role diff --git a/molecule/default/requirements.yml b/molecule/default/requirements.yml index 72e5a39..c70ac0c 100644 --- a/molecule/default/requirements.yml +++ b/molecule/default/requirements.yml @@ -1,9 +1,5 @@ --- -- src: idealista.java-role - version: 3.1.0 - name: java - - src: idealista.zookeeper-role - version: 1.2.0 + version: 1.3.0 name: zookeeper diff --git a/molecule/default/tests/test_default.yml b/molecule/default/tests/test_default.yml index 81a9096..5d21c2b 100644 --- a/molecule/default/tests/test_default.yml +++ b/molecule/default/tests/test_default.yml @@ -1,4 +1,5 @@ --- + group: {{ solr_group }}: exists: true @@ -27,7 +28,9 @@ file: filetype: directory port: - tcp6:{{ solr_port }}: + tcp:{{ solr_port }}: + listening: true + tcp:{{ solr_jmx_port }}: listening: true service: diff --git a/molecule/default/verifier.yml b/molecule/default/verify.yml similarity index 95% rename from molecule/default/verifier.yml rename to molecule/default/verify.yml index 84c11b2..bc97318 100644 --- a/molecule/default/verifier.yml +++ b/molecule/default/verify.yml @@ -10,9 +10,9 @@ # - https://github.com/indusbox/goss-ansible - name: Verify - hosts: all + hosts: solrcloud vars: - goss_version: v0.3.5 + goss_version: v0.3.6 goss_arch: amd64 goss_dst: /usr/local/bin/goss goss_url: "https://github.com/aelsabbahy/goss/releases/download/{{ goss_version }}/goss-linux-{{ goss_arch }}" @@ -22,7 +22,6 @@ vars_files: - ../../defaults/main.yml - ../../vars/main.yml - - ./group_vars/zookeeper_group.yml - ./group_vars/solrcloud_group.yml tasks: diff --git a/test-requirements.txt b/test-requirements.txt index 648f0be..6855712 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,3 +1,3 @@ ansible==2.5.3.0 molecule==2.19.0 -docker-py==1.10.6 +docker==3.3.0 From ea2ffedba59205a7d9915708e9f67c0d6da03fb7 Mon Sep 17 00:00:00 2001 From: dortega Date: Mon, 10 Dec 2018 16:10:26 +0100 Subject: [PATCH 13/21] #54 upgrading to SolrCloud 7.5.0 --- CHANGELOG.md | 1 + README.md | 2 ++ defaults/main.yml | 3 +-- molecule/default/group_vars/solrcloud_group.yml | 2 +- molecule/default/molecule.yml | 1 + templates/jetty-http.xml.j2 | 2 -- 6 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f5f348..c75bf05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. ## [Unreleased](https://github.com/idealista/solrcloud-role/tree/develop) ### Changed +- *[#54](https://github.com/idealista/solrcloud-role/issues/54) Installing SolrCloud 7.5.0 by default* @dortegau - *[#55](https://github.com/idealista/solrcloud-role/issues/55) Upgrading Java and ZooKeeper roles to latest versions, using hostmanager plugin to manage network instead of landrush, adding test-requirements.txt for execution under pipenv and upgrading to Ansible 2.5.3.0* @dortegau ## [1.9.0](https://github.com/idealista/solrcloud-role/tree/1.9.0) (2018-02-12) diff --git a/README.md b/README.md index 08a54c9..4850d45 100644 --- a/README.md +++ b/README.md @@ -147,6 +147,8 @@ $ pipenv install -r test-requirements.txt -python 2.7 $ pipenv run molecule test ``` +Solr Admin UI should be accessible from: http://localhost:8983/solr/#/ + See [molecule.yml](https://github.com/idealista/solrcloud-role/blob/master/molecule/default/molecule.yml) to check possible testing platforms. ## Built With diff --git a/defaults/main.yml b/defaults/main.yml index 75864aa..b7bf6b0 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -1,7 +1,6 @@ --- ## General - -solr_cloud_version: 7.0.0 +solr_cloud_version: 7.5.0 ## Service options diff --git a/molecule/default/group_vars/solrcloud_group.yml b/molecule/default/group_vars/solrcloud_group.yml index e310a1c..9f8a5ca 100644 --- a/molecule/default/group_vars/solrcloud_group.yml +++ b/molecule/default/group_vars/solrcloud_group.yml @@ -1,6 +1,6 @@ --- -solr_cloud_version: 7.0.0 +solr_cloud_version: 7.5.0 solr_port: 8983 solr_zookeeper_hosts: zookeeper:2181 diff --git a/molecule/default/molecule.yml b/molecule/default/molecule.yml index f62ad5c..c538400 100644 --- a/molecule/default/molecule.yml +++ b/molecule/default/molecule.yml @@ -19,6 +19,7 @@ platforms: - name: solr-network aliases: - zookeeper + - name: solrcloud hostname: solrcloud image: idealista/java-debian-ansible:3.2.0-debian9 diff --git a/templates/jetty-http.xml.j2 b/templates/jetty-http.xml.j2 index 7346697..5668c1b 100644 --- a/templates/jetty-http.xml.j2 +++ b/templates/jetty-http.xml.j2 @@ -37,8 +37,6 @@ - - From 300b6c84da537428a060a522300b21a06f699ac0 Mon Sep 17 00:00:00 2001 From: dortega Date: Mon, 10 Dec 2018 16:23:23 +0100 Subject: [PATCH 14/21] #54 recovering supported acceptorPriorityDelta and adding .github directory --- .github/CODE_OF_CONDUCT.md | 74 +++++++++++++++++++++++ .github/CONTRIBUTING.md | 100 +++++++++++++++++++++++++++++++ .github/ISSUE_TEMPLATE.md | 36 +++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 26 ++++++++ templates/jetty-http.xml.j2 | 1 + 5 files changed, 237 insertions(+) create mode 100644 .github/CODE_OF_CONDUCT.md create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..2461d80 --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,74 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at [labs@idealista.com](mailto:labs@idealista.com). All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..4715174 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,100 @@ +# Contributing to Idealista + +:+1::tada: First off, thanks for taking the time to contribute! :tada::+1: + +The following is a set of guidelines for contributing to Idealista's repositories, which are hosted in the [Idealista Organization](https://github.com/idealista) on GitHub. These are mostly guidelines, not rules. Use your best judgment, and feel free to propose changes to this document in a pull request. + +#### Table Of Contents + +[Code of Conduct](#code-of-conduct) + +[How Can I Contribute?](#how-can-i-contribute) + * [Reporting Bugs](#reporting-bugs) + * [Suggesting Enhancements](#suggesting-enhancements) + * [Pull Requests](#pull-requests) + * [Changelog](#changelog) + +[Styleguides](#styleguides) + * [Git Commit Messages](#git-commit-messages) + +## Code of Conduct + +This project and everyone participating in it is governed by the [Idealista Code of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to [labs@idealista.com](mailto:labs@idealista.com). + + +## How Can I Contribute? + +### Reporting Bugs + +This section guides you through submitting a bug report for Idealista. Following these guidelines helps maintainers and the community understand your report :pencil:, reproduce the behavior :computer: :computer:, and find related reports :mag_right:. + +Before creating bug reports, please check [this list](#before-submitting-a-bug-report) as you might find out that you don't need to create one. When you are creating a bug report, please [include as many details as possible](#how-do-i-submit-a-good-bug-report). Fill out [the required template](ISSUE_TEMPLATE.md), the information it asks for helps us resolve issues faster. + +> **Note:** If you find a **Closed** issue that seems like it is the same thing that you're experiencing, open a new issue and include a link to the original issue in the body of your new one. + +#### Before Submitting A Bug Report + +* **Check the last version.** Check if you can reproduce the problem in the latest version of the project. +* **Check the FAQ of the project** for a list of common questions and problems. +* **Perform a [cursory search](https://github.com/issues?q=+is%3Aissue+user%3Aidealista)** to see if the problem has already been reported. If it has **and the issue is still open**, add a comment to the existing issue instead of opening a new one. + +#### How Do I Submit A (Good) Bug Report? + +Bugs are tracked as [GitHub issues](https://guides.github.com/features/issues/). Create an issue on the project repository and provide the following information by filling in [the template](ISSUE_TEMPLATE.md). + +Explain the problem and include additional details to help maintainers reproduce the problem: + +* **Use a clear and descriptive title** for the issue to identify the problem. +* **Describe the exact steps which reproduce the problem** in as many details as possible. +* **Describe the behavior you observed after following the steps** and point out what exactly is the problem with that behavior. +* **Explain which behavior you expected to see instead and why.** + +### Suggesting Enhancements + +This section guides you through submitting an enhancement suggestion for Idealista, including completely new features and minor improvements to existing functionality. Following these guidelines helps maintainers and the community understand your suggestion :pencil: and find related suggestions :mag_right:. + +Before creating enhancement suggestions, please check [this list](#before-submitting-an-enhancement-suggestion) as you might find out that you don't need to create one. When you are creating an enhancement suggestion, please [include as many details as possible](#how-do-i-submit-a-good-enhancement-suggestion). Fill in [the template](ISSUE_TEMPLATE.md), including the steps that you imagine you would take if the feature you're requesting existed. + +#### Before Submitting An Enhancement Suggestion + +* **Check the last version.** Check if you can reproduce the problem in the latest version of the project. +* **Check the FAQ of the project** for a list of common questions and problems. +* **Perform a [cursory search](https://github.com/issues?q=+is%3Aissue+user%3Aidealista)** to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one. + +#### How Do I Submit A (Good) Enhancement Suggestion? + +Enhancement suggestions are tracked as [GitHub issues](https://guides.github.com/features/issues/). Create an issue on the project repository and provide the following information by filling in [the template](ISSUE_TEMPLATE.md): + +* **Use a clear and descriptive title** for the issue to identify the suggestion. +* **Provide a step-by-step description of the suggested enhancement** in as many details as possible. +* **Provide specific examples to demonstrate the steps**. +* **Describe the current behavior** and **explain which behavior you expected to see instead** and why. +* **Explain why this enhancement would be useful**. +* **List some other text editors or applications where this enhancement exists.** +* **Specify which version are you're using.** + +### Pull Requests + +* Fill in [the required template](PULL_REQUEST_TEMPLATE.md) +* Any pull request should has **idealista:develop** as base branch. + +### Changelog + +Every project has a CHANGELOG.md file. Once your code is ready to be merged please fill the issue after the **Unreleased** section as explained: + +* For an enhancement, fill the issue after the **Added** subsection (create it if doesn't exists) +* For a fixed bug, fill the issue after the **Fixed** subsection (create it if doesn't exists) +* For an improvement, fill the issue after the **Changed** subsection (create it if doesn't exists) + +Then write the issue info this way: + +- *[#29](https://github.com/idealista/nginx-role/issues/29) Support debian stretch* @jmonterrubio + +## Styleguides + +### Git Commit Messages + +* Use the present tense ("Add feature" not "Added feature") +* Use the imperative mood ("Move cursor to..." not "Moves cursor to...") +* Limit the first line to 72 characters or less +* Reference issues and pull requests liberally after the first line diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..b07e35f --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,36 @@ + + +### Prerequisites + +* [ ] Put an X between the brackets on this line if you have done all of the following: + * Checked that your issue isn't already filled: https://github.com/issues?utf8=✓&q=is%3Aissue+user%3Aidealista + * Checked that there is not already provided the described functionality + +### Description + +[Description of the issue] + +### Steps to Reproduce + +1. [First Step] +2. [Second Step] +3. [and so on...] + +**Expected behavior:** [What you expect to happen] + +**Actual behavior:** [What actually happens] + +**Reproduces how often:** [What percentage of the time does it reproduce?] + +### Versions + +The version/s you notice the behavior. + +### Additional Information + +Any additional information, configuration or data that might be necessary to reproduce the issue. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..8fa0af8 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,26 @@ +### Requirements + +* Filling out the template is required. Any pull request that does not include enough information to be reviewed in a timely manner may be closed at the maintainers' discretion. +* All new code requires tests to ensure against regressions +* Remember to set **idealista:develop** as base branch; + +### Description of the Change + + + + +### Benefits + + + +### Possible Drawbacks + + + +### Applicable Issues + + diff --git a/templates/jetty-http.xml.j2 b/templates/jetty-http.xml.j2 index 5668c1b..1742311 100644 --- a/templates/jetty-http.xml.j2 +++ b/templates/jetty-http.xml.j2 @@ -37,6 +37,7 @@ + From 99b041305e0a13c6056c8d80eef58fdff0badae8 Mon Sep 17 00:00:00 2001 From: dortega Date: Mon, 10 Dec 2018 17:00:33 +0100 Subject: [PATCH 15/21] #54 fixing CVE-2018-10855 --- test-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-requirements.txt b/test-requirements.txt index 6855712..cfcb056 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,3 +1,3 @@ -ansible==2.5.3.0 +ansible==2.5.5.0 molecule==2.19.0 docker==3.3.0 From 3b4d5d134c401c5dc7baf6c82a4c5a5c2e30db7e Mon Sep 17 00:00:00 2001 From: dortega Date: Mon, 10 Dec 2018 17:03:27 +0100 Subject: [PATCH 16/21] #54 fixing CVE-2018-10855 --- CHANGELOG.md | 2 +- README.md | 4 ++-- meta/main.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c75bf05..e0d1065 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. ## [Unreleased](https://github.com/idealista/solrcloud-role/tree/develop) ### Changed - *[#54](https://github.com/idealista/solrcloud-role/issues/54) Installing SolrCloud 7.5.0 by default* @dortegau -- *[#55](https://github.com/idealista/solrcloud-role/issues/55) Upgrading Java and ZooKeeper roles to latest versions, using hostmanager plugin to manage network instead of landrush, adding test-requirements.txt for execution under pipenv and upgrading to Ansible 2.5.3.0* @dortegau +- *[#55](https://github.com/idealista/solrcloud-role/issues/55) Upgrading Java and ZooKeeper roles to latest versions, using hostmanager plugin to manage network instead of landrush, adding test-requirements.txt for execution under pipenv and upgrading to Ansible 2.5.5.0* @dortegau ## [1.9.0](https://github.com/idealista/solrcloud-role/tree/1.9.0) (2018-02-12) [Full Changelog](https://github.com/idealista/solrcloud-role/compare/1.8.0...1.9.0) diff --git a/README.md b/README.md index 4850d45..10bfe5d 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ These instructions will get you a copy of the role for your ansible playbook. On ### Prerequisities -Ansible 2.5.3.0 version installed. +Ansible 2.5.5.0 version installed. Inventory destination should be a Debian environment. For testing purposes, [Molecule](https://molecule.readthedocs.io/) with [Docker](https://www.docker.com/) as driver. @@ -153,7 +153,7 @@ See [molecule.yml](https://github.com/idealista/solrcloud-role/blob/master/molec ## Built With -![Ansible](https://img.shields.io/badge/ansible-2.5.3.0-green.svg) +![Ansible](https://img.shields.io/badge/ansible-2.5.5.0-green.svg) ## Versioning diff --git a/meta/main.yml b/meta/main.yml index 9d1f61f..80c9347 100644 --- a/meta/main.yml +++ b/meta/main.yml @@ -2,7 +2,7 @@ galaxy_info: company: Idealista S.A. description: SolrCloud role - min_ansible_version: 2.5.3.0 + min_ansible_version: 2.5.5.0 license: Apache 2.0 platforms: - name: Debian From c9e447d524481d4556a271ba6f06d1b36843f9d5 Mon Sep 17 00:00:00 2001 From: dortega Date: Thu, 13 Dec 2018 15:52:09 +0100 Subject: [PATCH 17/21] #53 #54 #58 setting SolrCloud 7.5.0 as default, configuring two nodes to launch tests and adding support to manage collections --- .yamllint | 3 + CHANGELOG.md | 5 + README.md | 109 +- assets/solr_admin_ui.png | Bin 0 -> 327566 bytes defaults/main.yml | 51 +- molecule/default/group_vars/solrcloud.yml | 15 + .../default/group_vars/solrcloud_group.yml | 7 - .../{zookeeper_group.yml => zookeeper.yml} | 0 molecule/default/molecule.yml | 28 +- .../_rest_managed.json | 1 + .../_schema_analysis_stopwords_english.json | 38 + .../_schema_analysis_synonyms_english.json | 11 + .../clustering/carrot2/README.txt | 11 + .../clustering/carrot2/kmeans-attributes.xml | 19 + .../clustering/carrot2/lingo-attributes.xml | 24 + .../clustering/carrot2/stc-attributes.xml | 19 + .../sample_techproducts_configs/currency.xml | 67 + .../sample_techproducts_configs/elevate.xml | 42 + .../lang/contractions_ca.txt | 8 + .../lang/contractions_fr.txt | 15 + .../lang/contractions_ga.txt | 5 + .../lang/contractions_it.txt | 23 + .../lang/hyphenations_ga.txt | 5 + .../lang/stemdict_nl.txt | 6 + .../lang/stoptags_ja.txt | 420 ++ .../lang/stopwords_ar.txt | 125 + .../lang/stopwords_bg.txt | 193 + .../lang/stopwords_ca.txt | 220 + .../lang/stopwords_ckb.txt | 136 + .../lang/stopwords_cz.txt | 172 + .../lang/stopwords_da.txt | 110 + .../lang/stopwords_de.txt | 294 ++ .../lang/stopwords_el.txt | 78 + .../lang/stopwords_en.txt | 54 + .../lang/stopwords_es.txt | 356 ++ .../lang/stopwords_eu.txt | 99 + .../lang/stopwords_fa.txt | 313 ++ .../lang/stopwords_fi.txt | 97 + .../lang/stopwords_fr.txt | 186 + .../lang/stopwords_ga.txt | 110 + .../lang/stopwords_gl.txt | 161 + .../lang/stopwords_hi.txt | 235 + .../lang/stopwords_hu.txt | 211 + .../lang/stopwords_hy.txt | 46 + .../lang/stopwords_id.txt | 359 ++ .../lang/stopwords_it.txt | 303 ++ .../lang/stopwords_ja.txt | 127 + .../lang/stopwords_lv.txt | 172 + .../lang/stopwords_nl.txt | 119 + .../lang/stopwords_no.txt | 194 + .../lang/stopwords_pt.txt | 253 ++ .../lang/stopwords_ro.txt | 233 + .../lang/stopwords_ru.txt | 243 ++ .../lang/stopwords_sv.txt | 133 + .../lang/stopwords_th.txt | 119 + .../lang/stopwords_tr.txt | 212 + .../lang/userdict_ja.txt | 29 + .../managed-schema | 1187 +++++ .../mapping-FoldToASCII.txt | 3813 +++++++++++++++++ .../mapping-ISOLatin1Accent.txt | 246 ++ .../sample_techproducts_configs/params.json | 11 + .../sample_techproducts_configs/protwords.txt | 21 + .../solrconfig.xml | 1616 +++++++ .../sample_techproducts_configs/spellings.txt | 2 + .../sample_techproducts_configs/stopwords.txt | 14 + .../sample_techproducts_configs/synonyms.txt | 29 + .../update-script.js | 53 + .../velocity/README.txt | 101 + .../velocity/VM_global_library.vm | 186 + .../velocity/browse.vm | 33 + .../velocity/cluster.vm | 19 + .../velocity/cluster_results.vm | 31 + .../velocity/debug.vm | 28 + .../velocity/did_you_mean.vm | 11 + .../velocity/error.vm | 11 + .../velocity/facet_fields.vm | 24 + .../velocity/facet_pivot.vm | 12 + .../velocity/facet_queries.vm | 12 + .../velocity/facet_ranges.vm | 23 + .../velocity/facets.vm | 10 + .../velocity/footer.vm | 43 + .../velocity/head.vm | 37 + .../velocity/header.vm | 7 + .../velocity/hit.vm | 25 + .../velocity/hit_grouped.vm | 43 + .../velocity/hit_plain.vm | 25 + .../velocity/join_doc.vm | 20 + .../velocity/jquery.autocomplete.css | 48 + .../velocity/jquery.autocomplete.js | 763 ++++ .../velocity/layout.vm | 24 + .../velocity/main.css | 231 + .../velocity/mime_type_lists.vm | 68 + .../velocity/pagination_bottom.vm | 22 + .../velocity/pagination_top.vm | 29 + .../velocity/product_doc.vm | 32 + .../velocity/query.vm | 42 + .../velocity/query_form.vm | 64 + .../velocity/query_group.vm | 43 + .../velocity/query_spatial.vm | 75 + .../velocity/results_list.vm | 22 + .../velocity/richtext_doc.vm | 153 + .../velocity/suggest.vm | 8 + .../velocity/tabs.vm | 50 + .../xslt/example.xsl | 132 + .../xslt/example_atom.xsl | 67 + .../xslt/example_rss.xsl | 66 + .../sample_techproducts_configs/xslt/luke.xsl | 337 ++ .../xslt/updateXml.xsl | 70 + molecule/default/tests/test_default.yml | 12 +- molecule/default/verify.yml | 2 +- tasks/collections.yml | 62 + tasks/config.yml | 48 +- tasks/install.yml | 9 +- tasks/main.yml | 6 + vars/main.yml | 3 + 115 files changed, 16649 insertions(+), 156 deletions(-) create mode 100644 assets/solr_admin_ui.png create mode 100644 molecule/default/group_vars/solrcloud.yml delete mode 100644 molecule/default/group_vars/solrcloud_group.yml rename molecule/default/group_vars/{zookeeper_group.yml => zookeeper.yml} (100%) create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/_rest_managed.json create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/_schema_analysis_stopwords_english.json create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/_schema_analysis_synonyms_english.json create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/clustering/carrot2/README.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/clustering/carrot2/kmeans-attributes.xml create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/clustering/carrot2/lingo-attributes.xml create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/clustering/carrot2/stc-attributes.xml create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/currency.xml create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/elevate.xml create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/contractions_ca.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/contractions_fr.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/contractions_ga.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/contractions_it.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/hyphenations_ga.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stemdict_nl.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stoptags_ja.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ar.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_bg.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ca.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ckb.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_cz.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_da.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_de.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_el.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_en.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_es.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_eu.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_fa.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_fi.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_fr.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ga.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_gl.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_hi.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_hu.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_hy.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_id.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_it.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ja.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_lv.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_nl.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_no.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_pt.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ro.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ru.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_sv.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_th.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_tr.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/lang/userdict_ja.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/managed-schema create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/mapping-FoldToASCII.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/mapping-ISOLatin1Accent.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/params.json create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/protwords.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/solrconfig.xml create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/spellings.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/stopwords.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/synonyms.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/update-script.js create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/README.txt create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/VM_global_library.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/browse.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/cluster.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/cluster_results.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/debug.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/did_you_mean.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/error.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/facet_fields.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/facet_pivot.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/facet_queries.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/facet_ranges.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/facets.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/footer.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/head.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/header.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/hit.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/hit_grouped.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/hit_plain.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/join_doc.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/jquery.autocomplete.css create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/jquery.autocomplete.js create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/layout.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/main.css create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/mime_type_lists.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/pagination_bottom.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/pagination_top.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/product_doc.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/query.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/query_form.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/query_group.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/query_spatial.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/results_list.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/richtext_doc.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/suggest.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/velocity/tabs.vm create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/xslt/example.xsl create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/xslt/example_atom.xsl create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/xslt/example_rss.xsl create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/xslt/luke.xsl create mode 100755 molecule/default/templates/collections/sample_techproducts_configs/xslt/updateXml.xsl create mode 100644 tasks/collections.yml diff --git a/.yamllint b/.yamllint index 3a2255e..de11fc3 100644 --- a/.yamllint +++ b/.yamllint @@ -11,3 +11,6 @@ rules: # NOTE(retr0h): Templates no longer fail this lint rule. # Uncomment if running old Molecule templates. # truthy: disable + +ignore: | + tests/ diff --git a/CHANGELOG.md b/CHANGELOG.md index e0d1065..7eb32a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,12 @@ All notable changes to this project will be documented in this file. ## [Unreleased](https://github.com/idealista/solrcloud-role/tree/develop) + +### Added +- *[#53](https://github.com/idealista/solrcloud-role/issues/53) Adding tasks to manage collections* @dortegau + ### Changed +- *[#58](https://github.com/idealista/solrcloud-role/issues/58) Testing against a cluster with two nodes (solrcloud1 and solrcloud2) instead of one* @dortegau - *[#54](https://github.com/idealista/solrcloud-role/issues/54) Installing SolrCloud 7.5.0 by default* @dortegau - *[#55](https://github.com/idealista/solrcloud-role/issues/55) Upgrading Java and ZooKeeper roles to latest versions, using hostmanager plugin to manage network instead of landrush, adding test-requirements.txt for execution under pipenv and upgrading to Ansible 2.5.5.0* @dortegau diff --git a/README.md b/README.md index 10bfe5d..101bf0d 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Create or add to your roles dependency file (e.g requirements.yml): ``` - src: idealista.solrcloud-role - version: 1.9.0 + version: 2.0.0 name: solrcloud ``` @@ -53,87 +53,32 @@ Use in a playbook: - { role: solrcloud } ``` -Playbook example showing how to provision from scratch a solrcloud cluster plus create a collection called `mycollection`, using idealista [java](https://github.com/idealista/java-role), [zookeeper](https://github.com/idealista/zookeeper-role) and [solrcloud](https://github.com/idealista/solrcloud-role) roles. +Playbook example below showing how to provision from scratch a SolrCloud cluster with two nodes plus create an example (and empty) collection called `sample_techproducts_configs`, using idealista [java](https://github.com/idealista/java-role), [zookeeper](https://github.com/idealista/zookeeper-role) and [solrcloud](https://github.com/idealista/solrcloud-role) roles: + +**Note:** Assuming that 'solrcloud' group has two nodes (`solrcloud1` and `solrcloud2`) as is declared in [molecule.yml](https://github.com/idealista/solrcloud-role/tree/master/molecule/default/molecule.yml), +collection will have two shards, one replica and one shard per node as is declared in group vars file called [solrcloud.yml](https://github.com/idealista/solrcloud-role/tree/master/molecule/default/group_vars/solrcloud.yml) +and configuration files are stored under directory called `sample_techproducts_configs` under template directory. > :warning: Use the example below just as a reference, requires inventory host groups `solr` and `zookeeper` to be correctly defined + ``` -- hosts: solr:zookeeper - roles: - - role: idealista.java-role - become: yes - vars: - java_open_jdk_set_version: 8 +--- - hosts: zookeeper roles: - - role: idealista.zookeeper-role - become: yes - vars: - zookeeper_hosts: " - {%- set ips = [] %} - {%- for host in groups['zookeeper'] %} - {{- ips.append(dict(id=loop.index, host=host, ip=hostvars[host]['ansible_default_ipv4'].address)) }} - {%- endfor %} - {{- ips -}}" - -- hosts: solr - serial: - - 1 - - "100%" + - role: zookeeper + pre_tasks: + - name: installing required libs + apt: + pkg: "{{ item }}" + state: present + with_items: + - net-tools + - netcat + +- hosts: solrcloud roles: - - role: idealista.solrcloud-role - become: yes - vars: - solr_cloud_version: 6.5.1 - solr_heap: "10G" - solr_zookeeper_hosts: " - {%- set ips = [] %} - {%- for host in groups['zookeeper'] %} - {{- ips.append(hostvars[host]['ansible_default_ipv4'].address) }} - {%- endfor %} - {{- ips | zip_longest([], fillvalue=':2181') | map('join') | join(',') -}} - " - solr_host: "{{ ansible_hostname }}" - -- hosts: solr - vars: - solr_replicas: "{{ 1 if groups['solr'] | length == 1 else 2 }}" - solr_shards: "{{ groups['solr'] | length }}" - solr_collection_home: /var/solr - solr_collection_name: mycollection - solr_collection_ok_file: "{{ solr_collection_home }}/create_collection.ok" - - tasks: - - name: Upload collection - become: yes - when: "inventory_hostname == groups['solr'][0]" - copy: - src: "{{ playbook_dir }}/{{ solr_collection_name }}" - dest: "{{ solr_collection_home }}" - owner: solr - group: solr - mode: 0644 - - - name: Create mycollection collection - become: yes - when: "inventory_hostname == groups['solr'][0]" - become_user: solr - shell: | - /opt/solr/bin/solr create_collection \ - -c {{solr_collection_name}} \ - -n {{solr_collection_name}} \ - -d {{solr_collection_home}}/{{solr_collection_name}} \ - -shards {{solr_shards}} \ - -replicationFactor {{solr_replicas}} \ - && touch {{solr_collection_ok_file}} - - register: command_output - args: - executable: /bin/bash - creates: "{{solr_collection_ok_file}}" - - - name: Collection creation print - debug: msg="{{ command_output }}" + - role: solrcloud-role ``` ## Usage @@ -144,10 +89,20 @@ Look to the defaults properties file to see the possible configuration propertie ``` $ pipenv install -r test-requirements.txt -python 2.7 -$ pipenv run molecule test + +# This will execute tests but doesn't destroy created environment (because of --destroy=never) +$ pipenv run molecule test --destroy=never ``` -Solr Admin UI should be accessible from: http://localhost:8983/solr/#/ +Solr Admin UI should be accessible from docker container host at URL: + +http://localhost:8983/solr/#/ (node: `solrcloud1`) + +or + +http://localhost:8984/solr/#/ (node: `solrcloud2`) + +Solr Admin UI example See [molecule.yml](https://github.com/idealista/solrcloud-role/blob/master/molecule/default/molecule.yml) to check possible testing platforms. diff --git a/assets/solr_admin_ui.png b/assets/solr_admin_ui.png new file mode 100644 index 0000000000000000000000000000000000000000..87f538609918a8235995f121508e2e5f5628bb92 GIT binary patch literal 327566 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%0Ar91b#LP1aFH~m_bOs=0DR~m|j2}n=5K8eBKbv zB(Tcr^UmuvsI+~m;-zOd!d;R+*U&uQFlS5V8So9rJv_p-)hWppxp;dF5SKa7)b0?o z!=4>J?|Q_C?W?aaG2PARnd|A2PM%JZY%N7$LkpqK?ffS4>+`us|B-r=!NN_+!gkT& zzYG@INeG~WG8T)Fz)K}TR<>AZBpLDn4MY^keG8KA>t06VRVMYzekZro-i8(sZxZ6B zlFA;u*Bc+pXZ0Obp&kH`^+qTnKBwjIt<`y0Lw%r5b*RNylba0u$8Ta^MMuTnJ-Cap zhJ?o#)VFu0prnhb0L!Y5gvn&)y34CLS$?WO#Mp3-40R(4&IIMsh;KY!jiCu_qy`Hj(t&J{6Hd*P9M&VlftHtf;S7x+>+#Mn*@v6mvRGQ;4m!2I~>agmnbP!<*hwW2C+HHmzk|xrtejP*tx#{ zMvo9m;H=c6V6I54sbs2?`~6#XLx2AqXY zQ_@%{ndjHypGg{PqqVvJT7>sZ*W^~br5c84M;-dU~M+XD_m zJ?MWL^Do2^%p+w#fQIRM6Lz00WaAeecIY1}r&hk5N4hnKq?g7Z?0#%Ky98Amh`dB9 zP`J7ER7{zbt^rO_pxvTF%Hvq=eME|RM|Ph`_z2ClegP+`ll6EOwC?Yah6}lyrp>P+JyzUv$E^RQ&Ep~YZXt=<*QyhIGWx42V zR}vzTcG}tlFN5QUnmTSzKC`iye%P|`QGFsGPrVh)!r@lG#fUTD6!OBGH0@^&uc>r* zgDZcxvhb77=bcSHyG;YS&%HN#H&hGBBmEMe58`)>{(2%$AM{wv^dzck!AXBpX!{n! z(_jn4-{}RGtM1wp0Fv#R^C{E#+CNbL1s+pca(;_Qw}CFk1|eP48hU6X^BRL>`1UtoTE3TRyAbt*Hd0Cz^@o$6SAPZ4F3AH}8GHE6D;#l4 zuELW013*wrO?*e(ftHs0TqWe5M(zooGfb)|qJaB3AT+F0rn( zE1B{+%lE6o(8=PA@-WZ7$IsL-o?UICXVIrYf*P;vK$0EZD0VyG4jrBaq@`r{Z*7G4 zLto`4JZjs!2<_SSyLO}nj=Z;8zvj)LT)uSP_07QT%K^A9Iwp)@MM)W zW&B?&3kf<0;0dkdr^$?hOC^E&(rukxNThXAVVHOqDh5s@iM^2_>^ZbiB601x;5kHc z;_}4kdlF|s+1fj_Gddj7#~@}g9c4%{T(Uya$EKELghKI{DYHV3Sf78zTZmD`ujIkj z<>%I{|Gm(}rxcZ(w`xg|j6u8Jc5pbnE~QY;AdAC{bDlrCjegzo<&wzzav%Mfu+#Iv zq>z3ux`fM6mM70o`Nm&{x$raKwvQdG#c_%z@2RT7w!T|1)o;GDYgUT3IB-{k=+L9C zL^TT!)1HNp5*heb^&q!S&Lp)(0OY6W8TZrV&E+4qu z5Tj&e56opx0r(@5c2DAM_@e!f&s$dZL->aULW2^ljl5E7hQ9XS2a2;;^3U57Ionik zg6iLYtG3wEaO7#8Uj!ixxVjQ(0G_ln{#-L7n$M1&EgE~nXwKM5Wc zvtj7ZgybynUr+};ZkHaG~ z_il@s-Zv5p43hR9S*-m&F{2&u&LeL5o0gHcU)ifW(*D(U>2I~x;5Y-opierI5{KyI zL-TG*9Q4QH5nc8j6bG%irj&nJHHB2sH$6qD$WpjJaNdUIRTPYx$l`bC$uHqGJ!E#0 z;Z*-uS+{{!O?W23~Kg-O>pk3W+vsXWzjU`GSx z0{u>}#eLbRFr2Iqu4qzs6wQ2YnBqj!Q03)iIDFMR^X18D{>#-eJ*{+FE-sbT4}mC3 zXlc>Ai(;5WI(S$Geb*N_!6d1Vc7PJW17^3)`?S9E!OjjSK`@aqn3k$%B(5lt<}dvq zZ!p#I&?gn4D!^dGWOnj0h^LfbPvTT(rW;aLXNFf>$U>OQGN3()?(LwDTl7E2=NST{ z`Z5Nu^CQ*EYU~g!9o8njGC^>5IgDGm~SmSEo_lr z*vITHF84h*r${LVq5tIy)=wU!1)q8DwG!r07#?uFM(g-d*fe9oJQ;rt?O`Rgb6!_Q zPoataY$t~D5oR6gf)=k}1j`9$#Rp6X(xRL&$>)T$ z-Cct7_G`na@57?>hJ)OX%^44d(x3fqv_IHNB;}aR)Cg}y@o&Tp3hWs^-S6d0`D$t$ zIkG3laRAfs0#F3$VS%2w=}4gvBl#st+3fW?7dD&Z&6c{KmVra2>Sl+~+zOb}yE*g? z*g1{WSZ(8*7GR|87H6J6hW*{Yild_7To~~451Z)+PlXV0T^j!cwSlR?$>j*=Ql2-G zSyKg!j=hQX*Tq|M{o7_osqfFk0BxGABbsCfHHu<{efG1FicSBX-xw zJlR9bjfWQHFR2T08~b{SA35~3!CPFu9e)8;W8!o?6oyB1ZH|%+>C<)FWDNxhF z>Yl(vk3Efo-WR}8B>hYD$*6%@p%%s&P4Vs9Iv>wI$CI84!(1^>U0$1dnEt_hk)N4O zd6dLSEb3VeZ z3}d;W;Gr7}j*9NeN9XV@6KzI9#V;~XN`C%$FSDrd6hfq$arAy{wV^>82xhM80)9w}|dwPO$@wqC%+ zfWL%i6#iFM2i~BEf{H}QakLn4c5+@jj)o+H1cCZaQPExPfA)Cj;g@`NB zC!D&sjiSEl4|abRm!=5u&DEyqEg_-sL{iFSAVVjDy$qsJR)QJBzXZ8wZB_rqrKSWV-9SM ze%cthqQtoSB=z-m=#PmK?Kqz~D#jGr>t)Q_s+>R6gDt?9R&CXg&2zO?UD+T(dC161 zPg!L{SFO&;v5`&J23h%s2Qc`>!EoSer=!8*JV)(Bezz-r5O?WZDX-_9?hj)ueZ?b3 zThj}*{FZN`o#Yz#yZy+94aHl$R1gn&^uj9kzdXwZi?Ly6_i*_!hG`qqkJ)R)Jr6i( z{Q~ygxh4g7Z*@xFu)g>oXhuR{|JCvN?`=YKFvTYN&lH!m4PcUC|vzn5M z3W0Oh4qoRlK9+Nc#J5kX7wr0Syh1Q#+}Kps6FQ#Ht;gQxgo#7-@rI%W7(8E9`>T~v z%+pZI81Cag{HrU``PWM8D^*I6sb!2W=nn|1Y&%B~DVY4{s)@Xry%9H9M9k;qAFY$% z(qfar$U9Py@~gyIVKXPetz36ih8i2InBhD@zgNZcThT}_Wy)Qw)UR(59rC`+@@=Ik zv?O!^bWt5shIUQQloHvxd+!gTmq%{;zFz%VG$JfZ-Y+t4A>dt_5GxVCRMUJ3ru9b= zJM|MeQ3s$25jbdpKIp_$`rMnON)TL~q_k3eAVm_~cLt`(zdwGA&uk6n>?!??*z~eszGVw8 z*ZJ8|<*nK=HM>sZzM|ETqGIMH+SUO*247!_L$^1z-|^V)^W}yXeNse>$%1T*PH)Km z_P}q2tHwyuV;X?Ra%J<}pvlEmg<*-RzB%V({W}%PYbr;%D#I_c6MB$-RjBb6e++e; z5S_JOe;bd0JFSdSGO8Ak3Ywi)lpgdSAmRIG1Rp8-cdGdMy|s)K7=QNI5SvMYCIPxp zR{uE6v#!qi>ay5xe(n8-LwO{m9Khg>zwAjkUJ&s7KGtC5wZ!3H>bfeN{(XVm6uQh0 zsr_Hv*w;)tQ_6cxy?zB{+;d?_J6QN*!k(;F-|xx(%csg>PuZ04md0~oh4_AtO~fRW z&erEdE)~-|K<0o~RWxG#&74h<2qBAd`Nk_Sk9RH08)iUacu-Uo=nt>YxrunF+bqa5 zD-C-N5ah^Z5tr3zl&AugeFC4^z?WlU=QAzk+LeLuAnd+i44lQ#m*(a&`%*1qZO%2L zwkF-RwU05;V_qo?!o(5!4$~78B9QqEeeVHG(?Rm1O}{_PG?I6|HEwa$E8!e+%Bk0h zuQPkiyT_?Qu{wsw@HLK#(v5I|HF{+{X!Uud{sY>sbI73Zkbax+ z%YC}ckpM}}cO2mpB!u_24y6(w)6Fp%VdS#mk4y6dK@M&u#gL`sUu`}`oGgdks{TY% z0bWepTkyd_QlH_`h^NevYy%vhTaz{R6hBhmi=UwQkaM$#H?Y1p0?m27`9>i&&9xW> zetd7KiXC%ZCO*mH0b(iX7>D4k70xiOgm3Mu?sqj;2?Jq+kDk2)BeTAzNTAl2hFnYo zt*gMI3WVLz;RA4Ohlx{}#3`W6hH%B;jMSn1irvKm3+$|s6XPh-i7YF5MX2dCOUW=a zS2mix2VQ@KPLgX!Hy4I1TVGo+dmJSFg$Gv3@M z(&cEx0`+x^h%^Q_{QSpgFUD1?vvfXuGT0%*8l?-h27}g*4`^ec(1qM}`IPyfSk^#R z!OqE}kc6*Lu1)l^#4lIx869-xw3waBx$!?=pCBGN{3PJgzqkS;BBta(9Rfe44nPV0 z3rK5EL$Qb?4(SZV!R+9>7=K#!d~D|a2;Tyw0cb+0^zAi)P+j!v%c04m6<34ZPnhUL4U={3U0_f%M- z*k_tulO)oW(a@rdy%xBqQJLacHbJ>0uKqqMQtidopYYRXqV#KzeJeD}n2gT=K3aPI zHKbRB`{Rhhv~oz`T*Ko=j_C#D!}jSa?rTM8^fM(;2B$;tNG`_)FB6dd(%kia3R1z%#lCPAulnR0%4$EL- zCI!Jd8-F}#VlUX64M)r1CHNR})Uj8!xL5}r|o z?k*^cqbND(V2<3^+W~CeDBs~EfGCshCO104irz+NOlTHhY!f2AdFcMc9isQH*y}it zKc$bdPWoLsrxXHTSkrn}{<;JmQtYR4ues(c1rlOuUK-5CDTyQje|=M8#$Flxk7{I# z3wlL?sbvvey&Fb_W#Xrh^&s$_3HE_BxXf8KnGIZb%9~z}QNKk-Vi(W_#ey-&-a>gP zANlTw$F7*fabhpL{E83eVrY{49Q9zD-34qdEdig@f_@N-CHrMhIGzf%RZB{=bC z(vwJ5St;d99Rg&L1U7K;588(*YvGfcl5Ef_WnD-i@@_$d*9O$FA^2QD(K2pT4(^3f ziisZ|&?#~nM|NEH?HZb!v)I{gKWxO>s@2g~^TNPYq>hU_L3#hdEx%w)Ao3@<>SL~y z$7(exPVE<;7X7bwqEx6HYLnu~`RL2|S?DpuO29PH4JHt`dO!U0H!v4o+KISp1vtIO z-OU+`S`L_P1^r1w*+qJYK6WB(0n_O8clrcl^e8PJrBDD6lvZgzW1`bwKpwB>w25aE z;@$9zls_%Pi!3rGN0J)!=>J4n`+xX7kQ{CRPx0&;>kR96HTRk|o*@%P zDK_;pc_fOhAqTN;{anz``SRHWIRDCIQdBl5ptYcWT_4g$OYSqv60mz-WwNfro^d=- zU}Ut4!FV1hvGhqji_#v^wi|&b3`X|R6aH)Mds7cX_$g^sA-D#X%$@XL^y1hOw9ie z9SNsl?cmgl06)Z>Js7sAtq-^x$Hvi!O|cmm15j^gAuep_fvhx^8Q4gBy=_VT;rq$Y zyxWP72?bL@m=6cHLNAp3jWeXU`%DyOy0^$;tfg+nLo}Um8^nOA(+g?3VE&a)Xkj(1 z?^lu(9=ePs*p*ky=YOgXk6B8R6eqeutO5dmcPFL~_-w*P9y-#1vnp!iD=@Ki$n!gO zS?N3gXogWV{15m2fN)$2LU9Jq(+I~u^UGj~z_T!UUycAsx>`$;pt>ZelpKy-fNAO} z7vAo$fDrn`3%8!9)yWL`x2e=*IV4ENi4JmbQC1;`qfL8~(!E@&69yMW)@%8X0&b=4 zY;3S3YI!_{Nqrmf?(hTjJ&t4Ee93(DYNj_qvYw)gROZ5TGo6z z$%($UoHvc2u|MBmdC(%_wmE~WR||{$?h$Z_6VB=4AbH&?Dy0vl^G~6yy)iWC5xjJ6 zNIpj?Ng~$sH(N|STp0aFeQ*9$Og}j0CFp+fl0Kj)$D`(R`{nR0AX7B|WYsiw?!r(> zQbvwz=WU8|Hb2a9xBNAOK0$)Zp4{2~z@>fN=bOOv47i#l9Tp7%T|%BA#x;Z zsJzRqyz){hzLV`8bnqXFxqLC{?JN6AQnh9uAwFxC#8odMINknEuutN4pCL=auUQ3e zBm9{j)ho11+^XEE#pVeiCJ1S+GYVGs9m2S>fA~9+g8H4-TNqE*hdwh775xIP8o00z z2#$?uafocUcrL)Q;#L+dkaKhUa&wRn@c8bL>vF}9@=K@664X(9x}TQ=$TUW@bjn( z$eyx&-QSV&({B$s!Z@FxZh!vh6k^LBbg3;+_i3B{9}gl9AO`?18xA1Qki6g_og+f+ zLlPl~6@9wHSe`*SedE_`xE|SeuO{sL%uM+k^HN{~>|G1f_?GY4py}y%>25#i)!nNt zJ#jGpo^uw8UBBYz$(JD6_@k2r0baX2clKFAE=6c?KNw$F^^ke7hkWHT>xImNy`6as zI&LERAzbf2;O*>Bl5Bhk93*y2igIgM@_dsQKiY#AvH>jQEcGYQ?o~!vR};&MYOWyD z=n7u(Dozlke10O22b2bQDQ);B$uRCLwlruH{Fww`xd6{QI@Q|!Xd>0`YvB$Dt9_1I z9o5x*<}vTz@wsiPrsKLqYqxlq+@hY%l1uq_#;S6Xzpyq+Or zu&Q(7)6jkBLYIF_NtUdPi9V4xf&Z`btP29?HfN3SwJY&Y<_V7GK^Kij7HD5JoC7tw zrtT1EtxHxTnEu_WUjnT)?`X5M?&AE6IyyjVs^r?{s&>ONQeYK}gswp{d< z@K{TEhkubH>aKi^$hb2e-DC(T9NbMjRLvG1BjA=eUq&nHP2!}Mg{;>CQg=nCiBbwq z@E`oW)6mIGF#4e6R&dr1e%zq93&UNHi~}0*O(!qA=`yRgQ%T-^u^RPA*E6srk=f1i zDpx%opHjunuOtv;mfFu!6NWI&L~~UBUUdTQyB=WOZw}DO|9sajvS%tWLBAnDwM718 zmcQWaxuDW#BVcVHYq5}xNe!FEpwnPPAKsB*)2dT>8@JC*aV$5azhgw4k*1^yDemY; zFHClU6ib#c`~zui(LhaGH}?HvO6!L41v<$K$ZKlk03@TD5Nd|OL7F*Z1zdPgZr#4R zGv?D7asI9u+~n%`u^ldGm~i4_gz#4>{6yy0*16gK;Rx8}dQR0C2)n04E&T5(y$(BC4HiC$35LLphCuF!%tH zxEoA?j^V2-!x(50^jP37a~&Z$4eWTS^%v^;NV%5G@X7=Y65@Oe5G3skhQ1U~u3y=f zT(ms3-?h;&VlGrHvgown9)Z?@*{;VtvLSCIguQIZA|1V%Z|EnYQ|C^_wlrF zo7=N#k!3QjzHoA~eKJ09TTcmMef_y`iv6ypR5C4qsw5Q2DF_k<-;@?JdNMEkQt70j z+E(8m*}K^g8C&G%-kSw^i{w^v;5x!WDnrEm$X>ZeCu`QB-f!OSJ=gAG&Ywh#pg)NQ zPp5ot`KLN8z5k5OecK40hYk|6O6A)J4TmndKCHvs`_7=nNdsyhjS%Dw4vDK|#|dJW z%3pZ?SL6K6au6nUGqP^RqY^AvPSh1(rwDRwQD>(Zu^;Ac{UTN3+EeVu(XeA%y}tdq zZe}~I?8~M0O4YOBe_!8K8ouTyQYU}$R_>U>>mzP%jGEKoX{nBP3sya8Ez5u z%_h@M`&~!9lVQ<(`P3}w58j0fX1ki_CnNexmmB2)=8}Ijmlksd7BMVvZe>a#PP3ms zfA&NezXW$cI)4+{0&TVg-h-l&!~{P7%U-{wvrkVCcEuuJVj5uWt*)B6MPsH4fRcR42mq1<_YAt1e+rf&j0C8%x_)@ z{r782hJjnA^iuB=_)~8nI8w8Fno2rP{w)ag{+9)z{M&c;5TgG?f$oLGZ_U^ z@V5PQquob;LZJd>b%=#Lc)7lkvxWY?8wnckn6af6vkPMck}`;@4-dZQ9ZoD03Tj_}^gbMovxXrhEAL`E?y?bW7*!fX}Yf z8RS?}mWG2R2P2jLvg9!F;z&x}`;1EOsKEQ>ug~KeFbNg zM8OdDkED@`9;D1**a|A2e>{M4WN~2#_PdpXjU+OWQ(up*kLiY>#c}vMQ#~~?k*e;h z(&u1fQw?l!XOW9yNOEEeK-*j9!LZdFG+T38EAGtv#p(J-|M>5fi&Ww)>R9>EAD-bAY$x@IfIVzHSjLeL0x-$11VD z3MJYD>!&wh-?2If4KrNb?gd1L6Z!3CK52KwM1pTeA53Gx^xyIIm)C-W)ujLFmptSGfdlCA>&)Xt`gM(6i0 z-;0cNNvo*xl*=85^)4Qke>+D|ODsr)x~-lG9e4lFRRm<+cG0=&A9Wg%Y>&H@UqCqH zz}HqWFL?AXk<`HR0T6*Nai0GkHAsq;ocAR>f;Tjl7gTy#VxE;JTR#VyJ@;~-`KCUO z?5PJR($wb{9p$TBp!aUSy|nAGj9?L5_}}Atg1Z7hYn}_5eOQA;$QDH4@#7h=vfrvh z!8WklvbQ_l?>7igmtWj3XuuCAi_E|?w(M@z1Rw(gWx4-`Uq>-xL0=Oh*G~P(Nh%(V z=)`XOm1EiG&!gCn6z_xewgjn(3<g`)n&)io3i;)+U%G5|{3ncU-_~!Vx zEVV~}9F-Lk&J;WAB~sU4YWJH5yT`od{kZ85Wue9q)UJbcDj0o!gFwuA^SfRt<)BvD zc+@)ua1H`X80c_P@K6k)7LtcR_Q<=yEN!CQa)y;%OBrAT+R`6zM8NMl70o*OUmsEo z2V7dcmmkvd2e(<6?wJ@&iG%z);Y$X+2Y$t=9H?p1wSlr#JN5IT&h?H{z!xM@E@$2%LJ?JOR$($ zpz9A;|t}d*|ejOh)iXoVJjqw=_iq)8LY=%7q)dOnmlpovHJr}CFqCvpsR zW-EH=3DiM4tq~4zZExC1r@wd|`mxW3=DX}r4nWhzat+FX*azGHCL=+Ua=! z70+WebwZm62oj?+`PwHzB98;n=S~FVpn@-h(Sf98Yf!b3s49Li%Id9Fz$UdUd^3$$ z>t24$Kqtg7Ygp@I&WHKa0UjnR&`wn%)&!tj{L`@jB!~9Q(Ac)S71vLM_D{mN5V;dp zPft%=CE^j>tlP-mLepl@+;h&H=Y0GL**b%)K9GH=PO~IHjY^3_ZcA?J?N%HDX``eI z3;Hrs89nj=2fhfJK$04ZNxcvt`eLq~XuuS5K9!^DJh?G`BH@xEP?=Jh?|i!2DPVYY zlMn6=Yl^@#rEs6K64!8|^R@*~6{%HOLN7u`I`$Z2bXd&H8M&m4Rt<%d4ZQcQvI z%qb0>Fmx7@@_B-yg-)s&8sr6&hLA#*5|yhMF$TOUm#wWW2et+fIl^1#`l>CIVBF$p zlYV)uW?6TJ&Dj+ATx<9F(imq{>d9`V$e7UZZ^KV@*cy6#yZ^gSs0Av4%NG)YRb{#V zf;i5N5mbNdu2*C!B>UxlW70YRWxb{NfYg}plHu2E_jaN<)^=jQiKOl@v;?cRtFZS? zsVfu9y#lW=60J|YnAcj41Db%D#_S*{BxXFE;lpYvBc?2oXbbJcx7`gB1)}~m%mm11}yBBq*G(kYm^{*;w zg>RB_%3!SWn}PbO$>b`iGxY+?Yv}}C{0FnuVp=@uk()z90<}S>LSxl$9r@ywZM{W) zYG_aRUQOydB9#L}uo^oS?Ja$<{?^P%Pp>rsiWaZh5cJ-?Anu&-k1^ms{U6pj-FVL&$9s~B^PRs%^ z{n^Xx4?q}GEo^O*h-CNQ-`1eR{0KvLvT17ydoSu!@tqlAA~q!y%iwvNi@5_D5<7jd zp4<_2<>G5qm`js9>Nw`%JYhbxl8!}cj^8L4#svK!)%3oJ;wuSS(xM$Q5g(UVf)3yJ}Mwvh58*Rz#ZV z=R>%d2j$0+u9XR|>fy6TSH`9S_Fa&79tp!y2M3w}Zpt15!g$Fb25}2GN~~4LnWg0I zf)hYdB60gie~pk?WBmqa27jKu5RbcrxNQ#&{R{9&F}!gjjq)!Z37s@8GY!+;pT#*E zr@RF1$u`}Bv|n5H0W))u>7U4Wm2g}^Pqe4#)!I}+AA!`Dq*iJWV{}XOwU0RBq}vPj z=U9$M9==;#irJ)e=|~k#uhui>bFSj*Me}8VWsaU``(@0d^OqBAbxICm{NFGD*to3U zzf1JX(>3#;_xW}oi(-Mc9NhVs2rt3;{3Csm@-i9dAX#xgfLw;&=6{#V%y#M(pG@aB zuOasx=HeBX!3+qI5fo0f=9|le+Te_$e9nRSgxY|?C**ipnlH=%Z=f1vl*U5HA3}rH)H&je?=p4mHv0PvhF@t z|GP8ys177n-oIT$x7cFrI*u<0$Tz>Y}DILy%C;C#R0 z(FklMH)ZN-a;ck?q|C|$(cc)L*FXEOR%}*;-e;X)1AD4~xODVcf-_7%g$pJXgz8~F zm)VHB&(I;&CBEbb?U&47531Xf{#w`?gi(Q#S{2YdYzdfqlF!>EPg0Tf> z!9KiMtLNpL0->aJAukdd$-o-7n;Qm88<2O;31`)0JqC}Pzo&*Q06M}VF}1wWZ4(Z+E_z)%F-!> zg8D~777=c4rbyf9d7`hos1WMs7HSnx}nWYp`BK*%9bSpf+5)gvIvL+u& zs<_+Gd^f6I1L2D*@CH~}RvMQpTon=xh8S?8k^XV@)g;selhJPaq7`rU9C>^`Dn~Lw z_V<|Cp^ozb2dzu&c+{?C0bK=z3mbF>Dd^Q%kRW(b7Xnei>H74#$AF9R`_&shb6Ga) z(``c1{KFYEowkHqmP1W1ZZ-b7qX9lWsPKC)Nt!4Wm?NU@#HxBvn2QYWh=%{ZnSvW9 zI%w|Nyso?GdNjpnN+ zA;0OiZTKmaDyoW*Q#_KQ-oxrCcdS&GvWg9?4GU%bvIZ>{ZWJ5FE@%XQ5ocn=Dw)!X z$ePs#Y+#Y+x^9ypST`ZIVS+X_ZO{%}QaIEhYA+|b7I5%!exL_W=ySHhBo9}K=IAZ{ zX2@=vd^uxM!aFn#-ALVccAf8|=3#LUqtVa_E_^>CsLRhQ+?hgK{yjcdI3;R>9bV67 zUp@&W*`cS9*K@XwfaMOgPX^xy8@43ZvJyL8(i_a?wx|#sYF9bjz4z$+rG#U0EwL)p zQ-iNl_20SHh{)Mc)>LOaLwQV;cqIMr*JAjpsE(dLaaH3hK8A7nIMN>HnL-m*+ev2< z_UzWgt-O>fbkWbRFS2hth(QbK2axZCqX#!r;AT=bC%5uN?xIr)IbfzT7?XLUcoe$v zRbaQ@y{6R8M}+&}LpWb34_?mv^duQF`>O`u!tMg1+-VqWdajAH5>I2F1s)%*ZibG` z&@wT6Z5HdpAz-qcXY?jR&77{fF|tJ%eTL$k$RInb@-$Vrn1W=lO>AMTXuZTurq?S~ zy{Vr53IXOWycq6KOt9l8Kw&27wn!fl?dI9E1@_FCUGg|@iY$huCm-mBBrly=LwN)} zf%`mR*KTD2yI$CPv71k$)OXqXEn$Ke0f3jIYm4p?&C-?PTv

lzocgfNe2HgcwsZGZTVOHuw&EhUP{P(N+lvpJPML-QMs{UQjx)|CaqoENo%~a#%O0$r zN<7Awvfo2hyJFZDk#Z3qGLd18B1Q0hb_lJJC!v)LecqC^HN4vp>d8T0%C3uLi9t_t zz%EMU{-}B2q1ScsX`7Kuo%EoD=$)YG2R?dK-ls!)IVQYw9^fpZ{MKZ{8TEs-O?QCM zU;~rz$Bb|5z&zJc9|aCS6TzQw&r}GDYpgjuNK846(ep_`Ml9 ze<)(qH(aQd?Y)8QY$zOPV^F{JI{ZCX7|yZt!;SL_geEFnS+}O zxf}y3#NrvY*Ey}9>)b2?8&>MV8?}1g%yRMNtP4@DEB6?#nsDZ%fCV0mbWqQzcF*8! z@p$2#ye=*X5+yly=^M5rdp;%yhLCX_@H)K{)jO#j(N`(K;zIcitH?`Ghl|%KJXU>! zp^horxkia9AXFirS;tIhWQcWY&^?&M-w~6Pl42yL?O=Pc-s8gZT-(GjNKbO}`e?|p z4!dgZrePxj?$RuEt|8nF*YNwV-CJ&hQM0-Ac-lnc5f|l=Rl+5@dUb_d6si;AvJ;{`Wfn!< zU@KZf$L4&fUkRG_c+Zu_uomVXkr*pN*>?6eq<;|+QUn5(xr z!^$MZbY=7iF-?nP0+3>Vx-Hb~b-VArND(FnJ8!1s5dh7QyHbN{5_f~;LBH3psmbdv z;ecXnG7vIXv3L9nspP9gzk_g29~4(j&@ElL(A$%GH8;!$+F6_!;McI$tI2pn{B-g5^&lb-C5ZXMUY3=9uxYUyjFB8)GA>*Q% zyZqJRg!;wyrK|kRGL77j2A&eq+-ttse%|M-4_JNWjTC8@z1dren!5wRm$<2|RpK)+ zoK|P^L|y_xy#5eg%}*zkgTtRJ-M9w`mOc~GUAl-yHNgA20+wA~^F)K3+8u~p-P4|s z8@;V$#A_Gps3Ny8e5{cLwJ*&P#T7RAIxS)X{?B@U5X$* zJG*@m1Oj@9F+Zb(-o~c>J{`H!Lb5!NA$F~cXpUln_PzwZ z{Dh3Q6>=UUC`n&Aqs1f)M&9aPAPROyWT8xt9C5C zEccO49lGIE(`+=qGgyXTSkpDRg3)fx8`nYv&@!-5;<;w#W9`8DwZ>&8<5n}m!;H&* zwTQ2kq|ch^Zz1%7t!W(kd20b)g#bXZ&%JF!Srv?RUfDZ1co5Sgff2Zb?K}w{>UV_! zXQvl3-F8<}p^0bYefzIac(niR*mXWaC)L2vxO4T^9yRxKQ()-T4jG!%#B4$fE|WsG zbO&U|BUyfH8TDrpaA!}CBgV0mn1jxfvv)T8!8hG&gy%a<0Lpw?71?4KH*Ph-vtaZ~ zH$~Mqjd*u_M#nyoH@u{ zpFKXv&?thZMq5EE;0w6$tz1{6<|yFME~A&7P-X(@@EM^AY#Epu5dG9G=G-~Odlj7@ zWEs4F<`@3l@{5*Q0F);2ViHl(L~WtIhz*$DE5yUeIh@vT{r%XlfWKhvk$sdb-R07S z^w-yYr}KHxJE!XFSP_HbJ-xGaS!Gwz`Vx{;zH>@Uk!QfRwwgn>@{v{7&(F`OzXEvc za(#0eS4abFNYgrM?#Lo#JF`azrH~4ZljaowJGOf*jt0!$c@ZlSxKVRsPGCUhYqZh> z|2TGg0pnw1j$j+s_!GCLAE^QU>w6ug&bmJL`}?SU_gbEcz~V|_Kv4! zRYLQkb8$i`JWhNR#iYqIa&vRR5wc3R`_F~V;upWFn>~ZJYue?Rl*KN(=6X7KxySDb0@W%UfzF9 zp42P3w$GU+HmJ)qV>Ve{zFoey4JBJ~i=jzOYVDOJt%6RAhLd?&bU0wjR%~XYyG7ah z-uuOWQlbD-#&eaT6eK3COr%E{AWU+Dk)o1BiXu_m+50aQZBI$jQ1HY2WXAL^8XsMA zDwMM|tl8(VtpQ@GDS1;{J;=zNfo1dkPP;kK%sQ0hsF#X3a(siw$&x9-XMBPC&m|U# zNCtCN9I6iRdr8;sWnF>B-mYb*Q`l5I@>D$4IY!23@AEHb0j-YNcRE!|WK_4>H*;y!a^ErCMRH@;R)Ru#LX@!gZ4brc?Fa}bQ zop={})*9hVHU%J#n@AtJy_*!JLfJ2@HlV_p_*N6tq-RFIn$o}>*QoffyyKzzIL4=F z3G}&}kxh=;StCG<9;ZarBfdN19|N{8($nbTRIs*hLk1faeaAGXnJYrc?XcsH6uYrR zcPGq!6-TWQsu_SRZpCu`=|}}Yl=v1T=5vIkN9RoR>5=)e58u)?4kn>5M-eOm_5knK zA|8Qwop?kYX9yYMxmbO3jzmEX>E!5$<+~&jWD~NVQknZH7>lPAUMV3ZHLf8wIj=8w za5q^zVDC$I8R9&GLQL+s2bIj%|9kPX1o`Zyu+>mDvw6jT*`ta0drAlBJc zs5t5nw2L{9stQ!j`|8)mgE+i6D(V0!np&uvdB9k!H;!%#ll;A_ca282IXp_@eIyNU zx-V@Kuj<>vgkH&hIPeEff^q8=YjijE4Sn_vO;!gjfQ+kd!m?F3F#BTSWQYRXzd8Sx z@f9og2etT`4)ynXlz>u!s(S*b9^dFaFm{ly`JDAZ{sB}_=(t1gv~|dI1OuhYq);=H zI8LBKQrj-5tnIk6DK_L*7Tf7a;_2WXd?gZnDH+Fl#SBT8#~jyk7zO}DO;$x4ogzQ- zffA_LFwD$eI}0#khSkBAz~itd^i=t=p!InPbZQ394C&Yd?UzBg3Jn(mFV$#0mw~eA zeX?7*IsMeopZssjAW)gA=-n662dnI9eRXvDJTQFyu(*1M z-{++90alT(g+M;PEKs+5T;)^Vh#|SAb(Q=7o_kD%y*+8G^5>FcN=a+3?{9bit&M|B zSI1OCW#N0nN4?a)w8_7;+wGPG^PaG>lYkcwbrKNtq1b^S4C+ zi{Nn$IESap=EKpn$k()zB_*7=Ad`7LGGr85+IR^}yE%DAJmWZmc5q}*Za>lMn@KH zmq*&^vb89p4-L%NG=aA@tEA^}Qpfku!>nduTyjBQY%9srku0Ua@E@gs8DXBXzyE94 z1Yw!^W_RrIl;4+?q({yh)i26y`!P;tl_EttnL}QSj+uMp)k3A^E?bk0Cd(fdhkGQY z&8to2_iHQK9*4S%!87k6N2Ve#H1yfw3z-MNHIaFcrtp>fgr2qbAJDTFXxY!?DVv!= z({VK3jyEjn_grG|tMQMiUgNnx#fE?P)a|HwjCvrE}3 zRz81O8vB6#@u7D3xzMnTd!z)x4|=cFn}U;mMrMy}%gXg`IXOAqKK@-&#ttc*0^#L% zKogHJ_`;C6eAqPqa`aV%DfL9{-)BlaYgXvET8(bYd-?M7%99JjdsFh|ZDVEQW6Mwa zo;r|Z`F_G)Ir2ew5Jpl73Jy2gCrFSQeQtDq^Ki&#(Mph|*-6kM(AFh}j^O1|S&bf# z6N$<>N&CnlGP9v2L$h9HVOQ7M;o;%trIKzqvK^stdN!tu^by(_Gq9BSnYViyJQ1GX zL@m`+XJ^w$L$QC%!}`r$0$}Xl|D-p;3-lQsr8@#J&Y~#NM5q=F&TkVklQItf>;R6X=o2ZI!-^Rwi_t)%_f3xmm3A7|L zdt4^OYK?ww&r}sH;qod8kBYW-{g;+WZ{ab~k~TesD7L)(?n~nw8y$J~c!{z%aT3nW z1vO+$&M_#l>m)bxofB^O@mEnqo({&cVFmt42#{Js+~I4%X1oi>qBCCOvcy~=7vRjnndfc7QAUV=xlyo+#P^Fcd0))=#OQBXB@c&0) z7XPH1yo!`F0W45QVatmx0rMU0*~i|Fj7Tu_-Y?xAMS`L1(^+D!<~fBbxi32VskfSn z^xp%$Q6ny<|N8@=gn>~(>Pdib-*UQ9sfG5#@Mt#{V52ef`@>^b_Bpj**;hVz<6r)TuhhgpJD^`# zrT34+FjM^*hfK*KRu^1nk}$!t^4m!@UcVg3djHn-D?Y$qqEjp@IA(Qv;QV=T2zw4C z#YOAdD_HlGj6tMz$O`Py5GIa+??e3qtO9bsz|rU13KU4*8of$KV!Z-->V3{YQ)@B1 zw^%UTaQhactaq7&ghYz%;g^I9j+p{_sbq%S;R7*d8RB8lI>RTl)!&5wK5aGmMkJUR zJiL9&_)A*0@nqnY%GAG8#HQgNY9B1@8JQdh4~yAzIb~iRUwL@r!0 z{Fc1z&GkpD2lC}ytoGIY>8`cY<6K@vB&MOQ)r7NOU(~%E!b|d_E3&~&D0l759hUK> zHIcJ1a3Uk5&xlR=8ZYH8fr`3$H76^f2Taavmuc!{jqBZW{r46Ni$gl^K^Ku$2QK!2YSo2sZ0+^S+0x%cC@M`{&3Dp=<#O&KH1N#!3ezt!CcY?0XcAmPQ{#k6wA}g8T6@N7b2+Z1(iDrgaYA^tO{5!{3Mz& z181D9`mwrsjU3dSQxJg81Qq0*g|pT}n1DLr5tpDKT^W3i#d{I9r`pD5h_7II0aC0H zaiXu*ykfO|`lUXZK(V$Z`Ezc9zgn#6RH~)QnoIPm?bk+o$Lv0c`0caU0mH$`pQqHq z%WJv%%bFoQ1>fWB!1l4Di)~|AEQ%;*82z4|)#%Quoy+Te0XA$|wHmrL-Oc5g>6Xi@ zTUh^ZXfEp!>~Q1zR6G7M`xrKxd{OSPr)t+I?A9h4wm~ypND9;orzWBnx6^oWU`vrt zO8*0oQV>bGw2Z-6R&2hWDzD^JLAM+5mTD2muMBRK72}orzEhp`FbP`)&&xW5Bm;N% z3B$ABn$jAm8qHMI(;9sia0dH)aB$-BAbD1uy3obiE_+R+SL8yC+gZuz=wvFmX~~~{ zDx3k5?!u|Zc_%lGj{+s$$pK_Ne(^u%lc6@RP6MwT;Za++xdq3i-(Pv}L6w&Fe zE-H%a@~ql}9;hO;Unq;U_#un@)QJUP&Qh?NwwMzcO~f1U84J2qHv(I!(sT<#HdzqBW|9RO zI!VVt-Zayaz5Z#c$~6 zfyoaXm!(-?@+(0>5WLi{@mJ5Q4%Yc-9@dOutE;zk0{H}wddyCsE&<4;^dyTt{nrok ztH!koUSLjY$0pFt{@h%Zb24G5KS-CD9OG_wD;K_et4$z9;(j2B)6embOKdkVyX}wV z_k7TaMRko5!;&O~3@&7uWrD0))vx!pO84zbhP)iB8!hv`q%Jd32;!Ses(fsty!^n*x&c zSTCbeRH|DgKEbTr1rY=<19id47ox^^Zp8U>u>U-by1vl&XKus_Oc+GDk3}a8)^Fx>DU@&lM>6b9@wp$+9XQtW*;n?hL*e_r2*-l$c@Mb0x6Hh0Pcl6(J<%8rc`2OA5eH z9U96i(YT4!PzxJ1ijs%yV158r)fR_3w0P`*(r zTqdYpW+cAB;Y2hMJh)oU!4XyYC22z+k{tK z*vh5Mq5iUMI|;c(TkEh}?QugZ9c-?(6^i#wxkWN2wx}l-H@EozWE|L1B@X==O_eZf zgaLpY>J7`iuT)3(-FE1WUFvYDXds;`9g3L}V*cK(&Wb6{TL{HhNn zkr{v2vlS-3OOa$ivkCaQ6zKEMeJ|)@9-AUX1RX^9_l>Wd%4<@~8@@kAMAf+OtpU>Z zRKj0_0Yx{#KSA?j**6}mz*nw@B>^AI{o3< zKU5+73f|;E@Ne*lrkoK!IQpOb3eqGK*kVR~y@asP4@%7Oj9XcY&l+7|jwOA0EM#MR z{6sm+64+eIF;BlIwsjYHMrN6;Ir+Nd>tKB_N=W0_T^ z7id_lngAH#_YV5dRR(k7Ol0N@MolFrr56?{y#xh~NA4A6)6iKI2;n9o!ZR^_E4d#$ zLo$!&Tfe@;-hO0W>mJTlE0X>c>;8)w=R)3S<4VILiEZQlC3)YkSo!@yI<0KG@o4f^^HsCPaodqY%t{m;rgAT3B)^l-#b)hoYLtC2 z(-qG>3a<7pPEP)YjHl|h7>0{c^jVdP2BE(3f+E`)0h=84LWAiwmDAU}e?G*dAB zKVotf_a3=PzzFWFufZN6F2A(~C>&u$2!#V6R9l4WJ$c0jH}=5w&8}T2L$GK@OV_!! z5qbtbx(+gGa%pn5Q$wU~h;4|%WXNr~r{{q{8~4ErH1!N?7_qZ+tpA{LNCVxIiW67= zy!M0jxz0{{3umByYjIuzrll;9I!uk(g3yUU0__Z^DQ96Nd=*$~425qbF!DL{RsFza5=!?fwH`Y4@igEHEyL8K@gZs$cO`s77OeQKm)W@5b)w z(Juw|Tqxx1^4Xk|?>S$!gy^^cg()$UgL*ZJ;GMG`<&;>LxD2CFA$ruR z$GfRexr4)(8!U@zcdOxYjEB1L;MjQ00UT~+B8eOu1J42qw;sFZ8fCoAGM zZX)0<;*NT@l+jR?b^S%a7Jp&S^e?k+gDK@sC=0HS+dq3~`gr2W4KuHl+l4qfr|M`9 z_v?Iad{ zcZ~H+NR4tnKSAf&wOw^%7oy`XMmK3sTvzk<)MyMPcW;;nx6nd_bm*kVJ7%Ddls5Pu z77OA6G-R?`J_a4zTGE7juSDv4KW#%#WZ`ysELh;Afr6qWi-HH5eUH52>Jtj{0z!k| zba~>*m$9dcNLY3GPax0K{uKMqzsE?*T-N!9tG4=w_f}C({_`&kSyT+~j4fN1IxRU1 zTC=s5XG*+6^S@N@1UeSmGK?fC)AfhIbT_}y5lS9d?5Pba}Qth z@@=`T4?%fZg?Z_3Gqdj9yZRvuXO6ij{USjgYu-F5NmK9l-K7gfxrILM{TLrNt&e*0 zBN=NIJAtK6jZIkrPTlcEMcIKz4Rq%$e*l><@1xKCI%1JoA{N#lvEF2(G@MJnKU~C{ z6K%eUz7s403|_%#1_{UH^G@f%s;B|@Nb|{hnxEgjq#+7pptxtbOIUpWVoAZ%Dy-R23fsYgq++ZaxNRNIsX=et>x5V4{gsw8JyScPV z<6kAb!p0|xqR-djd|nxC+e&6Gh5_wR#e39w^uE&~))i52KTcDNw3KTK8_?YM zbiOG>IemAwyypG5$&`88wf%bdsU-@;4h~g@#u%WqF37_qj>JJ|0Is^OQHb!+vbWu=HT`60% zQG;i}R2)xrt4Y7zC7cekO3UClwh}%sZBiryXt`og@sZs!+Iz72UlCiT_8&S(WRl#e+@f>C_m$;a<%EQ6Cxxh zrFoly8R{SVKwQi5L88FDOH|I5Re`Xu4T~FWE6DmmW-&j>W^teZ`(Xq44NF|tr!!Aa zF|gLk%*9^(L&f6F7Thn_#S(jcJrW0pfB_M-iH?(#Q&1Qnwt-?Wo64l_u%kD-lW-q^ z6;aQ)DO=i@X%)GfYIjOBtS@$57N8CBpznR!4BeFsU%j=n1Y1ISJ74Nm6V_`NaU_F$ z@$PbJ-fW`ICp-7~&8S12X}QF{ zQw4S^)BBZt!`qaG#8X7^LEi}7oBuvhJ}_q4rVbnnuOXJiAr>^Pb!$|J*}VQM**!ae zodQEcqt+JtBHx%ua0!2vy|3q)LfbpNWFrMt;q8$dgP5#&|Lx!~LxGga$1B9eT-P^K zct|Alc>62@ij?T&)m}Z`Y4>DXx1{6~Orl6-Dz@k8Ta{HYei=N z*p#ZZcCw_vjrEamy2x9!n$xTHnD1;1I$@LQVU%)~A(S5Fy$^qeEqw%$69*R;*S*^S zN$DCG6ogZB4PBY|a}3=U_q}=QDIpQn7)x5L(Pcf$ye(*vqw?G6BQMB!E#?2cDqz*D zZ+VwykUl#dqkLH;DsuCzN~;5El)JjMf#f6g@Pa_=Jgmg~lttz~l^)-%j+&i55bL#U zCBftV*>?ncVUy|15ZLzIKoP9zJu?}N~jU36$&?BLOnfwZl|OEB3QJ(UIx}HvZNRj zSoeHLmg?Xxba2)2Z|A4R(;ZuTj+l@K@UT9Ml*IW4hU>1t=@Gl|PrV$}ET zvim$6x>jB^IQ#z???0NC)BCQ1;zXkYI9oTS9vN;}WR7SZ+@c=l-GK<=KHB9#BKZ6b z*FbJkm?R_buH)V4JldFoOTrezf0qiw>B8kPY4KQ8e(^Un(O3PL`&&_Tx?y$Sl-qmW zD%-zTAo`fi-*?+i)t6RIJ&fyx;`IyK8^0x&h3~%JbJRNXF!Gi2%dla6wW8W<3Vmc$ z#8T>gKbxo%qqwSzii$q#!O$soQ>fbqOMiFq!8BWWiW`o=(p%hJc1vT*W`9>& z9rXGsoClYU=8VGW47KRD#kXAqY^|ocyF>+;t^A!BQIwd+LMF8s65*A_1`X6A6~u^e z2cFdRHqW!bfe>%PHRr9Jy0_fz%`Qw7X=8>z2MnDA*dDrAP2so-uc>_O!mgvkUx6g4 zjE)*R^GRCOH;6lG{31ja%M~cx#qvZC4ADj*LHDeT3x;t^MHYaAlL(}N7s_JGiJa0` zKz%U^UEUvGyZTlV!c_m44}7hnZLH2F5ro-;pWaJMx(Hj9z+ix52Gx8o#eG!sOOiJa zN83LTt;@ZCdXw)`yboV>m9Wt26MxCxg>$c3zE^E!y2^%xc)>h2D9YH^)bQufH9=<8u}1jWOyqYVs~Om+8n7%KC&# ziZN>}+OA`7t+}$~M#kF&sU)F*)SWbh1an3hMjq!&=h1%#+E=b@6n8>oDlKVp5H6e4+9UD3=y z=@sa7e0m+6lgRJf-HB^V-=G|i3Nc9c1nN@{yw}XM%yU%D&N&(gSDgvOA_;R8iRhi6 zkDs4icM6WWl&*qFzzA4xiewjY;GS2B*r3i*W(d&=lJah=6E#V{gpc#d8XInmrl(O~PH z=kA2l?MfIpipg6LC!=wMmY)o98Z)Se(a;rVU}_>GvEMl??&k37Y_vZl)1~f7y0&1( zR((HV)9xj@J?48%;tiEtYyfAAj|I^MayrK&y~l$`-wR?292Pu@ZdB0eEZX`%3`?;; z9TI!sO@XCR-Kz27;-uEH4^|ppxWbwj^q08l6Fc=II>X$~Mz7_L179P4CN2BVul;-k z56~074&}QYduI{|J2-u<1PWG%uBq9_mnK#I=T_j5AIFe2S|?NhfEx@%XbqbICG_E zj3nnk4>KG>up)wrB)hIG>=rEN{-#cn;U)g;+tMx&6H=)X=e`Al{b!wLcFsIHYyHj@ zo98fA?SP#R#x)v1xIoeQ8h>oTne<*UZO6-3U2gymF>nQ1;{72M0U=J?Q?+ zKSc1&a+izX)$Wb^!R@w_vZBiky;Ka!<$BPMsJfN^tY*}<&)Um=(LqJ1W|u2ZGH64^ zoh-7NY+=D);B-U1s947_M!i6lh(|#_fahin?1!{UHc$}_12=c|`sPFYkMyr@sePGX zDR5{LrZTVde#`ls50#XB*Vb0I2p4z9)Nf|1vDr6}ibzo8>~Kp9HcN>}psa1_GiqOS z7n_r++-5ThG}!`}?Vd9Wtc#YcR3c0z4(`UWBEj{`x>vXd=S2sLJ!jl?iuyjU)MOBm z(cs(Wgt)p|AZMn#dSkAmC{d&A)j`rYA%uj))44b}A(8wQ^$NlSVTTkK=lR{_2&0-g zr=`1czi7&86n2W80|f1g_i~Umy}55LQk{*BzdcPZ$4a5eW@#E!M;ysWaUKAZQIKhG z`TQneCy5lqRK9z8?-}|j=q44nzXb+Tzc$D=bYr3j&k;;Nct@os{Q6H~GjN3x?oV&L z_5InZSt@lV)`Q}qQJQISaq;IVzrF2MMy_j>LN`JRB zMU$DLP zFWBYPp|m);r|WRet5rJFpu(iq)of5*CWM9*t)%xgEdFs~e67EFuNZr7Qy>jSdH28H zU}O*qiWt~E@0IKpkaR6o6?cw!{DiY5*PJ-{R!qBB3j2^#0cCGwk+lY`<9kYp24me8 z^G(C@WPGkNd+Zzi29Kg-*aAiRHYQxHR3^wXo-+0OwUit0;&dB3Q*}QTzbccPc^bB= z$ytq7z~GO46RM42M_l(V=;fUWGhz>qE4c#ONxmdKptw2R=Yku_6;GEGm43hT5dk+= z11*C&dMuUA&(B}ed++vrP;$j!h^;T7FlU}K0@05)V@2bu;ESgnmMq<5!a6 zh0(6Bi9z}eW;kU|LcvM}sLG--9oF|leQ*gI zD_8Kt^q6Jte4^ePaU-X&V$dR{xEjkSC8S0w3HVjR(H0K-xyjJ>^29Z}S_Fo2DX-u`xcbOVUgCEZsD4M6)*l*Y9O;>Vg>1iqa= z!4RLbAC`m{;t|^sq{FZlE%f@2?(5z$p_Nk{dM%(KWoJJMI%JJ+OOK(@!X&5&Skr32 zs%sTLsSp>-8@K|Uo`A3@djtZ~x&U&yPw#jz>8t>?ef_q>{p77JD6 z80lq_es-uLnK9HYkh;*Dmspd_VSXW%OvU#SS?C^R1VC9YP6xch727c$`D|c)ZNI0k9 zo^ec_uXLfuTDFsC3A3iRKIv6Y6BnLOu*+pa%ZA$Nna1YPF5;K*7ONA zCBzypvS6j_cXY7JYZ!A;B#H=!a7yG|#{~tjAKk*`+6K1-qhE?lglh2T&vs7=zinFx z-k$7nJenIU3hi-p@H$ZIv!{fqxu=^U)B>SiT8$!T4q+}IfCllC4jW&kF!cr~PrHE~ zQ1IyO+c1OtT%Qtoi-6q%ONH~j=IN(C(!n0RW+o6T3HFG4WCb4WMt09Y$NB|@f15OW zz0n;8#*1d#w&GHZS4Z4Pk)P zo#&==Pfzi&>Q~}NenO;?tDSFGB6uDGao5NV9M=lsSzuXe4#H+NMEoNJA1DUc9b8m@ zWGQzAQs34N!3+T|JGW)5EC|{Ea5smo0NML{d@Y%Do{QZ|M;j0{wbG<)x+yNNJ;tTz zX|sENe~{9;gvjuwh5#F$Tsng=w|ByW_o3O4gQUD&-eqy!B8PHhYAm|>^}?!`L-mWV z9meL|xFZ%9bKg~aqgJ%M*(bQ67zwt7VuS_LBs0mkOgd+!E&tZ29e$Yec6F`8+zUBxYLd3aBjf)m83RXv5kJS{k(ghla2ek(}a6qbSj6 zuCk*DwH{8bRq~o&tZZDh+Cm)pje38>R$U){YF|n~WsHW?jYQNHQhuy&j4(pAEgdma zH>NjN<43YhD@^efRi2NCAc+*BSWzHZ32i;CK&~gmeV{GbBe7pLB?Jk{^b1EvG|5YX zRLSDf(k~u65x8P(@ni}lPW$e0R#wctKd0|YPT7=sJUu$|nY!O4Qeyqv(>l$xB+UQ{ zz952TXS6+~+f%h*Rn~D5omp6lFKd3s>0Pb@Dn3JVq2v*TO_F@$ zh7LDFbHT?3GOt_A2o|p8#fWKzl+p%y}zWhg3L>?yj1EPSMd1DG4=mvxnkeE7H2gutfYXPbo1t=2CcJ?nbvB z)ud2iEjW}P_Vk8tdVemGvqT$F@VW8yz1~y%A~~*p`|Dbw(yau_B;TkF?%KP*&ngfR za$~92C1nTNpM(vW`8y4;pGiGJpZ7h@lt)B(kqWQ*rA0||0D3TZ$M^SBxL8i)Vv}hZ z!;JR5Ite-2T{hA3>*|4MGlsD&BEoj~$nklHbJ~$Sq7NaJ3%CW3O=Pn+gmRW`{+r zuxa??t0_8UU=5W7h1=06&QEr@2SU};x@?S%_-VwWt!-|HxqX_ZbWF++$#kUaucAcZ z14l)5)@07Fp2J$$VD|UgNz0V@i7H!asc4?nM4#H%D-{u?LQa#-Wx!*N-4wLWwFb-* z+0iMWbO23>Y@a!JP^b{og?|BTM_H@WkCUjd0*T)Z)a-Q{49}G~R{O*#6jXM9q^?Pi zq{3D^@!Y-ar*8kdyx{J-(7<3#p?Jx{waR3|(?s#;amw|kPkF1|l{OGOo!MF$o19?pX%gGzwk(FKMJ70B8nMM@b()Wd3b!?02D}z8Gv}(R(A_Nky2z#I zj*+>O*j!GaT7QehLBLH|BV3v4OvKi4?72SV>7S*{`NYm~AA>=0PM-#V;&(8m5#Bdy zq~47B59&>GVnO2eJ~*KSMDQYFYfK|OHQ1C33VK470ns*2_&$bps3=ag<7&1qF*q;8 zH>PesJxpa7LUOOFyZZxtnm8&zI&_|Xh{aXOA%mbY{Yle-(C2>+wLeCdQYTnpYT-YnrJfx zHcX#Paotg;#awN;BDEQs-i@?uPSaPKo4q~xIo3QEmOiVW8}~^p385+`Ur?jZAB5YID0$eC(^!tbi~zYUM@7Cu^)M&Nh!MrE3yk%xDoJ_h$0v zW|^+E`%zz%GFXT>dC5M zO7ycTRnB;8Twm)nYy4Zczp%Id<`i^x;9>t&{n=JoVN8nuLx-9xXX{Z<#WW|}9UccU zVPsmfE)3D(sODj|V^_c|k5i>kg91GDG(nBr@ZO+|%S5=yt;Z4Pd!mH8bPb}|X%I2@Z&0itbq_Pb3OyvH}j=(y{2&`i1(4%H=Y|*78#BOIkOacm50t*$S?QBr|H8l9>x<$e z1(2^=s|)NswY;UeO0J_mga^ z`|oC3E7Fs6mJIhjYt{~V)ItBdn0w2pDzrC@Q%XQY`XJri zAdMg;ozfv)(%mU3-5@0(-QC?Fl2X#$DP6PAotaOwX3bjvPxI}ryY6)z&)NIkZ#?hs zc?&%>t8}0u73dr724_`=w3C1z_Xqn(=YNt2ssFXT9m)oM;5$Eo?7;0?T2Sl@p8t$ayLHLDoPD zqX3eQH98x}NAS(Sf|RD|MWW`*DCmKflm7qTfnE^k&k+yb1Pa#aOXx~)9#}KA{!F6= z{r2BOCrtxMydYV069wP?vYjd2yc{&7T~Yjx-%&1Cbd}ew!z~aTJH3C2ich)J>@1^E zVE5_kJ5CiDN282FAyAwc^`ixekh>%7>s4*yCdmM2O;dqmFbz9R0%v&n+|&XbyWd#g z41+nT(dmC@IRAe=!_(Vr#U&*sKrhk^IynDg&d<*SoxhaoQq-0BCIuI7O_svrqJQpv zg|4pLkF@(tBg_L`?7}y8A3Xa*QC%OgP-`n2AKtc zkE*Jw3FA3AIphWz`z1-zm+Q89?O$RygYYRS<;YzMAj7HR8s~YuI<(?AZF#M;^7}Os z-Cpi7;6o5VuS`#B9ysNV(DvSOmC5fesO&^r`+vPMN@)Wc^;W6Cu3mK32&gwF+dQuW zor_C!Xf1bq>DTVIlxK=WUden*C?+or#37i5kWsav*I7x5TDMJ?md7b7aa*joqR}0X z(-^c102#w7DhL>@YrmAi9bcpX0pog(eP{K*5eL)%8ZZh+jegSC7V2^+(C_%ruJtEQ zX1l7>mDA#E0mTfHlTpH;NKa?g zo6c=eHb8rHFFqP$>Ck}h&AC?zA;uLus?&PB-Jiqa2SM)>zWIg6GS3ywSZvJ)Xlymd z0`=x!c+VM}VV^i>YNH^y51=i|$V#5{Mzb0$30i=bHP!qiSzXD_(0-O+j9rhz-gr$o zc5qRoM8a5y^O`)uN^fsPV}o%fvn6Qgm>H^&m_$5aVkQRhP6j(@02~5ra31DR z!9P@IfKXh$6j0iM3w`s1-9O=NwuOnKcTBVk*M7143%+`tzxCoHb6E=kd?WwO$4@{F zc%A9al{DxR7pZ2HQIi2;grAEaL)?FomHvzoqA1Y-wZn3TIUzRx^RtVRa|E&*sEV90> zar*Do{ssgf6_RGIyoWUN)KD!@hvPxTmj+se${ad66 z3e}|f7pu61;xAN-iaFtmLFWmvETfTi%8TvEPQ;A`2`-C_CiDPbRPe#dKTi&7QI{~q z0fQXVNev>0m0_1HI9c;jAacxGaL+7g!&*CMPIJ%5cz^nufSXuk0=I@WCX}7u{t-V7 zp8|)To;EHHe))v!#M5(p7E1t#oNqW01y&$%M zp(v)y`{l?)OH=}d3!g~+VU_rBzPVyRWS=EuRGuSV~edx$?AKFB?hxM&$`C^@hqRuo>m^7hj1M`682Ec26u$Kne`qY>L6Nv*IaG& zu@u3CWQcEw$@s5VG~FqG$rMS=_wwfj^PXC~7yT{}5)NUS zmMMFY&AKMpQ%j&}dr3lm)NEU{k$+BulZ}uB!Q-|`|NR6= zE{Q;B%cY#4Y7T>j3ni<6@PmoQ1`_;uKtLV@n;!Wa08y+J_5Ny3Qp*cW$l?KwTo;9j zw44VBpYo)b($0a3^1v;G$R%YF>=%`thhikMaZ7fJLbD8{G;wHRE&^gjxxPt048`iU zdq5ujM^;CN5NjV%;OO2J$WrNMBfP=~?=Yd`FE)0&)elG6AW;*Uy#^cS@j#d&43(MSfgS5w z+m+Am+vZ8W&-W`1KrbMvshQe(w_h>|AVQMfD;@_-{x9G@vp^Lqdn>-8+NQr!$etC5CKNDbz2TQK4o`rlAcRxB;H}3uMn0sZ?yaqWT zN%|G1r`r+o&gLI!%9r)#@>nV;SI!f{VX1&(!Yuxru$ zp#rnNNj-QZC|5Z^+T(4Co~0J@*jo^6PzNjbU)sY0(jKsPU2c&j=pDyQRISz~Ri{|i zqto;c(W1B{ZacrZP)($CTycf=GMl`J<(Sdrs70#6=6#-aG|Z$@8G(-S1Sh?ZCD$a5 z)?venj{|U=kg>3^P+=2#IQ^RLFihvM((!c3GVgI9$LzdTx4xSjorJ@nHVAm6mzd z)2AC06m(@AWp$tZSZ0AF=Jr-*XDqA2`cIXS#60MjAarm7O?251c^MBaE*BeFChDlY zk0}W>Tgw{NFgihQbk6iT?NQ;~jOsDu+FhWiNCF|ASz~!4cb;VAs3H;<3E^<QP9YzY;LuNzYXU^nQ)vG2D??R1$)0QFK)@-N1rw^HB4nd z`dkNJS;~{ivE~~CJ8(~`In`EQne|`o_(1@i-(HH1+(+=>Mq+C9epjqjYxwxSP)E@A z`v*HE?Y58j2bN_a+FmS{E2_=^@FaQr}s`fhYA0y7k2SZ+w?q)u_rBZ1`@1758Xo+O>AzU!!Bw zY%!(X0tie=$)7!>peuAm6&2BGE`X8k0G4itz|+QzfKa9_D)`yd=ZkME-@-MER;?tE z5>ia%%hixf{smIPIzr!vv+~6hsLzwbDCY#0Gr%<|eNLe_oC)HuiH7F8W2U85*YJxx z3Z%yTcbP_8OL)%~6QrTIq=uEjso|!>#2dl=|N2>vl5CAfh_y9xEtPs3F4`jxOBAnB z9Z&A0hQqm$;004JiXs{>I|uE(nzo*8l1ARNz57DKh5sFYllu#D9Cv;j9`8#Q2+Qa5 zR%{$>@hjfTKGbEj#~p*F^}P};75kI2;9*BxAqt`qzK=xOs&&#n*K_mdSI^5)3(=86 zS!b0GE+?OIuS5gm%35>r*SmrVt}cHpFp^6^qi*4v?ia56ct`y#_ien#>V6>kp^+eR zPH@CCGmvi@hGpT0G6EM2Pus1$&sb1KQ$DHoJ2n9)q7R+}Pe3u1*Vw3WHD`q8&3pp% zbpHBlS8ixN`f4f(w{03+nKGxL%efM0dkdVG$uW=9U5m#wK3^CPL|}c$K=)CPG4=;> z%IkYz^x_l&fCF+K*T)&8^^%`N%clRRNQ>&$z2oGPY;2-4czEbGq+_;bLD+|(Yv0+* z6I@FvA72NF$?Qnb9K%g=$3vc~VJOt-*#Vdn>~4bP%UB(UA*!oVEvucK9hCKTAZGvy zjI=;VU0vNdz;_N2*tTL|sLiE%FxC1EZa~on>J-OUKq15c97xoDRngkyL?S-SJsCUq z+qU=kKoMLrrbj-p8jnJ^W$@8O{i^ zXH~tmXlLZb=0#R}%$o0)rp^9L?L)HoayL2YSK1y7cYhHTh7c4!&%t&hAf~gpX1)`w zCRrxn%UY51G-KsI0)nf|T?e0QP!ku4D#S|oT${yHp1WVCT@UW=41BDwQW>I|^`%X7 zUS_Nw8)A{aco}_+dx`0_(BoU~E^)Qspm1-~_IUA4&v=~kZv)Rvi4n`zpY^m*bE?1Y z4dy>a_|xkvM*f&w@yd7ZJ>7v-i7#kbYNc-BxXb&jnw0>9x{FM6V1Mxlc!jY*5YgQefV9{|?pskQ`LrU|25G6F853DL>s=pxxMpG9V#MC2$%eWb$t zrXK0?y5S&rV;H9b2GfN~=K$p?s9z>i#tTl@=QwbZ^ife*;MV#GgAYmllFLpXCWxVO zyT^0f&&R@V*$l;gB@12(XFc0nwuVR|JUsm?5E=psJ)$$aw8$OIOc_D&Oa!=>8_#n3 z9MjueVhJ^*I#c-9Q-gu1w)PL4tpfU5q!Pq*In+Osi-k$Al`Ii9M(Z_TxEpfBaNH64 zr1h1UvmeYWFsded|L)X|!`c>ffF0bkZ{ddx?L(QvoAlVdT{XnArJ0_d)+l*f_gZP%pOV1G$~TVw0I^8p`w+d8 zpV<%S(u0XurpJC!VMrNx1}nAz+*?{E)UX1@ruH}Q4&m+XPS#OKph!4Gvf2X?gqH=c z_Cf(_@9p0i1Vt#z#drY4Va$)D2jY#q&y9-v?TBv!Xc^2$4~2QAj~fcPsLqh zAk)hBrZ$YmJn7!=jq0iWia#pHvwE{P#wHP+bP)CJO0jlhm+X9Fk~h}vD>ngSR`fk( zbtKCtGjCeN=;$k#%V86i5&y4fq2G2kgQr?|81JQA8f^+7s*6p}zuBFCc_RCAKcD_f zJU{i-`ldiE_(;ZUJx7~iR)1jw1M&{}zq4EW?DvE;t4_W_$$}RS@{F|_{bvA}9}g_0 ztNPXeOjL_nHf7wfV_r#3jT*`pg-EAy>yZ8SQ(OuJ=v_t9ae3@Y%0u8PgcH_n#*TrF z=WE|AWTKPJ_?uL{51~pnsf4lG-hn6S(ZQM|iChpYFaN6%d=OmYRcmoMB4@$v`g?>- zW7UY;UA+#6_~w_im`&vMn9y@8R0ewfcjZZqx&3B6@S3d*AsHN^?bTB+Y#BNs;I_5U zB5wKjpui1!km_Qc$zVEw%A(sA5~f7LNW|{@XANb;U#9#koI)&O(l9z?qE!U4T%$H$1B^n7%ZE zQ<%G4_@!(dx{Do`C&OJfK|J=R@szWi5Cd@;c(}B46-m@O^rNC2l-JP&=!q`>SJJey&>LxQ*>k=%QYS$iK>)a% z7&?}~eokUVr63M%*fHmGcFE>pAv1nhVAF5#Xt*+W1=X)GQK5g@q^fIJY8fx z|2kI_S6|t?Fun`etG;h+%R!lM#IeLfx9ojxd4^B@cSJCwdv}i$qRY%pvQJ+@C*h8}Z|t*cg=;bdAOTJPT;Fh6>OqHtu^ z_d(fr%w?Ggf9L#7!O?+(bEVndWVDRYDht z(wR~6pMaMMEq@@Q|=Dv^2PJ)nF5c4aF* z=A$VC&0X!gG_f_&Y^2ZRjJ4q{5WqnTmL-v5pT@%KS4@0P zyD^nBm#Q*(9%l{8dUcZLBB+>{TbWD8)8v7=xBH`YB6P*OOj~U(%31F*x6^iiOo^b# zHm-dn&aTTrJ`n!{#Pm#n_o;i|dKQL>qlkooY(ejh zz-ecwAFY}|>t#S)$k`97&z(02vsFVj!2;#`kF;Mi2(xT-z==B0Oe z>d@9JQ-2ZlZZMYx#NFI4H7SHtAntOCpy&|jJ50mtXs<@fI+i(ZL~_5PepA{-U)zaU z(r<~duHPiwy7bNKlyD#H_D{@;xd8R3;N5PnN8HPmqczY>NCX~n9ACJDAWA&!3w9v- zs-!Y1EP{iYj;pbbMV7IHCBJTK36Za-N^E_2$J+|_xW1sF0{78aqbLiyak)HQ;b?x~ z5pcV7;!}`@9Gk7H@;2d$|NXKkQW);+Y4-x?CJ|3vs5T!yI5Fo2zd-C$B$6nk>Ln_J69q7of$zQPz+WP>{MX_ZwI6RcP6vgEZ*`*oJMS%y&GMWXi z=osmgi@#N3s#z&&2PXUz84Z>Ge@-&2@#RsNDz|q4Y^ChrYr~%^uAJ1~NOdV4!p`?^ zu{!|oC*uLwrXv4?7ZZ51nDq!>EoF`oUY{m{BJj|%87D*D_jEhvn*{Pzrs|~y7B_wr zOEj$>!16v0)#eduAUXDklti$O-Wl2e?E^iO>kgLI(|~^`D=Xhh|EwIjw1BNucr^1e z+k#K#6JOFbF(x7j_)7`yW;>o#D^ln2k?dk48)%FWkTlkY`r4`8OB9~n4wg=P}!v!0HaqSuRAFrA&`}XXSp*uQ{naf}MmclpP-o+jEMVFw5x&9HLYXw)&FGnSI3LYP z;nhVA7k}J+xD(f~Ln8&mzuk^655G}C4zID#H1uWtGschIw)(1> zj-6M#urqJt+;?jJqUBumh2zQ$L=idbmRWbXhIXly>(GTF-a~L3$*tfVe?KIQ9}+ z(bXP=Uln*TYo@q`P%^fWH( zSZU{9Qh1mVoCyIX7Z62&Em*Yzl^{r+<+jw;A{y0VqcY#WWBNXv{VwyGX3{w~r5`@l zVr`Su&Z-A_4im4Cahzh`zy(W7No;YU3``<{>#B&*c!v*|Bju>mi7AY1+<1WAK8rgK z+>b_luu5O4A#nnL_2OV34s+vLF=ly}?`4Tz-@^pw?P)yxLLBHlSM6=&5Lj-dqL{Z% zSYsbled=AY#3dx%28F~%b4z5_rx6MpWF~fNA>wYZe8l)=C;{YLS{1q$wg@)p*DFFE z-KZO9p%@g0O7S*EMG&NIyNzf+dpzz=w^iwEab+(}f-Z24H@YW2bYU83+?j$|t5(9d zF!%er&5HKB;(z;pMkpt;+|a`iQwGQ2k=~7gbboKUDE=zJ|56HL3_jxhc6PzMnP5h7 zGKSV_7rTzD4d4|v3%W`AS#|-wlZff)LMJzub=@(`_q=? z{Qb7KQU9&}FYI~e&hk4Au8XL79$Z&GYdzeO;ZiBm^~8~)uro1`2Hfd~Nx_j z+=e+}EoD1D+xOwz`OFI9;VS6p4~zNsYp=L{wm8OFUBbHl)2Lp*V>U^3-&-TMSTcaZ zgXX&A+*1d$zIsc&0FS{3PlCjQXfMR^Wx8;1vr6aqj@4 zq`zD+vS&I7%i)J)Gnn{SJZ1C!lsx*ZddSv<^^lv?|3Q{`1U9t zy@ZlJ^nCFQh1H(g8D|-H{e%oHvR=PsC8bBEUK4t{F?u90Ic}26^5e$1fR!jsZqxsi zo?BVO`QZ@OKL^87BRcPXY441f<;U7X_oTs1nLN!;N9I%q=n6W_r-$P-Kg)26XaQxR zlRD28PW$nJQ)TwMw_;o~epP!QFO2@qBK_y%Ac+yocIB+ax;` zpm{?)=lV1PZifa04#pO11Cc_hQ1`up+VemEK!PNhkWA?z?a%aU+xfKF;$ib^rAd0?w!$Idz;6c7Oy##JNA!md#oj@s#t2;wtx6%IwE$!5A0KO#|Cw*#H&oupm03#c$t^SN( zNN1=SEH$s)R~v7hcb->POz727SXIP>q-X{EK^KH*_)v0S3YrmVeSkS~7WJwyeX9=w z8<O6!_$nP?1v`Mn_o@!)X%MS`xpDra8;fCVy*#KM&d0fr=?*n5Y6 z%)|;DKe1i1gTg}IT^Y>{pl5*w6*AUrWAI0)bK7e?b}^`7I#W()-NS3@CN|-3e)mpD zc)(mGa`2H$>}of627pk0tgJ3C3;KuOG@A8tC?W-x&Tdh&w7h`1kNogr4CPF%3FB4j zyKSua1yhlwLkbQ@4<>}0p}E=kQAx^GMzLL8{g9QlGGb)Q zLD>u%Qugfh&TzMh2-9gDeFl@wr!IoJDd|%8D+)XZ^U%f4Q7Xs6>zzKlcIkbq51XX? z!FyB?>GdxignfAbNcW`ZWQx=3jdWf|^0A=PbmHp`AXDMc+*dHVSGm*S12?P!tm3{^ zt#>Zc{zu`4mCEaAD)!cb{O>*d9e=O!$HAZ#-qsH=1f)Dngia2v0~-3}$kg)bg;}C0 zF7;O&OOD95+GB`1Mt;0^Wd?{C1U_)5hLN0pEZf<#Bt2~Zywju6z4Zlpl_&U*YUAaT z$|Fg+0taCOSRTgmSB-^+@?C1mDaVtbmsRGjjFAAB#m+tw@w8F$YYX|IC@U`e+?%2! z`3yeELYt=2$6F&Rdo^Mv52v{GYRvF)@}IcqU8s(_av7!CRUe035)bPBZxIbW_vigJ z{o<}xqBm3w)U22Yj$NTBrVlTumA!IDZ~XhvC~Zt-JENIwzMKlp5X>}Mcy7i@{6lDy z`Wo(5YKwTuV)Olwn~0iNNa{x!(2z__!ZzCXXp>Wau#ZfeRDtUkTztE>7R$*~r061Q zz9x1L$a00Ja(~(6*QvSHSkbITtHh4|pu3^xWBgivEP#DTqy0 z8MvN?&n#vSnjeq6rMv0X0GOsihASM;Y#re_F1Cdbhxh7^J05LSHP5spll+n!QL@bFRl3ykBq0dkP%(=#vCYsQ94@*{JoPP&Z|wd#}%XJnQFGL+?HV!FsVC< zL2>O7NEf({ZoDcW+TaTxUJ6vt;EWkoCcNsucls#U2|pKa-{utM^WK{882Ec#kDiV5Eb3y zhb(-{c=s>{mq^yf4)Jz37&usti-*o(Ja=K0;HSv;u#1(1@D=__;f{Al5)ZOp@o+Ov zK?(jUYQ>XdxwbwE&_ZuULtK^N-B`MvBj`w2yw(JIFNj+M19sTA->!?QygWmL{p}mE zhyIWB?eXq?fK4Jo5_GKblI(k#7P(>C(M~sfMe$|H_~TLFZG=yF!8g zHz8cFk7Qb7(lJR{dHD?Px0~$VNL@>2m0xI#>xPjm_us!B&wi(h`LGY-VW?>^Vqha# zw;UlXvA|pI+zGaL+cjY{?B^Nu13AdSnMwygQ>|U`<4hXuRK6H2)?z6Xu}1wRoLh$+ z5qL& zCbio^xDGQn^zep^2r~kK*Ii%LevtWMgd@!IqE1o+}+IImagAChTY3zC|WVZ$kNA#v%x4wqA`=p9m;nOn+ol zAekThyUg6skWpXp_tNC4Ne)cuz63(tab+GakQ%t|dqe+`u_a$5}2`$MrPGdc5{9uY=)E3|JXCWIJnpI=p z?!N~qeiEH1swu1T-1_ABA_VZ39i8=;d<0mrU|qjm(%`b#-%!m;&fYj3(Gk4+o5?a>8x5A5FA3_o>z*$yN16kCza z^_wr?uNHtQYj>iLIwo)-+iP=WhB@P~rnKWkwO%RTPeCGUP7wXmB^sY6%1mMvK5g#6 z>@#-nd!nS`s#kt7GZET1Hd!iTV&?w1A-^Uu(FgTg3pk8u(=*(w0fevHhQ)#jWSFPaF zitKNyf2abMofinLl4dx{Kg8US*t*{yXoT$WHm*qM^)#VW5tb`q202*=?jV0uG{r@s zrXNEaNC&Hi=4b~%-uYqm8Ro@{=jVxZM$P{lbbOeBu&Am!(~pZf3Hy>X;FaMI!)zmz zP~LC1^JTmG{PjlJhLKB4Whorrx(Y*s!u&(S$jQm#FnvyZH<}MUmmO^~(@wM=+!T(y zt_1Hh+h%KKi?7WhL!~q+SOHn(7Vw%(fQLXeuzzgcpvm%DA6_g`XK~$Z_IV$BIjbwP z(4awC<3q@Fi7OY+MYJFpZyISb(H%t2DW_ZEwE=D{Ye=rBZ zF;A*w%Vf`nK&pl-V+0?KA)QR|2JU$*~z+y8`#g{So|qY{Jc=rjX~S%b^(A> z!%$DV5Bc8rS0XD~pi!{Yw&MG&3tgE240z|+H0%0Q9pJ_|S!vKCMmSst)J@doym(wz zDNe^a_kVW)UojT2Uj^x)E*1s6j|7UWO2tQHvBS|A}_x>8?yRlWl(KWF|Y!$)X{Eaq0`6>*IE# z(&S0p=Gk-6Mpn#|DPF&MzzS=Bt={gNCz!y9L zfUC&=;c?#{^8(ChT)Xc-ZQr82q&Vn|ul?~#d*1tcNf-ZVQK2IiIyYMrG5}VDZ95;eex~cwTsv!EEdCcR<8PIA{BNE#Al`I060;XSE zsyAwj;NLB7LC0fIH+DgX0jNqzp8x2b>l2_nOF##2{~iE&KJKqgiyYUI)2AlzW5s2j zJr25VLaAi{Xe2Vp!3=yRPiAO9`f2CRl80SY`P#w9rQxC<}b z&-!pp_VSYD1;Y817-v3vT8G%%p#pEm@>pn3{wA{n3_~!707pzBC4>z84T`MVE@#5b zJl3P}z!`3W+OpgYdOuJ3{IZwi4&{WY6Z{2d3;5+l>J_HK0;FgHr+#VCc4<$GjrK;f zS3r+bh2jp}pGUx72sf099awzzF7$!+6e&=S8IVVG^gZ)g~ByI-j8L zTx^fV%W=&IewqgaZ1_WV&9AUu!8mpVfPtuh{bP9e$#XW^S0Rz+)|RCf*XysF&c|Z| zDcXCj{PYv{8~sBdNE{JM1YMt9`m%&3SY}a_KQY_OH)(d92iYsnf^q>!JZH+%JP)tc zXGWZUop0Qk$p4{9At3>_ly&_KLShnkgs%2?JRp`pVP3E9+>*dN{tA)XnPteH_RKJa7K1?o~{`ixT-Z+RAp8kcu z2Pa%I@Fr``Ce=7S3v{RiR*J`ioRiJYmad!M$A;^zwMVjQXoeEbp5w(GX{6Gw$}E9z z&zDdLicaGlXL#bpvj%C6=>zj*Wf^0g&Ix`_&>+AtCIv@+mkuG;mb!4!)z!E+LV63E zC)^ndk+FLQf%kwq(St@kZyikEjwB)9-$)2fD`}ascU^Ae@khs-W2isUT>xtYD0feq zUJ!)>G{`+B-?!-tCyKvKgwm(!$}ai#k$7Wj1%KFekA&fqSAM%xQ z#OFl9f@_RSNEJiFz~T3%0byL5>BX*5>j-0Gb!S**%*W?_0H|!45dsmj?GPwNJocgj z4*-{O@;$T9)2-P&pa#bu>j6|#m^iyPxne)v4FRpU^ftsD0gUZ!2D3q6cn>n42P2cK~jorFAug>g}IAJB*6eg87WRL$kb z(M`YxDZZ8Zxex~VWGWwv6LnH-M@4iZxGq0$)YJE>@+abQ-=UDH%zbW8qFn=_L;T@& zgLm6_YQ_`$2AD=X$eFDF3kyRkIB_dZZyV7(zudIl47^u}TQh=m)P%iQ9(r?N#iD-b zt%+)%8}7<|JtYz$ld!$5Zfoy6)Mh-yR2HW4~vhgVUPzk4qRav*fVrte`L1Am2*~P3a!($@O6SdqHl-#I;w)S69FfP!_c|; z2#~e0a4)+Vjq**A7wkTP`y&=s{IM3v(*NP4Zz&6KS(&(fr{bXA6%K=BA&pPyhbZ{L z8-d7JfhQjl;?M(?Lie~$=yMPP({a=^x)g@3Yk4lGKP|O^KUDNP@K*XqxWy+HpduDd zs@bjJcT0B}SQ$R44OZK_8oy@+hx2{(CXon2TUL;$J;e#`YJB2cnGM_;tbPW;ZgZOp zorBnY6GO;+(;XXv4-<3&{S7UWR^<ik4CMzDhF9nmAO)l(d#0;4g=KqE3{NL z=VnIp1tomfgOF^L)cZdSlRt&uYueO3P3H6rYi@oKMuib2wE=%<)mtTMfy0Q&rN4|h ztV-9e1qD5sY_UtM&`O`2HeB>4)*?a%Qp}E&j#xO){)u`}P{k@U5+nj>S>6k2tUrv4 zq9p>SV_N%B<5+Qjr}YyLNnEbOTLfGkQZOploug<`7Y6Pih6AvI`~+Sj?}Rnxya#>? zSaC;p7>REPH?Oy$zH0e1hqEa&ZIk0QvbEFI4VUx_h-da7aAfMO0Lklv-cUH$tzws~ zt^9+KxjU2=q&S&iU@nwxoXTbt{Nr8MdQ3-8_~BexAJ1AeQA~hl=iYox0Ru*ha;4!~ z1DRU%TG4e>>z72`T)(Hf8j>zMXXr zr`w2snom}4F0b|SMv#{tw8JjU6uh+RKYN$-I#bhJ;Qmhbwpmojyg$7aI~`SDk`4Z& zQIo>!nqTT{YMUzP>9MXkJ#=oJlzctrtFFaTm!d-OldR4tYBOi_lo$_$P?6k2{N516jL zIe|Zi(&wLF_Ep2I1PRO70Tr`jpjXz1$2nGU?46Rd(kPs2gq^w$d#EP{_iqY*?yl9moOw?$Ye)^ z%u5QM#6`PLdrE2^1AD=2IrQcCte5v1#gRtLao04-T!xW|mO7HWHVdc4>Id(B`zSNm zw-|tTFdOOZ1UYuna4RxHLIz65^Le7|(>czq<8Os(r;wS++J5K3EY2}>oseG{918hQ zd~*5R`?MWp<5?|}`}fItq8oSB5BP9Dx7bS>E3XF7S>dI>`e88j(ygZ0-G+05%sRO; zjrx;8_fQThf1^suZdD6|x#6d*0sDxr=KiqkD|d(o0on+q$~OV*TB9C!*Suyl@L19~ zj5_d4FuNSjy9!!zBm+2e9-m@PvbV(Q>VHbkavdm7z;axMV z6;@ub zd~m?!)A8(yN!?W3sEcLF^>0sYwUgTB&!$eT+kKW>wGzK21Fip*Cbl{r)0$|o3}2n=xV@_NsqcV&J^Xpk+Es<&trWLoV<^FiK8E1k69w->lrXz#cgkvR z@8$4FDdp@RbUmIc9;$iN*q0tpn`R~>ncBN19|yo?$_*HJTR471V5G!EC)!C@xOx@Qj8U>6PQh|(A45jkcS!z z%m(2u9**Q!t90UT|xz*e_kjb`# zOt$=JwCUA`@!N^+hH~`7aC~mntZ`Q8UV{WTq*$Ep7~vlM`aBlAU>!n62s{KL;QnB$ z+1XnL|ExCe;xAT{CIOI3++`BDuLp?CAHECC*J7Mt%?Ns<2wTLlqz!=gtGXxwrx%^p z5&C{@qbA6m&1vo~M#$bt``n)UR_o8eTPzh9y|bvEQz5i4h+5LDO?hgOEm@JzchbK%>^5EORtOh!S-WhMw`; zDH$=>{1mG_;RdNzuhO%=ZpwJ|S8-j1Gr}MaQ>w4)3Y3?c(;|U_vqp-%#n&9~!H@gj zrOBptkuBBqo9N4>#h#N3*4tqXM|*nnDsn705M&SR93{Fa&97XFdG%|%#2~o#1Ls#9lsXNu zxz(uJRSjq==_+}%A4Nbg{I;R@F_X}JhqTFc^Re!mJG6pze964LrgN~S$1Qk&#-aI~ zzQEt;_VAdvB6**5l$$ftEVN(J@bg4*a8YJ+XoEN&rtRe*+9%%_RRt+(Ypcme+w)&x z3Q|+}+`%>5qe<4xOKO5QHeqRm%D2bE6?vi~Z)7lktuflP_IzXAiRL}ORmd7i7K)CK z_PzPJ{Sf}$p&=RPZw0OPzeOD`9Sb;%#mcG=!<}W)DG?nHGF@>J`O4*PW?D~;-8i}4 z8}uc4Mo7I&dOe|#AHN!YK@IC94>jBaO7Uusv2iB?9;PpU{GKO`76O?e^0ofQ+822@ zRL4))jASd8F>%gjRSMmGI)deg=q?gQeIk9XG`N%q36nVpo9Nhc|Hk6w`J}FvJ#CpB ze#Wi1iei+?kUPAl0neW^*`mb#dJCg$oke$a&n=j&Q=kv2;?P#QF8^cG7H3%+RFpbq z$nSA!ys-Jf^YP)@|I*`*@C4J5VUfYaun1(=f(D~hnd@lIKVQdWrJ%hBHa46d{?v4a zVnW?~jE-L@L&Y^1J9Klo5N~eY;Ia3PB6F5GSu5amFaAMa$r25@wC^8c%?Vo3%hj2< z8Ge+t>pY^laGqhjK~>|H)Ee`OvX8oM{M##sDdKDKx8Ay6d}K#={kU?9|_>W%1PKANaq$( zNfG(ZZr>{V;PCTT=3V5wA|cQ|(N0N-ukkt?fW6KAY;>DDG&xzRsco^86X~Q;U*e=? zVQn$*GSo{;m!ta@Hu!@Qdf|Z>3bviBoqke@{<1PnuLsK?wq13I34`qJkJKp@i_JSm zy&Q4E%V_$RvrzQ_T4TMx_1xfLym)Kig2f4Sj^Gh4<{4ijBt8UQ;C2O^{lo95XB4~%2qG+P zyTLSTlEgjWIP?e*7;)=-qvT>&sd0p|iSEMKw|Ac?Fuyji?y9JPZ7huKN@hT9uKC)) z?A4YkFW7tC0uA|)&(uU@Q^NG0z?NYd7E1i$NTPY{$ZrUfXjQa*2TihoYijznv9;r$ zmePhA0lR5$x{~Y30+ykbiqazyMCHx|0-xBImjpi}D$smW&%!CtWz*X?T{~$!T9r5? z{3X|9##Q@uD^@5ZRx%cCKMPrc=|AVy6il3f4f=Yg*!7ATrsI-Fl7yklO8|ei`Tv&OX%JoexXj>D1OoLxIw9PBlhZi z8El6G!(b!E>R#|zkP`k2?< zp<6zLzaL%EP`qhbFWX)R|2d##{O6tk7T|P@j*P)F<}_^>1@&|4fTBz2i$;7EsbrS5 z=`ENYbV;aDuRK$g;v)&pp<>HUR zE8UqpP?ZG~iusC?25sPTXH>fTHQ`vw#xSwtbhIf!cADR8Uwh6(Y4n_(y-GsN_&;d- z%CIWCu3PDbO>L0w+@wl(cMF@67LaaHx)GEvNeL08K}qRGKtWPErKKCr+P?4i=ey32 z^XL41E*|%N-)pTo=Nfa2F}r~w!^Yp!l+^&CMP!DH^FKcs4~0yBE1n7y^{3cLn@r}{ z4I>zeVMD4Xte`pOuG1`&IAb1)7nQ1WbM|o&weLf6g05JsM~m(LsL;S`GqdcX%%nlVrL-PH3Mz&7OT6g;jrQ& zCrmwJWQDp<`IBKO!z(wH#BHgxeXZQYk=&-8cP%l?%!p6{fqIb4Inuh5s zr6GZg1Gs8NmH1;++~6$45sS$~PL8H}z7g77ncsd3E`!CK9n3QkSB$7CyB* z^x12wb^XP6TZ6lq^1oh%sjI`2SyHj|xz>9?0Sn?tRF`#hro7bYv!F6AMa=ihwWsI*s~ zb)^Z82AED7x(#Ub3iiEC3`k=le!oxY8MoUM;KUG>tI>owYH4P_JbH7H(wtc1HA46s z?j_g8zD1zBL_SLsUHA~ry)^7@zlf~=GqHjJb!ER2Ol50Gvk~NaBgoW%BcYKm|JS(P zpg*a;@&<=vea7?(7=j3`^RS#fn%Pr-&qDN>lcIm94o}70q>6sG7Zgl=)bkxNcpJ1!jZ}#IK@2nJg5o420g|&^Y z^9POgt3$IdrGPxi1hUK0IqDHGVLzFs+Ja=N$sxQB*C$Bwd3>rpf zbn$!~H_@V#Z=@aXqIkT>7?yK>yn4%ps_5{A~4~Uc& z5W>fkz2AbtiX1Q{MsR^6=ECfw7zA)jvR2_c8u8i2G${)eN?m-jv2|5ACSiP6bzZw) zl+YWbQLVgEGy=?>cn&?kMD%0vs7G)=bCU>6q#1c;r8;uS06$CTE()wd-_wD~^Wi5mRP7WL zhjz#2v`0f3`&14BH_mj9LV0GEXo;=i_#tl1wxc;%4k35VI34nRs4I`S&E?TKKc6^_ ze2F_U*`YkUI}|G&J%rKbhr6(&f3I@yYQ~HBe(qNP`9Q-}JjmOkEUYkZm1Iw;Eu{T{ zp~Aqsd@>H(^!aO z`ZfC;>|cqlVmp6Uig~TX?bI#Q`%>wZg~LbgW&S&2A4&GrQlp=^!8HiL)MlJSA0pch z%2X($RvH)`%A2vvZ=r92JS-!{g1j6X9eY3%`f~Rwh&@{+YBR9q(NC$%%FeZ4xt=?> zOMJBX@~x+%h2KSlC)};r!=jZ76yDBpvFu3qc)F6I5~m;pa7nI;i!j%*&?s;VmV2Pf zT)&z#jW!@@vBrKR1|&7}oh6<9G6R5+OqAsPtx^#h2^Z@i!dXR+afO{&o~2_+h<@X6y37XyZ z{_d=S%blj!3&ds5f8-NI{X^B8N3t71zm|s-$pYx+(@dG&IKP+ouD>?pP&_YJf3G4p zxWu&Y#vTfj4UN6?u5%Qy9{OSHl65L+SijTsVKhW=i2A_X7sua}d(ZgKE2FE4V37Wv zkp4vO2ExImfH-<*nRGer3T~PeCZl*VYo}x?%+wyg8b1J4dYC6WV`6jNwz>-LYO0{F z>}nPkZJcVmTI?-@wweY!u4|786_xo?1B``d&q>Ksy_b=eH|xsBdSl;O>t@lOWioz- zh4!5bN4`#LiS8Y5?$o6?wnOXc<=HuNN`Bfa>FprTkoX0bOvjZd?C*k*KFk+8kdd zLp$P8Tu>JN%meyzIyaicJH9@ur1ojFn;n8JDacrLl!%O_R&awt4qOWl+duXT-CIf~ zBS?3Y`y2Sfe<1Fzz z=Zr7DtQTl8^fuJS_fmFG1hWquQ9$H?KMPB}boIHZKdpn=cPWgQoO=BZ?bLfyxnW z*P-b8!+@H0Q>3~;Is<+)kf)#=!k+_?AW%MXu>$d06kY0+EE_*#mv6kurZxJA7&g6JFy%&V*lsS3JM;*&KYAFOJ?9!0NS0d(&p#2j&5bmXiOJN$3Z%lEBKuN3^2N`b=d^=3Mk@tvNSu%Y0us z=~h$!_D*!ww zF3O7^Zi%O|=3cMO*Zf9rW|<#4V;FH`|K0LL>|g>U?{(PgKjPvtRWEP96F%fxdy2eZ zR0(D+eDIHXYA{rML>SfFCZnPloHp3fa^L)>lbD(74T`t_j)tSsI-A@$mgr(NQTv=S zsmj*M-#G&c^m3AmMbi%3j6&12uI`!Kk7^k!$q{hs_MQlARBVz~Fe6=QcXra2O_P4v ziWynj0;2>ujgajdIswh@B!ifo2_M;+1l!i}O>V$WvACl;d1s#~-EHm1W`N zxL8stE``JRuSxb^AO*kXxblD1j)c*Wef`QT&hKChl=~$rRyiLa*2AIq85O2>?>iX7 zFejxx)nhl0gbph3qN0$5aG2w;gxRDu5LuoGGkK7-L7v zdC#Jkz>V~kR8vP{wh>_=Pjw@D>;!U9YMfP*-)$8fKM(gi`^^)!NkRB=l#XjCin9S- zb_p-HOmeVafwMyipUjAl2P9F9}NdC7lHwdD{m@tSEdEdj;+60h0kAg44 z-eBRU?tLGyxUZO%>h zFfDhCkZPnemy27Zicjow*M8+Hrz2^ zzHvg5I3I1gTBsfWQD6r43p zP}su2$LTu9S(ydl^F5{=A~E9zyAQj8$HDxLC%P1m-CCC0ch>WU@s&&zv*R}xxu?|v z-k<3*^dp!OBfn4Qy1(Sy9K=jnHxK#z07v!jpKF^ z`RWlMPnvx$<{J9I627hJ_qsqR%n$SeGLxC8TKDMe^Kcb@t_NNp4vPU{X0fOKkWF~^ zFssq0YXab`V2k0O9wL}_q{Xw1>-NC!Mr1QFhc>biGyNwzJbXDYxijm)0;Ur$$*sfR zk?zfae+gkF4oNX<)!UT#DTB4VhN2G_l|rJacc2?%_D}Ae`GsM?^WB5)?d7D8&P1H; zuSlQJ3lIYRIAl)@Rw+&W+OJ=!ngt? zZ2BcyHJzOWThh_S6}SED3Hue)3gy7H^jv!N4qZ8gY4lp$2w=s;sB;j}7Kms!!~A8FkM?nK+J7Gh_f`+~ToOimzKg8&we21@ z@5>G4T46C-Grk9%C-V-uFlzK&I!pdPICso5;Us$IFVcmgpiRco<0o8bf5b)gxsly8 zcHu%+kqMf0=C%~)ov4ozUW}z}!mZ#|Z=ZCAC@dV4=|0wSHPC5H=KSMeIz)M%5RT<{ zboJ5QQ0cr}$DEM0;dA`!j(O|!tBLt%MjGCo)yIlGQP4MXXNn}3WRlI@VYMHtY(}{N zXh@sJf|vP+t8ptObG;iwL&IceV2mp@bu==71M*mBAVeO=I+yY+$yU;jo6vFfsX*eU z#w&&Q0x#Y-6te;%Pj*>=QO)HP0(dOw6Jx^L5ln782E%^S4%pz1f7f?7dk5Uh(~ezi z{Ao5D3Ntjbg`eJC{wNs>91f_tEX~Bym+G`$2=R6AEwCMU%d<#w27foVjoIkF$SIS1 zDaeWC(l*y4#3OeNEtpGHoR@3Aa+r5Kmzik#al3Vn7NfdQv%F%}XckGx#pY3z+%|Wp zZqSMV*3QR!>NitPTc5sqZNF$;L8*XjQN9ZpYCie}>7Ol6I}FxrjRS{yrmQ~nz80{k zX2*9BvY=#k=W;3Pxdz;nbRbdPt7SmA#9}Je$PgFlv?>O zN)ck}5&dMy$M$XxftasE4MEFH+M6Q3?Kf+cXkhscx=Rm;fCrNEpz+HNP&9X8YGTC#F ziP1;r)h~h@jlIq2cLln(F|DDbWl)ROsYMGr5FuHw8B>`BL;{H~L4VUh{#onrk^9oe zYt>bXnw~(3ySSF?Q=;0XfF-qZLleQ9SHkPd<3!r@&s+TWjmN&+zKMR_k<@Wc#p%=H zZ9BH-FR);IRo3#Mf`+-rJL% zpZO7-NdV(sk->1Fh93Y4@+6+CcyO5E?_nrynifsq3dI4y%bn+h>hTdAKs{IoUD>ml zIV+TDz&vDY&~hHL9@q$T9Ak^D3g2a2*OKH6rPq3gh!<4GJ%iRDUU*R;F&h2a+Nd9- zM1BgcEX1Poh7eSYa~kp2XP)(L$Aq3v!S{1{xz?CC4c)^$C+vvfGe*(cnpiR8?oNy(uQ`#n&EWbuCw$kfFB?sQ0ZeEE@rlaI9F9R=!F4V(t&_EmF5TkX34!r;2~HVRcZdB;k%gu)-u4Ch6bts8BpyLBbuQoK z>(+3CQNaomYfUTTVs=mD>REh}=O|oB6T?mk5QcC$i|)WLSH5Xu+sv*m1uk-9IJJJo zDc;j!^TW<=CFH`^%*rdU9+!N6FClyPMX}*Y|EG}>s3Ok1nM$_AX|9l4{%+m4hPIZF zAhcn^<{eGls|2S@#zzBxrA=1-^}HJhI-aOhhw-AAU`9?g11w)?D1YWdnG6@D_}UiLF)*Rr{3(HZ?q8+q?6f3jH6PpG0z%Q{ zZ?sJ2BL5?A*1^l>>@;nCE0)*US6h781{_O|LY&1EOndLG zF?nx58AXslWx2v3=tE@j!g{XKM0ML8GW$?t$7N{W9(UX;W6*?4&fAkXx$n z;CFWZlNr_ZNy7R8TAaHmwO2b6^@+zm;s%p@P0rTj{#E8bkrkKzn)*4`x#v=xlZ`6X z_6|RW&#q=kZuA!%NN^XlJ>)v@yRA^md;)+I1x161(-(u)J69+UCRvX)GBrLTVF#c8 z%Fr#kFG4{$jP-va|7AOhcOGw5{}ATj{p?YJP|6!0g_IaRE&5r(-W5Zg2q_|P7L%5$ zV#Elm?vh!9p!5H($Jo;Cz1P_GpNPoDuau)H+iNP55Nn_z(EM~3{K4Qu5Yv)9cHlF( zfKo(^iY;E937B7h1Az*a->MgPQ_>r-M4@-}FD5vg2&k zA5cj~)EhHh8rg(IUwk6I{}Rw3{K2__r(;-o4mF0({GyOK(6!^{AOsDEs$#9}myRl0 zXmJbr&SJo|I-PM4=SQKExM(J&C*e#+Y$M~gU_xRm75k#boj%K*fHuXX3*1Wi!&^_s z+7?GWE8%>HYtkonv#V1{Z3&$Bub=8P5Z8-KH+lVe?^!v=jV;VQoc>6*_4d>lAXzVM z_pDyv*;`MxWIVacmY)@H;iNY5cD*Q@auT=yS?H_(Lyu#@@F{;pd${8w`5Rkha%5#p zc%XVn7xxjUSafq97YWCt36DU^7#Mk8izZYfxOy~~%0kt>HUU+nC6tZqx{E{yj%0z99a$J~h%yz!uW8qaF;mcg!!sbD%Y{r>}Vc{%;5|vfEq14GwF!Q0o;A zMi4^d>1C|}vn}OCpXkSZYGZ!4Z>-g%p9YEfTRt}jm-~Ni_WxY&4K7*b@~XzPAO`j< zx(gyccpe;c`lT7HkW-X)hc#tBK>un`4q(M-&Vr0aB;@9*3y@DTh;0!5_Qg|v)NOKP zfoe|mP#%*8-s0GuiO;Nn5HiYMAwNis^jg!sk2?*#HutBe8dMI8gZ7-9B^h^LB_KS= z0(U(z#YKqN2rkwP=BxgVU)6k5hOU%-zeJ{dbVj7Hrk^AFs^GOh(V>3#QbK!@N;(1d ziwt2^v?&|RdmN%9)4q_zB!nGc@sf;cCGolWp0Uma*D(wPh4;+nP%&oY$y}XID}sNC z@e>8AV@u`xk1#v=vRo39XR31$OnLBHAF8I+|9x7ONU-ZvBEPLWf@eCUGbe6-=~|~( zN(tWL&F|I-AGbqpZ|BL@9)-E1Aq=FQ%F8@kw@`41uo*0;{;i%KE3&|Xfo*fIDd!HW z8{>wNxd@O!ODv1?p&FF z%-e?bG{p7ySbB5?9lQ*QTzAEP-a!NL4kO-goAoC(R}_AYJwhF01Rv^z+z|8MJG?=p znK#(=Hi++vCe_a3jrL$7u}lPYSDf8BiDIFrr+K>3@ES_#HpD{<&f-RBP7fZ)SnN?z zrj*FwEwr)`YoEPG;Zt6g+x_-aku7GSB6#X8z8c7XwkRnGq9mlwL*KztUa0%hHL1r&fwf0JL|+5&DEUx1U_oV72lw z(8dM`dq5xV7gV~JKLqJJIvX>%m|c(A@g@eY`K6+Qd*s=8Ck z_^1sSEmnV|Oi5SY&5y6Xj%X(W>u4Av&o_d5V3}vqBv$6H3ifN3IP&^}*(xY_XG9yR`gk}v`&^_-mLbvmuesirsJd4#?LD-_lO;0p=3%c{W0HLhhyxv36s?*iDG_XBN* zO&6Y^=dA@8y#TU#ZOd_#3OF6w{nP%k=2+kW!aDNFZ6kd6w75-aCR>ZT7TiZ@g57s3 zlUOxV!N~Uo{}@n@WjZ_e`Y?Lby`vUY&`)d(on+@LjnP^Tk!SgE460!5o_I1V_U{KEDfB-=hImYOGEk$R1`16K$}a2l!_OcV}v4 zlMuD$8UQ2S&AUfDe@-k4FwF?5$KY$qS?NZxM)=TcapgWP_a7?eDr4FrWUIf!HVkQ` zLfy=ReLER*2fIzw{pH_>Q(#iM=Ip_}=s}AvV%R!#e!nM3s`0d#ywn;LD*twI7#-Nf zm~7skp~#b(FQhF6af3q;kuOBn@!`KeiKj+RQL2;5_zY$LCvFN9>6q`fh@{>KF$MOy zPungcj#`ZCoojk2958WGA=>Rh;i~|IE;~dLNaBZt@c{g&wG2M!USgR7^lb(7BOke zVa!)b6-U6zZ2*Y)w)1Q4fP2S|r~^AF9m^TJe;CC39lJ%#-Bd@LqVjtGhWrK5up6ZS zvpB+sP>S0EI@!vMx>z$p5$wKQ37`KBihOF}^LSbOg!}8ZdynpeXku28#0#)o8?9YH z<8!EW9;8yY^cu?f(xPTU-#EM%569uWMlmnzO82a&p8Vf8Cr8de1k#U66ML?cn%myj z#(Sy=GO$W$^ZJW_ftKmtH&+Iim+NK`i=PjM&{;C*5gd&{ZAI#JWZ*AfJ_g#+-x=;m zv5_(EjqB`|%NXmNehU!N+T4M6-J6TrtsRvZ>6Biv7{;n#215Ygiurc)O<%IWvb^IB zZI0)q7x!*j-j+vO7mumM48xpz*3G;Y`Q#l?2+kx(BFwTH61javE?Q}T-Mz7A?*w*O z=IeuRQ(q)+=?v)Sr9;sNfOR5WCCwu`j7o^2*@nRPgQGY|78}g z|D9RbitkEOw-BPW;JiI!<}kHD(2~Jiyw7cSbGc+>u$rnHSo+z?{PaKB zjU16bag#YE2|(?%7@;3JC=1eO%G7gxOK{{rxubF<*c}3^Q8GlA9*R<8wt* z>5`&QLwxT$?iE~GiMhQ=5fI*WxJMep#&77`tlkML0AF`%#aHc4iUJ6yT_LLWRp7jZ z@AdhE1)Z1}h?QXIJz!k9g9y~Tdo&aLv3aS=vQv1g6)<{6@{yx!*?ed1i-T1 zrK6$y1(G5S;FKcrZ7h}W*o5+Yj%#j@H7u;EpaSUe=G<{gfmH6BsHV*mx$0ThF1&S+ zTs>|<1e8qGE>IA5pqFl&I6*p6{-U(QuYMfa^hY$vD-jH86I74=)7RSbW=XW&@|wGO zmjOn#2>x>okX9YP!~IZF6YxV%RP{F zneb&`WceKpgy0a|H+zj0Dq}Gm0~W%b2^IRz>9F7;6YS|6m}yW06kp6}1Ce$eH^B#E zY@IK46c*4tL@*ipNexWsDIKeVGdXz)f_1y2SgHtc^XU*!O@)Fsi%sZ+`nq#xU~fJplvt|)15FkG9@t?fIwJz)NEw%4 zb{SGpEUW2s&NlV~0sK+D*?a zP%u@&2UeKg_?Ky*4p46q^>TFs{i2MioSjKO2~0#rs_{>L%$!p{Z0W%ykXgTHOkK0| z>SXPq^84Gt?|Woj&s*Yq-IwXyq&#UB=zp(2dkloA9fq?(Vtkg}QB2=cmO7lD{O#gL zfj-egXb*3%PCe2BXipCu;O|!Z;?lmI%?{1K0;372qWdaoaegJ!`f$SOwULaYxGyoi ztPUx$ezT{m&&IPS>xHbRfh403e4M#qb-7@4&WNdURiJHBz()%wBs$$fn2D(ZA`pCS z{a=9qa7YKUriXot|Hlj95AYCA`%m@?VH5O>&z)GOT|eJ6)t=m=qu{i-0$%&6cemH9 zPfeqtkobvGBb^`;G7-TgN-tnDszS(rNtnw1>k8c~vhEJRVuHe2!xJF0asZ`fW-Sfo zLt!>R2{q}wEs_Xz4FuYp<{@s=rhd>(S;bs~6coUA?dNo;SNAoGN+Z`D5Xla}b`+qT z(_OXFBx5wc?S2(PujPj*r2W2gDgN6nIt*I&fXI!70P`v|I;c;yN#D8)O252+I0YXd z2X+5%i*Pi|eq`83dW1!2t@#r7i@Q&mxF%_N4+xs%&5?8l9#(!kGfGsR0j#?LP`AR^ z)`3-WMFp6>Cgel%3x@$+wAi&iI3>a{eE#X~8yW3UMIM{*_TV1$IiYw1fsjTM@1g`2 zsJ!>Q*ObvuggC;0l_qEzQ3iFI7cGN&z-@D8pUxxU?rN21#2qJwSdrGhPItG~7=MR0 zonGPQX8!HtKwcl*4D{o+2DuMe9KW*VfvYq9o5wGH^@~%8dOLRRMZ{q(S3m2NIRrxe zWV+vWuj;yhryCo>iN`o<9=zEcBdoB>uKBPRjNzo3&3*Q2i`lj)RLVm1`tiJ49AX~D z9LUh1FmQ=BA|HLs)j1DD-&k{v&wo-M^{a4}uPMoZJtR<%!vQX4Y%Mk!LI)Xbssc$e z{2z~>*--K%)p63teq-%%V(w~gcu6KI=&)$X=zO^z`XBk3(MPK|@yTK1R8wz5#E{1| zz^P9Jd2L}hvug6k2U!dkRLn2jKa>yOXk1}Ls;G8d)v zG??LBYuCZTVVXgjq>;9uHQW_~1m#aBllt3Rih<0Y>4Mk48P5WW@AZvPxQfZEt)lt* z)_~RPRQ~pOVWd$uMrXN;XC40LjmmSkC3D-h>wJi-VLJpK8}#;kl9(T~!j)Or49R8b zo`HQt$di-${@=C1ml3g#V2V||kyWl31N7OSo*+ZJ==d)3M;kDzgTtl0H$E@%%grmf zo`jpKB8ZaarppMv_M1{sc0Cd@A;dPTlL6tr>_t6dg;TGNg4y_z7;-?`rFV$kzVY5FWo%={2xaF69Bh)~RV72$gecN)dW+}*S!$!9ayT1$ zFP1|d)2++iDHzo|b0Kuhi8wObT_#8!HCZEORU^d}%o!e~6AENivG?8cxq}U*`j7vG zlAYCM4>QM`{aN82HnS~T{I5Hx3@P{j35>NY>x?x>GnSZD1`K`&+EK|Q>+g9UYm&&Kx%X9f!ks@VKR09RhS(9{ z1vC7MT`-KL{Re1lG5WF0CEY%KkjH#Gl3h)x%^&@W1g#zp`jy#L!J`N)Ny`Y9Xi%_> z$*m%Z_NBD&YsgDf{N9cdGK2mS$~qXAM6A{We019l$<5P9^)Wop(`Z?fJiIl&fyqB+lM}X&ed5H=T=hw6zSv2(B4mXK*NzHI2)k!6A;W`nZOc+A283ThZGJF6u>~PC zjk)nnqNNgnUuS?Moxsx9keU*&7`3A=Q`~M8x#%ZbE0?G!Q2&{y#re)kT7PPW)X|E> zCZ+z6!3X|Kd`^>iBWAgdj11|#o&}_g{;Dk+^N4hbNU80CNGd66I#G+$aI`&B?-}N5 zUX3f*V=HXoOzP0?A^8=s|1770A%h7Y{IP)p%wj#HLH>7bRp3%EMg$srzj$Cr?z!a< z#hBC=?8W$4o)(OT(nGY*yd_aY@Zt^?_2j%C?e~q9Yth)oc!(WViWDa^)$y16ac7bG z;%q$v_?@AL_yj%$!gSNyfHT##(dsI>s3Ba^*73_{is`Br;rNN79-JHA64lf=uHZz* zDR?Qij;9w$!)yb(#88L)8$9LwI6d|ia071+Du6M^d?UtT(rNiVA4dCd9uK49J2ms5 zoeqGWH1_>Maiq%uVuhOXt#MZG{3x?jp%IYc+>!^z{-IXwkSJP^;#T|WD0J%rbl#S~ z@Z$I<=l;lbavO_vG`_3M|LQ36=(Y@t-=PC$Ft&l0shYNtZSxI(N2xy5w9qR_f2_{p zg~u^0s=!Zrpda7%omvDTv?C~q^&(t^FsMvj~!SJy5Rx_=_P62%yH zztwGafqjLnaT@FCPul@Oy_q+HZP?$zXa4*u(bduJeM_0<`mkfgEV;&ay2?U%l3T=k z_YcW2)hdx|mptk|1EkF1)4{6ak<>u67kaMNheJc_9x9%gViPua&kOSDxL4 zW85!wE=MhVHS$e{n@L#`i@pV5IkI)72e7{Ei3dvb5D`e3x6~iZl?>IKk`+J&>m~gRN!i+DQrI>Je53>;k+! z!wo~CaZ-8XruF*@r1#Os;w6^pmY?4*Q&T3}WW;}QF%*a)RXyyQB%%Yj}FwVDry%s1>(Y_?rBopWXk+NN4^utGx&}3TWH1@If20Pya9|DO>q$AWd9B!6&<-%xxsrpkl$Mu)Uap{gBPf8oqM{je9m+9b@A?Ga0`Ayv3ua3+4Q*O%F4 zo;Lviup3$A^{syJW+IeLx&x0LB?PH8gI@2`1x~tjXKX|V>j^^l!ySoFy**d_r&do< z2_-o@`(QVy&nOam^bafKspnDqBiQpQyEjBau@9Dw`ycS!aE{-9BF1S;SDBo5ER0;q zGWBZ^)!t!DCw=Bn{>4Nh4D0=~jb~p&m?4;gz~;u=YfzvyV(L!)A;P!CeySo{B9UG9 zqtFg7m|oy^UiBwo@K%Arl7@9wz@jkBF^LOourU7Cg0XLpW+uytx{jTCrU?=veKsWT zFXI?t+G)UUVquH-T&HEKW%I;JNvj2n_W2%FJG|njxdJoz^3mp{fx{4YMcRLRSls(} z?}0qtg}h8#-rqwbowuWr>IU2!=S8p!RW?Zdh^>MN270gFYr1c~Ci97QQ>KrGCMTQ) zw|_u&-sfxU%%)$ITxW4RFLwW&n}QIVgZjvv4{RA@&3;s*9oCFIYYW`qmx%j$%gf%> zS+~k8ZjbHJBzwHTq)T-&m86ZBa{cd_Pc$ipo#>p%>QbMT>nH6sou)jUom?>7B13gY zYh}rZwVb3rKG_Z>S|=p7g$~cmzcIY=Wci_;^$p9Of=rrN?*6WXp^TQ;8@K42#2#1?Yk^(C0O(fBm+JztJj!A3T6KfPBqy`|LnDWt5 z84*)(B1yS%I!WxL>HK|&JLdIDauVKMJ=hR`j!~!i(H!Hkbtvy*N4GfGcGO5HLxk{n zOyXWv6a0&iBLbVixx~0Hk!piSV6fZ}(1>m%r_{YQQu#Z;p{-B#_!d#XHcl+fvO2hC zzax=N2UhBxjnzwHln!_R4bTl?>I~TcwVM>t$R25`@E;5|iy7ZOmu>){A0*c{I6Ro* zMeYVIhxe|`NQ6k1^fA3R_~`1`t1=N1$b=~MeDEVUunjl8-w<>KR}lAgtR_}B!P*NH z_OK=kW)vKz^w%TubPty9!aVc8Ke}!{4mllW9`$qs`LRd7Zpj$q&~#2pV!auqGf1=U za7R&W4nO#j{}3zdrG0o&$E&D1(hpHTJBdYhYikf~ zzShw=<(R4=Us#{zKTIB)6{Ml!N?D-;33WKkF8C?B5{X}*Wf6m}FDOyx>v@+iBQ`RH zh&$eI>l-_*hin{YQ>Gexh=#5W_>e-0>61TGl1wInL;E#(5pJ>0b@Hv@TKB_{!`8pf zm^tQJ1gP5^m-VMC4JAt)xSUV9Fc9}Y{Bnp+L;%4a>@-s_If9x(bzETBx&#_?+cug5 z+~PEH8F5(d=|4X)ls|*}k{McU<b`dYBMWxwa#5tH3jA zl{v|w2DDAbFguNNK!a7g(8p&iyRa|m!PplEhGb*q#`WE+o`vK}e(}%x3ED=tX&4iv z-ViTdg}Llc2_92=-t!0CTqL7ndT*74WX->X9Km6|Iv6p-tw&H*=m}B)v0LBrJ$DUp zJaw?r4{_x;9N`k3*?pk4oUe8C#zZGR4ovF`Fvc3~6v5fW#OdBCt9>WR^D9?~)!Pli z#cNT%FZOZ~K&k6Dk+L$DH&Rt5C5X&j0VOe00a8$z~YzvR0! z%=KR8G^otx0`2nx`*O)eaj(ua(L zRnKE__3`?JzJoJq4C=zTBME4z-G}hC-`j|m5NO{l%&)xW#E)@$A3)Uyb}p4o&Ex+f zo-2x=U3tM*-b+%Rt7rAuC>!+V0Tsp`r`+dyW2{hJ*S=AQ(*Em-&RE{_Vw#$&2sK{Y zZO6;oovkr1Y1b z&4I*LJ48m>hl!|nQ8@FBT}L79ItHvZ@VDk+vNQ?%#~qkE<-{ErAK!kU&#-Wf!I%_D^Ja=)ptxZbHR|`>pp} zDb3M(qe^M>SMUNUI_Xbi$vc`7m)-2A!sn#NCIxkh1Eb`jsH7)zT|^_G6VYRD`TfYp zK+zD(mC*g7tKs|0qCvUjV2Kjk9Wj^&1DkS}_X|ZEoZx++WA$OVIsfeKgfV!z6NsP0GjgGJ$(bHEcep%g z9##Bx;oZAJ^l!Xk;Hf;g&?Vi<%Mm)pHaT`YMWCrZ%MH4e!jqLd{iiL5r92e zY%JEau!cN3RxW7fG2!+{RFXX$i>;y^f;v2>cVR`cjU6Oom|g}kbQZonUOXewrc`n` zfzmnW4|nPJQNtx7jVZig3;}J}5vRaC=t|l>=^j@e(^>~pR61BH;&V2Db0tnhcN$jT zsW!YAYk;o?v31wuE~>@G#J~CV%PZZBY^8LET!{(cDbA8M&WE3m=1;=FtshM{YuU)c zRw@_b+3B;=c7JnX~U`bw7*fPs-qb}ce;UN~)2*?oh1pyK%D`;g;a zrm#M=<^*wpJ{2V57w*Qq|D8K~1>L)#33GiP{r4NL1;s$>ryb(pM_zmx${CoefyQWU z%`f*yIYT{UbFSC+@;Fsr$+c2$A=kGx&ptV#GW7i+VQ%(}_1496rRLILK*}B7e+zz?1qxZV#CDGsa8TwCe=%AV5H(5{r{RKb?z( zEVTANtjUsVx~&IY<3^#g?fDI%b8Eekj4yXpMG77^*aq%lJzRR0^vGCEYfCw8>3!+3 zHB*AVqYcB;@1D|8n??8KGoZc$VlyFmzL@vh9B(!`5FTH1phvi$=&3EX5;{XmTOx_` z2J(p9KvQ^~wxZ0|+KouoROQ;?4hH>^|3B=Yr~lI6r?p|B10p z_Qv1?^~E>cN8PU^;b)$=9jr!qo_+75KO$LR9HBW|L)zjT0>XuQg{xyS?WFzfb)z1~ zGrL+vDBCfA`^)`9;A-UO^DUFeLZiRux$Ki{a#~l%BlDi)>J^d>jdr4~1yv%*+No8* zKQEZkMEb{%uSF)Zk@#MzhP=b-{#7OlX2rSBUM`1MC-wio9jx2CE3L-sL+#dQ!9d@9Fxpu{c7fiL{E{wn&v$mhx{14_B z0%{l4s;XK$)UsSTD=SUhU>O9EBtxHR+m!iiO7qT9+p5EIh9X41`IS!Fux0L8%*UzS z{+y%Y$LS}f}Mk)#hs zaS=mEk?QGn?z-6OpUohbd&$y*6?t*~IEw}=X>wt~`w*1}f`Ldn+MSROtdmJ1cl``fH(LW=g0L~;D)CFcF{ z^wG9#2G!Ob*Ti4P2Ys?TkeMakJ|f*#&UXDALX^yx!1q2}LCG02CcpI8`FJ>P=L!>Y zW01UtS&rY4aZ=C2X#iShhy08y-i*Bln6_8Q<97d93xxH|rd~By> z-R6;i5{NK9xKSud%9DTRd5eVm=bnl%z-PK7N)_#@3L9tb%DChl+bh_1YF+OoVkJ1h}hDDRCTIFz(>0>?oM*qJ1@IZ%CAmFZ*DB6cWRpjd1 zBhY+W&ejjM<~MJD@J-D<8)d-p?GtFAC@XUEA1075BH&6Km*) zFhst%T~sQES|jxjTygcE^B-p~of90>ml1<0W-Z85zHpphFCn=ZX@9N~KUOMk7{H&{ zgktSCSC#eD$Ea|ezic#`K58omg6bdK-%%j_Bz~H!&xnxGJAKF&k1WE7$@1g^SN1iT zOCxOlr?Z0&V6X89)^XH;T~fwKj@*Oby!G^n6;PcwpF%R`&A;A^y)6B1^y2Hy%nP@= zSC8b3zT0yTjkxga@QfRKZ+%NTF$s8j9&g$QT6-RwyLtK{C@L>8A-nksjeQy@*-QnF zvcVmwS=0n-u_<8*+S1>o)G9K9J~wVxnbv~dB6{HW-?{=MRu~f(``;DV6$x*$2h&HM z7kg-RY>-Z5KYxKwg$7gMA$iG0>?d6v88?pTzPeEgGN*reN3>Wb8Utn9&G&YxX@(YI zW233PxR!Zc+ic`hbUg~6W)p1t5OBFG_5^WiFgd;zyy&@ZpKgCWC`08>wu9LeCEubq z`q*>8ft=9n141OHGLsS0JP57KJg!(C4c&LmxJ=}VwBC49U z2G=Tzn+AQnYpfHYJMX94b=Q@)h_g(SH|*t`BdA(^79OtO3)@aBU;4TXW`ue(5%!t{ z!fcnJN9a&dNbl<_GHe@?@+)Ja3H^B0Dli-hlLsagiFF%$Nal{#36IlBn?GcH(QEBB zjufomQy*SL+!85DqV%$aDK;#*LNcDFtq7ujf%xGK~oOVH75Cxs;JO%X zKH8!bB#+#xL{LuXHUKYGK1Hb^h%u{j&72D1o*WZW^sv{-jC?iuSL)jVPsz73S$&r| zB>8?5sUMe3ow(kc&^jzyi|v-SATr0c3)As~09Jag?Q?!5DTTFjzVA;yAB6l=e0yN6 zv;kLH{VlBGsm^$jbwC}31rf{-J9su3TxG5(l7a1@`Tcc#Rb!%NXCN>L&kmQCbP6mW z*b#f-pYY_-h6`NmM0qpbL{n%PRdJ=8+2#MaFI8RSeQGr|$m78>#H!oZALqd`ICte? zIy-#l$iWGlFnq;R`>w3HQ>130bZ78rFV$x>odj6qJR!yUO*_7v?rHrYgSwK9nGjks z)7Z}RURiL1s>_?OsonlA&r|j?g15sK!#kdrkjbcum~fq4@&TK?b{-ljnthGBSnr8I zfGi=)Jezw#vR&9ADT&E7(YjBz=_(siLP!f)krA@8N0hxoWF;%3_?=gu@q7Kg|9wB7-+#~ZdOfeleZ8;ieU9Ti zj^ivKqW&5(v;4$Z6hhFzhUljexp9|=9J`sNido%37pYiZKilftn)y&OHKc7q8P<~X zmToX14Tkn;z8+$&l8>^CwsE$SJW)!5RM@mZ%o+2uF;~*hin#hODy;Q<(5{dBTiAV= z+Iy&FX0jIY8tcmAt0tP^52y{b`-q;`Yovj!uNzx-o1n z3?>OLs1)Z_bI2wqjNd1JOlKaOBkxa~)9!GHW}II?%l+lwBl7WG;3-{=fl6wBD(%C= z99e6v3C~}(nahv<#c3AR0$mH5>*e^NxZPH6WPGhV2QgIEu#!-ynbS;GH8e9-d;4vv zi{5ZV|FUl>2+aCxSms_ft*5*eI#e&rv!`itO3Mpwx3jAE#`xW?1^+cRdGHL3JYnYr3@+aGLAPiRFyy?Q5k z$@~jm&-@@zHMhDh;(nrJ|KQa|`2e);IXH*14(GAI*Gue`sn_40tP0RpIC*D8_2OCAu`lQ!~(%oOS>+L&n{g~u?KmpknQY+ zEa9M1-aj7sy%lnQ@hc6U-yW{N<8)`JB!YM3!5iEwp_V0?ttx&88$Y}-t_j0T?06r7 z^;l#tS;^7K#o!4uvEY0NV&**j;ANS2HE4Vyt{Tq}X=tV&W*#aMbzM|{)Es^tH~t}B z#0*T~DNYsDNYgo~Siz5d^K<=+8@Y;U1d``TF0EPw$<{Vs{UCtGG~-Yl!!)AejLR*T zXQ=h}inQ~%ph~J5+g;9!2xXkRiQp{`EoT1d&e*&OeyCN5VS)Rs$jjww+p9QkIvW_R z?fziXJAE1|1nFGm$LOnaIS5#d>buAKP-Aa>Odv_C{(gkPk5_)m_;qGgwd-?4+cWgx^H^-`aOc8F!jaFY!W$L+Dk<;qGGcG>318r(ed zbO~0#9JTi8vpksjY(60XWKrfLbHutBIDfVXC9soDvUAN$rkhMW_BLuM1b+PvR@roc z%>hF%dDq?Ix8F4tsh-C*{a8cRx{yfieeQA&D8S>GyYex?$`@zunH!2qQnwP>>M&5% z^s<{|Jd9LYTuyW7n}(F>2{@_{BOr(SD;MLCqpJN? zvP#Pu{DOU2aKRndN!`S{Rnd)ua4b%^BAET3@7Bj3Cas~8M_`j2kxZ!jev$N&6Tz5; zNBsP6b9RP_5Lc)b)8=oVYq>aquw({~p3e~?D=Sz{IT-(VCUgHa7>tIu6ndYbNg)xC z=4%VBeKTC&o;gQTp#v+_aU`fUqb|^X>uSoP6iXxTj;6{2Y5OIsO9YmmYv|E*~L7x&?l6DL@%zFO|?+?*32beT`w^GaPRon5d}L-f9W$f>!=#*QHM! zX1b+7o3nIj_|>6EHW2{^ZYS50wcdDDa}e5c`XbF$!~DB0;0@{GquQk^{9*ORa%C^S zhe%uUxw%Vnv|=vV$YPAG0{~?)Qhs}?xWBqdluR4U?Q^*<(uZay9x+grydTS`eXDi(aM_xs=Wr^PI zs5gC?tR7RZbSod_;oq{yKi(LDB{E2^JXBTbOZPc{2zxC+!+e?zlnpE(ihgWPxD)_hhAWmG->`?D1_u2`}a@N5dBO# zvNwSNHwyg01d|9#-<6wTXIU+EC54(3E&&iq*%bEhR}9+kBdoPR*1a476L1;Aooh|a zw7Z7HO18({q>HzL{(4F*gi~BCLN=0$dy#~aCVLdcJeuj3JUjf}9;S}RZWexId7i1yZBgS7NJ$<9e)?O0umuKU=7l@_OFuV;u6@XvGpP z_QPuvlFvg^Tn|hE1%$0iHf$;qa7wfNq9x`z$I&#xO}s?Ge5e)4=8DKVlJTrDPq%>D z?+%=KRq$;QG5dz9n}@kca=tBH4i)E0DHB2RDLGgc*2L6kpWD_12#aUSC#GzN4pGqoynj#A`XB{~oKz~j` zWESt<*ozYDm{zpQ(O+gf?i2U|ACEw--!D9&e%NZW>Y`Ma`>Tz5y#f7Gt)k~<%n{9O z+W6h9jEPAxj}l(HAE34~I~INYk{oW_%h9U(f4K)858&C*_;?CCuoz53BXVeQKFK2h zfqXscs62Xuf)92LNo4S_5%r09gj?me6EbrD!db>+BjOct)nw0HnFXqRPVWUx8CyOa zib3$C9}2AnSx$1c*W?}ktl38Y>q<)Xm509i=h+hve@pz{C9daGTlQvnc)Y*9l1y|% zx%~5E99+piIi-ro;^^rhO&^6o6swdKUO1BsB`HGU?2VGCy0{bzI;+8%Fgq}kkZVTv z{%9i`ejI=>Qz|tR@%IfEQitpH+ee6ihz*TPC{Yo{hV5(c_JJJLy{Y$aS>u#Vmv>^Q z?z-VDOWv{CCwd{x|8#*7s$&hap71 ziL)-F$j_E;c4X@P*S^V``YCWla`;<4X;xLWUvX++_J_~=UqX2l0cQyZSGijes6Vmk z@S;o;`Au1yRAzTQ8Cpq{ygVwK6Xv;>I+=n}@rbCzUtqb&>yltV8|F#0a|zUATYnzx zN~&XovteVaiwd(fhOqqH)wC*?nQIj%!<>?bRD97olgLh%XdTPrDNmF=JO#%MCke_pel%E%0UK9MdZdEsN`)S=w@u8pt zwKMGF!mA|sfgtAmv=%w@%AbrK%h$=>@!k7H#!wsse^;hoS->u(a30c^AB`>Cl#YO$ zjO;h^z$IzL$Q6Jmdeb_k6texNfS)T!mGst+uMsnEmtSI;SWx=B@y|6EYp1z2m$|#eIs0RGorZ=-JCASN`BgLhuf*h{ z0?q_A(T|>i&SN$EnrCTE{~2%19pAW#ge2$AWN}T7)Sts8>NB#vODB)Dbzv^4?K@2%x{G`{sO1$@Fg>V@;e6e_2GfmUgB!DGezfYPTCRNQH|=5sTD5>W86)+7 z7a_=!?y+#+u68T_rU64c2vSkgpd5(dLaU6cX=J(n4PkP_?WHk!xr(g8=~zalw-g*5 zmnoXg4eRUTzII?@}vg)giS)Mj~PB`8{;Xp7js z=C#6y+}VT0Mr89(uyhfTkzKrMLskSX4JeE`75wku^l`D?ENOU>;lS1$oR{Tf37N?q zaaYs%%h%>9_%M!E``BYtCSkf6tkx!n(&cTrQ8T+SRJEcKAfU4pjK)r7=SpSZp*Un# zam^1|jx!Jf@#M-~Txy0ykssn7XGYz1zJA_R30uc9%k+EU4=eO+I zqsg|iZW+78fvc%0R>*_=Zzsl__x~i`a&5tjaR;fmQDrBizqmY6;e}yFppjn!!OoNL zIG8Dr@c{ChC79ByP~rlKcHDGOw?K;}Imh4va$uP+D?^cD2p4Brv_iN*Nl{^9Gnqx# z<)@lj3zz)&|3f(jie^)V+hqEncfE`!e$a)maYDG|VQ|cSw-3kY)3F+MOLZY}2nwz% z8MY?-Y@}`o3wAMnBC+l_)Gjfg}kpd;8pDPxM9Cjskom?yr`y(u=D8^G_mNC5@e^0%>+4F$%sFnMrTv zT_W6nF^vfnGCj~qzGFsJ`Vc8SkE$Zl+Tqu^E96accs-=JKrh;7_!7K4Dtow#myE8& z+N0W|W$PL_uNb}MO%ZD7tu(daNv*!`tZOE(Bnu@K8MrZ;LVQ< zE^XLPiOa7Hj+6xn_z;UIS8NLUk!QOM{$SV`*Ac7<`AK;s=>&-~6piJE<&MLKTcYvc z=d9&qwG$_d4!N}>c#*34bp(`S|1^qF5455|tsWtgd9j8Kk-=Du|F2};X<8^%@;{wI zp^Os0&x+ZJ8aqYOdCSf6&zOx4aem?O5Tp5A=|f}5czH4*bIIO8&g+hAjRiyrj5MyZ z4K-7Gy8b>3qH~@a{om-E^(Mk~-6I&8Z*WzxY`p$0m=S;S2&ol|sV=SbKV4ZHfmLWK zCC!iU?1)fQT2HRJt=Qjiw(2bcI~ z>bAij1*f@3_gk+S!Z+zzR7Z5vbX^B8YFy|)q}9A&7tzG~B!7d*`fuUJ(=I}j2t;fh zN_R0d;_TL2BiFrd>eB$Js0S5REjTLW!9Fb_p}pwoaI2Bfv;HR{DUrnV*LIZfc-SGaZ|hcnooab~inkG|_sMtJc47@PP8 ziwB#WGA@t{u2fz{~y92xUkZz zrqdYkatMtcul@&Ujl{r>9hoR~8|yh%n~pZ~i7C;V+eEY9K{-`cE%SJ6!k>8X@Kk!eJ5cJ`{@>DDA8!W!-8cTU z2K|Gp9jYLLh`I;XTe3?_-%J;{#ZN#$kUrT|Sf~g)w^-@LTvDN3eN%sOu*riUTiJeV zZ_?j?>QTj{;vTl~r|wO>zk%A8s2I~hKV#tHWitWDs2Vh1XzDPcrD|eI#$w@aSl1rAc^vS54v2ip%iT#7SUp zX7Wl9VYu$XiY?74+B*7#<-Wh~)C}FGlbG9kY83XsnCxmrNfy>hN)~EREf`m|IS03P z_QRJ_qsNbS+wT^XJjVS)k@vY(hV?rJn;e5}P9U!5nDq21&rH4NjclOWiMBlZqOYx; zfP_)c6TmYvqyvskM8l!~?1plS6S$2jdut;ak)%xg$mMN|BJHKnkz@vGW*P{#xR{j< z3{vekD_O`<7qL&vi7xuShwJxHd!w4lcdB=4Yt-@9hnRPbvMARkeEG-r{kY=K`V@V% zao~`)*qZlebG)kk46-?mDC`5+=AXfm>QmY)=aKUrS8tAykL`ad)~h8pQz)+WOxm*E zYx6FTFb`cA%4YR*eo+yK!_|S=Uh>*VT|;BJqLVQNG~_0w^=sU;phae5XZKw@1!|U5 zD`hwZ$o>*m7)e!|-@tnwc$04Xag(iirCob+&(T`o-ii6*uAPj>dlL_w>@pFD&g6>( zuF{5ftvtxPoL9!N_&MWfxZc_BYa?}IR2AnGrR%ux82vK^iy$$$A2*w;3RbHnH51{I z$ylp)dM7OJm%{U ztlL^6i0pTky2+WC1bQLihTyFxwi+SB~+0w$OuQ9(o8c`P!8HX;XA;O zYyg@rIRk?w`)xFB-!qw8n6Kh~d#_(LT=v_b!abv zGla5oJl%^@KFfN8;V)l$XMTGoCne>tg`sit6+q1&NoYzYjTncm)!%3gF`%IoP?Uu4 zF81)UES4drd8Lprk+)BNma6qaTan|O;8ns8ODR|@#X46T^v>aA>xcw*u>5{kSQ7?xF#zqI;*gO6{k)#2jtk5|vQL(Vm5 zG}C`lqPAp1%R5h0e!8)TY;OgAiQjP3X@FDTs z={(<{2fA9$A}JIvCRH49C~Au&t^~pL8_N&xFJ1T2T#j@|fZInCOLY7TntNk&Rhy0V zWOfa1pLepX*S)t=L(ZKqI+*oYB>n*ae%*Utc^qvv2oTy;bSKVY5Fif7Isez;LCdki zclUPPkC#BUF7mT8slJ2&IU10DBx zuVbNFP#{@0lN?pUG3Cn!>F77;+{z{}n-J8yra(H-1=-Wq)IJB&fzDJo-fli^X&#v{yFE&X7ocf#I5g{VoT`uJP=^32Fg%$O6hC$=T%3 z((OX%nC6quwQh@c5TCrfc)0FGOnH!}%0=qESYlA_K*<|B&S7Nj)8tqo7hbI*Grh8M zL-9#Y7zZ|aG;*0(Kd*|=2(73Q=T)Ex;JD;tv9K$}kw|W$)qF=jmVkl-)u8!bnJ^|H zp_H<_>dqItgN=#d244?|3<(gi4ZBENIsp6n>UoPnnquy+|koc=|b5XKINfL zd_zKr$M^cMv*Fg&O>=vLJ{o*n@mp=pDE>8^m6X`H?tFN>L|Jx7xyCqAHIlgEI+9#I zvN-R_AmxgFb&f_pn$%$nAN%4OI*QkC-6VmAPeV}3s6b8MCS9>1R(34GthggLE$puW@MDUw=r?UcW`@z z(P9mPq2+QEXFP!=BigjdVXIGk0Veq3NyS23wwyb{! zG1`bx8W}IORMhMt5u5ZHxo!$@`_E6jX|%yfhu22z3Vqm(26ASpY$WNzo-`Q8_&x6Y1@Cu-fEBexw{ zUa8}MEa&D{QQzdXX|_D_4Pxi${a;UUFX>=t*5hdjbD4eKb`K1sx3?=+=lT#SE%7Yj z$`dmbDckb=mluGzt87{^WGO`@rL3o~U2~s3D{EM74pRW5g0xOL4-TIhxgEn>dB6KN zX$Ljb)t4YWsUKo3P{~Ue8fqGunQ=#vGEt$x)!cFZ3vl9scKgMO{Xnp8RLy8CdecWb zG=4i?gvRqky=mOQkoTM(!RZ|RB{U<4h{#BB{KM+|zdf(#Qhey79N0|q7B}bIZW?L| z5w;^fAe(Q6N9TEMwh2ML`*`c4i2Y= z3;74_n*7;4TCOqO6+;9rj`i!W6lLNK0 z)4wC%Ctw1_0>}O06|Hmn!RnC0_TTw1(w<=KbCSOq{Z^R`RT};F4P>OmPQ{yFGPcvB z17OIl!=at+IH13{TVdN-Zb(zNJIMhD0Jn2=NFbkFwrnB3R(wrlzMiFXh!Pzk@^%RD<|K z7-!|4jJGp^>kRn~b~d)x>*yd0VA>X482#Wf11j!CD~KNMo7H1QPH5vF`C)sSsHm&1 z^Rn!kvP?kXD3~kSqd)t21VT-opXA49{_=;BBE*Y1lD?IMx5BHne-__lZs*<>4EIzO zh}Bgw(Lq*aNj*ItZB$SFaM;-mg^&PhC_MZcv&#vTFC%kIreCQ?S78=uNb^)r)B0v_ zK#cvKU(LO#mmR@DGI0d?Po$PhXv?w2yVLy=bkB zc2U&XX3LMFy^_)PbnusX)=7Cp!kye0@7C41OB2f9V?%KCtq-C-`hifuB3izFe&*+qrmgGJDRtbu2L8N7WV_nN5lc-|ugXRL~7 zu`3g>@(_c5nCA@30!PL%u3@gk1o=76k2%9R^vMttL#)*!M5`g^H7fipG(BqxK1F^_ka0*@j|$%J3#@OwbKD zzb-*A;?vq_xkKVjgf}WPDJB@mdrts+z}VmSL!-z5XN`I0A}jK;C?Icoa2P~jt*9At zT_Ghf(Fm3&a`LSdMVb^;X7G)0Di}AUBfcr|)GQHT4%W3YzK>?^5JL8yOxk^I^R>Eh zA(s~;jY!NV6Wh&4RMEPc&?z!3p8VMzG`|0^ji&?dQrYy(B1iZoK3I=>v~A5RcK0h6 zdtq}V{cNDJD%qZj&h0YtZ7&!s+Elwu!fSKKA!*dKpYusE5BfmAp!P)Uere@myr=Uc z7CTf&NX_g%Bw(hWNx>;7-1VrOE8*ydMJrYYf~OlO|B!0sTQ^*1R@t#vR8cD)-Rv2! zt8tv7`5OfN^MW%spp!GUc?;b_k*%%&yW9QbDAvUCtRS!pdSi?FtUJmj*-VVWnHN#e z0o>-dPffFkVAv|5eC5&Z3Q=p;p~kimHYp=ItNA%Du0=fxd;OB6f|Zt%P;9r?*7Rkt zHF&2|ZLhON*B3&Cs^73?O z??-p+?ja2rS`hmciVu=uq3G5hVw$HB;}6=*N5&}?UX#r9;^N|uySAO-u00KLH6;Cg z)}f``fSpiNx*zUeAM3vqg~1_s>WUUywISN=czKg?Zrq^#={DrTy*2%_`IazbW^K3x z(~DFh{@P}f>7Q3b&4#E^+>n0qBc6?^tUd56-N8X?$OBs^LwaVIl`;>h2 zM#&YFQ>fbk7}oLu`V@gH5qi9~OL3K}GU39iKO1%v5L|0*{4!IEpLVuT z;D-~nSucv38mY;#o3qY*f)G|ie%b!m0WhX#cb@hioRtP}R*l){q#M9ly(!g6vW5V1 z=v`FrQ$Vm9QF7NupT7abvRnJJ>;mbmsHn?p>o8J!A0JzDZ=J_GXf><03odKVpFi(4 zj1fY#y3N9XhR}^)Vt{nycXAR*@1k4!&5iWFIaq-F5H}zIH-YuXVo#IMbXd&tAk!-= zRcK%6e{l*|`_=T&^9$jZzH1p-{LX;>;Q4H*nBRaS;0S)j3^-)bI+?1?@wlP;Z6pQQ z(dWzYG2vYi)HhA68wGc+`l-og<_Qlr`ezjT2R-E-YR$In4_RXt%g6tiF z7?f{#Im31&_7L81MvzZ!2sOsX!UsqR%enqrdQLQ3tds=dG-yA}A2q{<=@OHQR#<@z z5Xdl)0t^iKt^3=LqmKU*T3l-y67B+;3JZAd3K+Y9caUJSph+!1sZ$`u!CTQnkb1Hl^zT-waPURD&?ZcfV0EuAAd`DrD^X)Uvj_DpP0 zz@2@0`_8SWvhQd$06Q}aO-lPC7rYyDBLwLwSi-QzPP)oH@}4hA5Ug5RWMYbP#RrKi3J>GBe_kF^HU!kHIr&4Sj8Kx%_c0I&cN5 z1Y;cT`-9a20t9}(QVnQa-EGn5GEY$&p}H)pNP~OLb8S^ga&EiG19&iRb^(Daa%B^5 zxqVh-Se%N&krzgN!r-@E!@AN5dALwMq51mxc6(o6Uj#H-9_i#|+rE1HT5~)XYz@!=wjxz{j-Ulfeq&|4pqm8`I7M$zxMBzbpfp}&%R zZj$@d+rtNN+1)FjQDq6cms>fpqI4i)U4e9^68GjD9oLGQ?4d~}?p;Oba_OvXng8W0 z#t>C9Gu+1*C+LWw$AVZA=16FRXDdz=w-3w*-CW`a`M9Nq-`TN$$6E`|N8r%!9q)hq zvn-&F33kPxd3-cF$}e`5vu?YDxT-7xN`xZ0NV5!U;ph7*MRA9l|$)n-{_D z2^~%$FHU(sl)&Qz@Bkwl919gwsqmO9Ot_3QAH0n-7{QKUx%)h4M`g#K*@Ro*0L8xa z`R9*-`?C#obQwuCx#w?k%vY2px2Q1(EY6amW`Ossv|em1N%tpQ{%c>VWjR^Ej(T$8?>C zltL)=BUokOH^8%-9IV+PNQ2S>)+P0u%56b6K+cO7)lxXR!DTK#p`Qs&F)tt@Vu%h^ z{r&PBS=Y(Wj{-p_Q*)_4IJ0c?WVT?7+tVAm#dpqH7cG76_d=S(P=V5L)twt2!Z!y$ z9(|`@PQwxFpJm>|QD#PoSKs-fJR@&Hfzn9)JP4`jwQUfSvUSh)LYqB|h%Y{(QAnPb zmX{X+TR7kR&vng2sMaPLB>2iy#NAX03~YJ`L1YKgLJ#0GfW};wYh1_<{hJ-WJFYM! zwnKvFc`{iTuxZ<$jsxdKC$2EMEd!Y3nQaRz@&&mH!-=`PFZHxtl&nZ#cVY=CLQbrx zF!M2TV$LkG`4L)q6Bht+_>3C=)kZ>pw(WvFh^ML}^S26dzskLWd|g?iZ_QW8i1HZ2 zN#(9RSWWCaX@k-=%|v!a@S&Z(eYc^pCHut0L_rkR(0$e=R68Z=PKYiQWKZ5PF_hwG zW1n|m(y7PD59}*OS_s}ZBj)b!{f5wg<0vjbj4C`D=NtZ>_0i69a$;hhOPNKT{%1z= zVm)(?FHdXvcoiOJm$+;lDrMn-~prACH>viXrzxcb0PDmVVORCPs zG#|BRK@9=jfE;uKcHZIGV|Q+6UICPQ@NYc57{kRd-SlQ$_CBED`>| zy&;tyfclG0P&qjHVY%;}Cs@Ee)#%l2(o6qwF(GdJ93IxM1Fn(%NRc7v{l!97m2}X) zmt+DhaymYJx-39{EcMXg_HFJ3q6DXrBKEH5oL`>;jIK>K`AJ+Eu$Wjn z^L;V1{UF@^fkTT609K~poX-Z(1* z*G@39MV2N$iB+Y@{kRd#ExTcMpH>rvl&45}w$&Df*I+0+9lST`RHg<-JtGyT*hzTp zRDMD$SNxvK=0XS8(iC3^6=B(-{@$Py+R^mR}$tP;HZ^J24V_3k!C@@ zdOlaeLe1WW@Rm&$n7s5<+V?IE2A#g^q#$r62|3?z2h)NN5VKzAp-F{J1iAIR4~(OF zCP*>NbL)nA1cP+gXiafAP^hh zo1Y{bjxOH;lvfCI0WbXGn>TN`Q_r_!ZJPz-CSi##?SE#fHG=b=7K?0wyGXrM5X;|c zuVdEeSM9*cNWZq7fc2Of^#OYjRqZrpM1NfCqK&p$&85VIW`dTZ(;Ri#yDeU3qe0c2K~s%|hUQ0qy7VP5^{xA=rF0 zD1tK71~IeT;bRDxT!SRrkMwF>EOi)BW*FVi6q(g96WwY$aq;XH=eNLOZ45#zu~q&I zRXZ88C*Fab@7yaIntE9#9b8Ww=b9Q3re2R|IS;w~bA;!#TssK3K3M;~*pdNK;&7wC zw`Uw_kUXKS|Lvs6SIKmjOpda@<{d@z$j@$xN^GvXoYdcYkX`2T&e5^6?TFIs)Hw$U zsv9gYgXA9`aEaP&pE$7nnWF|RsKaD@BP4OxD*)zMI9rg!sE;<9+n=E+M|0EM0GO{YTjGZAug_&|DIMUu z>FxO>CFS{AmhH3SMuRSOG? z&oL}t@g;?2OG0F9Yvc07wq9YQE;gULDT=8I9*bY&2v?ABUy3GIZnjm0a6HJ3F~K7J z^P;ejtL$P2nr>A`Svj&HWL6+33qKKLcp z0pLMe^$lFqfGYOwtRjOSltOy9G#c&4VJC#i=r5Pee}w3P_5q| zZOYy~HFNO)M_gEon#qXjrL185p||#QWho>E&A%(B)q^En;-`(XDzA8v{l53prw5)j z0W+f428?S=uU0KCJS5}`djD@Q??pE6cc1!>Lrt6SH|LXz-vewAbc8pJn#P{cI}Dxn z5XKf7c#K%2XK>o%MHC$ANhb-28WoU#W9PoCRv=>BulMW8(@m~>Z8$-i5VEXQpwcTB zCb+JM!=|f+WAwNDd3k6np=P5inNjA7tq4;r;lx`%ZEk};qMHPXHO9Q9b*d-z9jRnj z&;w)9g75ByEj_Fx7NP$Ks3(%o`!VVNNw|}}+kWMxjfy3d;6!3HH)3@xjVxH$%``W@ z&3UVL&j#qbZTKS-j+pnr-WOBr_zqcofd1G!|U}IZFKk|5S6W`*}IfC%(aK~F` z8wocar=a03qhZirc1nyz>xRcY)`;3~Iw?j={6b}9&XqZ=qGxk1#d1Y42 zb~X~*rqy6xd42Ql{%e?5a`YUlHp{@n{t+fTxug{JSanvw{Dsw&=;hgp8wDQjY|IjR zHnuh|N(xQXA3b`JSFWpm;|trt5>@i&`f9cuucG!BW27e)Kvzb`!1o=kSnScqHqQ?~ zX@%e4{b~zy^9q}|MZk#qY*Sb5;NSe#?o0IHV^giP=BmaE|qd2mzYjLGI=59nsNelntJP-SL*KqjaA>uR9D+M)6&vb0%dxl z!ZylzvP#XU?B?5c0*7Y-@2l>Ps6(a6OH6k)ar6mid{xy|jmZnQ+0EZOCqZ#q%t6I( z!PWotyh0ayuBUtOhRYFVSoxrf7E>;ea}RD4~~9nw2Z#h7h_k` zPp&FwCLqu+BH(rZy_GUtz!EbOPL1~@BZhUN?ukn5`{Cor^};RMSLd%DS5^wapekMx zHh{Qq&&z%EY=l~QxWZQD#;0o_V3?J#5Y|pH<7v zp4l#RuuhJ}8+rcB6u&j&G^HCCw|klL>jcL?R*(+--oJf0<18yN2;=2?4q%GfHF=|F zeYf6s{bb@xn(miTyK5cN?i6Gnp``!h7KYud3mp@aWYV9a7(%7artl$m8p?@lOMY*H zl%wb#GqS`YJpG&C|6r(c_ij-fy_hz@IL{l5DXFP7Zr^^1Ed1zc`-CiRq%`|VBSxf5 z1K$!$-~1(hg4#r^pz*rTuP-Gp!<{rqs2V2h{-7_J@KNpL+H5$P2o^*zA@9%Udygm| zv^zt&9E{r<3gvXUpu)I!=q}raRy#?3B0K`W;N6b*b4xXY8Qs5_0#geW&a-csq$^TW zMmyS^PrDkTWNH&i$-$<6(7&IF==A`=BdHr&>3KbLJwAT4NtQ@29jXQggS^l z0!A}ZQdsr$^pdl)H-vR+r}I=|T`Lrq4p{ZWsg$179H95~US!zok+10_6s=Q4xj@up&N<VxImvy z?IYi1b&2FtGR1dwL7)q7qZ-=5U#1xRCgLl&ZOci^m>&ryp+6^?4_I<4B^{q9 zQJaAU6S1S=R8Iu+4W@8=M^1$ZiInKF*?!~1H2xpmkys4k0m z8_cGCS8_y(9DaTK^l#(M!-oweX4UHH{FdC~&h6h>*O(;S3yZv=91PWxMqPty(Xf=S zN(PWQwJ-9|X;Sofe}PFfYWC7IFvrj9PfjLJ+Xw!oZa|rFS#HH^n%;tb7$?Ku@U{cQ z<*qPU*2(_*zwJPXypX3CjyDuJ-qYP@XI+QC7B31(E>>T?V#3B=A^;nIjGX5GgYm-5 z8+9uylV$jmkoBE%!5@@CZjsUMB!K~PMAHDQO)4p zZq4u&$ewKT+6Z&+j&ZTdCtn*8y-^jMQ>2%ArZ@gQ*as9Tfq#!2j<(kC7p~6B-N|^u zp;chZ#tt$2v4ckb_ZgNOyWh%dYIVQqxG=vuXwZBDV%x7nlDcf8r4ui|gTj^@0W!V` z`5!og^QUDzO~9XDokDkp*$fX5oz;0ppXM8n^&GAHqCVpw!5nc&W6h+IepnkvbEWkL z)p_NLcJK@4yYW&}@4jtDZ($C?jyVMrSZ-44V=3DSq$#dDfGyVV0;hJRU{E{aFhd`; zf={Z70qBFJ%IABQLuzdi+y$Y4<2|f55@mvhHE{ zey{&l$fDhG>d;F{8Gd0nw)^7f$14q6EypCYwwlg`Z)eLHw~X@UnG3Ajp7?eM5_0KI zAXwJlliwLPv?Y|{DVVP%!XgOzi#v2_{+VGq*y31ukJ0Qxr|ed0V)2I{06zzfN%RM@sAaVr>W zyHEc5atJ6%4ZgGIznsoCAd#;FrCc#T$nh3ohwiiB509&Vz|_egKf7F6$tgEJG>65K zm%_P8yY!jNMz*um!3;mbjAaQZVE7-`ZfYc`%Y@agOn~62+a&@Iqn)avqC!15WEaqe zE@Z|F2>Nizof~&1O6sayhUC}A)KfBT_#`8#gn&VLuqlIC7dvB9aj#^r4h*>Sl7RM_ z<9#-<*ZH#l#fZ4f&tqJgT3A>}cSVSh&u?#)dEB`~+tRgK#%sf5f$Me6wK}H%XHpu2;u~Cymdf>)L4_ew$)77E5=lWW};$YL~C3Uh0bjWQwX>h-zI!d z8(qZw!v=gh{czRcF|u&YyP(^wh+d&_8d+$Is$OnTee2fL zU|{tS-r_sXz2vRs&M_Zmqc3LxYNPGG+muT@M>fWW6&DoQJFgBgiCZyrn639KH%+d1 zI*`wkUPlms_Ze8vDBwK>e*kju(*Fg15GzuT4;jv~>+9?H#INO1=_6V@1O8=UVd1p%k-LK*Wz8H5E_|hCU@+wW_%UVZ zxeAW}Mc4WJ6zHI@Y_t(nXqT_W#${$BG-BMaQ$_(H*uH9jhzx~FafP4DshiaU-;V%? z?Nf=n(Dt@!odR9RsFbU=Z5Myo{C*?*=2VS<_cKm5G#54}Az%5;0N7-+1FK&M<+W%i z6tw_s6unu5cE_>bzGQ0|jKV_LCM);iTV6_yGWob2!k>}yw513FH!t<}L;!(H75=yZ z##9u4x{~X!jby^^$6@eCdaK877MDu>*>3CkkZ`39o&zsG6r(9vCercnyKTuLvV>zN zILx*X7{6}>nQ49kZ9k2ZF}h=~Y0Xo%MCkskH${0oV|H%T*Bahv0M8SKEc^d&{0A})}LF+&i) zq@^P~$a|jnb-hzl1qox648m6rqOXX`=R~pz{r@RWFn< zny>sv)QOJ*9ep&)(k=3Pe!-jXBREezziX*ElWYMljz|^|jux9^Yh0|r7XRC+s&vYJ zdL;{s{cv(9;Zk6yDi8lDF8R1-`_!Z=5UqB@x0>tp9Di-r%pE`ca>+Ld;~HFxv)DP_ zg2k+m*!T3Aaz(hFV!qJXFKjA=vob>4n*U&9T#w;|C-w?+9|3s;72!Dq;;feAIhGAxdJ`+-s8Z8`;uoM z0o@NLxeG4We}3o$B?GMIqsWL>mFvp$$CkhT-(!e18YXlF^98boZbx6h33FpY^jgEA{YFvcPesL^kWWEq5Z>c7?I$- zP*Nj5dyT+55b&O=Vsn*GM{7pCk+&@X?^zfy`iJ+pAb1bQR^I{OJ$J+oCXwn4b>rkM z)KB;1l~h!C#MaR_n*U0RexGMyBI0PcF(0VFhl>)WOX@Ta`;&kFQCC4SJhA z#pDVI2D;Yd=7FXz;;!oI>e78$ znK+#Xu2q8o0&PYJ5A7ZwN74{6N@9dURAP`#D6I0q8RvZ>gSUwZm{VZ+^WvMk0QKLs zl)uG{6{3n`Ll!<4jJ5&Jojc&F{-gYqijJf{2R^VII@KW;G|4`S7nHA@8`X_wY$l#l zU1betN0-Z8z`>5YV#x9G^Cuz84_;}Y>i2)tvQFOdxWeiWvfqMmJ@kSjX^_dstZC$x zPv5(hFhB>dykx;-#H{N>QDJu0;{(r^Gc46(*=0$0kLKf^?p_wRF#R_K0ZBmV?}gh* z+Z&`SYCe+@jqYLyaP$=ccS|QxZMP|>ix;)5qq%o>c2dm)oa-526w~-APD>NT2Qr4n zgqO922853u*{u)!t^6~kRmu5IHd*H`e|Pm4JZt5Ty@qW0P)I+rBW8ui~hW zJ}{%^Z;frw@t%FNwW#IXkhICuvaX1cCu+F-xL-M(4Q38ue$N{~&UCi~t#0K(^@f9y z5AA|QpQj4RI5+Pm8zCPheqeZF@Rx8Z6Vh`2|CiU|@Q>Hx^547`#ZUhSuZ3Gc0!=8p zikF{tMQ%Lb-!=H~91B6AQ)!*DuY+JDe#pEnm}@M{KL!n~5dobp{wxdTQS)(_^ugK) zQ3j6|nigYlzV(T0t)P8RD&ft@I44rcQy_aQkHmNefX_sa2WiuSn~Fo|1$6iV>EF+v zTxv=9kxb2fey9t`uC8@G1V>|U&0n>Xp>}OFn-JPWT#|4PUE8%rupZ$qNvqIiRKZ7d z9~Z8Bq=t~qdyvz7TubNpxkm0`6gW9%dhlp(*1bvj_(HkYpKP7~CLNW+XeFxHzP0#P zHs^vp=>dljGRu1D)$!d11W~XDPFt@aRFQA`yy%zhbm7(rt6gGwqHx@hS47chguLo` z^+@T3J8zlE`>o#8`+>9UAB2cr@YcO=XM1@!Uzwbpo!MxuJ@%@0eA4K?&5N7*aoH9E zLr#{pK7fS$n}G5!kUcpUu%C`|(d;33$=v-y?%8%O@)w`u;_aJS;Z%rqNT==L84?NBUw-~2nKQn z5kV!3`iF|5ALMn4 zUVvD30T>QCZG5Kv(I%wC3G+a&;7TFS4WSd17Lc4&JpF)o_Dln6#auPoT-piHwd8eY zX!+<~NxvUWK|plgM$$OBAi}Nm;M~Q$|3taqb}jSL8%6Ty2AGutO_)5=?5(^$*~j|( z2QK7WxM|VZGL@3U6{gKb1|g0?DTF&j#~%|lje;a*OouUJm54)TsPjmTXM(n%I2mnm z(Q<`33E`0ew#BJ6m$b3vOc*bHPG1L+9uipTr6&hhr$S&A6?j+@({OysW#4gPbQU|h z@|$auVrpx!gwengx-&Mr$nk=h1$kW&^lc5)nXKkcbRO@L|CrjECeXgndZK=5QSmZH z05GGNYgJ{3=x>K;G9+lR zs*#eC$xjj_zn{}$AK;GrxT0m7O~LtmKEJ?O>ASh|4))Ax3}-t=^TaKHxm*aB>1V&0 zi`7O<=XUCSUovNMvAnY-=uECYbk1bV#BGaM>1BJw_dsCq`@EX_&H*SiS0LqhJFX4N zASf%^yd|T3%CH{D;wd$(O+Ak6#0>=BxR^M_L4YDim^wU7{E84;wc4@IqWeq zk;xO|*q{DRvQg&>c@XBMeJCUA^pJQh2RxziBBBy@NX6SUryyN%Olz(ZZfC^Cq%qq7 z{*}+AKfs#P&e9urAt6GxpnIHsM|tVh!)3)Pobn^mBFZ;2l*f}bw__bXHyDKC$xw2X z-i9`|w+!BXHGnc{zCN~P;3)I8R_uMx)9#EiH!)^!fbqUXdGXri=BfXK#ufxoACQvM zIpD|!o8{wK;4_7DZ|w0)plGi7=s;Lf_8CXS=N=!S{b;fYI#E_ zp+VVh5HNMg^AmkNI-4NcUe?-#^d`2&scYx38*Z*-bKg1U^*@M0Z4(n>T3|W%u6*gD z^uYYgjj;3QRLo1t=>b&_e5 zVH*S%7)(jSa;cQtGBZO+@$?I9Sv`9y^=Rvd2aT69M#USy6Nj1`DSr0x_DXA^iYDgu zL83(jJPApKVdj4Eki_@e@bdjFE{3noJU_F(ikmINXJh(X_shZlIw6wTB@}l#-^vVy zffx7RK2NMq3x7ReYw9`vVLgBLzWeLY^-GtR6B`@GsgRskNF=01Z^nD-zRqMFsJ?LT zDp3eyIiaxi0IVq&ZR3RTyq^~6_OZrzuW31oQ`e(Q(&wOyS+wsymbYLV-b zzdTYL-mt}m_&jGWQGZ%c#A3Ib(pwd6RF=))Xvw3h`us3bpr$~uS^C%2>Sy&&`;6Ns z`^GlfmkP7Bw6%v>7&0O<)oiy)gb#)&E~nO|!P`UIFgd{`#DcxC|H$U*VGA zNKF4+clOtw!}UrG7|j8;7dw9jV4CbP+HTKCVmgA1R05!usWLXae*zVNt>S!-*&bo; z1pz#nmJ+DRuZ{rY9Z{A)*SYkPYU&RLJ3DxtggeY%3ja!RrB#y3_-1AnXMSE3XJ%3N_y9s{aS=?!_uhb0WOgp%_a?sx5mbz8oy{>AnXP2lGx~$G!`j13l)~0Z* z3Y{5-IyuU0M!#Za3L_goZpIsX)_X?>5E%;w^-ftzTme2iLi0eAq5V#T!--K9aFsrj zwCzwjwGd!g+jN*De_&Zcx0m|U77wulaSrjEDfCAxO(3y#O~9&$xDl^;dgZ%i?6sn; zi$_jeI3!pd1S@AoIB~wj5mVu=)93QSaYU>8mt=HX64J{O!N->OK!?Gk6oP2nY~S*R zE!B6vr5VJMGt{)fbbLeqv6UMMkEwk_TFxxeMP7;A-jVp}aT%g4*T-sC8NT8IFFxDW zS}4KO+AY%`V&x_RMq5mXm95riVw1Po_oK%#{%qwlNUUrYy7B$YvdaEs_%*l7e`4jL zvD6^8QyEcX5*L5VpFnEKq`HmPyt7bzetD@kEU}@P`&*gcG1cKc1m=2{h{P+O##{p^ z*QPT4IVmNpA`B?nXos@vY zPzp*;%$qnDgD_j$fHqbhvpM_bdQkT1Y&yX7v|z}x9vet`ZRG5%PwH7;iNd%;f1Uic|4eC zr2L)KZ=;Aych1FLBx6(ZK6TOa`yFE_`_1X>-x%huKfv)T#eg4!t@-g|K zA9xM94++?r8gL&zl*i$k8Ny(|cTlv*?=?L19@X^z{cL)n+jl(SaVpmVKW>5^6?dmK z>sGg7vWk{l3DcwV$`*d*9TXS(3@z_@KkMTkjiwHNHQ2_Vbz6xs8zF!Yvq}@+1;r?D zOnhSbKYYo&R`>9WbcAwG`>$hsqi#2&i|*=)XS{2`{E1q~E~(V`wXXL)=`jYcdYQIE z96-g0&_VlL`}Z$hZ@ZWJOIw|;3eE2Kj{eLRcN-iU$myl5j6d6P-03>4*#p+IRQR{& z+8Dil*i5IA#>W286OGHqI=HKD&NN@Xd{GsA51jjVzBuD`&eP=$o6>i3SpNwon{UQ? zbqDK!US4LOX+u^y7KCt3LUY@$xxPpM2y#=0z{XyU!??g=tMU(dj10M%)6P`Nl`=@K zg&uw%oiX(-pQX}9L+RQWeNf|m z8!4DpWcB=;On)|}tCg)GQsJDHnpm-fqDn!<3_!_l9LFER5`Gj-ZNEhL+i&AV>ArbI z>2wyexQpuI9oy0c)&fyHx_bxG$Xl(+h^Y$*%R;wR@*1 zF>=jIsl_L}l3JgWUb6jxWO)Wz2<0nQtZ+K$!Mm{eD6rxBBd&NT#_E#?6Q9b%EUg(< zfeKtQ9AI@L=KB|k@euy9fOX$_cl&RjUcN`@JmXFKbNGnd=Q33Y$CFH#NV=ch5QQb( zKI_#P(4ww^Q-&EBl-*JaM`e#jP$fSLRg(Kgua4w9@T zrNrcv*RIUW{S(k8`3KOpnzy$JR9#%*h0W-%xY^w0O^0?DMemq}3hzoFi3gFp0su}<@SO2=U48}qAyFC09mP|ngJ6xQ;xfA(A1zrEkMTqrxq#xUEjHof)tdh_W%w@9;c49&a5sWhzWTV$v;v2yR{Y|+V| z63{|*3#nQvvAmD8SG(R^RI^tJM&Z6cs3mh23hSJ)AH;32u5i{xIz{fiJU|6MH3-2B zQkQ=Gx~u-E3@xbtJ0AOdNDpaP zUv%`eudSHs7&oB<`uv&P?rIx=z1uKI{2_{a0;KD^`fJoRjsdb~5!I5U8yWyY`5oQH za8~$zw7(*MC{KAy{igmqZ6hNFg^34xHYQbTy<7=r#+hB1DsF5=s-NRliK5do-L@I3 zRnM!n)w#Y}$fBJ8fHk!9#W*f$xID%zPpzoQ{WgyOJMeDib}?d3i@96&vZN6tknX=L zu9IKc10dxDkt(e6FL`+L^_xBsdk^lK-z`}nxARvh)Vis~!d%F@8Z~TEryl+=A*n;O zBqN|1g0{bAZD8}dUJ7>?5k$%4jWeZe}MMr1vR)0L3M~o{0d2SqO<~} zD>(#km&msWS*8X@)s7x~#$J;d24=c$7P;#oU$tK>0_Tqi&2r&rxwT^yso_tn+abw>{XZf1sn z#n_BmO7Snu27L$-+>@$u7@~$?a9c5SR5?ciUhbkd=23J*u$pM??uRA>4*5(eVEegG zL+Wc6c)!Wpv&MgD4fqfaI#pTS>2CEV1y*ksW&&Lb001MBc$?)Mm6ltG(%7w~1+yUefOjf!Er-RA8hiup_F7MjGCzopGr!ZM7@q4$ z#j>3E4^|f>!BQa!Mois8|JF5IwBzPl(K9e#vmCB2d@u?px|TtDr%Hxy7|{PQR9U#g zk?Rh8xj7=(gQ#U8AZ>0iGJ4!b{WQ6MjEvWRlacwKv2y;uV9x(%&9rnScuv9x4-pT3 z;?J0D4%DaWYTFe7M=Q@(JHz#d<;TZ}Boi-&Od$#&C;glyhPdOjqQwPhJR^%gnwoG1 zuDF9AXok!EsV!{&#B2Zg&4D)&P9f+-3L_8eMGryM1-1s*HGlYsC;v8=MK&2f=IcKs zZ83@{(dh4Q9JqmuaeqAI8n7V3??7r?ejjsY1A!y_-A`LO1SaN=v>q`KW|AV- zDMEKS^}ljuCOj_w6aA+NevgvRUpLTfN;s2y{*Y**CzMqaAv--yjZ(3J>DLMZ&A;^{iGI_m*cy;#=+luJvveNZ zO-M=OsM-}%&2l|bu}J)&<7c`XG8HgRPa1v`dCkSMR~`NwXlw|GvXo6Mgy2Yip+X^}*=dBb}Mg~M9)E%FM zP~b3X<%M2k=N?>rzZ!g#v0V362h*tLu0m&*p=>@#sOIJ83x!d$N;v6jl{`#d``l;< z`RRNV4HOm;z_pCM?_ysv(lAlweuL0j**6eSG_;;=3w=5Pnia~BkuG&=(|*kR4e4Z) z3596$H$7KQ;S+&C6EVv(gx~Y`KT+^H%=rh+bo4T_=nu};vCAm@`fOUr^!){?V#lx( z9qvQab(I1B-os7&2#%k|tF@#m#l|emsPOopQvKfXlsscJbBQDGpln2ea_cWgEw{BC zQd9?1p{)tegt7(WdWE@tgj$(l{jO56+$hw{lH=X%t=z#Oy9k6gz0Si=|z})u7-tG0H6) z8`DP)(t-|SHxaghJQukD)|WN_+wdZ~MNf|tH6+8wO-OUmaA;#nm#g+!hC-HCqz8tj@C-+?NI|TuAuKD$d81}@x z{K*2QqqroBMHQX<=^YrSe{@>Rtd<7C)7ye_?{O zjy`BkKK6lx5yBru7z_tT)4$6b{G}`3gX)rM#!G0{ib(h;0yywi`n#tY$++B-(D)(^ z_^EcQ(D;X7EI0y|5@3}qJ^}-}lgp^lU%!)P7uE-}+K9q`$s&({F>ga<%am|?{&?rI zkP)hNf8nf3c?M%ugaU&#zm`@KUFbotR;n>eXqo|OiVmH-`cMdkZF)|gG#QF!G=xIw zeL*dsibaA&tqU{h<5b3>s)LCluZZ)D_CKy@GxId&f0XhMU=lgfPCg=v|AVqYgzPxZ zXq*B3fHv)gnZ`U2-vF)HMR@gkv^-U6CofRfNT#3G}Mje&K2Y!L){0l(k-a$s~Q<)HvIl|BtwQW zD+l@B>n45&*4`_*VFmubf3Zrx+E4rsqUGPM99UX+B*3Q9n6+h2i}VF9{(dwUO`!E! zA&u$ddog2fA zS29c-cL+p8j`Z1p?I}k`l#QxTnYiQ^)Rw-g#|?=N5Wy}0{Zu6oPGf`e<*nt2;7gl6%N5dJc8Hf1Qq1}UQZqmc;6=&g-*qBj5w{rDUa zQwG@iwI9LmH`4~&R)sm|V-BtW50+UtusB}<-!bns2qMo~%)6jZ_TB&ZYYfyaL(kku zZM-BKHLm4_ZY&Vwhz}7|vnC0RQBpBbNjkr*sN$zsyHvuU`kpGPgXxi~jC$457X}nw z&74qRFd8GuLM>dAK@+u49Kn$&P!`!XKa}7~r#q)1rcH+W#8mP`M-8p1qr-$C)=2Sl zEO zsTu{siUZ}XAI?c*`{&ed=6Z*P^E^VU36fmOkKm5X7mB6OoapjOVj3Y|_bWNSWSc7^ z7<+;FfFJdlE#f-&aCwS~E$**cfx;>+R3<}bs5^6&rjm-(cU2W9ln@avpiScd2z@I) zST73dcQuOVFYuah#Y$|2;{{gP4RaWP+$LW9Y3GZ@{(x3{`WX(6Z-DBPi+SlaY_m~{ ziSDj@AlCTuYnR#)a6qJINX$WLBuE&f4|P5x;*GnFCXGIlZ!BCdTZAIY5s2s`I1+8| z|75`k%?v9eo&m3B6VTv@62zP29oE`0zy$x?t?<8POt+z? zF-r(NLN!Og(2F6L4t;U1++0H7M1a|T`i3|Uh$XV=pyU@q|6;$F^>GqeGvzv>vztto zjcIqqc`gf)GXT;=;nEu@QWRnG9#VeVQ_BsVcX9;zDM;h;XIqi!gqSlDi`4rgPazHB< z8L9ir;^QcQI^WYiL<1W<|1+0G5|mYM0(0M+ZeTY(Y4Af}eAyBRVjH??4Z6kz2L)kx zBgC9=tmP+J9_gTFin>YoSt`1htCnwK5gZpcYc1dBXAy53aJkLCgJ>(8cpJ4cLLi!Q z9p(?EC>LNo`$u!@Zw%6mz#nIx!+h`(iDDKmePX{V?*Aw#U%aqjCVZ)Et~iMTP0M4k z#jJ_XN}3TsOoP%VUY7z|%=@24$||`OD0zG`EmS(&5U%_4L55u>mfR+$kM{KJ+`pJq z2vEvK>(~>!3mij#l(7)%jrZ(u4kG5raeKh(Q*`$=FV2p9%LaRXj=yr3jqp<qW3ZXmuS%lb6;m0>kCuyFmxr1%Y4;J|T_GkqkFhU5k zXH%aewCN~3p}Pt(Nei?oZKZMv{#Gdq-=;XmC;j6R8X6OBKGUB|P!%M)V4eO1U(GJp zaUdmG(RNlQua=mhO6!h?L@G95(z;AAf)lDabu-+6{;DU9{|uxkcWdct*k)!6dFgDU6it zPjh2stAvv7uN^5Jn~6VaB2Tms&trYxE9O@z_A7}!Sht)SY&6#4`nAWGE@o(-T$ zlU;gnaNq*!;C;|kj0Xg!w{UnQF4mqI`+?}Ir95S<M3Ij zDAH%%)!{MMi>n7M010WgeR*Z(C7p1c9R|S_yZk|nwuh_XXK$uxZft;%t}382CDbT8 zNnxl>wdkQXR}HCv7ZyMFH&;KtsB-2yiuL~~$MbqkpfUUq+Kkn2H3TNsfA+aP0invb zrV27IivT6;9V}k~*8IV?`$Wqd4R@h^8~BmP`bo(Oa|hr;K0@ArOhoo3w3yV!z|U+x zTz%#Oh=?!s64TTEzZ<&~ACSvNJ)P)B6KUM8JriOiQ%uHp_Fg>;9``3ZgP5qlPZ21$ z5FiB80P^cwt_5`SaSOC#^xd8gBeG#@r0kL$)~GS!5W)zKH$x3t=j|*aNV(U7S*pS* z-WmqM(I8kUNJfS7(-iqHuKw^IHZPCgE7I6xd=KF*jvIgG}}TovF1f zzG=o@*G*cSFbroBW%z7;H6>YFCfzM1bYL7KZ_|FB-P!fDL{0Q*qRU9k42B)2!G;c$ zOO26!Piaxf;!5GfJN^(1Mt%T_*dnw9OGH`~1Pvn4Zvl%AoLjUEad7NsXH1`}@8nQ4Z@*qaPP6T4pQi8>K#jtnXfHBvrOJh{F;avN>J zL!}$>plSSJ|Mt>bPS$Kby;J-h1R|eucrqGUbZ((fpKgQT?%J&C&5I4Pf_5L3iG$9R zu*gO|_WxxNIw0+BIUU4YJJ_9(oy`LfUWJ;)1mF~nS;neNH~A(TU-sS6L{yae?9YcJ zah7IDhagaj-LmOmeMVMRr3l`BTJFKHFj^mFYoRccp*N#CXcDdrdQ3doTsPnd7il~$ z_x#{KeIE5Z}NFaOc4-;q_|I6(oSzitr;BTE_|P)Q|Y}(N}a-;&WZn4PN8b# zNPwLuI-y}cy&I2PM_E?2s)IFI#Yi?O>Ad1~55?#@15*~2l1@@;)29ta$_CN89O{u# z+J!keO-w@TTxz^cs@qO?QORgTJv_8ZdI>o492(?Jc-S1ZY;0_Ch?pE;b$Gxv#fg7= zA%}u^ftXX8jUSGr!)}1dS0rf#p`ItJ3f8TpD9V>*(4oS@!lKW7o26Fz0TOo+{~=?V z3D}QtEoQapQv&w>jALslgS?@od_U}nOYq~3qJOJ_;$fw7GHB#R$$LQD3W2_XI+-LEj)tr zgYZ883R~~Hn8fH~m4vZbLR&ANo5iFy6qD6*XgQ20>|)H!y|LUg7+f zUB$0vNia;fb})$u0|8V*6L1p~SC-KC9LyL%#>dGH+sCpcX-#GEKbbb&e~GY0tPxPw z@LjiB3dW^a%*{@Kb`=1>Z0q;<>+Ss)eXoB1e!O;N{72mv)gKfnbbK2T`yw_%xHv-`3lSq>?(LE=)R449HJLh#I2xWh?mIS9O--e2FkI zJO-$QMfYcd*K0&uLkC@jcGhTV;Fw-Lv^93q+-Ax;LAeyd-GvnHU>q zh2RUzj#04t90R|kcVO~mitgc{Fvol% zhj5(l1tmfIFgr7A2%>YJL`Xit)M|Kl4CTSMM6p)z~f9*?S>~ z;%@cL8)T<3iKS2d)h{}BEF4rvYqdzJAv3j!pB74_nRR?zsK`CMyI<_BPEt?2x@o+d zhgI4t`RU#shvc9Hs@?(HE0*#T=>i2VzI9&Lt|k~KaT<)<-0*2EK@Zst{K!zf!1KW_ zPsgR}zFHTrgb5z&9xq>x)kL1Ge>Uh7R0iLde9JBIUP%Y(C-N7HZ&uZFA- z);mIi>*$Pl&WeWj1DccWX!I=Tea4v{uj+X;=mw_>+3SwEwja+(4d#S?o~ds>E?Y4I z_h&Il$mFHHO|La5+kHz`E+cJP&|~uTAW9%@^DdjatgNh# zv@?~W;Mo`F`e=`0G`OFca=&nkZ__SXwpA&SB#6cpTef1MXA z%$_qI$Pvmw8bDLZPTmupln$bptancNet%gUP)`=T`Jl})i zuJ@*x|9L{jw9PX)!C~v3A|WT0-Yk~+C0;GdQs3 zSu^H4HSN(ev%vOFRHF5k2T}jT%4Pen59NrieXJ`1VJ4iIp;bJTt*jvmVWpUJqE^fZ z?9sO#3_sJGbQLPd$&F-;5tWrZTw#1U6NK+Tj!nP~vuUS*)}JHt-w$?7%XR&zO7rSV zCSsWlptVaZ9*qyz&L^bHy}poa>=z2E+QG}egyIIL)t)IMU4!y&3GSpdZ9a6y)EGAF zpbw+5XtvLYbN1WLXtf+TTh^7E%#yiEE_F2iZsEmzOwBMmk{F#d>F`!`wB36A`{1## z&L(JN@Q(!{O{)nX2<^P0(s>DXY!T?!b@fBLqR{z#0r-L>1ZtV?BL*J7!MV#n3l=pj z*qs~~`nui(O_ao+^d_=SMqZ+Np|bEWM}eV&=iP(9bQ#DWh`(cCa?hDz9cNv7KR&{c z-Q{CjQj!qxj+JLy&Q(`E+sbNL_4x34wa*vR4!ze}UFvp^f*2|=f3m;V&)}iHG00Hk z5OYInm5DuDbl9YOa)OIio1S5~)})7S^CJ_@CcRV7vRKvM+ ze*KE*d`5b@gE%<>zXa%C2=C0&OpbfTb~6eI3C(%Dc1(^P^x%4B8cap?2&Zgj_EXKv zmseL(lam+MXgBWF+K-GrY%r<#x${IS8P4}Tz;9!NdeCiCIWik5FeL`6w3sKGlGBL2 zAIdwtF_SkHg16JX72VIJ!kpa>Q8QXRElxw+-1{oe@YjWO2PbOU38a6TCwj3~HeghTYh{Ixoacr+_G8=| z=#@O%uQubawl3LD?Z+1gRivDE4pvU_u3XbnVb7qyO6HM5a>eGl`Z&%}a8un#58p6X ztwP8f9Z6-8$8wyPJ4jR>Yd_r0301!jNqra4UYHQ3<4Jk;?zYO_8N~bF$P&8+24*AV zNPOMi5f`JInb+7ntg0>b<+SRMV=-jd^wa-I-y{O=35cHB6%$t5wdHt;2 zQ5@)jaiHXH!WrwCj*gBzWxQ7y4vOh>`j-4j0n{ms2uA5ahL{m8IdW95>=_DL?QvPD zuab`szS%pIJ$|D0YG?6ltwwS}JiF~x?}VkkM{XbNnBHP?3Es?=!6(p1E8rhzhRZ}f zeadmyuT&D$3<`^j* zZ$3?+BU&*SpdcuN?`uSGtDvZ8!jttriPE_nf{B@)W>#w8gluVSU zi9}Hh%o;n)8vkhW6WPBEm5@IupM!x#RK-YOVc;;u!R45!8?;y_@3>iT-b|kowxs`Q zr+l%}r2Z-Z{kGDVM{ zTNIrf0+lrUu^^Y|S*C&Y>{0STyp90e_2DWcd@7*%X=IfY*6Rr(WW znQo)-lnnkaQuyLPN;0^MC4QUR$#)^fL40pes}c;Ejsl5&+Bo>mo;d!~m~Aj;IN#e$ z;A3WEaLqaDYa)s#zD#MeFfcP7${nYWYtS&y=gLGpyN&kyf*17w~=T29LI^AmR{?Cjp12busHdJ;;d=G z1HDd4j6zCzCB@WF1o^yK%s$pRz(tQ&m*dm35Z%KOYqr%xXKoIZ?%hL=`b=~Q6H zc`ym7U;DIA-k?km;9Yd+D`jJx#w1mS%Q3iFVuMcf&vAEP%%n~#-gIE=Jz>5#n}Yf; z!+ihs`=^VC{l&Dky5#_7Fa<83a~V$+JaK7CCx9JOP6%D%hbi+z%)mPozxGKtITg47 z3nu=){QwzbfOIrWS@etilbmT$1uQ45myUri>)&SzG1_BS99@zE(gEmOn0h zv2-+&v8ci_7d!bbI3X|?oYome7&0+FjNihXJoU_p<3EKli=1HN&gY_%EF}7x0*L=+bWGn4vn4DX;btmoq*3p(T)LFAgQwAX+0 zXne$o+0>k;ffr&%j5rboo|M0HKCJM$H72?z$Q--|zuH+&vG_Mj6=zKhZuEK}ffJd8 z*Yb#0FkfK!o0WGi5;nMu`C=Y?uB8Qex=%4zPBtUNln!vCVDA21_*@_xGK;ufcm8I% zJ-CTD1q)YB_*{+@%-msq2j$;gqXgG%yl~Y+uF-&d`o6z&lBI@a6=)8z3jf;m7UZh~ zv*A8IJ{yQr`D^0?8=Dla2^dB@*(W+af37wCiEG`YV*lqaKV#Vq#)UjMt1K)q3&<8@60sI1_XVp*uq(pLyJiFcfd!e)6Ka+My?} zHb)vy(80XP{!}nBQ~$F2P8c2WJ>(r$vG|eYZKTJAyu;)al+NXr6V}n4pzB;AVPxVJ zH*||8&`X^^G-#(VF49s+FYy|(;V?x6aPKcs9lU&5=NSG*r>2L0T`sc{D;d6w_?!%# z3No|3vfHUA+#8nnUD)G!m*0#m?W#Ij=GUgSgkbYfseO%e6cVZvQig*H0Sb+U?>kzl z@Tx>7-m&dGRb{adIk(Z$Q9+d@Gbf|mQ);TUvG;AV?0mCP4jhI%mdunv(k_TkiE&?I zKY0VpX@jwm8Y%0=aHyxnOv~;G}g89$O80P~Fna=&1;^|nkw|A~5=bE@i%g>IvnLenHkBf3ko00QV zk8xyu@3d#T8+F6AOtY}C`e>ndZvr0ju^iQn1OAjy}pfzO_LSrw;KZ)baVmA6C9 znmO?;RVDrZhX2Dsh1?xlJwL%9?;k$;lzjK?+v?nEEexBrf2_ZwH+U3FsUKM6>I97-$Cfs0RG3@pO@(Azp*j9m{4&3IbCWMDIk_@X>SSYVBC`*#0_~WM zEQqqFXmkjV6tt|%bke=Qq3;3852>_@Q`NQ4$G4r2k6GVnlM~FD!n9a=_t^Qn2lQZl zBXjnWpuFdjFpfM0_`C72{F9e5&bcRGg82>|StvCp$Jn@8_;LfI6hDYrW#Fo!4T;Op zv%>4r7%b7b^!Nli!>7im`RwqfQe{Zvv%I{{9Fm+s7_|K^qTzS(FSUeItg%{@uPeZ<-wpEjWxz zLD3KCgFbXhz8aHT_@XO8Hu@+D+Gihe#-VJH1Zn+||KW$neW%aTY$WrqNt=nnW<3`s z_Cx+;tDNHxwxUf`D9x;MY1PhFSSITHHe+KQ?$A>Ts^Xq2GT3FRxwm))9dc*!32u1x z$L>vtF;0fC?A!~sC7%^%AER`m_{DBJn& z>m|0^BzygS&Kzy7s@Bm~Z>$z6{^^X0W;veX7C=-Lz!7^3eH z6R@YshZ3O1Jm_sqGfH%FVOy!iwIyj(a?4Sv4d%W1o^oHiRkod~%;v_EgYwpB5P41$ z_O2#yK>FTea~El(61xxPeb5k}qj zZBXY6&3vZmpM2kRDk~jj`~4o{;-Cj*n?=$#CvWhzTLw|^d=M*W|G95!-FD{C_?amh zO+WQh|JxO*5qojc<9OfLFCQEOEI%y0O|Xr5`^mAsIG6%Kqb;75+7I-_D6^{qFd3i5 zhh}4Fi&%oFyVNy?yFSou6rBrav;uW*Efi{Xjj%}xPg`EB=)z!28w5-iAa zhIa2xgdz>;t056q5nU#ntR`5R`|g9y$iO&Q2VT(a&W0S~@HqK>qQ>8V%5#*v=>K#6 z@?zTU?5bAWOJ2~U>J8QfBRU21iO!WPfGcXudq?@oR$6ZP^E998%FFvPybud)J~!z{ z5)6MG(fkQdLJYpYDq^9o9i&s>L!0}3tT)F8ZyXnj&7G;2f3ZR)N>JO;tbQopao=LS zNbSADQ~iZB4$P}8l{vhQGFrB>SSWhS)s6^{pAQ~VGv|w=H7S;qe(-(3|KXX zy#3O^)k9jUS|~<{FMume0%$0cTln$)Pj|a};iXOFSBDOKiM}!r2YBZRe!xgpqM6U# z=0=R*-LySHhX~~KS2ddQhT~($~yQ}=HBsHfsv@HnZqNXlOR#9X-_7$GDwI!(zvKSMk z7E=!h63j8EUTdT?4PkR5t*|F);?I6>roqqnROHE|TD%Sppz?h6c4*mL}z;W4zbu3wgb8eLsh6ic89ppR?c$Iy{wLNFAYH8g;W3O2!oo$(;unm{mG1 zM?v9}DBa4zoX+#x?G3Fd&%cgd_ks2G36m&q+z(3ZZ=m$F#*W%-Dff(T%kC z^Y;l1S6tEivjDm$iW!z^45py!+n*S1qLA>1?sR!&CT<@p712lW2(TCF_;pd-qtsnl z#Q%!JzhrJtvJ&B!|18?4byb>@UkOn+1k0rHwzirasPl%o`n}2?5mVI_i_AaQQV8}Q zwS-EbDn6<;uk$CJslGnjy;O<|&}wB1j7h&x(YLw`0@QsQ4psDq#iIjysfnCU#EKz8 z)V>(Lv3pA1WeJtQmzdo4-*3O%$NnVKLMrT6{ySITH1)y?VeO{9=TLboBIXO{4U#YV zXq;IM|HH%^g4{Z?B925ZfHoVa3&rMe`=HBc3X;d`%g1|@8c=kc-g)-4eE^fYHlZ7_ z-$>*M-v&77Ea@I8s)QF1k*;SWxIh85>y%Tnk2QlC!)RQ>r@sHJ8UI;EN}!* z&aG=nG79l0~N#1(=N4?rk!y9CKrlM+!eBu?eAR58akFTE3U3UB@ zeB~KzmEoV4jJ+3=tM4Cd&9EOfQ1ut{4c{6|kb@(KOX(Gjh?4>+I^xHFHn5?ZoE#sT ze>?;~GBYO>8)}=g9EMO1nhXWxPKn8o)r1wg5Wh@6cXY^gG!>6R7|m~+0E^86<+`$Y z?TK2H7&rE6*W1 z<(3x=nRP&M%NdrT-Omv`u4Jx5lA|W3*@P!;G->ixQst&jH~j8d;okYzg|nuEhw#JV&e3qrbY&TISuKO ziFD=!e|c$uC*piKF5#TqCnR%v#Jq6&ga`!A1Eff@IkgkOS{&Nmvi^4-+qGd))#9K7 z+U|RD7_2N0e)lm7zDQNKBG4LfUfVq%~qbfyx#o#*By z?EFv zIl|@p&~r~*2H!CvPbT5B;cMIVxlg~BGMpa;6N<5kEn9|mPNf*ChFFdOw_fa z8}R|QSGImBT?XKqWQ|Sl%C|@y^P-Q-<%4_ls8Dl2h$UoXOfGv7=%Me>i;GXjAR5Zn z5LRf}J++nC{iqE{gL|3OR8)f_L*yH10ri_qy(#+eKsVwd+kv7~(C7O68 zZsksJN1_2er#t;WbM@QiW zEj_*4&w>!)?AH8T8#^&T#?9~_SGs@Iy}DYQzb5HOBmi!bw!7UI*VnHMFCqP@|1F0I z4ww*4y+_M`Q-j4syqd0NFvVs6UoQzX`uSv{ptF`?nJlMn2tI18GW2DPuLwE!je|2s za$b-+D&-%>aTsj-d2@Pvoc%XnD;@zgx-j~@>j27C0@6fF--J{4afw(+^<@rCFY z!agY#2_&2nY`6n9xKEyJ?aoUhkH^^3wa0&2LwYa7D=k2HbD`{GPDb_*&={TclZ07y z+{L?1NQEz3mH^SzF zx6W40$9rE%Zib()9Xwj08BI5f&h~_;7<0L}TW~+;^tq|ptUk<|?18!~;E-&hX|JIG z!gk3>%C{Wp`y%*pv&`A|dil#Gs%6~<)?zSpn8y0F_$M1WddLTa7<6%L2iFmxQq4MV zkj1ewzdw7)J+-qhY}1MB8R$zOtk8?R zVNco^i!H{%!O_;ww#7rhf{vSkfPIz!<{1pgUE$$S5#A9l+nT}TcAJK2q5iqq)Y7le zjwkku;ELWbfKA%{Jb&R52*{Jw-h2%qsFu@(y7j0g|=&*&KzMYMeihR`YG=bl(~?w zqjTq>M~&ssBMz!NgZFGR;?I#qdPDjr*cA|F+F7#ih8%APQT%}jCX;48E)V{7sS!5X z-Yc=Qj(P$B6g|rFC)EQRIakiD@iz#j-+!ECE;jcsYrlq3M^Bj6D>A`mm3gn#ls8^q zoWDQfsr{}^_vzr}9{U@EbBW({>3y=gmTU~_?!R;p8D>^YNmj|V-OL5Ri%{@;5~C z>_~?rM{ZJy!DAW281z??GLGEY;PcwO?c)rWT)WV8GIE#SJdCKZO`T~uLsWYjudH(D zwL%xDbuR)_B_8AeuRa;`UcCxss<=@63)nxth9QUGJjZK-ZnF**jeF?}i;EH6^SE_% zFG22n?O=d%+4z}?#74`RImH8HT8kG^ zQxaMp*ks?*K8~C(IUUf}B>$Uviux&?%)uOml&iwmgDIGqTlqo>Juwj5JK*`mUHPG{ zO!ZT7bX9i}dtFf5@22Cr+Pb>PIwp3J(=j?^>UYxmC|+K@nvk5vZp{)$*IdDGwo*1RAz$*cEz&aOKvfG)Lva)(Jy;J zVw)|dD~CT}QBYY~sdSWhX{!5bxudDw+v(8qssYV*=HQoKjCTFRJPATqI0btIQhzK> zv?FEx{n3DnC&a5rTsD}3WMl-WYWHt@-U=TtQj>d0Ryzps9(SfNz4{ATP6N@$?x_#3 z>(ctjfA6m_9$6lI#3d_uqm!j?jX^_YoN8Sz-WS3lI5^X=6Xtd-lLdu?1Vbe9tB}$F z_{Ry(jd=3UV%8`uDc_Ls9JHta?n(%pBSfhSR{Tak?A$}Qv>lXp3!KCm44J2%kZ zVtJvdiQ;h5#*&%5bv~W1(@lFQ501dpr9A==uvq2t5*Sy~2S~d>V50nOclpc7*?SA* zIV*NI5AM%latrSBd3K#M^k#ss$;F?_^sRfP;8}=2^`uO0=M!`s>Zx9QQ&{~}RWW^! zLV?9>Rya43^h1-yTCt{xDl$~2NT!fsD>8(Tsf;DrWShsf zd7h^bLKB6M3{mEB+nGg_p|X*g3}qfOXME4A`}cd-?^)})dG2?u_rK?lTC3H*_P(yq z^%>6dJdX1?y5xdr0kgh;A9z)Dk;6>;Zjb*0K-;Xs~&RGlSzYLE>d{IM!dMa3MVT%W6* zzIcP}?(14)_qYq^-Ztw2ul+AdzDWQO{0Gl&!HG=y!b1q!uj?9EWyrD5t!z|0RbZ|aE?};;Dd;b9f1wig&B_I?0 z4@%a4mGDu07>de#mSw=gA0S)=2bJa{$VmSCC;Fc}vQtQEWs<{wD`3AXSf0Iv1$N3= z-;)RU7p5>|j+Gv&`_D|45hNYLB60(Qn@Onr3FNCowBQr z*Q6qZqsO$S2yD&@{0jl1#sT2f?3YIc93njrut8y=<9+#8$T~lf`vFQmM)svpV@|0O zIEaz$d)!8NuBRT2{QE88?;d{w;mEPpk88o_ zuKB~rt=tF`IOv+EaLtJ0L>_VtQh(V@8`*!{fJ?&<)4V74{&D12CE=~EtPC^myD2N=ewoXg2h`^Nyg||+e&hO@h_MNq=;^I5tTT!1F z%`tED{@3^~MLWN+U$L5swT+n?LUwtjOE(l8wL^e&SA^_;c$x{%{iBUhXf!th*?GP`ThqeLH$2b@o2s> z^E>G_?R#8e3Z`#LdF5cM?S*%JzCV1qa{nRyjl6^KPOH9ZEs-7TI2SMpEs9JZZFUPA zB0`B*p8E|*(EBO{@jeEHa`F0T%PdT3d;QqAXHUMlWM-;Ft^{TZ`mGsjTrzQ@b~gux z)cFK>LuR^;uj%$(oGh>5_T&pOuKiNaOZM*a?5^1g+Q|n08oQ_R0Y@=4yBPj%5JzEY zPkT!@D2=F+6U#d4l&-9$6_4}MfJasI`XLlow0=@ULqIsZLXa9>Ey7?Z%DvJWvHz>R z1=Bh8Ztk@0%&+Is`48VY20h~Y_DoMZT#>~nh_+8WZBP@p=oQbAo_%LPXNnUW$r;Cq z9r<06ULa*M#+YQm3RJ>Uqu3R9q`*2>k@HB6eo!6a4l zUDH0gBq^8Lep!V3>r~XMFZ@cv6I*I%GHBs2u&?k99r56NRTB)g;3v!f}ZaGqL0a(XXbJy6o6PCH0q87MDY-s`)L~NX`on zqS71EHC`lL3?BD!xA=536lG;?JqEo;#kT~&FcOh@-#NRm$ES-|h2Yie>UFRgrKY7- zhUPETI6;L0JNKtQeZu$(z}+e{Gcz(goU|9H2JDpMlLg2Qt>tG2H2VD>4f=)|Rna_U|@SAF@fJ)Rw+H-JbuVx-5nkvTo~)W;>+2!)C;5grzyLbMDeY zBBxK={AzrwpM(?_uUxp(;5b7ZRLQ#OC!x<>Tns>%xhcpO-_1gE`jIM4)kJq_Kxsyh zf{9naeHepUc?ur}m(eP4c9PoxY0v|Uzl(snXX$y21WQsbq29uzuK(_I>CArT5*!j< zKp&c{ZCj2A;S(}y`#v5ma=M5>O2dCT&%xYGF~-yU9%Tr>$yq46h2C0sO7(N3_ zEcO}F;RA9zG{3xnlOq55{1zSr)iQH(UVQ(qiQsM@od!I9KJHoor=%Ak{KPd&@Ae5H z^Y+|5YO#L+dH>oKco`#_SJp?Y0bj&4&~I3+@e5wCbzi7Z!dM8H%+wTBHV z23mEHa<$dbF*GjzDPaox{6M7L+(##pdc2hF3)@o4E+mMr2<`1`U%!5BH|DXTrlwXj zHcp9q8mHR$_NU8Cm9*Kzou2N}`%3YXlJU^FRgi|mX%-b11F(?4aC7F_4;eDavJOoW zvElniR9C5LW})?IX*h_IB)`|&Zqs*bZ7#|}RuDAZY8}5FO>{OjeUs=8J(9o1$HhbI zs@JQlDcb)`N`ht39PeycmD{v95EPW&W3i3v;1&s~@FmVWNno!kI*e?A1;LL4k> zRaOmDnEJg99URs}vEy&wO$xgXcHT~0URpZO#l4e`+cHSO6h1Sj5lG%`E}3qZxX>Esjur3qXv1z#^4nxn8`ALj53) zoD`)wvVWvOMel^{p^erF{bpbBnA5M0H8!RmZUVeWE5B7!W3q?_RivuU_E|HXK+DFE zHM!#2`z#nwd7KVMxE3ODSsza0+noe#UM%OG>(PozKR#qhO@4=Q1S_=S;iroXEH9;e z%eO%*h?0a1$50P$6}Cagy-+)~+t7;}3r(3V%)5(6brY|xOC*q-^#h_j<|>4sZ=OQ#vP)!E5yv5I400b2M|DA^H&6xXiY zyU|Lm2EbbZc5)oR&S+4bD){V6A}G2_p!y0@F>@tC8E-lzp-yUCW8Kp*#^6yBbMCZi z(M2G)+thmM?Rzi;lmfr_q;VOPw7jezlVdcg>EcPLeSu7bB~5w|?O$cH zos)+C1ZFX(G+&J!R=sTQ0YHG)DztnEM!|NNKQh@&lWSmE*bHJ2v-c*LbG1f@4y`bN zOA;>hhu@a1rM2~Q5Q*ZtTP9m$y&=mB6oddG+vjaVx%u!?B!$kVqFG%krrsvla2(q? z%b-kH=yQ|jb)E&mD7=1%mJVSV)TJyup;6y9{pijt5gYFDLxZ33)_H9mwq#F`Ze_nN ze_(`c>i4H23TvroJ{&qki~P^;r~WyiHp9RCcPIPaw?AnYn7Lw{!wrzkgBo>7lCX zN>K2?2L{b|DU*Jq{9P3iyfaONLfYEfv^e1u!k-Eyx%%37O~?C*R!J#{7CoMcMRUo@ z9Y4zC@(j_jM8G>e|JCWvrK$zr*7=TW4ezU0bI*NVjR-l1BUc7hL-Om`hqCXH&0AII zmw<5{k@uHBH;$aG+3d`p)wZ=v?G$t&gO|Y@2OgM%`FkE!24Vn4*6$qPVPhIEVzg_75hhzww z9)7@deCJ6DAwmtr=>T<_1okS|@EoC<(mPdAeL7r;;5WLE`8@Cbjl&SPlcj}UYG-!w$UI~(DSio zcQxOZjO<jcs>3{Q|gdr`hw zDJYGuCHH2slI5Pet*3YP>?sCi#5vjPtTTz_u-uWO<*UNidG8=OVLuFRicg&v0}ssfoSZLy6G@3sI4pGbdv#FB!w3n9lC6Vi6SC`P$Qoa^oBUBG zur=`7S-x;dI)2whQ$;zs6BkZ(8h62H$M@b$kfy@RPr>IuYkG09+vwaZ&PFtcTg3r7>~h3Y0-* z58gVAQ}gGmmaQ77Zfy4l-r6rsfh49r9?7?OQ)MD|RhZ-!%*9q@$r5Hb$FI}`wdA?Rv=ahost{U#eU_gC+3KH7IvzCZkd9m6kz+ZhaN zT`$6uL`Zmt$OlDXJ!|C=tSG^)SHecEElE8PPu5n3ouPytYP*hW&Bmcj7L=A-CnubN zfKnYu3rM`vaKO<%XSwVoWlox~kQj&{t*fM-UsybNSPgXGJntruNQG zj;E4qFOdT-DlyTv-yEUS;ujX$q7gcNAz)(+oGWDJNe0R;_crNJewu z0_D=eX%SgdpiBPv!Pys1i}@<|k+pmfqHHI~y82pccINCA^3$Wwz4qIjDu@=E{a~=S zG7-1(0ysk_TKM3>@X7Uxriio0BiD9e&r2>*+I$&C8T{b;!E|&!E|3+6yKON zpWJW-7UDhgcrBK5$2Y{!U+%o9Gb)fzt2CEGW2l?%;wqAmMXP`6Qm&j&qQP%BqWX?V zw(2h@qcj9{1(&X?;9EH6m=cT1-gari5d{JJg~rF1A{s+MNSw~*mLtTy&7cWweX9p& z`TVT+Y~h+SmW*mJ1$~T-7zJ648HkOKu5Z~k%J7=%`R}X>y3gxD9^>uxfCy*%pkrEA z?hvM-u2(A;L*pzHL1*A0!(X%QB%zS|0k+CnRnd)I(ChoCHBVrAD!p5(8ZXpzZswLk z1aNM{@q2_hVBS0f-KrM9E>czuxBPpoEEn)yfy`!922sbXuh-t2fM~?{50Pam16F)c z=uz?a!^E;uu;A(b3Ztv3J$~g-cO3B@d~kNm)E}u+YKJ=>u#!(yAuD+tKv0jLZc~fI zW_o4Efwds7qVjyB>T%SRX#R_vj`!Xs;8{`aKX3{@udmT@xLh{LqL733CEwF zT5$WX`UO`-d1?dv04KooMTsGJg|@W|Rif{rL$t;`mYTRYxVS!39EUzAny0`JOkL0H zQk}zvHzLBr#KgpIkF zlvf9(6lRR-sW0`F~zWJ4~uUhVLs*qJcg z+l)mFqHFd0tmOPZw6?ZV&Ua8E5{G(jz2NcrHQeK1 z8n?g3D~44FCCs(@?>ZOs)r0bmoEU_KHkV{SPnLlDu|?lk4>J(_ukF}m#2sULC-W58 ztqZ(|LSc{gDh~KE2l;JO+nXCLv%SR)<~${nT4*!}!}&H^o}taI_wsVQHf;#*^5fCv zgOCXxBs)yYX2ASiK<=J^rl9OZmBY}6PD7Clk+-8l9pdfd7&)&; zp96wj#pUIFA#%9sP&?p_A;m|XGN*K#!Sc>|31FV(8UjeZlef15aY{9~xay9*DJp7z zoxinG25lY9=U$f^w(bG3+cw*5(p_>L*lgv;$6bhnF7~eNBGChg@ve6Jj?63$UWcyMv) zdLJn*tQOF)yN=PtaG=m>1($RMLBWe6{|2VNQe)^lH+QdT8umT$=vTg2^8Rd&ma|F1 z#xEXS*mnQGTIW)C&I=S#ZOw@#Gje&r3xMYAyG~+Uc`ZVEm)bGjs~FnJd*#+=IlAg) zyI6ai_JQ@>NzB+V$kA4*CP_(p%n>NFwQ`HlEL!;n;6qq(k{pe-ehf0eiu{o9GhS(9 z{$&Uvv~A2I?l{W~x&E72j}MtI3*R_H{A+cDV)GS}GbW`FRXrggd+jlLT(>v%?ORTd zDJZt|#_)nr-JY_-LkMZ`dTr_-K^%&op@^U+$JrMn@0&T`osOYNp+$C;}mE%qg zE0Yd;kW55x1$spSn}X)->+7@GqR6!&^z>YaHSo$LKab@g+xabpI~*hxzw7aXKrrIH z`RJ_WctYG6ACs!rAw$(f4(+V@SQg!y_22=(PDt8A}+290VWDyW-<(SMvS7l9!iP(!{z{GQU?Ii4Zse zc)wgd*FUs?X_A+t6u(&Y_RiPTnhA-Ysc{LW$?IL}q2RetIii=e-iSmhTMmHM?6(C4 zj3DDCQ&Uu}vs-2t;o*BIPESBqP$DaBx>!3cTkYdKns;5Bc5=h6rz=1)`nY{2k%A*-$;Q7Iy);Y#vFhsRn%n`P#$pSJ%~Do zF%!O1xT(2Sv_G8o`HiR4?%Ktg_8x{;$r(9{v-Jn;-v6R`Dxj?xJszTLX>a@D=Cc3l zmhZW#rIMGi-M{$6IasFJqhIs(rr$BI|Go#2n)29kZuDrg;&ZX*pBghpw~rNXtg~`q ze=kU~f!=fp8nxDYk2&kugSr!SkPimkZ|3+28Qrm#x|{nBGq4_Hp=O(JP7pb!udk0^ zl{NQ$?o(iwor@J{(!@0?t*bcCU7y1K;2+J5RlQThR)c+zmiAW3+PTU@a&Awtto03zemZb6T#x1_!6o*; z5_2|N`qd;Lc8ik+p<0gmlY1WCca#I_fy&ZmZL6!RYim^Z^S7d_X>m@z)iV*pYotzU zGnBEqLR68jV>r*OMe|H?+C-YPns6=55y-;XK_AQT$MvsqMSXx@g(%uRc z!n-TmRx+zm`4cZ2YeFy59IttO}q zSNE5Fxt0o>fa3S)u`*z)*}=N1pKBLz+<&f~hwUqpDB=q{JiiY>)(`VnP4N5YMomcW zUe=ZHPT`+`E6DD5G@_n*{~?P45|lzaza%9fy@d#eLrXivbN?Y@VUZ;S)*vg5H^^!QZlU z$m7?H2qkErS5+Vvkaiq1s~&g=K6LHTF@pH{|0|aBf5meC{}#(Rsghl*hb#x6JqJo3 z*?0SafCTAsn9U=vFn3jGriREy{iiWSK9{$_zd#3xBdKI-fmlHZf=eO zh1IQQ(1QQ+<;x--XEo*|3;lwX)9LM24ld;j~t03ya?X73k}uHebib^MF#T z@pXk7mHg*G&H)`-@E)NYz^{`=2yFyUFm(ZsHQPC_#^9X+Z@={x< z;%MR@3eefeve3Zjr;X+~x9&gsa|$rU9>r-;$)dTa@kkvrvrYl3g5KOVZS5a|dG3Pe z$VX7sww>w9jclf6l5hhDq4EaXuqgWX)Xp7&#ALHzDd70CY&_l?<6|fwajW1lm|7GM z?aaH|X(C*pInY5lE+QKe^a0VQtHuqV-fv$FMcOnwr02wjSOv zCqp+hHZ?g0kOuQoPxe%L7VBP51LJEjtPA8nlIM^!xPbg93fewT=}5`LG|#*F%Bp$#u$eR~(Yb z@*Xh=XSJD%{Sy!ZUoVvQQEIufI2YXxJxb9ML62EbKNv zFm;#~YNmO03Vwdox*GB-5ke(Zh!Xztn|=`Tw!)l}H-3UpM%pR{*TF;Ku9g-p4a#Kt z`yf39X25GEH!nQ+FX3i>J;jP8o^mL!a!EM>hz$w4HILni;$cHe6~mm}pKW;mLmmw2 z$&b2}goua;Tks&W`$H8>>$NsJ6|=2QNG&raGdv`Bh$5K%`+G` z^yX^>gHf9+Q$GW#$yaYEM1;6h571Fyz9dR?LwH*~aK@)y@N$05Zuy`~hZ-JwBHu3{ z&8EfQ#Iw5`ePog|VfMxIG#pgho<%?!fiLJL6M%xXZr?Trx3#AaSTrA}a;V9WC1wwQ z0$mduD6-`-qL|w&-0f!u%8Jd+%t}o$?fx6DJcv+GSjZ_Txa71jvimWK=E`r@Q?}aC zp-{9hA69&KGqEnTyp=T0rl+75-LL*3P2d(Wy$~Jg+ewT#m-sLB3AS1irkPlusm|=! ziXYJXW!s*nG`~0mlUBrQW%BO3PXk?d33W+n-r5{we=MbF%(yRHSgaWI#_8lH*3!*s zlU0LejoXr#@ zDErLre*(G?K$JD(=#~_=4P4H&o7g@XtNr*DM2iuWr`%RiQ5lq5b|A=h@-dK|6B-Ky zX$d}^qI$#x3KM-PuX@u;JC3!y?-O)gPClssMfF)k0|mj8MNB`Ppi3(S)YBHsu_8yB zmjO+2_T3u0xiY+0K9g4rdRSe@X?!4|Ujya*UPSo?s%POVZz#)ubXTtlN6`Et?1Jw> zTp%^G-$qKyD4zYlwE(Ki9cr~}Hqi;N7bHUY+D=!O81=pE1R|^A&eS{AS3L*?{kO66 ze*hF+Phelz9XND^q}2QA>@leaRW+-*_PtOz9xVCcyRPrv18v+Bn<`+ky`$1 z&+#*Kvu%fvf&;Lbwz~2SrQIv{ie08OBtV;EP@5_L5&kC2S7vG;kMOTwzrO39WVue~D#C4(!l9@cDPtV8 zI@4Xj!KLY#0+b&9E6LV4dx(gjXgN^B`h;1LPv22sdpj|$i%jE}9JDEKf z{Q+Kv|QURWo@Nv%U9{a*GX($r9g@(pLuu z(UST%-ZD;}6!BOz+5!sILRPr^!cXsQB!L@xaqfU@0RgZyje5{9$hj%t_4QO+lM zO>;{iKoKbS7wU2~KciIm1<)ge63tZ^<49m~mG9V|!4U+{-g&F)7=2#z&?qR{ zJlZxGJ&9Xf_eKQRK`Uf5hV%BZhNI#ujL)O%P(MFEb+1O0ns&h6#O>WKv{z@NJK4_S z2#4ag_SW}ylgOFGzcb}~mIDMdcn@8ou5c354>J|(ZJM`#E_MH!3i3Lhb$oO}B_x|u zgRY{I!8ybf(qZSChuGb!^6|Z-(-=07>a-%!38b8>UtnVOv9KfkWi!PqUT^V_BdKPZU)tKJ@ zejv}#pKtE7tKEj~-CGmVduL*=JzGdxM_N!!Dhg;0*hA%!T7W4n^pqd5fbfNgu*6DA zf~|a_PZ9RglO2`Fl3hA+2TNL1ly`(70lXhM`-d}~gOVu`W93I+B zVN-Z$Yc?7#>iyHOu)F~KOA(`8X{~RfsJ%g=DbA)5YH|ZXKB%y^yB$mH)v2+Dhu8MPc3$Bs1C-H$*f3ApqgwZA&jA1C`}= z(r)Bg6R=F}foElC=6(eWk--VZD-K3xNqfl-4FKXzRP*?}QK!hYg(-l`y;yZX-c4XY zHZ|yl>AT2O1T1syCRr6ftk?ZKF#Zi|N1IA zlyfIi7R`s8Chpm*#3%&qs+i8oHgVc8lKGOD^7t=ayk0RxZu@8ZC;VePhX1yrESeEf zxuVk}{BR(o!lA5Dn^HYZUm=JUu|Hr1Y-lk8*i2k*9C;GpWw3?S$Em@2L?C0W6jHQYhr5iFZl#2h-? zzq%gG3lz51rjTOG|301i`yT-wNKJ_~lcgT4AahDfdmwTc5Tpi-*>37lbF(rX{-GnL zD#3??OpGX`35`+z#~2DJcDh%vg*Lr{NXXW2U|15aPlF>YD4?aj<7~nyvnIX0L1hJG zkRy3m;Q)KeAIG@;fvUGC?G9F&wuEZ0ziBgkv2iI5h~Pptw+E zonO`Um{%_#H6_7kELxkbU~+Jx&T>8N6NdB~mELYYc|exsh*%Q@X$CxmB6XumOR&pqPaBH$)XzmuTa6xB<8UYx zyg%Cn3&{d>Sn$C8xx4VAYVhL>1(Uc?W_}2TGN8B9o!N6>I^+0Ja-nirFa0Q**fK*B zB!k{&QClH;1iE<*%zGfw(Fdo~Z1p#A5kenniv<%53Gn2x1(Vvm&EU<(Z{OD5iP@vO zJb(#1h~JE%3wuSiIs$?Tg+N*RXqyQ3w+SCJK@qx!7PA%QaktXHDHk}kEK1w}Hc$Fy_R!0mV zvHRA_J7Jj!;NmNM%D?ucjwwqcm8togRp7XFNZMNIi!%IwQn~9Yw&e}A!sGpVcS^Ar44@kMC=51->&TMM05XIC6Y2f z`woX8D|LZ7nnY4{2ydIw=EBEeii`jY}AlpBZnS zgzKz=(J;B&bmqHqPs*fsKzcCTGfxzEb?Ut8rcJ1OnyH;{z+a#0&;rhVgX1my6<<8J zc+T$L{m~CioC^J=?Ysvp#@|SEASZAZr``~pn##6bU>KUEEDItUSr1Z8*IB>j8#UjJ&L6)MP zLoKlz>_2|JmXB^NeHUawIG#Y?yyEnr?i2_{I$uPoj3hiM1ECUj@L(D?Od&;wd+hD3 z&*=_r#uPsvX}MTqL#mO%ePS62=|e%J&DPF=!8$#p6*Sdj)cemhF9*<{*>vlIax7jMYx=70?!A?8l* z*`obZoqi0#)j=OHvx`d8QO?Z@iB}(=6%#Cyu5@VxM!Xr4-%El!pj{aaQ`%5u3`Lxf zrN);<#WZ%QdNho+p4ilh0}kE4YqxePmV%p)&!zJ;4=-GllndgP`#1mzOH@vkJGsuIVY8m!;VT0e~0tj~2bp+*gxHDMyq^ zr%jE*2lULCf3GGk^NKH$tN4pT(Pm^LYrUSE%s*ACFGAqbb zLxMtX`v?gxY@3Pr&4ZfSzrx4mPiBwSLjY*oma4#y6>u27_C75%>n_fvi3(k;PJoyY zm@{*A48U_L0ayF7bas%znp|7>#&JHCej}a@?)H>(>T%5Z@ybh}w0F`rNV0CAU33=o+urCodQd6=g*xPjzOaeX#rFV_bnp~2DF*V>xGbIe zH{7Zz=CZJ5v0n`4gQ^yvsAz1m!qsO}M*{wZMLust?cbMiJ{P__BeQeq9I5sNo7*7Q zD@zNs^V>H{X0u}`Z+C|0ZBsiq4iLQXZBe^EE+9>waSXnw!osD5);Dw%Krc$(ogO6KsXW;6-8{f4+nD2^< z$4xu{hwy?or(yrCY=8ZTfHkDhxbuaE9ROBp#GQ%l^jF*c=P*tM?q<%Zj~E z^IxyD=SdF{^&!4lZdW}|9H2Nd1&ieT4z+U-h!OpOJHx#{V|qYOdnR&c(H05bFlKHD zS43a+bkP2bQSmnN2E~65h`^X3@4h~f@j4=-vEKvz*F3rwh;;ZD95=qQ@23wRdjPlp z;L-*XE1X9tFY+&mKOIzRKpZp*^?MM(f>{KUu6X>K?4X=8<61Kj3VNFRE|45W?mvvB z0NchU`snx1&s=p5^!pPB;D`P{-Dkjy zzRy2|0U?Sz7IIL_@d+3N0rj2-$bj5L2INkX^+5wt0N)+r+k+JAXOZ5=idV15_FqFR z1T*-Y+S}2;iX+`X2I&$0rnkRG+dly@@HuQ4!vr$uwxIixO71wtaKQPjg`}Ju|1xm- zjew5!w>S4!kp>$h*gHn=DIpyw*YuFcGC1<){#!p4_B1??ZJqKv>hxLST&tWr9?0<+J;v&oA954?)*g-;9*#GYSA!M*i;O4%s9Vj>whHMOx7D0u`H2`0d`5h!U@^>$w{i5b- z8HuLOD`6tS zj}B$4yvL}G-6W$BYH2K5p-AMD%uh&npQd@h?{zd^Dkidfu-$11h2s6(-Y&?u(eWbN z`2^eoBK<&};9z&aE$Ab+Q0LOAsa^goxQ>Q~QHr9DCL!>uLVEhWvGQgb%U;i2_wB6xs%%X>%zIvi0t>NlrwJ$#|V0;qI*5D%R`-Wqd7O@emcw`hA}v2cx+ z>8f|;ZvE`gsX`%3_oudZsy3VRE>D_ZBZjDxFDvkwf_a#ZgMnJFNO7W!a759tvw1pt z{={aVfsJL^VD88JL44W$_l=H6RvPIu7EcT)gfUoBUKVD7oRoaHsTLjWp*YZ?Hby z2(29Q{)8PUI2Te%Zxbl4E?(;gfpD9};aU-!o=c1ZCh|WM9ps-A(OxvL@k)R9t{-$E zy3(Al919pncG5ih&j*|a1v9W?3K{9^RQ^!bt}>-j$o`Ur*S+p1+H$5K$=q%3-jro; z3~goLiUJ{s2jg=Nmyt&*OB>w}_li%B3YMkS<;y+qG1p^-9z$!{m1#xCSX)k&#q^p} zwlEd=XU9<8{($hM^Va#1uJwxf@|o$u)+gh~!Nk48uJZSF_jZ7&&TNyk$9EsP!A?Nv zd}`N5srFeJNKo(g9F{Q2aEmDad)tUTW3)tV-Dpr!`4+eJ3ptNNJ(z^hI$JE z;HeF3Mt`0?(#xI~>1kHs&0TrZ5Yv_t>ngc&Vup}!uHuad@|Qq^bqAzc_n`eC1B$kt zWeLy%LPwfW97OI)1inJT70@R=xK`#o@o6Q;`4l4+_6TwS-dB$OH+TNuk5rGSUmSVH z!8=s=b@?2wInf&BKje#gH}pEDHwBhPV6p<{2{Civ`ibt36EYEk*_k}YV<>tp@=}8X zX*m+APhiYo#9qq~OuWl%_iEOIsy8v~?EJXOfGyEW;hXL|04d^-x`P|ii7B~0(D7@U z6zY_D9U(DQ1Of6n?V}tV9Eh&V%#W&yv5AQasf2d-%5QVuGoM2ySJLJf6C0}wfME7Y zisN*2A`_9htlCfDW=IVEdD5SCbWp1F)Ewcvx2E|CbQ9r9h0B!5)YMc8Z`Tfei{3=G ztWxW1$(cuD<)Lo}?yZRV+){;M2@|{c2*UV(zn{abMUInUclD(y+5U~`DlMJz_NDcH zu8gY!EEyJUU)wLkyi`wQLjldF`mRA88h0#^wliHun2Z<|uCGAG+q>;aFu9>V##S7J zraMtoG)IHqsp5!v73>T-E)FEaiwB;GKQH zKQk|ga5rAE8z^0z$0Y5+%j*G{Z59u-gcki^~GddRf?`k zv2!i5{!5jSTHpXq8#RQNZ6AIuY_MT(7n;V6J*77jtMVpM;9G(T>bLlV$nWjLLPrQTI5sK1$yjN+y zh~udIorefwlc({3QpjgUcc=)E&_<@8dobomd3P}+3wuE?Wy=S~)&|VX;(hQiIm+3tHgw$|)}|`m_ITU;Dc|Tnk4s>*1rx>2e~~yUEe^x>lZY-gn)eRwmz9 zz)%%6k{dwqurlmzHuWqkIbOk&s_24n_JzXX^JL1}M640RRafucOk>M%J4uAf5?`mN zeyiKG^fe~2<~_}$isS~BP)#kZKB(Bw^DuApUjbZV7BrcWO3@!R*B`pjNeN|UwIr!Q zI6RF&PrQcg$jba+|7r~ornbJ?`~9pt+(*TP!+tG;`pNy|`}LyLzsa>%S$TO|P?;%N z=SW4)`mVICMHp_g68 zOL{ZI>7gP2FVKAvMw7N_upm&SzVlb%5?KZ*?8xUgVj9ORCJ8Bc5OC2Rlif%KmMxm_lskgCR_HaFZF4g+@ z!$%jrGLC~ptVOg0Y&2B(3%rH6VRMNfQo7nAwoV;dKBg#Zw9a5qx}x~q-Vm#nsU?~j z$H}Rf{u(!q5Rwqhd$Cy;5H)Ex;K9hRS?WYE?@Zos1B-*W!^hil)BmL@jW$*Hhvn;# zI3`ZLO=zc6iRI5deGJAEE_#)Ht*y%2{f;!y2p!pVn$tvREdA~KaxxU?5p`jTA&gVfuHKK+fAzw@k+bhVmf*jvaHJ+6kugTM zZELR}G2sU#j}A4)E7YWA@~+jHUW+M98FU2BM&%A6mGdiFxnNqkILk=sak7^JW>FB8 z4|Fl%Gs0SlvF2z?rW})d)o5*^XzDCdzIPLfGvy2NGX!fzi0k_J(W>eSp~x=h6qt4O zf&*x*H}x>7p70dK7B17>W$i3nOJ&V ziY#n*JNh&GF6@8cQw$sAFYNX0CA6xoIkM?=rb6E5e(J*5Em*ZQXBVzyF{otUBr`Y@ zqjlQl)YYE%(^lD;8a=7a?Sa!2^WK;O6z|6@2@72XPc6c&#boJRe?qHFOt-)P%oQW) zmieVWON`_v(v>Q3kLp1kV=`tXgY;7}km9g+6hZ-&l;6ZE!M3}CR+DK7!JeTs{KMKl zMaOJHjKX-&gH8stwYmcMxU4U8n)sxTH+X634S)1U)PMA$9o}tYBs3w*PyRiCKh%?i zQyf+!%?u;fnn!D%0_A~7`YBJv_EO6nu+SdQuE|6I8)}GHo=u{9V-a+$x&Y&>7MCHL zvzzz5zW#N+9+4>aaISl}Z!kbag;1|6E*_24`dSA-=seXmo~Vc z931=bciuF0=UBQ{`K~GN=5Qy=`QHW(-x*pOxr<(HE4QfT<5m(oWmdzJ8Qcyh ziTE_fQ#sj>>HIRgYwr3sdhS>Z1vh2Pi9$b_yQb1Jo6)~v-5STdj<&Wu6DNK-4v((fPcMdSN^JDa`F zZ%OIg`$LXeNHJG{n(B1SY$=$?ZD;271@TDYe(9lnm%w_fVzCbNjEv8mIb=r`uZnoE z{S8Zc5g`lmGlJ*a?_9yA935nmAaSPc1fe<0tXC;(kR@U;eG`}Sd1$h*%Z}KsJ}gQT|54V$?hLGA=B%w({xm$CW2aeF&ZzkrwHu9`!J8KWKkJT2jjwJ?Z+qcYb)686T$r)Qc zW2ckoMHDTt6z{OQ35zmsf_dczGqC*400YhG_W{aQkJ!Yk(_-=?q$puWP~1p}IrKXh zXg<`{8$c!aDWY)n|BVs`su2$olN{7^|-F%k8z%dQ;?lT z450!fTyZo>8yfcm>xmLwyxhbfuv0|_ zJyY+J<^y>U7ZxOYT6rh`18BkKPIvA&m;wLk$!x?uf^4FQOHyRS5-ZYodVco%rAzy# zGem)v_g{B)Fi>Y?W{RNLHSp%S**1lyU;DN2Qz#WO9$lA7jA@)0j4TFruhNTww3bkj zX%0WZ%X^bj>-3au+#mM9`wanI=J_9k(&b1>$7I{v+ZikEOeJWd)X@(I9TA!bz z=yu_mO>QP9CCfm-Up%M^l(%j=_uIaYi+Mi@WT-(nB1NzSmOJXB`TjfE+&06yE(8E+QEB{C;=SA=kIXR|v%6Y(g0z70 zj+B!frna1dvDPSV|JoT7S@F)5(J#l9!R6uD+8J8S;>q0xxwY2VL~J{i$yt|nC9Ylo zGzZS14S|kHD#LfTfW>KLy?R{|$YNf8@N^{&LxxsUzOGJ5PTmFZ)_329jo5XeY6|TK>8Z z5oeMZe`z{!4?VlslGp}6t^m(w`fP#bkwMgrnfeL^}Q`o8P_z%Ru%`EFYO zCm~GyZ^n$goPw+(Cj9?H*;|KI*?s-KNS6}Q-JK#K9SSHS-Kiif38g!vJ4I3&rAxZI zR8qRTQ@YQ*pZDx{KWFdr!@aMIKh_1TweFbrm~)Qt9iQ*{C&%qi&I(%37i30rHHuao zew2PGz?3T^$;S+5F3u_c^XCQYg!=mq(ia6rr|Ep#fhvWD>k`&lkJ_=cMwoypkYy78 zhm$0lJ!qey2ko(ezHSWt;rhqTv77Py8w$hl zZ6vkSHi*DgAW%>EV^QvMXlZJ$=Q%)DG*Mp_%fStTRFn|lW5#KwC0z{N2Mk_=1gSa- zr}=xNU_B)CgY!211t9>B<*R*`MCn#{fE0lkn$@4Y#Ts0WZAQeu$tRiA)JQyH%$ou9 z9gcSE79_%_v7Bg>e}K*9?9EZO*aT>`(N%2QGv9E(ICTEMN|1E!%^%V~&9j)vTd7<( z;M5shwIBUz%D*+3S%;5UTo7tErLJqNQ;9dx*{fr*)Y+?E?eXb&Q>dAN%rp4@thp~p z%~zWd_EuZ?1h6ob0;tXJKg3{vhILS9zhwftIjTVK8*)E8Gc&hH&R8_5wscm7B@n{A zufaS%1o)1=2O>uU42~0DY}NF#a&n-iG!wl#hl*EVVSpy=%UN)#O7v_2m7KDHO!iFE zU0w4HkbQhRG|tp;N{Cor+PW-yGN??A?$|xXNvk|}P&hL?eQB|CEYJjX36&?ai~J=W zI{!?(2l>0F@QFgl9(QxAwzMlVkHJ^> zkg5)>h5q3xo*(um1}21Xa{z8^b&6gr3QTF(V2tojW2NHAI)IPv5pA2MymKWl?g|AO z?}OD$C>k{w05Rv9nwSx&`q9lu)*y?mo%m?u(NR zVBzS)`m@5%ifyf;~odZXeF@6eALHsdUp~yk_}v?3=`$ggssJ!n`WmoP3CieT4xCY zf_i<$IFN|2^Yf3{2pa1=d;1j}+DIk-hq571)d05GtP@&h?iVK&04j<6GZeGr=;+8W zD5_k$c)v1dVIL^fl_4Af`YXYzyF04~-h&bQR9;O@?K88g5;5=<&&$aPbUT>>jifJs z`dduYcc?jnMTQUP6zK`B!k_9(7AlkqAlv$#?^u#0`(bM&I|3gMPZPv_JtkTnp5I45 zy1N7Gk3>K+#g8k)zfA*l?@NG7%`C7n{pju?SqC|Qfb@w9kRE;X(??f}iHnnIG*8OY zW@1v()P%_qaF&8ibnV;6M-AV5qN_nlcRzVq z-@r8+{^Ga`R099_V8Sarkh(i(BkK%}pxcLVpeTe3NxL(8QJ4N=g)$E*f(*3x(Llal z78Sfk?pnG#7!(R>~Sv^EYH9JIFW;KH~3#L1SW zkrh;?8dHw`qVN$H2II3`^5SARes@s(C=L%jWFMa!qJkSF4tcd|`uwHI8kH^%AObQA#J?2K z{w=v;hL|AF7*nS1z5p;n=$dsr=9UFxnjVb1+{aVXcMFfjU7=w!YZ7_@p3oski+91i ziu{+T_Ai-QvWp;1-`xWM8wMeMGM|z`XS@w9R_jKS^8fZgLz0r-!9`7QFouNS0UAf@*8N++C4hnj zHCZva6Xpwa!t^CFrfEfhyVV|d&ZH#_c+{p6bIdt|C@gKQuBry67aYTKxVSi zK?2YL+;LyMW`NA#P1T_7Yw&OXzQK3Ai3$fAW36ml$k2NrRhVy!%$?r?Cfk2lP4cL1 z&}56My-#|_F+oR6Weu(q-R?BkBM=7uB`>`z4Aeo(299q*5+FdaKq2Al#H#+?<8u;H zSD)}1g@U0H4YJA4h7`E@?`}sK2#4hs8)OkfK1^zf9^CkJZgEExVE}{5Lm0qXb|Mgmmc}cj5?u$HC{l6%eo>WK zU<**1AE~Wk41nbz~iH z{ASczjk*Lgf*xH7*!uwsfwAckyiw(6WNHS{nGq@6Yu0Q^)~JAvPt2Vypxb*z;1}JS6#uS1-s!N)o=4c+Y(1gxARL>(Kc_4Q)(63e>{(8$38t0A4A7#$3=OKN?E1SyEuo;$ zZg!1Wt#kK*0(YdKe{!0=Kocil>`ibHx4z(M-{&ZNCgP^$=XFbwcr)jNrTsERcmj0I zhJxMuO%u~!w(pTP@XWxXW{BDhv=^fMXgnat^1!+}9hklqfqn@}k7Rpyk4;p%Ch-@D z>;ODu2})w``P>I24X&D|*RBseTOtr1h+4H@uC-+PlN~iti^8ly-b2U1fe)YESMqN& zZV!?&9}K5RKXTdj*A6fs{(^+ptVj#PG1aX7%UjdPQL}Uh76E-e;-#F9A3J~_O*dIY z=rZ+DLY^#_;17Dm06Sz>I7>RIu_fME{vr*Gtw%gOIwLX#pAtZAC#a$~fbDS}_@^KD z!-ENecx6J7|29nVWP89crO5=mWD;$XX3DYgOTcE?0q#-dpkHqav^9T@iP3a%sRe0S zEdY6$&bM9bgDMiBRa-7Ujx7N+u>#$Q%&wy~K&=mN?g3F&$aWoQ-(0fs44d(^JvC>J z12U)@Yb+2TAscaDGSee>c7w)g2*t|Zg^!Ov3cwQlRf)f68(gRM7us~(DR*AqWaugH z)ZMflz6RmO^4wG5=L0APipJ~9o z9bDWxzsaQR4Co?lP+0RlWo&gsQi3}F9EBj)1ki~0_|Lo`PAB0{xgx+$DkZfo5Ce%- zegi$a(es-YH>1-riq&G?)3NdEs(@>f%vBXo`WZ_5%Nj9K8=jfG92JG*Xkb`O{Qc%7 z;IDwpmi;ba=Hcn2Ip@~z?1+u@x(jvtkT6pINzi;ev$mf0Or`jtyY5lj+5Qc%j2BTJ zTm-n3@&jmOD?F9B1ZieATG}?y z%%;icG%$@ay0D3kuHxH27ER`%6$KPvIkN|kPd$=suL`uvEI>PIY-;KUVDw{Bc)**T zy6?WzcL+(2Qr%Ayk^r_$pbaSIwyM?D)wMxCZSqbpxg$7RW)!!c0J+G z|9S>!S-?;m%X;L>)z+jTBcqj_I4v02tc%?7%kkb^(-XbnC+hCNnrcF%K;s#vNO^H_ z?xvSPC+HuyGKU$Q38+m&NU;rlXv!B75~{D8?HAM^VF3|E&mP5(8IKB$U+rRF0t4xx z_HR7H$dK8U3`IHHq|Sl^u;9=Fm7^JiKdVRSE7W)~gB95dsk7UM_Uz8Nwa3i3S4ihRq&Jr08}B-)}_!0Ki&yIFbcD>=)UV=Swpo1qt4LM6cJbH%1f*~ zmw6uoFiWM+ZG*Uzjew^)zzuP}L3rw}$?HtdBYX1XNtERR7OQ$e2_zb5mT;=;6ogX5 zfVd3C=Px|GoML$p-u*D~Se${i*7R#2<0~e&>87@SrNp!V;7L~L;rnFFZ0TR6{U4BP zuYK7+29_S0gcO6qU@n)2=S9~h0}PtJs#hq-7V%GPzimm?0sW_}W79F2wy7;3(CIkP z3Ht*=E~M5Z2TDJCNm5H*PxSn5m4(ETY-Dg?H+8Ux9T0E|50eV^M9a5-0vdtx+%AJ< z!~<<%;H0xF9Q)uME+xv}o@6{|r8>~Gc`A>UeEbJXv7(`L57I=ulnclSBNrM4)yC0+ zL-$*4c*swth*HmBgc{FdKOI9Pl2XK_98zagTxi5gq{H(fvAcO*P;5yw%ozYcGDJK8 zF+nY$HW<%EqXL;%Bv2HTVP`5@DHg0Z1=OYn{t!cLuVWBGjT}T=d4M>&fk5f@Z=sHP z;8uMsdNz;Xdf3a~+yAK*KQD2iIQtNvXGcG@heHj#XUB(tlKP~{uN|1#UA7O;ZZ4Tyhpqrd5mjmj?SLtr!PguWcllKaR z1l(bI3-{SwGrqCVdHh;fGICeP$7T=6pyzk{U6Uu99?WoD0krsidc}aa^$nd=uh!1G zi67~$==t(P)12mj%1eU1^WV7Cpk!ZgILy18{^UgNH)33dFO_|z_H;-M=dks*(bCo*ne38IB-S|Nr2M9KpjOQ-?83p@Qj8RRN{%NM`h>sJmA6xmb%$dtg^?sfAKeQx#!B;{%<$_(T zTnqWwIgflVj@JUZii7c8#3>q6BuSv@=ro<4)6GhH&HM>|@*V`!f5ka#*cI4ld26jNMX4g?gtEbd7GWZ`XMNU_@rYg91B zBxU2R)2~!4d)TkMRW9qrcI_pL?Z&A#55H#=&dWF|9kH77wud9d9wTaa?{==&n>2Wj zGYP@wYtiB_YdET!e@3w9ND<1kOHQGq2;1@Ajf9iY9y;aO3MD`!eaG%~{+Mrj9gT2( zam=G;87OKXCPbbY(1nh-Zt&~UI`_htg(fE%2pXeyCYyktdw0{W7=(SeW~p9~LWbfp zpt6hzD!6aPfB8a2cs1bEx}+NabcE2Z*n{l2A%C$8gnM15r)y6svrBwE#S1ryv{&2a znpk82BfHKTs3TFP2G>|Wes?)GbG!whh1%TBfIf}t1;Es)nkrgRFK-Xn)7S%;sUX$0 zfoQf~H0?7Fyiq4mbCqwwm{SdUivPU)aiAE7Fc$hyH?JEdz%&J`Mg!%Aqi-D@9KFA34&si4s3Bf#DJmKG_LUL+t}&ii(zN8nCKc3o_dWeEUCsU7q8s#h zsIkJZ8&lvh@*brJ)S~0TzL;slLk%vwW!@BKjklVYD151kqtWT7*xI2%X$$=(YQy<#=NLg?de&68h%rBzzQ$} z!5`3-A?G7C{z1N)cPXUi7dz{s*T+jwJV}~Phux$(mz3wO0o_a3<7#K&5-d&eavK-B z3RlegKvb!oj&O|f!_sEr%9I{x<=#j6%To^3hX=jW{PM&KfMot!9OBxMav6%3Q7muX zYhaZxLoy?J%w8~~QRF}?vO{#t=ueo2axWdkI?F$a7)b zp!Y#zP*TWv(T6$@HdysxPJ4~DJYzpNkwqJ}5jk23)Pv&$9J=eZO7`etCP4jzPU1pU z`~p`S{wp(k%3=0aE@;$v`!gqVN>h;hg{jqw1yO;+?KAQjIm;8C89@4CF#~ZK6w|JWv+Jx(*4dXer%p9c0K0O34B!r0uB`6vl`1gADD(hQ zNq-MOiE4r&(e}yZQpTJ+OmghvheqQfJP8z@x5(6X6b-V!*aW{dH65!3?so5tgCZB& z0;YgpF69Iz#ce#d(e!t!g{}2zfH10g@>|LdiS){2rpg=LtTE%+nTP7@R*iCjqX8-T zqJ`_m)YW=cybP;A?c1AcJ(%=bK)$Kn-t3H8E$l_p!evC)RRdURpMZ5u^#PD8R4Xc~ zbPj6A%{Vt=+F$!%iB^vsk~U&dZ`SDpk4=SOvA=95va&$_*>F+^7oh$;{pj&h6jhug zyza5nFZv(>DMjVmp9H`E;6nQ}K(-lDm6yb-9Rqq}h-@RIfwhQ_sfdpv(ym4&4mudh z6p_&UXxzl5E}@Te2E7!#faj(n@btA0*m%?)zzWc1VD%)K6m;faF8(o#b02j^mu9j` zFWvkCmV}dlFJd|8ern(KG~z>hAkO>LJ%vkBz-XE50GsRNd~YflGHc)b*0e)t^OR=; zducYw_<@oPmJecJ1dJFLiKpB*xGAL-4>Zz*^9(s18G1sh((62`3}+3M72KWE!<@^Q zDi5)RW*ML}jqOWal}&l10d3VGf?Uy%&#u&n7T)F)Aj_krhCkn|%J_D^3ly7EYkNZV z269bypc_x?(p_w4M~@;Ar2$o2*5_|EXfse2LS5Cva?=@tns{8eK&JadJDZg%4W-nj zntWGB0@IJk4FiSYXulGKFpm0p%HVt~5xB9oODmNTWP=JxeD>DDba%n`H&^GCW+Qps z%;+zfh%#LFjYPnTZszP7c=2&op3ZrSeK(l056?4NCli4INaWJ>0teF~s|+l&D18i| zOm$Zt_+dhpvX1o>%ap)JDa!WvHKYWxT41hkTA8D(6OCTinvsCUj?vA8hm^t?F05B~YBc=Uka=z;nM}OqKu#m)BFdMp$rdGy_`Mm}ZUC)~HKZMF$vecLcBhP+X7y}gX%!T{9V+J2c zC4kB64RF+@9Tf zly76+%|-zUS6n#|9l0n)4F{rg2irEGuCzQjbc%MfJPL@|Ln>&Oqfg_1tYuz_~{qg*0nc+6(eLT+lca1kW@m|Cs>q&EOE( z!nu;-YtU}TCjg{NRe(w?R|C^s7#&LM09?$1oE#?H7pSMX0bA%HXDn0;?iU4AKCycP z!U3L?E}EPeYVnHkomG{IV!cU{Og3RB!?Rem;1OW`UFjM>hbTv=65GfJ-xl zRQHddc;K4I+X=x)?noAkUqS0#?zcbiPWKJ4lCGnvZ}g^)xGKKxX-`UGEgviDe8$4l z9gwo{!y(zySU_O!Nqd2SuC;y@8=jfFc5c4eQVLIgW3a?;=K%ok#$V9iK7Ra)dxWCndQCX&$LZps(~ln@(W^#fFux}W@F2{4 zPmR(vEp6U87JdHPy<5eg(6q}}6ha$uWFLSkZ4Y^9-v%Tf-d%_MhYJtV+|Yn3{8INYZj0tHB`~^L{>QaG zyWLJkanqCed>cV8(vUq1IuyRsol;~ASd$5T7HA+Oz~wutWh)uJg_qO3fS1#vig`=z zWr4~}m&Hhz#Xl94EWlwM^;WLZWltgcc8&iJOs2nh{|EZH~d#KD+jC1~9#>%uK01p*`W}uU=8mR5n{?4ZK;@ zFwwt<7K(o_kU6rT8$N}7U)UMc6?zYsK}sAyqDv~hLvsdhRqj8Yz`wt2DG)jt$QRsZ ze_jHzHpIinPtd_;vqR+*x4Y-V61Uv!((LfjRFW&bD?dP=N}Pe|N3J%guzbr?c+d3cD4*O|19lN z>az!jgar6vl_EQ^)|NC`;xFvoLjW)-Y(w{WlH+@)#65b8b;l-NTu(vH_!}Jq14+6c z{u|6;+#CA;gL4GeAwCq5pdgG&wWg`qNT{E;L^ARSft`qmaH zp3e4cgU-p$l<9let5@M*ND=Q5pduLF&)1wZ_9M6w5&tNR?8{hy^{GiTt*EN1N)A|< zpb-uM2SSe8tgNS?Zp6>@JrF!Nk{G8oueVU*{yk>zc>O5^dUiBR{q9qHzqPlo04q2d zK|w)=G4hoW@Nfc|X<#YHJF$X37H>uBePb_rVJ&fEiS&;6bkoi|KKFnAiR(S;OP6#c zSt*zoR=u`nKLNJRysM>UVM5_7Fp^15PBv+>wsq9R2KQs>1zc+oSl;w>cVjy>_4M}Q zI~AAEV7PS!(1a|xBstmqAKh1hZ_u*?{}iEv09#Ak!mEVlY zy|A7Vs2fT|A#I^SA?V*fFUjBwH%E>l{rxR0EI${eP;88prfVt(_cPXLX+?idWXWae zQ&9a7@bbUUa4AGQwMoZiQs?VI^ZVTCtNO<=dog{hE-Kwwp=3QA`b=f&MV||3?&Bm! zGaOLtoz=p{`u{UX45uH)Ka#|lMq~X}vWOnYzU|0bNp$KMibQu07o3D{6p}9iwua^) zc&5mH!yg#`_c#9c3vL|PyAN?Mjx8oLyfLntUX2_h7(J7*Df{$c8;`86oUu(nIRgDL z?(wak*2YG3u4G7P4Bi1f!-FdWr9&ec@chLix?H$qHPq=%x*lczOcC`Q$9NukDjUrI zOd0n$^Jn{6d OEm~xADdWJ*C=L4vzO=rBC?Vx})|PX7J|qplnt<8o@3Cw-3vLjj(S>kT}%5|tLW zAHHsN(~c;uC^66f9vO*j;pHtYzwZrDZzy49{~n=z7VYwFU8VoqwTvhc>7%&{I+HI< zX-|_`24FB4cGDc^bNyl*tz}qFj~%|we3gs{6?ETUzJw1W5Bpx#`0~f*k6+)Pdj`lQ z^k_X|%vODo9hdkv_QnKU3nBx=L@e^iKVt@w7a}@e>)tn=O_63bX^3dQ6HA+#V@!#$ z=wZ{QI>%6mS$xT`=oe{X#Reu}lr7 zF+bUjAy*J%vag%N-Y|v(Lz#Q6OJ&I$442Ay0ef$H`g?MQG9#~QJP!?46kR{z^$JT|U5k8o zzr`4uR-?~l&NZp3JmKrv$M0U8FkQE$QhGo(O~a%7XeIb_+|LYeKR#9ta9rU$_dFe| z?AC>vY`T*EjLzM#*t=HBx*3F=)&HgwVU>y=8fwp{=_%T61DS`&<@zVzx5?vv{(AP4 zUaQJkRiNi7JRQ}a6EB2ssndn6^hci}o&}G2RB9k8U~_T~-0(d_Ba?&29-(Q^LgOJ` z3CgY?pn36XI_!TNBmXsR8^S+?!QK($Y5($%KI6$tH;Q(hPp4VP2g(Cmm*M5jc(Kl$+PeN;@l zt`^tQyJWEyC$0pWvt zFBVXr71awgailm@F0t$54jOlNw`0`tRqZyuE6jDs9*}fym3ZvE{}8u1Gxc_@EJDt; zSHGt(@YAmXjT3pT01>mpQK~ zkNcDojrq$$)Ulvj7__)w0ckNlOtH&}{_u$gbc5i95ANrMRWHSeB{2}S6;$u}%3L;O zYRwI#D0N+FN4OpdV+)X``;Bgl$i+Qq8juJl+Tz1qj?v}yLQT5?d0$%_&^z1>I$>$_ z@u!jjG}~t4ZCp=+X$tYd3#RhGz(ApY&m;eS{n8E|TYI}GhijH4bO1hG%1)8c$DE7W zFld0fv&^rkYY1QGao%Y#uyT?MAo+mJf%ra5XvEO}-WyC*!k4KWa%;Vxbn$iC6In)< zIzeI3Zg_z!#c+UAOOL4^z;4`>E3RJB!9kiP9!erns1HvPO)9OjP`#3T^8JbCBcoD( zxSnB$X%PSUS7zlsqZ;n7uoT1>@l1*gk&aQL2_lH9-Ty9YIeFr0kL)Jt`TeX;O>t0{ z(e``D%I2qH<@64l=PzCkMbgSk{ppwQX(*HXdRErV6}AgjKmT6)@E!)!itQ=!cA&|SE313 zW??Z!0?&g9Ib%bo$EPfF_(Cpk2Bfga?I+M!Fo9cZ)YX++LbiLL)f;42t4}8~P*UfD zZtD2L!0q5!k80`KbH-#k$e%oc$Mi*!e%sagA-$eoTAMt!Jk>2o{q%t3vE>Cl@a(k# zTZJTH3^j|yxHv{2r1RMcITjRNL7{Y0d=G51%N~x0e`aEEWA<+Xl%y-aIDWV2;ZLN( z)zn`Cjs>`{$Rb2r1HY*ndU4U)_x67K5GKkex&})Qrw_9y4f^_0*yJM|qKrL@YL~4U zAQvsc{{%iEj1c52g5@XFKVJiAL=oDQ)!vdJ;xt$C|6z~9wSlUcj@16JL$Ero;7yPN zuiII~uaq`SLGp7xpPqfYd-ss038w7X1l0{GO|;>5HRE#wS5UO{HfPbf}}J=;8-Jx(z;Yrbi`Viwi1 ziO!ZYHx026s@6*xKdFx4-F+C*PuqxBOk$y8H|iRF<|eA5N<<IFdSHQx&!|D5pn@&<2 z*=NBslcG^nFMM&vN%`e3CbhG!=kK|5UK-ClVa;-S;j2a#&m}fL*Q;uEui!y>GbaTu% zcT-gMA+?X|DhqxG7C1LUQtzLUKBcUc^AllbF$SAIwab-ck_(g+cB*Dg&&^!w2&~El z&GIP2wUyd+w5zG6>m+DP{U_zLUPkmdSK*oGJkicXk^Npq2uJjTLeDd?anLBv_-=C~ z=i9f=FF38=WrHL`WPPjunSuX*_JfA455eS1_(ncIJ>#h#0g-@cjt{I*u-U&wACrJ_ zGmYC9AKSobnCMdxf~6*kH8QfhP&g_N9Kxlm-8?am7`H8ld{}9SoSZyrl;-Oi$q>(* zHP2YwWcJ{Mx*5Us&;j~=-TA)2hNB@lq|3Jv%^}hSZ&$3P(8vaAk=h71kxZ_`)q!0y zS6T3sT_vB%O^Ym1JSZ4(pBLX=aH>#3B_yM#n9~7GD5%?oGpq_0p30MTlg1MTZ=-kR zKXr~WFz2&=8hcRBa6EHNqE4k2t@5dT>+pr-8*el;?@XLGSyeJqMjBOi<@PUhY?GFq zY?re#K4sat#kZqpbP?(-1OU8r$L9Sz-JZBTzhb+2O!U%`FrD)?iuwFSPz7#5_cL0`v8+>H+wY)_2m!y3_s#)aCF~05U---yMm7OE zDg$z@bBYr;xaS__zUj9JTq+2OPC%a22?#0tiA2TDdlX1GiLpKAXMPvVA}i`U88_Fh zE>YeJ_!0Dppr6`jptDo_=0fk8Z0c1~AXuLh$MzaDF0z^=N0q{&ZiPvyZPEWx9?SJ z=qSR-h{;DnpE8rqlwg(;3Sx9c*y-IR0)G8wh3TcLbWBZ zc`kTT&qI6m0GEJw!AP3@kU4(P%OBnOUB8?%@M3?*@_l`8C(b_>Irn{TY;Y|4M&c-a z?gsOs{GSJv%)*qBq4|#2=(LKCrd8z?WB(4bw_2ZwTgv$!(Fb9sa-wtci89-4;ge>B?~Yx3 zL1Nn)QdZvnecjmh&*<-m$t$aQk|m^ZMfg#TFLN--zha-hGUsF<+nBx+%VMt&@NYbe|O zwM7yEMa#T;y;2w>MqpsY1Brdi4+Pi(Yx!IcrdY}i?kjcqvB(DVK~rWW*)*pEywOP9 z0}Yxh&rRUo)-*vs+KA{!uz+ey`v2L=|IZ~@a~2g`ddC!4Up49XlHqF`R>Ig#er<>s z^JZz6!XrCBv~MOv=!x$L(sIDou6~2j?kGdS#i5zr;XP5-r3>>)^0Iw{%pbZhTQzMH z0#)(duuf1YxUsQ_DFnFcNITCs7I|f9B6zcsZKS@V4CqkbT;kE@$?Z>ks>Q zkXdxT8LoME;SseM>Pl&%$1q!+d}qhlJ!rc6*%ZGGiJ&AhwG10uepvpT=dgY?tx(b} z@JMQ8hT@F;961G}Yl))8N4&%aWtBU{qsp%0#apAV+l8~VQ!JG~y%G_IhKJ~OM0OS< z4u3w52<*!D9DXyrwZ}_IWE{1)xMauh!JE!$I6qK3*rnFhF8f{dcq$X~EMCvc{+Nt< z8ZG5&&DG`p&sth#bTe^$89%Y!mfQ0@yKaB!5cALyk7uT>!g|XO3pvh$1-^}Gu_*A z!q+%}JtLEtjiLwxW3T9c!cwnB^tX3KYqAeuA^;5)r$oOh$MpUQM5onL^`gWsU zm^tAy`|q;f$B!P!S-OX8JLyOvHthQYs~kCN2Y~?4 zH)aXLBaSc3Ok#g2rFRf(=;gnD8rvR9rM_ zrnNvF0wy(t%*wCVU<^)8&90amz|15a!q2t+5LIoE*73&hDEES0P^p_A_jnbCD=3k+7a1+kPnoqdg?Q%S}7x{3B6U25JP9zKvjPm;*1#2IW3P6C!P z@vcY|2rfjqQrODH?kz~yHU?0wi|eD3D}PJ(N-U?)b-UOgupeL1EXS!=89Z$}#I+xD z=|xkEH0<9QT<=HzN%+<$JDcs84R?FS_r%8`z=J~6%d%Zxs)Wz5>NWB9w1aDjWz@yb z-BPc&k{$~eLnm(CwELP#oUsl~R+r<~rJSv06D48$B!M2lvSsPuW!tU9{+HHUjDdiR zfmYm==>N279l{0c2}WN6!5lt~`*=iL6_OZ4a9rd5UUHae)b#6uTe!}OhUv2$zdUNO z5Q&JUeYx-ZB#T}*>=U7}D>hcmy2wF%Nw?1rUkONf0EJ89-fk*@4s~;Sp35ysPZ!A~ z;MgFRRe9G;c6k`?2iJxGpRbz_JaF$KI&cvxQB_Kfdp=Tc0%-2z1-X*@k{`vXy>(t; z8m?{?$R^DvFM(O0>f9L=vJ>b{{wxZGe#h1}ycD}?6C3CzCUmPLXu`)LF0 zd@#9*Y>h2vmD*B)jWR%a{N0S zGVGqm`3Cp>nb6oA=jXY08F%mRuDwb|d;jpPaZ7J68pwpSqaW|O7}f&5XK#fO0k3X% z=C&2#?e{*bXOeo&qM)FQA#68&b7D^9^~y7QyLg6^^wc7z>PJ3&nv*y;<=j&p&83xOn5?4&dz;kPP`2wm8~O2q2*E6Tg||@5MqBM! zDR^8hQ3km8joXIDz4a_MxSApV;~$K>TYVfcG@(mRm|UY8o7)xq>v1ZxiHdn#{mCjt z&Dzb{*KZl>1O&_7SBts{bxZ~(1go;rqaRWHO^)4^YMNd-SZegE%Zn_II2vvI_+&gI zG{;^R#}RQJEmbigD~aK#&O2M0Ere`B1RuqTyGbqSA7GOl4HXg&%-5G{Gd{%WL1u|QB$+EPDd2&C;U$hazZ%!&a_xn08x#J!0SG~tNCFhMc zQmS0|uh61+DLKJHB-KQ`xWut@$hUEsiJZcI)Yy^KYbv z{~G4Ij=G(?bWO1(H0z!%J!K%R6**mLn);Tb$*aNt=9vM>UOq4m8wWP#Kti1`Xh@bCX($;`zEQx5srm+vCc=GGmN&G*2iHooWsgV3XR|CVh71Fsg{|RJkB$Mpc zYO@AILxRx=k0V+w(3&yPb<~~Ygc3J*7_uO9Qg42&M(DxUZkELr5V`=k zo5!8cw?ib%iLfkfP}I3Uq9f3T5_+Mn_$pB%^c3Cuy}K6tU|X=H9gYLJhZ_|g0m}rl zjVKrq;TwL)xRI_Ds>!LxQ6?pCr$gNghhEhl2s}HxL*V0ig^`1-#a{icUaAgI5Tc1p z1>jwqPMl0{q3YdL)26zy?O0dP{2>)e##LlwH9Om%Ajpc3aO`@r9aX4PmAK7?eP7CT zzQ99g769cWf-By)Q7JS$ zZVpqE%o7STN&r9l2cS&9M?`{L_QD3b8eZoZH36H)Wss-h>qm4XZEPFx+J_h5+)PW_ zXL}|~OXNdU1X;notAk<566)DS&3`G%Mmar$HDbxY7AkRkPtHAW_ipc}wBl=5Us4Mr zm{hjzo2LrJ9|x~V8rq~*jUzXrUL&@UgpNZ_=kl7!78s9ZeK>JbP_TQiwoS!&e%$~z z9+^Fsk#o_6Lud)M(-^fu5<}uZMxCB1jz(NQVX($ZUmZncb>oAYg&({&t#913DT8zd zvUd(E_)mW9?Vcr(v53*Jny$(Agud)aOkqiQlFL#~v_C&MJTd1ry$U?s3j#~_$ zH}p^yX5A*QT<(}V9`(!(#j)cNmRETI7{rkqReMvTZX`YL?(XW?c+la#kbNc&!X5iU` ztCLD3`w()Y5=T)LiR<}ccL#GQIu=;<>1R(7lJ(vcOz~OiJ5_ioa&axx0Q~V-HaW@17?{yyPgA>|4bvW1j znq1Hd%V<=Xe7&oA-@~4Ct_Y#C#g||ls|T$9+dZ%i4XucL9ErNynz@lDsLC}F(>tP^ zR!TpTh7Z7>Pe~}d1xWlRp#~_VW#ClaX2$dBzP|*~X%rQ@mm-``1&|Uv#EhJ@91m}K ziOE2N)aeyqO-K!A;RL_Uqb-TCjFicMY)BpaQ3-vPwtx$MyYvR^?yHHX+g-K>5oVv1 z%rap5x9xiqZ^XL?5;tS_h}XjnB0oi0`(hi;jacWe?>JB7ERp7=^)Y_Xf9qzIzv&&a z%j;%;>M4fdD68G@9S?})Ysjz%6j<_ltuE78PRrsVt+>)0Ns%8Or%O%SppaN?r}6wj z)N$e|9mA9wUlTojVx;(S4Eq;}gK5TOiKTr)Ioh#tJX7_JLYz@@I-ZWk~JsV-{JVz-Ix0 z!Qe2$Ft;yxi@OXF8vn$a9GfJD`H^=T#+&=7_K~_+{Ma68?Cptf@U`dNxT5u(S3WCi zYnv6#khm`tBK2bhMisy?n_df4rr7QOYCG&^7?TZigs=CUuWiOFt9o66V9IK2bKexZ zLMt8VsV2-;7F(x4zhN?^mCeY#2&vLYm=!1XO=l>v^uWUCCu&Br05QR&t*msny84=T zKEfB{Di^ampSCy+XysN3^UiX|Vu)yd6bk)V@!UJFQ&m^}>78N0-2IXu)ig0Ho4)6$ zo~_J4Pd@YUW5?$zreBUIUJaL^K3D$kE3sb&~?Ki%&n2}cs~6e(TQ zMKxxsApId#yp@!v_~U!Uc&M~*wzxJ0gxgw3{c%hM(q%%$r4HqXMM)&1=4WY*yD9Kz z_;LmogPEkpL#0Vu8lD*-_uJL0D9IEE5KYZf_nll*J!WHOCa%}p6(VMp$rmFn&`Z|^ zJrms5+A(PEa&$*4Em-buf!LFuc}_YGk@nu8KDM~Ux{O#R-y1bu#<%n&zMQOFLuW6c zIHuDzAQ|&9h1*5CC|GZ*MYDg{Pv*qm!ngg9dEv`h6JfYi>me_f9qLI-9myL3t9HjL zPeimeL=1Fx%m+8rV=rwi{s#--Kd4>ee<6kryqObS8hqnLa_vUK(&GDI@SX>zaH5wX zukxD>k7mRsZbJ){Fzym$DV^E}58A{PwX~j4l@Caa88MeT0UwHA1y(T!r{N(wL|fb# zq|#!)nC$)V#tGlo@4(Sv268phQqS(cjngwRX56Mv6X8Ln76+4%NlWc+v|c6?BH<`p=+d;;5>0YL(8R5Jz4uNx z##?c3xYqksUf+$x(*cOR2w|N=x-`;-5Mf#hBdEp7N|A{QKI&G-V-t=0C2&J%IGZ&)c zYWx#2^I$cYbtQ@I>vH=oo2*C8I#~6}R1(;)?{lABcW`+WRL$Z#*KWKIe5X3o~?cka0dxPb6`c$i+ zq)s9SZHY~J-j!FPio-p7D;H9fCgk3+lmPDQSdKFWm9N@6^Gp>Wx}jv^(%O$3ja!d||!V&23f zb=j%EBh~s4Z77Wq1C>X$9KD#xCxvZT2ho>!JzxpJ%OBkR%#P0&_2CR*(xj!Q1Zx

_qR{0B|`?c`;jYI1N~;KEO+Y=Qs&;*ti)2MM9!0U`QNx`?|sF`UnDVd z?^@EV62+=&vY66O1Jj`Nrd-=6q;`5)><=~lFMQ?Nc~F=WJ)$O*ZmVfdn@@#KB)UZc ztDTXX;$doO1Q|h7!ix^fi zg%Uvy#l5kB;@ML-d(3f2j;u)JL-TbISKE-!+>q!~)Ai1WKVLcBd+_eH;t0`B$D;WZ z64`-&FASQo7;6he;H&22e+pM=G%!ix3cti(Ck$qeMa}AP|1p%y8GNg!BxHOjerHBV zWJGjT$U1dfvc3en*O>L{Nn%flxD=^dj8IGvr;JhBa2Sx^U<Ro+_>+8HXV6|W`CFmoC_>7p2K%>*y`v@6B!Y;obRVKMa6jRG zm1|HRRwYLxSB}hvX9wH=6QXpaP>vb)nW32hcH3`pKc1O$L_hl)^7vJQg0dTPbRs4~ zw8B!qtN$+=@&~CP72ul*=Sb%y`ca8T_l%(2dE4g%off-(l*%oP*B6OZ<^O5#FXN)@ zy8eG$dguXUDCtxfX^@l-0Vz?sBnD~eW?%^El8{D3P^2ZK8)*V5tm{hoaBf#djM<~a7T_gZVOz1I6vtUx(2k6IyZsIA2{6JpQ}VnAy{>1r2) zlg%Ynft9enr=DHXPaAO-P957X<|T8~<}XNY*M;&^er8u4z~p)DtWetBQl+OA{QW*RCSJWzDtcodH!wYy z9DLTWJ&=9-)4|1tyIBwTkPI16WUex+Y7<^>@^1T0(&@wNhqG}V|)9G>1(4o}ww zr|^0=#vh9Z4?olx8d+&M7kPn#Dns)EInUq@6>eh59uJDUyQYY~UWRanyOvsu`!_$D zOdn>vr2%R?!r7of#JF>e)riri14iE=Q)lU1?ZqYEDm}*UnhieCvc>Y9>Ql; zn3AaKX&iKne-VBCbu`6X^stP?ur$K?ux{mref%YGpGXqgArF*x`}t4=YQ{x29J8E> zboTXlef;?>%~j}JGMwGX-==o{K*}F*W?ty5hUsrVbf-uCtXvQoj+x)=Ezq6Yy)*l6 zsC|=rx|$+#xNUPnW{kkOQmtA&Lejoa!^7RggGw2(;GK^5IUr}ajkS0C@1tWW^uz?I zccFP@GLiC6u@aY_6X;Kiei@M@4GJ38M39k zjeN{m)#E09n}8x;>6mW~IxK3i!WyDNZ9i%%D_=i^^i zFaWM1U22;)nQ(0%)S5UDut9kDTZ#RL9q@k4PHvf&dgVdjw`^~{%6%p6zB$MGUFW-& zjtN}HO-Ho7`kpAUM+Cdr2n3#>g)Oen;0wt@JN)dnoZvEMx~}sQ+7?O~3){?8KrA?} z#^>88ize1c;q7R?w0D*+@6VPnu~N;>-Cc2WFYUH1C$yykyJOYAlBAPwg=8ryc-Eip zE_TWiWVnkFRPiWGqT;~q5FrBvVUzZ{Q%7#qgB+m@3_Pv1dms%uQDsv_n?B=hJ%MGg zm=@tz9>rQW6xL#`V(K41gvLKnMN>d9?+0w|3n2GKB&jz44O-jlP1)Fk|lKF+^H!nm^JN}jbEmnDc`BV6e2j)kVGSo|xRid{ei9`g09y$kD>2NK=W!I+I`=F_!N5uk zv-PR|8nQ*RccV3)bOgyzQ5g|7^LW7$8XWz>EZ0~wnU&mqy4_c2V=f`yRT{ZiRwlx$8=mVMZf+qtWSQ3L6sUs-E8dVXR_pMcSqs%iG(#`fLx2{~-x8N1>4l>9zdT_oP56o{bFHj zK76)SYxF-dOH01>b*=TyL<)=Ft*V}ba|?$>DbF_&66ZRI5%_Le8q+hnAKP2;s7srK z7jZ0D$|8Kil^PWdKPq@$d+H+oa$06zhhE-AR^tT2N!!#JeU(guC`Si}t7qS$g9`rb z|2k($l+Uq#iP(2rKXeL#)j9$UNa}9JH_5*F5Ue(QO3m)zVRM#E9<5(Y`h(rx&3A1* z%k1o#UB+I9kmwhdp)bf*m8XH)Ort5{tq1W0C>TUK%--f!0p;R|Oik-of{t3KzEtss zb}K*lFNz?0-8@=ZMERo-7~$HpE${Bf(zUkqHZ;!L_IE}yXx_BjM_$)2b7t}2$*ZP%6+{Q)KTJyqX@ep=P4ALo;-AE%`6!i~n-+&Tcf4*xak;fd zwtjD1`yjj!KFq`|HhqJvkKUta_6~r-MCWc(EIBkyzMR?mgA2=n7MR zRP#MeYvKWSshyYJ(dW%XclEFv_a(WS1hPHdLVfduHLX|9Uez^CGJqP&;mKOMADY2- z9$^u1{dx=iZUN<8c9o9@q#~QB&(xwEieC$DJ%g)ZKUOz}^%}h@ygQ%V?B}l14SP>; zb+T)tS+luwf?hK@u7o>8Ug+3L+QD4fc=UpI&HNeW(rxi?y3$nRowur-vYAUb(7a-- zsO>@dioNjLlQmpHuC{5MD0@%IHmBe(+pRKTEz_Oy6h;=eIft253vJy9M|qw!gDSV+ zE*g}b%n93Z=HvZmhjp+b+UcL{qZP8#kL;g&7v7v>Q>!;l&g!}+INYT?x8VO{+tc+EEhPDU|e{dbF}yPhs(3|=m~7`myAIjKCNn7KCsFk<-ZUG zvSCD2>KZ*{#$^l;*KDkjjJ|gh?d1A71Cu-^5UZ3ybZ3)6eS~8fO8hNkkS`d(*Nv|s;DP)enk@bK^rH@Di2p`;F>S>&`WN|vP) z60Z*#(6`a9Dlm4VOluT5s~`lA%wvgl96XBxYw%cVB@||MTfPzL;tX2ESmeB)5Z6S( znm?>RT6-g|vsbw<*ss`xyRP|eL6$CH*V(J`r&`hOgi_6*)3N0l3$MI{zNf_K+t7(| z?9AM^H{oJxq~f@@s&-V=>%FTGYov~`AC!*2ecW68Ug1CB{c)mH;<=1#(sB8S4{ zgCtiGuOA=z_&ux`&ILxn} z3ErO@rmu)Thl zOQP{&G;g!Cx?Fy(cQ&bOfXDn?|Y@B02f#8lpQe8 zd||>Il#uw6`YqA@ujHaqQD}}g3$1q~-2m)E#lfLuGC<%mhi*y2p|LtA0IlX{yE5|d z%#M(ZG_~wDNVA=RQcTa6yb1o_nCW@V&}Npp(ubMG-6_{3HjURkfBJ`cZ(m}nG<0~;ND*Zhf0biA?GkP>n}VI)^ZbQH*1(7&ZcAd2okb@6s$awa%*>~^{Wo|TY;K|v?E)#i8e-ZKu7Nsik4@0|17T{om2@YkGJe|iD3j(ECjTMN4ly&%c)L>U94JP( zMm1MXRQ`&D4YTsty{IP0lh)K><^5AFd%uaQ3yBzck)d=@&R*60?w^3>B?q>Q=R* z+~wsQQ`-vU*(+b*H|;>iBLD%_>KI}5GAzAuYfwu*6xpRxbA!Vg=+qjhIujP9mea4| zeW4Blt#7u5G1I|-A)wdV@09OkEU|IvE|P$JOw&$fX6W>_(8M9g39I;a(}_7h$A&|t z`Smej!`HT^F4i_59Nv6gl6_9YsBF3unu5_kRux2jtUE?FMv>ogGP{7?UfxU#&E}Aa zY$W$#Wt5b*p78Em(W&|VOj1PGMFXm3(KidPs5gtPx^GJ|=Sr@hFN=uhxVV(Gv3=70 z9hBunba*XBD@JC)$o0qEl&2P4(^4cJ-A{E1Di*WJ?C(!6!p^__V{L16vf*o2AR?%*t%OSz{L}xWoxT?UMg&s@F%4_Gp<45Lrt7R((mS3Q z!DLz>{WKI$?7tJtCN~IpUD2(0o90!C=e`i%YRoLo2Q<#dvKL{y*f)9daU1S80I6W% zY4pZ+sX}x{^3f}K#nyceLp-av&|RucvQ65XJI1D&K8|7ghLK}2@yBw?nG$}ZISbxz z9(;4nDUp5gfZ_A6aleFF7Y)2ft0Kini}Q+UxB4@|rZPOOuZ?p24fDh1|N5@;ONdJxEXF&zSZ5T_ z>6}bPtomjL1g7{9W0aCkyIY|}iTpX&NVSBpFJx--N{lH@guhCPz*3=6?a`32QtO(V z=_CmFUyP+*#&|TeZ>$|DZj{&FuZp}n_+_AT)6V}uyY+u^{)jB;t@qI>+cmcIXyz;s zIP|C;FX6+3R0|X-?yb0CV$ADM{Tt)nXe3x2u)<)a)oCdUG~OKq6g~O zO~YC1Z@;i)$qn&w+|6j(X~U20O_qs#8RvxcyP`o0W(^|~M-;5K#PU{n;D~?oASoze zD(=2kL9T5&Psy9lJ56NFV+aDBn47nZdmbLo(mu(Utg{}<8D=tx7Aj}+C?n>-M{(N_ zQPH*`P1(o$n7FctC-Mev7nBkk!@BwdMyXQ~;Wqh0J7gTQ@Y`B+MvUd6c}$FVC5+hX z<#$OJNgfw`@%@hFjEg<6AVcqEMmtK^=)PWXEK7eD$Gh>EhuVy@2~5ItzYThVemeYE z7!PJU0#}xcK$DW7yV%>7L!mGv0#C5B2-%Z)Dg>7Dv2OomH7AZI*bOMJJPxsFGJF2TyTg0SrFkQm5O0-drUao z^~L8`{yeSsi$ghT?3ND2FttyTbdo>v(`3gF)C;Sm4MsRd+mbmVseSl#5DVJ5A%j`l z2)fkg=^61{&eT~suT^Bj1b%EBzj07rSARa5p`|C{_$tG#S5Hgyt?Mw^Ai~gx<0X8H zpCAbURo6^Y(W=D8_&pV*d_r>D$H}XFeuhF!0X((<;W_>lNG%3$3TX5M`!?-8FHQ9` zGi)h-R7F!9Cf!{im5ViAuMo#sQY*uwEur3ihhd=s;8KG4fOzp52S)Vd&4{}WUx~o# zrlTu~{^CckO>z2HT34OR-auLmxj-|dliyNy?_m$-QhDuj1{`zy}A`N=wCpqnQ%2;>P5vs3PUpC6!!HsCjBOiE896^$NzY%PNbB7m;HwE1vcEK?K&>#&PTt`rJ;OpA?~I{i zh>;$(p1T0)sh|}QnK(_yUVmep9<6wZNv5A;0=8dk!e`y8$|?)Fnt92^{cMZBHgkYIF6>P?YaJw$FOSY z2VtVmP;ox2y&Y^dr9v;-7L+#ehJwLzXZGq=d^1#z2cPi`K70jt9Had?_ZYBw+@F(# z=BW$Je7l_E)Ln&&AJ1pvU(i9mFro}WVU7r4R^1MdTyCdRkxRhuJT|W4mB*g-pC;HT z(JgBspk#Jc3M0avM*0w>E(A-zm!myU`y_3`wM)alvmx}JV6ESi_RjdG+LP;(&T+O%xNoO`?^2wBh*YgSg% zsHFw_HtK6vwdg&dj^9z}aT!^qs)_%pW&Qa)sY2@2$qwayIVnbAw+sU5!niChE+};; z2-T`d(9)(sz|2ERkhjxinkd#n!=c+ExquyGCeZa>za8CBy5?>O-SBLl|pDb+Rz%xj|a2z)-T4_-CaL|`C4gK7kzA#coUj#J!Ww+rxm z+QCCI#V$tWOEu{XZ-REo-8fT$UndE_(*#PZiReOwkbb<(H$nwisv>puqN|7V0Dzg& z!EVy@0V*Efo*LUcyqD<49n-ALoiAoyQ|nR&-TW|IYVi+i$5$*%XB`i1nCr3#l%MT`lFFrKqDWO>1(XrU#M)U>hVfI7 zh34T%ZgYnunfjvUN7Z=nWbKeg7V8YvI1xa|H^?vSWIIM|3ks3=iisu%IIb-W&sKue zpxDt55Xgp&e(&^Bzq@&~W=FMtciWh+6D*9k&=xtwh76-yM!lj9^--T*r;F{IdrLx< zD|=7pL0tYKjc0nG?qKLyAUpmHJ7-0UV5;PPe3O7bGiDfx`RXWJIDE%W-WcHlbztCb zcmz!-RmH-D(C!(NuMx6GS4Fo};-6JPn-)GWpa;c$143(*b_RtWDPYRSnX7>Xsx-SB zzvfbV`Lx!Zrign}#zP`CCzhDo_@V3a7R3)AmRziuupNAK)$;(ngY=PY8Hhqs8fbS) zs{8HP;9u=deS?|Hq7Ms4t~o^6f_&^or(Q5U_OnLO`Si>LCP`Y;PRIQb+D(secv(Q^ zVC{5CSC!|5f6%fRDabKCYf~aiHFXMRv;+cbT^dA=q_5VxM6_feaRv@`mcz6XM`1im ze3^_VO~;Kx;lwiE%WXcf@rw~yR^TdVQJ(V3(pr||Voaxo;4zbsT3u^vPZDH^|Lw9^n)EIH4OoLPo^h!w;@mXgwckt~}h50A3O zv`Qgpp*K{r)iGSQg@VBD?5gUNBjMQthj6?r@yExm?W$_&PT39(y9&(Eays=5Auh*< zL+q5Q-CR#RKS5M^x?05)i??22?29EgPuEYqsxE)%p0pXaViI6{M8}nwHS6$0`2m`I zfxa{U*jF#nnGE&BtQh94p+vIiojgVBvB)PDr0L=bUlI$=xk~%f^lsUz8*)b8qp(rR zHB{bx71jH_rJex$$ZQPh+*Xiz#uZ$K?ncUlm#&db^7h8z^trgc;I@v%~XL1w;k{q+K({;X0&WJ+>7^&2+0is-rgS~|5W%>S)quox?U zuKGP+2>sa2LuWzn2k9gaQ=J%}tZsfHM!|}3mHGHZ9*vS}e``;fy~8DtJH>@^d-#Q- z_d-1DGn75|9aAem8Rm0`AZKbOW>4?3!?CY1+lXw$C-w{{nPGR@+JO0O;W=Mz|NZni z0WZ}Y4Xu86b0)v#)9QFl0r?DIr!w0EM z!<@XemT!1)h041$MMevLX4xdGiu#T&)xN93QMdwD;2Ib*Zw5&_c^{gZCEuA3AI^IijXezt zc)Gg6Mm*3mRHN?;BxhUdS%% z;%*6)5(cCCj&p2u^^DUwQE+x+Hge^eQ1-K?xz-QC6=vtylP2%y#wJU$Zf73O!U?|; zYK`bHZa$-3>^oG>;J)we<2~@5jfG7qAf+q2bTc6-%i`t%`Mqjkg9f_N59-HM!OI&# zlNC>PLD8w-GOsl1L$pr>ag=GHOZ?W&HRu{gmdBU78ZFm#ohVy1gm-5GClYnnXs59D zq$YO=f{+dkY~sHdRgvXHi+m~U1c8V!$Try;^~QU1v8fZMteSSSr(D^#?KdY7+vh73 z$0|Otp&f|z=P|~IY`}Z!d-zF~hMo?)!3Pr7*Hg43bPRKC9(#q2x!QPg`zg?kpN*Fs zHa5OAB3z)uV0KjwluOA@Dtob0io7zR?c2uqE#=iGwGvAldp;AnLW9|LCPTS6V1DNq+s`(f^X%YqQ6d=h`I3t3 zJt%rq@o+Q1e^CkXV&U8RmRN#N5MS=)65UcG`46KXSsqM&^wAza5hmPgGPO+tgE-QZ za!X23|EV&BRVU?T`Gxb(IlQ4;2aTYtU3R|z#qU~ed;vFOQIO`A^yBo`Yb{?GX{GFS zWU;V)!XWUmoVfhpo=-oW>9@W|M+oOnnZU!$KntXpMguR-$0|uT zpV=b!S8VaV>P^KQhK&6D)$xf``n*1H_qdnQtZil4(f6i~ijT98B8lJ(143xki7)N3c#jltv-~f+@7~L+4yj^B zr#r|T5gPvGCXZm2Mr#+8gghTFFc%6pH_&knc9P82C^b-Jfks_xV`friYQt|;8QxXB zu75-QOkDVPDFI$aCk-PskhjGo@e&myEQwfPyCH+uKbjRf>Gk65P}pjXb&Wt%EbazJ zHBaTq0VM=pjR+_5tdeTt|NL1T@XlIJ*vj7d*3azENQ^FR$K&5O=I%UYJ!>@Rebe`? zla{-8TF_CYeL>;J{f&eZ0>PapYqneDjv)Ze7FQLD{_E#Dg^o$?B3`CW_UfT>LsLrQGrB{EdBNG&)YRa_ z&bvTYnESKgh)ex+el=N^Hs1q|1{;1R2hfhXErkE-#Nxuh?S@+Ha&1caM z(+7S*@6*UqVS`A*5-}Cz<|o!h(EZGtkDiZghnzqz%$FvW0%Gq4rRv><8c2zQR?wH5 z#OTY!v4BBVm=v29C5GIrLkcffXhX!WPGovFgjgxPeum zCkXQSRE(OZQGRj76A`W3y4E#6MjeFLU9VAM4Cqk%e>()5@RpsADk%U#MvJOuBK+13 z2rNAQkc~HASYsRZ!g(2toO-=)!a1Hh93nI|4H(ni?GrL_JbIDics3i3*8?i%uFrg0 zi02~LyIw%in@5HJJ^z$lS<^V)nH>NwLtr%Y!b7M?^s#;EMhYG+Qw*d;B@vL(H@#|C06zh?LIBCD{_K-q z!YMtS?VbB$eZqZH*za1Eo1o#|=A?m2X&DqWsovyQWCxd0o;w8hSVV5BWwW zCq+1_c>LyhIWPeY3=yA{#6owNr72)LPMPsc@4f~4NdRpJd0`lkg$Ky?wIzQMU>uGO zTG0PpIq~0KL}4M_qYnv$JFci98X+(Pk8Pp6XPx`Y$`0;Fny;(O@o5`rppR}$wiDf& z-gL)Rx$h?%yfN%cB5IMgET%1C31At_t4brf<5zI8rO0bjE(Sj7V`HC{N}C^zYJXDm z31PrDhBFL5v9nE*B@D~2DAytq&`HJT=;cZRowybX;{+d72gY`=jF~HxR8<9nqLZs( ziR%6iP5A}+S_s}I2Qd|XY22S%P0cC>9?cJIRD5ivWj;0fv>v-YDY&$X_D6(^bU$B`Sdc4uOm2eyecbnDD`e(ed1^5Acv)6#t@=4 zP>i^HdwchfdPmSiR?1qS#q+ft%{NA{${t5y*({4pVFDLspVuGzI~QgMMLc=J$FDa% zHKiIJ`xW$RSNaRfKxkVCQ?NU)OS?aq5UOwR6z? z(k;?EC729VJI80y*WRiVmJ4+d%jq3`+T2c#DIpTva94WW{3%HobS{2;_A%j`8fj_w zc|fSK;8B~@*u?~A5H7?;M!+S_@>e5<~ILkFSW&h)^r;C zRv8QHK{}b+QP;EPfET#~;oc!cZEdsGrB@|GNtel))eWO`XX9B+>oro$!QfAu!FLMTft?kiYE=x_UDg zYyEHT^iN|Vr)=7b4=19Ryuo^FO98mD&$z0f?C=fq{Ne9x`+u0DmLzr_))3f3L!>3Z zRo)PFRidV$c~x1dy-|JBgdYN)n-oK_(!F~L#l>7{ypKbHMn$@tlErJVRhq*xSA+InuJGW2WC z$$ofv$hHqS`Mtf*IS2NG%p*sZ1~UH9R4`?N0s>>CDN`h1Zs-B2D}ItKvOXm++C-3z zul0{W=fA~0nexs%wTxWo|7cil;Gk>EAk5@psqqfc`JfRyF(@c#DKO(TU^=GuU;^o; zZ&#{;Dc8zj;)^YBu_O#szt#6v{G&%Ib#O&X1p{<;e*V3@n=UaXhA5Xka+MQud_|0W z5qM}9pOL{uVd#YH=s7mh0)$r&na$%p~DN z3VDDB+<=G!VFfMF6OJ1pfCF`|XRCZ)`k8Auu63B}d27D_ul3yB?4+ z#9}`GiuIix!ROvI-YeR|k+fCEr>bL7R_?W9eBZbYU0<~{_=9B-OYWUwq zzA!w~5iF4w=nq+c{^Pq-;PfR~o-q%+=1U8bpWc-ip4UZYF zDsFDb+;$3}lMT;+Gg%(8ubFOxbKhFeb^?qkztH7559z9#$=ZR>|~mAwDildLSSV3o!wgh$O^S6K~$Am%qOYWGH+ywHi`k?5SbpO=uawOT2>u9e0aaaQ&el1hmT_XEH@1-Uw85z!_ZY^U7 z9Hb9L61&A_cZry*%BZ>$vIV10c|l zfCzaLUgd;E!Sg~t*tV(<00eY_y;Zeu-Q8aqN(l-=|2Q}Z`$o78d;k8umY$wX6Ap+P zB!)aEiRr|)nt%Bt3o&IPfFHT1to&?u7Ht~_N@o&ZyrA|vuAj57j?JF|aJ{h)xu^-34AS&FrLttY zuwyb%sQhZU4=`2saxmoS;nC4O85tQRBIJ44StEGbjCAmbh=>@GnlL)=9*81vq~Aer zvDoqo{pNZ1PX)zrBzB;8Byk9A*}3KJzbECNUhuqvsDkF!s6i!nk&ODS<8!s1z><>N zE?@qdU{(Xv_hE{gkqy+;)KN-kbi51?Det$r0V!e{UPXZU(F|*AR{)bXXXDFO=+T`g zD^N~=GNQW4$;ofP4NNJR<+$b6tDhw#B)a;-x|evn!4J+?Dmr*pz@=9uVXiD5K7Q~P z#k$+V9nV#SqhrdqZx+hx>J&*I)pm5ziD{wwSH&S)1vzu?C=#oyg+BK7@^xc<I9uXqv4H*QhW{Pb@kn1;!A_k=MwT7qAmy9VUKaqA z0aG5C_CKGFtQGvXQTVH^0;Xbo~LEe>Q+wLD|l{%1e<{LWnKy`6B?sq5W0`MPG0 zL2LRRD9%>~v6)my93V>q^1#S^(+pvvRML9BuQ+!SXEUOC1_70(Oq_ScCK(*kkNbp?QN}> zl&%Z-fEPMf@-P!&q9GcrO6wD)!gN~w#Fx0r^Pqg>U5kOLz)d(@O>zhDv@30U{Ln*S zfR_T2TeiX=6N<4ZOyCZ8T3l(xN+tc3JFF3gHZp zcP}pL>+8SAE7HX;FI!d8hFY=Mrgm)ue(UH4&A_3o($2|JY`XXk4ikD3vGL6|T4Hq? zb&10yk|0x)3Hb&~w5st1GO`~9uHtvH6o!;4pH0Vn_n=#~Is1xYFX&p58_Ofe5? zWK`p?WDyi8)PaSS^&>czzRQ&>4+!U1vW)2CN;}tseCI!-ACuzdQH7fncM~MxOzeOn z&`CS)+qaW}g=!Tq1C)+0d+C{n!~wrdeBKon#$AOLdARkcN2Hz#RJeD?sBXl52-&`_ zkCGpZ{%2G5=3fpQg~gM!7;FJ1YW)@BK*}``Qxl_uuwCu^csu0^V{{`FdgBTJfNO>% zhq5uK;zaH844OE1k_S(h(bC;29!78G=i`f_#89x{q-*i^bO>a?R4@Zvc5|%acA@-F z_r(T0pYzAEx}G>Kv+oc>`?WA`Cs{$GAb1;aYYSJ9qErNZK&%CG!9n50Mq@W=HsHz(St!TCm|6Rl{!zdN*wm?`GWg(Rn^fTw zA|1tRGbd@0Aj?lWKSxpKKrNafJ1Gn~8T-5(*4OY?BF zAe>`Q2)+{$^mwBa~7hZ0J(l22nV-5t?dTJHzxA%LvbO-_Yeez*VI##z6?TBTl+Bz1}xE`<~j2Q zep@X=YkfD+Gsfw2Ed5m)aPfAx0eMc)O3>gn?^_ElsQl^odwNa2r<&c91kQweV#~Ze?MEyXS95nzDxW??b5gd0N1U5lb`$Bg;T?5%6 zfIipL-!I-PMVyN*ev2U!Ska)J>qnkk@i<4j-i->YB%YT_%_M8);N-UpA0_ha66q1H z^Y&qy%j6OmgwN8B7|^77Uk4F7ph_#PP73y7Gz~ET?MvwWRZ5q{^F@nux$y)Lr{;pg z;RS`Jp-yxTB6eP1S;bSvK7XbnArN=K+={iWq~nzNii6_xx;UH|@M07wKSn$L{0?L1 z4r%J$07dRV8Kappv$m7Sm}}Q49x2O7KL~yoA)5@{X-V%<@?z2+BW9UiUQojTMZpBv zm;Y=xc2oK)1T}@ag}`{4K49zmOuTEA__EEO?K_H!Y!O1W1&&D0Tz(n)8sl_b$POaT z*piN{|GGsid$-|!OQ8>dprk%Ery=NtGBHT6BCmV?1QlwQS7pEk`FD55uf=2D`Eotg zq-@U5&#&TfH_?8p2g^o{`=EbSo^LaT$FW z+d$97YA|AegX*aG*-!tNl(|n)^Y=H?xKiGtI@Ls3` z(jq8k!D|cFjV0MBD+glUiS%ubUwAmpB1{PuAxQImV%Dng?;qx+J0hr|PgtikZi0ZZ z+E-U{uZMYgieVN4)5mlx2BAGezw`@!>lobFpu=1g%;EA&Y_n__0q!?#5R}R+)*ceL z(d1>1%!m8huR`(QhP^-U|E6=}zXFqA&5b_i@7^Fzu8BLwy^)g>!4$mCC?%kPwi~Ae zC0vch^?r4kXl%+e^8<@=gz|k*m>iTGR{^3!%Au^1m@=0-Ik{09GV1ulwmwVQePVW< z$7g^)^2pr3AIcyVDAkPVO zxP=fZso$y$s7;DO#l8K~NAd{2)hz8}!KZe81FT;3_!U^_MF5rc>h@qM`Dy3Z=SDrd z0B}1#FTEBeAA~~{B?-jEKJqbpWv8+5X*9;2E#v9uZ}pGzPL+g=rC5qO00i$g^Ko_D zB{iY`w{z{OW6SCopsF_Rmj=G7t!7CiuJsp6LyIq6-dIHP(Qsat>wfpn;pED`2{JL{ zgyl=3H9Koxm4$Lj$L`-FRlNv*_XndLeN%&HiLmfl;pNP4zG;>*6ZoX&Vsjpa!1c7-E=XG%5!jo1lTMc5fCO`G>x=$Z#tNJ zj>lek%E5ba`xMh9FnwiO9AY{{jez$#oo{sB-m{XSf~OfR0lgMC538LXRl1j~$dp8O z_3^LVjR#tp7cBIl){_X8uqfm8{jc~IM@h%CKBdN~JAJ?S-^?UzTfHG(WKSK zc&~T{;{QMkj z&$p77ikd^zM~Cz(SQZjD)B~4+7;WisVooP;+CJUqb)POoFDLpbvcZ01Gpz3Haf!ci zp@Asp#0o1yliuj=?cudznuT(qCA^ZG3jDdTVRs5R zkiCF8-wSku`aY@OHR7w6!*=I3tksYNT7cg6=n!188E}~A1{GGZXX%M=Jwd@p6A)<8 z1beqx5b^u|CktVsFXft8%;K(;;fqb0oBRW|;EX{tCR;Z#x;?0!9FWg2?~V=%t@?iN zeZKeAV~#M0eQ9aQ62#BJXBDmrQ`reEa@Z{fK75t3Tg)*wf-w$NoYvTM+g(1m;0Ob^w$boeI1z7Ip9Cka%|q)8A+jXdHfUT zj62qe^D9~~2$@AKd?4#kD$ISpfc!}?Z&e+PiT>26cW2(Oo^856FK+U>7T?Rx&0gRZ zwfuo|ZoP@?!U9R~aX3B#Fo20|>I{LQbfI=xqLtaF%{TQ*a-VO2ZQ;b)29>?ZRAQV0 zI@L`ZTdN(Vv==YlOoLoOt;K2dL%zp~zFJdJuua|SNSg`A=8K2-Gwx_wcOu+a8OZj9 z>Xnnzb<54=B{Eu6@KY=lH}8yqeasJryvQ=lyKuUi-@l-&sl9C~t$^K77u1e}KU-{xMad-)e4HFVIsp zNtp)l?`?x&rj^G1L9v%%zlK&&u=|;!f)K$fGQPKRGS@(GV4yJ!@Xt*gMQ;ZdN7gb}^|cd=;m}Hj>uq0F+3yUCs)HV4eFE1k+3Y4!E55Vc651Rh(#v zW9fk%PR%P>k4lY=fKL2#1Fj|jM%)9go=Ar5bdTW8N|u3g91Aj?D{&N^MkLu({_JO( zbynT0!5e*1urOl!!D;FyWr*Ub2Y%JHketru`s^9n|7nf?{SLC(Ajd;G5_D&Nmfk0* zs9}|z5<2Hg{qSWI=#=(?^{Zzc*^@wz%V)78St&kKG)vH6O%+Qp$Ziq8PT@npZ#2=w zjM1rAl7F#%emaO z*-i1OD7Q${AN6};#w0IJHL>SP%3M|)xP+Zfa z8+zn#&0;!I?PY}tzZFLRr_1qX9Zt{b1U79w3MY(+mb%|69&M*VYpVKDV`(`igiAMP zz>2p)ZI~&0&T}c6Pe|w?(5TV8%U!F*PWty@z`w4n>>H*xNmXiE+D&@D15IE*ZUN8C z_4eVrH)nUxg`-qTp3PFpq6Vn*W@QCHxdN1pMmz&lgBb`YNSVCh5ql&}idJ zx#-sbtM@%E2<-dQZzb?fi-FB!K(}X$Jd(`be^RMuL6vtEO_Z0HgIGzL!23@F1mQCI z>(iaUr>CW*Jq4<}PxrokoJt2n1qX?$Qt8MI1X^UZQIk;#n6q3Da=;Pc&vDiPZhF9!m#lf&2G5v`6M?tW(&x;2?K79xIlQ$C2 z)8KRgKX;{jn8a4_^es$i5cVr4KeM0oER|Y!?U(sxg|!Cz?W>&${<`GXmha_m{;9>r z#NG^i_`)6>209}Igys`R3<+_EpZ0&Ik( zd(1l{$ORF+KPCG1xI-04{`B=4V9F!RBCAnK)y=;yeNK0~>HEgUlDe-JFg~dgr7e&j zvIJXkR+SJ7wn#hvM0pul5DeekmGpnki+{g^WQCV)fMLzVgzxnh!|bghQSiOX(N`*m z0dGw}mx*Dszu(|1*<@GZdM|WL7(8yi1B7ZOp!G|e?|dMXkmjCMDS|PwVMwLNe5B(x z%iqTC|N6FnEn210s8Bd*h0+(MzKCz1W31o)H3i{P@%C2ldN>&)VP(*Yos2*E;?-;^ z#~|2`DOdqwAp!-TI)_!S&N1h7VnSx_o8GaA&yjBFQFtoh!R8iw-x8H-a0ERLj2hQu%|G4U{6r^rot!+3$4uzbn4u6y}|s4 z!5k(=&f>t&Mh5hi|Mby+tteMU2E<56p6H)U(q97(_E-@8gS>RXgg>pszXo7cMrt?@ zU*7Fc59(i&xe*H7mb|bn%ij&$e;AnI5THLy5wZ5CMewg7@xHpFNQZHyKR({8`^~{e zla9Q7{j>D{I!XsucSP~EIQ~Db>F*wa6a{(^%!uR7AHDa#M(OH~xIgGIHHYEeE{DTdsj0W%>JZB{HT# F{|`AFQd0l` literal 0 HcmV?d00001 diff --git a/defaults/main.yml b/defaults/main.yml index b7bf6b0..6881e06 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -17,12 +17,19 @@ solr_service_state: started solr_log_dir: /var/log/solr solr_home: /var/solr solr_data_dir: "{{ solr_home }}/data" +solr_collections_config_tmp_dir: /tmp/collections + +# Logs +solr_log_root_level: WARN +solr_log_file_size: 500MB +solr_log_max_backup_index: 9 # Ports +solr_host: "{{ hostvars[ansible_nodename]['ansible_' + ansible_default_ipv4.alias]['ipv4']['address'] }}" solr_port: 8983 +solr_url: http://{{ solr_host }}:{{ solr_port }}/solr solr_jmx_enabled: 'true' solr_jmx_port: 1099 -solr_host: "{{ hostvars[ansible_nodename]['ansible_' + ansible_default_ipv4.alias]['ipv4']['address'] }}" # JVM solr_gc_tune: "-XX:NewRatio=3 \ @@ -31,7 +38,8 @@ solr_gc_tune: "-XX:NewRatio=3 \ -XX:MaxTenuringThreshold=8 \ -XX:+UseConcMarkSweepGC \ -XX:+UseParNewGC \ --XX:ConcGCThreads=4 -XX:ParallelGCThreads=4 \ +-XX:ConcGCThreads=4 \ +-XX:ParallelGCThreads=4 \ -XX:+CMSScavengeBeforeRemark \ -XX:PretenureSizeThreshold=64m \ -XX:+UseCMSInitiatingOccupancyOnly \ @@ -44,6 +52,8 @@ solr_gc_tune: "-XX:NewRatio=3 \ -XX:+UseTLAB" solr_stack_size: 256k solr_heap: 512m + +# Jetty solr_jetty_threads_min: 10 solr_jetty_threads_max: 10000 solr_jetty_threads_idle_timeout: 5000 @@ -60,36 +70,13 @@ solr_jetty_delay_dispatch_until_content: 'false' solr_jetty_http_selectors: -1 solr_jetty_http_acceptors: -1 -# ZOOKEEPER -# Deprecated -zookeeper_hosts: localhost:2181 -# Deprecated -zookeeper_hosts_solr_path: solr -# Deprecated -zk_host: "{{ zookeeper_hosts }}/{{ zookeeper_hosts_solr_path }}" -# Deprecated -zookeeper_client_path: /opt/solr/server/scripts/cloud-scripts - -solr_zookeeper_hosts: "{{ zookeeper_hosts }}" -solr_zookeeper_hosts_solr_path: "{{ zookeeper_hosts_solr_path }}" +# Zookeeper +solr_zookeeper_hosts: localhost:2181 +solr_zookeeper_hosts_solr_path: solr solr_zk_host: "{{ solr_zookeeper_hosts }}/{{ solr_zookeeper_hosts_solr_path }}" -solr_zookeeper_client_path: "{{ zookeeper_client_path }}" +solr_zookeeper_client_path: /opt/solr/server/scripts/cloud-scripts solr_zookeeper_client_timeout: 15000 -# LOG -# Deprecated -log_root_level: WARN -# Deprecated -log_file_size: 500MB -# Deprecated -log_max_backup_index: 9 - -solr_log_root_level: "{{ log_root_level }}" -solr_log_file_size: "{{ log_file_size }}" -solr_log_max_backup_index: "{{ log_max_backup_index }}" - -# MOUNT -# mount_name: # Deprecated -# mount_source: # Deprecated -solr_mount_name: "{{ mount_name }}" -solr_mount_source: "{{ mount_source }}" +# Collections configuration +solr_collections: {} +solr_collections_template_path: "{{ playbook_dir }}/templates/collections/" diff --git a/molecule/default/group_vars/solrcloud.yml b/molecule/default/group_vars/solrcloud.yml new file mode 100644 index 0000000..76cea2e --- /dev/null +++ b/molecule/default/group_vars/solrcloud.yml @@ -0,0 +1,15 @@ +--- + +solr_cloud_version: 7.5.0 +solr_port: 8983 + +solr_zookeeper_hosts: zookeeper:2181 +solr_host: "{{ hostvars[ansible_nodename]['ansible_' + ansible_default_ipv4.alias]['ipv4']['address'] }}" + +solr_collections: + # Extracted from https://github.com/apache/lucene-solr/tree/master/solr/server/solr/configsets/sample_techproducts_configs/conf + # Should have configuration files under "templates/collections/[collection_name]" directory + sample_techproducts_configs: + shards: 2 + replicas: 1 + shards_per_node: 1 diff --git a/molecule/default/group_vars/solrcloud_group.yml b/molecule/default/group_vars/solrcloud_group.yml deleted file mode 100644 index 9f8a5ca..0000000 --- a/molecule/default/group_vars/solrcloud_group.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- - -solr_cloud_version: 7.5.0 -solr_port: 8983 - -solr_zookeeper_hosts: zookeeper:2181 -solr_host: "{{ hostvars[ansible_nodename]['ansible_' + ansible_default_ipv4.alias]['ipv4']['address'] }}" diff --git a/molecule/default/group_vars/zookeeper_group.yml b/molecule/default/group_vars/zookeeper.yml similarity index 100% rename from molecule/default/group_vars/zookeeper_group.yml rename to molecule/default/group_vars/zookeeper.yml diff --git a/molecule/default/molecule.yml b/molecule/default/molecule.yml index c538400..de1fe62 100644 --- a/molecule/default/molecule.yml +++ b/molecule/default/molecule.yml @@ -20,8 +20,8 @@ platforms: aliases: - zookeeper - - name: solrcloud - hostname: solrcloud + - name: solrcloud1 + hostname: solrcloud1 image: idealista/java-debian-ansible:3.2.0-debian9 privileged: true capabilities: @@ -29,16 +29,36 @@ platforms: volumes: - '/sys/fs/cgroup:/sys/fs/cgroup:ro' groups: - - solrcloud_group + - solrcloud command: '/lib/systemd/systemd' networks: - name: solr-network aliases: - - solrcloud + - solrcloud1 links: - zookeeper:zookeeper published_ports: - 0.0.0.0:8983:8983/tcp + + - name: solrcloud2 + hostname: solrcloud2 + image: idealista/java-debian-ansible:3.2.0-debian9 + privileged: true + capabilities: + - SYS_ADMIN + volumes: + - '/sys/fs/cgroup:/sys/fs/cgroup:ro' + groups: + - solrcloud + command: '/lib/systemd/systemd' + networks: + - name: solr-network + aliases: + - solrcloud2 + links: + - zookeeper:zookeeper + published_ports: + - 0.0.0.0:8984:8983/tcp provisioner: name: ansible lint: diff --git a/molecule/default/templates/collections/sample_techproducts_configs/_rest_managed.json b/molecule/default/templates/collections/sample_techproducts_configs/_rest_managed.json new file mode 100755 index 0000000..6a4aec3 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/_rest_managed.json @@ -0,0 +1 @@ +{"initArgs":{},"managedList":[]} diff --git a/molecule/default/templates/collections/sample_techproducts_configs/_schema_analysis_stopwords_english.json b/molecule/default/templates/collections/sample_techproducts_configs/_schema_analysis_stopwords_english.json new file mode 100755 index 0000000..a694e5c --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/_schema_analysis_stopwords_english.json @@ -0,0 +1,38 @@ +{ + "initArgs":{"ignoreCase":true}, + "managedList":[ + "a", + "an", + "and", + "are", + "as", + "at", + "be", + "but", + "by", + "for", + "if", + "in", + "into", + "is", + "it", + "no", + "not", + "of", + "on", + "or", + "stopworda", + "stopwordb", + "such", + "that", + "the", + "their", + "then", + "there", + "these", + "they", + "this", + "to", + "was", + "will", + "with"]} diff --git a/molecule/default/templates/collections/sample_techproducts_configs/_schema_analysis_synonyms_english.json b/molecule/default/templates/collections/sample_techproducts_configs/_schema_analysis_synonyms_english.json new file mode 100755 index 0000000..869bdce --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/_schema_analysis_synonyms_english.json @@ -0,0 +1,11 @@ +{ + "initArgs":{ + "ignoreCase":true, + "format":"solr" + }, + "managedMap":{ + "GB":["GiB","Gigabyte"], + "happy":["glad","joyful"], + "TV":["Television"] + } +} diff --git a/molecule/default/templates/collections/sample_techproducts_configs/clustering/carrot2/README.txt b/molecule/default/templates/collections/sample_techproducts_configs/clustering/carrot2/README.txt new file mode 100755 index 0000000..3d90ec7 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/clustering/carrot2/README.txt @@ -0,0 +1,11 @@ +An override location of the clustering algorithm's resources +attribute definitions and lexical resources. + +A directory from which to load algorithm-specific stop words, +stop labels and attribute definition XMLs. + +For an overview of Carrot2 lexical resources, see: +http://download.carrot2.org/head/manual/#chapter.lexical-resources + +For an overview of Lingo3G lexical resources, see: +http://download.carrotsearch.com/lingo3g/manual/#chapter.lexical-resources diff --git a/molecule/default/templates/collections/sample_techproducts_configs/clustering/carrot2/kmeans-attributes.xml b/molecule/default/templates/collections/sample_techproducts_configs/clustering/carrot2/kmeans-attributes.xml new file mode 100755 index 0000000..d802465 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/clustering/carrot2/kmeans-attributes.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + diff --git a/molecule/default/templates/collections/sample_techproducts_configs/clustering/carrot2/lingo-attributes.xml b/molecule/default/templates/collections/sample_techproducts_configs/clustering/carrot2/lingo-attributes.xml new file mode 100755 index 0000000..4bf1360 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/clustering/carrot2/lingo-attributes.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/molecule/default/templates/collections/sample_techproducts_configs/clustering/carrot2/stc-attributes.xml b/molecule/default/templates/collections/sample_techproducts_configs/clustering/carrot2/stc-attributes.xml new file mode 100755 index 0000000..c1bf110 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/clustering/carrot2/stc-attributes.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + diff --git a/molecule/default/templates/collections/sample_techproducts_configs/currency.xml b/molecule/default/templates/collections/sample_techproducts_configs/currency.xml new file mode 100755 index 0000000..3a9c58a --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/currency.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/molecule/default/templates/collections/sample_techproducts_configs/elevate.xml b/molecule/default/templates/collections/sample_techproducts_configs/elevate.xml new file mode 100755 index 0000000..2c09ebe --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/elevate.xml @@ -0,0 +1,42 @@ + + + + + + + + diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/contractions_ca.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/contractions_ca.txt new file mode 100755 index 0000000..307a85f --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/contractions_ca.txt @@ -0,0 +1,8 @@ +# Set of Catalan contractions for ElisionFilter +# TODO: load this as a resource from the analyzer and sync it in build.xml +d +l +m +n +s +t diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/contractions_fr.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/contractions_fr.txt new file mode 100755 index 0000000..f1bba51 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/contractions_fr.txt @@ -0,0 +1,15 @@ +# Set of French contractions for ElisionFilter +# TODO: load this as a resource from the analyzer and sync it in build.xml +l +m +t +qu +n +s +j +d +c +jusqu +quoiqu +lorsqu +puisqu diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/contractions_ga.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/contractions_ga.txt new file mode 100755 index 0000000..9ebe7fa --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/contractions_ga.txt @@ -0,0 +1,5 @@ +# Set of Irish contractions for ElisionFilter +# TODO: load this as a resource from the analyzer and sync it in build.xml +d +m +b diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/contractions_it.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/contractions_it.txt new file mode 100755 index 0000000..cac0409 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/contractions_it.txt @@ -0,0 +1,23 @@ +# Set of Italian contractions for ElisionFilter +# TODO: load this as a resource from the analyzer and sync it in build.xml +c +l +all +dall +dell +nell +sull +coll +pell +gl +agl +dagl +degl +negl +sugl +un +m +t +s +v +d diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/hyphenations_ga.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/hyphenations_ga.txt new file mode 100755 index 0000000..4d2642c --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/hyphenations_ga.txt @@ -0,0 +1,5 @@ +# Set of Irish hyphenations for StopFilter +# TODO: load this as a resource from the analyzer and sync it in build.xml +h +n +t diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stemdict_nl.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stemdict_nl.txt new file mode 100755 index 0000000..4410729 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stemdict_nl.txt @@ -0,0 +1,6 @@ +# Set of overrides for the dutch stemmer +# TODO: load this as a resource from the analyzer and sync it in build.xml +fiets fiets +bromfiets bromfiets +ei eier +kind kinder diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stoptags_ja.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stoptags_ja.txt new file mode 100755 index 0000000..71b7508 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stoptags_ja.txt @@ -0,0 +1,420 @@ +# +# This file defines a Japanese stoptag set for JapanesePartOfSpeechStopFilter. +# +# Any token with a part-of-speech tag that exactly matches those defined in this +# file are removed from the token stream. +# +# Set your own stoptags by uncommenting the lines below. Note that comments are +# not allowed on the same line as a stoptag. See LUCENE-3745 for frequency lists, +# etc. that can be useful for building you own stoptag set. +# +# The entire possible tagset is provided below for convenience. +# +##### +# noun: unclassified nouns +#名詞 +# +# noun-common: Common nouns or nouns where the sub-classification is undefined +#名詞-一般 +# +# noun-proper: Proper nouns where the sub-classification is undefined +#名詞-固有名詞 +# +# noun-proper-misc: miscellaneous proper nouns +#名詞-固有名詞-一般 +# +# noun-proper-person: Personal names where the sub-classification is undefined +#名詞-固有名詞-人名 +# +# noun-proper-person-misc: names that cannot be divided into surname and +# given name; foreign names; names where the surname or given name is unknown. +# e.g. お市の方 +#名詞-固有名詞-人名-一般 +# +# noun-proper-person-surname: Mainly Japanese surnames. +# e.g. 山田 +#名詞-固有名詞-人名-姓 +# +# noun-proper-person-given_name: Mainly Japanese given names. +# e.g. 太郎 +#名詞-固有名詞-人名-名 +# +# noun-proper-organization: Names representing organizations. +# e.g. 通産省, NHK +#名詞-固有名詞-組織 +# +# noun-proper-place: Place names where the sub-classification is undefined +#名詞-固有名詞-地域 +# +# noun-proper-place-misc: Place names excluding countries. +# e.g. アジア, バルセロナ, 京都 +#名詞-固有名詞-地域-一般 +# +# noun-proper-place-country: Country names. +# e.g. 日本, オーストラリア +#名詞-固有名詞-地域-国 +# +# noun-pronoun: Pronouns where the sub-classification is undefined +#名詞-代名詞 +# +# noun-pronoun-misc: miscellaneous pronouns: +# e.g. それ, ここ, あいつ, あなた, あちこち, いくつ, どこか, なに, みなさん, みんな, わたくし, われわれ +#名詞-代名詞-一般 +# +# noun-pronoun-contraction: Spoken language contraction made by combining a +# pronoun and the particle 'wa'. +# e.g. ありゃ, こりゃ, こりゃあ, そりゃ, そりゃあ +#名詞-代名詞-縮約 +# +# noun-adverbial: Temporal nouns such as names of days or months that behave +# like adverbs. Nouns that represent amount or ratios and can be used adverbially, +# e.g. 金曜, 一月, 午後, 少量 +#名詞-副詞可能 +# +# noun-verbal: Nouns that take arguments with case and can appear followed by +# 'suru' and related verbs (する, できる, なさる, くださる) +# e.g. インプット, 愛着, 悪化, 悪戦苦闘, 一安心, 下取り +#名詞-サ変接続 +# +# noun-adjective-base: The base form of adjectives, words that appear before な ("na") +# e.g. 健康, 安易, 駄目, だめ +#名詞-形容動詞語幹 +# +# noun-numeric: Arabic numbers, Chinese numerals, and counters like 何 (回), 数. +# e.g. 0, 1, 2, 何, 数, 幾 +#名詞-数 +# +# noun-affix: noun affixes where the sub-classification is undefined +#名詞-非自立 +# +# noun-affix-misc: Of adnominalizers, the case-marker の ("no"), and words that +# attach to the base form of inflectional words, words that cannot be classified +# into any of the other categories below. This category includes indefinite nouns. +# e.g. あかつき, 暁, かい, 甲斐, 気, きらい, 嫌い, くせ, 癖, こと, 事, ごと, 毎, しだい, 次第, +# 順, せい, 所為, ついで, 序で, つもり, 積もり, 点, どころ, の, はず, 筈, はずみ, 弾み, +# 拍子, ふう, ふり, 振り, ほう, 方, 旨, もの, 物, 者, ゆえ, 故, ゆえん, 所以, わけ, 訳, +# わり, 割り, 割, ん-口語/, もん-口語/ +#名詞-非自立-一般 +# +# noun-affix-adverbial: noun affixes that that can behave as adverbs. +# e.g. あいだ, 間, あげく, 挙げ句, あと, 後, 余り, 以外, 以降, 以後, 以上, 以前, 一方, うえ, +# 上, うち, 内, おり, 折り, かぎり, 限り, きり, っきり, 結果, ころ, 頃, さい, 際, 最中, さなか, +# 最中, じたい, 自体, たび, 度, ため, 為, つど, 都度, とおり, 通り, とき, 時, ところ, 所, +# とたん, 途端, なか, 中, のち, 後, ばあい, 場合, 日, ぶん, 分, ほか, 他, まえ, 前, まま, +# 儘, 侭, みぎり, 矢先 +#名詞-非自立-副詞可能 +# +# noun-affix-aux: noun affixes treated as 助動詞 ("auxiliary verb") in school grammars +# with the stem よう(だ) ("you(da)"). +# e.g. よう, やう, 様 (よう) +#名詞-非自立-助動詞語幹 +# +# noun-affix-adjective-base: noun affixes that can connect to the indeclinable +# connection form な (aux "da"). +# e.g. みたい, ふう +#名詞-非自立-形容動詞語幹 +# +# noun-special: special nouns where the sub-classification is undefined. +#名詞-特殊 +# +# noun-special-aux: The そうだ ("souda") stem form that is used for reporting news, is +# treated as 助動詞 ("auxiliary verb") in school grammars, and attach to the base +# form of inflectional words. +# e.g. そう +#名詞-特殊-助動詞語幹 +# +# noun-suffix: noun suffixes where the sub-classification is undefined. +#名詞-接尾 +# +# noun-suffix-misc: Of the nouns or stem forms of other parts of speech that connect +# to ガル or タイ and can combine into compound nouns, words that cannot be classified into +# any of the other categories below. In general, this category is more inclusive than +# 接尾語 ("suffix") and is usually the last element in a compound noun. +# e.g. おき, かた, 方, 甲斐 (がい), がかり, ぎみ, 気味, ぐるみ, (~した) さ, 次第, 済 (ず) み, +# よう, (でき)っこ, 感, 観, 性, 学, 類, 面, 用 +#名詞-接尾-一般 +# +# noun-suffix-person: Suffixes that form nouns and attach to person names more often +# than other nouns. +# e.g. 君, 様, 著 +#名詞-接尾-人名 +# +# noun-suffix-place: Suffixes that form nouns and attach to place names more often +# than other nouns. +# e.g. 町, 市, 県 +#名詞-接尾-地域 +# +# noun-suffix-verbal: Of the suffixes that attach to nouns and form nouns, those that +# can appear before スル ("suru"). +# e.g. 化, 視, 分け, 入り, 落ち, 買い +#名詞-接尾-サ変接続 +# +# noun-suffix-aux: The stem form of そうだ (様態) that is used to indicate conditions, +# is treated as 助動詞 ("auxiliary verb") in school grammars, and attach to the +# conjunctive form of inflectional words. +# e.g. そう +#名詞-接尾-助動詞語幹 +# +# noun-suffix-adjective-base: Suffixes that attach to other nouns or the conjunctive +# form of inflectional words and appear before the copula だ ("da"). +# e.g. 的, げ, がち +#名詞-接尾-形容動詞語幹 +# +# noun-suffix-adverbial: Suffixes that attach to other nouns and can behave as adverbs. +# e.g. 後 (ご), 以後, 以降, 以前, 前後, 中, 末, 上, 時 (じ) +#名詞-接尾-副詞可能 +# +# noun-suffix-classifier: Suffixes that attach to numbers and form nouns. This category +# is more inclusive than 助数詞 ("classifier") and includes common nouns that attach +# to numbers. +# e.g. 個, つ, 本, 冊, パーセント, cm, kg, カ月, か国, 区画, 時間, 時半 +#名詞-接尾-助数詞 +# +# noun-suffix-special: Special suffixes that mainly attach to inflecting words. +# e.g. (楽し) さ, (考え) 方 +#名詞-接尾-特殊 +# +# noun-suffix-conjunctive: Nouns that behave like conjunctions and join two words +# together. +# e.g. (日本) 対 (アメリカ), 対 (アメリカ), (3) 対 (5), (女優) 兼 (主婦) +#名詞-接続詞的 +# +# noun-verbal_aux: Nouns that attach to the conjunctive particle て ("te") and are +# semantically verb-like. +# e.g. ごらん, ご覧, 御覧, 頂戴 +#名詞-動詞非自立的 +# +# noun-quotation: text that cannot be segmented into words, proverbs, Chinese poetry, +# dialects, English, etc. Currently, the only entry for 名詞 引用文字列 ("noun quotation") +# is いわく ("iwaku"). +#名詞-引用文字列 +# +# noun-nai_adjective: Words that appear before the auxiliary verb ない ("nai") and +# behave like an adjective. +# e.g. 申し訳, 仕方, とんでも, 違い +#名詞-ナイ形容詞語幹 +# +##### +# prefix: unclassified prefixes +#接頭詞 +# +# prefix-nominal: Prefixes that attach to nouns (including adjective stem forms) +# excluding numerical expressions. +# e.g. お (水), 某 (氏), 同 (社), 故 (~氏), 高 (品質), お (見事), ご (立派) +#接頭詞-名詞接続 +# +# prefix-verbal: Prefixes that attach to the imperative form of a verb or a verb +# in conjunctive form followed by なる/なさる/くださる. +# e.g. お (読みなさい), お (座り) +#接頭詞-動詞接続 +# +# prefix-adjectival: Prefixes that attach to adjectives. +# e.g. お (寒いですねえ), バカ (でかい) +#接頭詞-形容詞接続 +# +# prefix-numerical: Prefixes that attach to numerical expressions. +# e.g. 約, およそ, 毎時 +#接頭詞-数接続 +# +##### +# verb: unclassified verbs +#動詞 +# +# verb-main: +#動詞-自立 +# +# verb-auxiliary: +#動詞-非自立 +# +# verb-suffix: +#動詞-接尾 +# +##### +# adjective: unclassified adjectives +#形容詞 +# +# adjective-main: +#形容詞-自立 +# +# adjective-auxiliary: +#形容詞-非自立 +# +# adjective-suffix: +#形容詞-接尾 +# +##### +# adverb: unclassified adverbs +#副詞 +# +# adverb-misc: Words that can be segmented into one unit and where adnominal +# modification is not possible. +# e.g. あいかわらず, 多分 +#副詞-一般 +# +# adverb-particle_conjunction: Adverbs that can be followed by の, は, に, +# な, する, だ, etc. +# e.g. こんなに, そんなに, あんなに, なにか, なんでも +#副詞-助詞類接続 +# +##### +# adnominal: Words that only have noun-modifying forms. +# e.g. この, その, あの, どの, いわゆる, なんらかの, 何らかの, いろんな, こういう, そういう, ああいう, +# どういう, こんな, そんな, あんな, どんな, 大きな, 小さな, おかしな, ほんの, たいした, +# 「(, も) さる (ことながら)」, 微々たる, 堂々たる, 単なる, いかなる, 我が」「同じ, 亡き +#連体詞 +# +##### +# conjunction: Conjunctions that can occur independently. +# e.g. が, けれども, そして, じゃあ, それどころか +接続詞 +# +##### +# particle: unclassified particles. +助詞 +# +# particle-case: case particles where the subclassification is undefined. +助詞-格助詞 +# +# particle-case-misc: Case particles. +# e.g. から, が, で, と, に, へ, より, を, の, にて +助詞-格助詞-一般 +# +# particle-case-quote: the "to" that appears after nouns, a person’s speech, +# quotation marks, expressions of decisions from a meeting, reasons, judgements, +# conjectures, etc. +# e.g. ( だ) と (述べた.), ( である) と (して執行猶予...) +助詞-格助詞-引用 +# +# particle-case-compound: Compounds of particles and verbs that mainly behave +# like case particles. +# e.g. という, といった, とかいう, として, とともに, と共に, でもって, にあたって, に当たって, に当って, +# にあたり, に当たり, に当り, に当たる, にあたる, において, に於いて,に於て, における, に於ける, +# にかけ, にかけて, にかんし, に関し, にかんして, に関して, にかんする, に関する, に際し, +# に際して, にしたがい, に従い, に従う, にしたがって, に従って, にたいし, に対し, にたいして, +# に対して, にたいする, に対する, について, につき, につけ, につけて, につれ, につれて, にとって, +# にとり, にまつわる, によって, に依って, に因って, により, に依り, に因り, による, に依る, に因る, +# にわたって, にわたる, をもって, を以って, を通じ, を通じて, を通して, をめぐって, をめぐり, をめぐる, +# って-口語/, ちゅう-関西弁「という」/, (何) ていう (人)-口語/, っていう-口語/, といふ, とかいふ +助詞-格助詞-連語 +# +# particle-conjunctive: +# e.g. から, からには, が, けれど, けれども, けど, し, つつ, て, で, と, ところが, どころか, とも, ども, +# ながら, なり, ので, のに, ば, ものの, や ( した), やいなや, (ころん) じゃ(いけない)-口語/, +# (行っ) ちゃ(いけない)-口語/, (言っ) たって (しかたがない)-口語/, (それがなく)ったって (平気)-口語/ +助詞-接続助詞 +# +# particle-dependency: +# e.g. こそ, さえ, しか, すら, は, も, ぞ +助詞-係助詞 +# +# particle-adverbial: +# e.g. がてら, かも, くらい, 位, ぐらい, しも, (学校) じゃ(これが流行っている)-口語/, +# (それ)じゃあ (よくない)-口語/, ずつ, (私) なぞ, など, (私) なり (に), (先生) なんか (大嫌い)-口語/, +# (私) なんぞ, (先生) なんて (大嫌い)-口語/, のみ, だけ, (私) だって-口語/, だに, +# (彼)ったら-口語/, (お茶) でも (いかが), 等 (とう), (今後) とも, ばかり, ばっか-口語/, ばっかり-口語/, +# ほど, 程, まで, 迄, (誰) も (が)([助詞-格助詞] および [助詞-係助詞] の前に位置する「も」) +助詞-副助詞 +# +# particle-interjective: particles with interjective grammatical roles. +# e.g. (松島) や +助詞-間投助詞 +# +# particle-coordinate: +# e.g. と, たり, だの, だり, とか, なり, や, やら +助詞-並立助詞 +# +# particle-final: +# e.g. かい, かしら, さ, ぜ, (だ)っけ-口語/, (とまってる) で-方言/, な, ナ, なあ-口語/, ぞ, ね, ネ, +# ねぇ-口語/, ねえ-口語/, ねん-方言/, の, のう-口語/, や, よ, ヨ, よぉ-口語/, わ, わい-口語/ +助詞-終助詞 +# +# particle-adverbial/conjunctive/final: The particle "ka" when unknown whether it is +# adverbial, conjunctive, or sentence final. For example: +# (a) 「A か B か」. Ex:「(国内で運用する) か,(海外で運用する) か (.)」 +# (b) Inside an adverb phrase. Ex:「(幸いという) か (, 死者はいなかった.)」 +# 「(祈りが届いたせい) か (, 試験に合格した.)」 +# (c) 「かのように」. Ex:「(何もなかった) か (のように振る舞った.)」 +# e.g. か +助詞-副助詞/並立助詞/終助詞 +# +# particle-adnominalizer: The "no" that attaches to nouns and modifies +# non-inflectional words. +助詞-連体化 +# +# particle-adnominalizer: The "ni" and "to" that appear following nouns and adverbs +# that are giongo, giseigo, or gitaigo. +# e.g. に, と +助詞-副詞化 +# +# particle-special: A particle that does not fit into one of the above classifications. +# This includes particles that are used in Tanka, Haiku, and other poetry. +# e.g. かな, けむ, ( しただろう) に, (あんた) にゃ(わからん), (俺) ん (家) +助詞-特殊 +# +##### +# auxiliary-verb: +助動詞 +# +##### +# interjection: Greetings and other exclamations. +# e.g. おはよう, おはようございます, こんにちは, こんばんは, ありがとう, どうもありがとう, ありがとうございます, +# いただきます, ごちそうさま, さよなら, さようなら, はい, いいえ, ごめん, ごめんなさい +#感動詞 +# +##### +# symbol: unclassified Symbols. +記号 +# +# symbol-misc: A general symbol not in one of the categories below. +# e.g. [○◎@$〒→+] +記号-一般 +# +# symbol-comma: Commas +# e.g. [,、] +記号-読点 +# +# symbol-period: Periods and full stops. +# e.g. [..。] +記号-句点 +# +# symbol-space: Full-width whitespace. +記号-空白 +# +# symbol-open_bracket: +# e.g. [({‘“『【] +記号-括弧開 +# +# symbol-close_bracket: +# e.g. [)}’”』」】] +記号-括弧閉 +# +# symbol-alphabetic: +#記号-アルファベット +# +##### +# other: unclassified other +#その他 +# +# other-interjection: Words that are hard to classify as noun-suffixes or +# sentence-final particles. +# e.g. (だ)ァ +その他-間投 +# +##### +# filler: Aizuchi that occurs during a conversation or sounds inserted as filler. +# e.g. あの, うんと, えと +フィラー +# +##### +# non-verbal: non-verbal sound. +非言語音 +# +##### +# fragment: +#語断片 +# +##### +# unknown: unknown part of speech. +#未知語 +# +##### End of file diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ar.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ar.txt new file mode 100755 index 0000000..046829d --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ar.txt @@ -0,0 +1,125 @@ +# This file was created by Jacques Savoy and is distributed under the BSD license. +# See http://members.unine.ch/jacques.savoy/clef/index.html. +# Also see http://www.opensource.org/licenses/bsd-license.html +# Cleaned on October 11, 2009 (not normalized, so use before normalization) +# This means that when modifying this list, you might need to add some +# redundant entries, for example containing forms with both أ and ا +من +ومن +منها +منه +في +وفي +فيها +فيه +و +ف +ثم +او +أو +ب +بها +به +ا +أ +اى +اي +أي +أى +لا +ولا +الا +ألا +إلا +لكن +ما +وما +كما +فما +عن +مع +اذا +إذا +ان +أن +إن +انها +أنها +إنها +انه +أنه +إنه +بان +بأن +فان +فأن +وان +وأن +وإن +التى +التي +الذى +الذي +الذين +الى +الي +إلى +إلي +على +عليها +عليه +اما +أما +إما +ايضا +أيضا +كل +وكل +لم +ولم +لن +ولن +هى +هي +هو +وهى +وهي +وهو +فهى +فهي +فهو +انت +أنت +لك +لها +له +هذه +هذا +تلك +ذلك +هناك +كانت +كان +يكون +تكون +وكانت +وكان +غير +بعض +قد +نحو +بين +بينما +منذ +ضمن +حيث +الان +الآن +خلال +بعد +قبل +حتى +عند +عندما +لدى +جميع diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_bg.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_bg.txt new file mode 100755 index 0000000..1ae4ba2 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_bg.txt @@ -0,0 +1,193 @@ +# This file was created by Jacques Savoy and is distributed under the BSD license. +# See http://members.unine.ch/jacques.savoy/clef/index.html. +# Also see http://www.opensource.org/licenses/bsd-license.html +а +аз +ако +ала +бе +без +беше +би +бил +била +били +било +близо +бъдат +бъде +бяха +в +вас +ваш +ваша +вероятно +вече +взема +ви +вие +винаги +все +всеки +всички +всичко +всяка +във +въпреки +върху +г +ги +главно +го +д +да +дали +до +докато +докога +дори +досега +доста +е +едва +един +ето +за +зад +заедно +заради +засега +затова +защо +защото +и +из +или +им +има +имат +иска +й +каза +как +каква +какво +както +какъв +като +кога +когато +което +които +кой +който +колко +която +къде +където +към +ли +м +ме +между +мен +ми +мнозина +мога +могат +може +моля +момента +му +н +на +над +назад +най +направи +напред +например +нас +не +него +нея +ни +ние +никой +нито +но +някои +някой +няма +обаче +около +освен +особено +от +отгоре +отново +още +пак +по +повече +повечето +под +поне +поради +после +почти +прави +пред +преди +през +при +пък +първо +с +са +само +се +сега +си +скоро +след +сме +според +сред +срещу +сте +съм +със +също +т +тази +така +такива +такъв +там +твой +те +тези +ти +тн +то +това +тогава +този +той +толкова +точно +трябва +тук +тъй +тя +тях +у +харесва +ч +че +често +чрез +ще +щом +я diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ca.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ca.txt new file mode 100755 index 0000000..3da65de --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ca.txt @@ -0,0 +1,220 @@ +# Catalan stopwords from http://github.com/vcl/cue.language (Apache 2 Licensed) +a +abans +ací +ah +així +això +al +als +aleshores +algun +alguna +algunes +alguns +alhora +allà +allí +allò +altra +altre +altres +amb +ambdós +ambdues +apa +aquell +aquella +aquelles +aquells +aquest +aquesta +aquestes +aquests +aquí +baix +cada +cadascú +cadascuna +cadascunes +cadascuns +com +contra +d'un +d'una +d'unes +d'uns +dalt +de +del +dels +des +després +dins +dintre +donat +doncs +durant +e +eh +el +els +em +en +encara +ens +entre +érem +eren +éreu +es +és +esta +està +estàvem +estaven +estàveu +esteu +et +etc +ets +fins +fora +gairebé +ha +han +has +havia +he +hem +heu +hi +ho +i +igual +iguals +ja +l'hi +la +les +li +li'n +llavors +m'he +ma +mal +malgrat +mateix +mateixa +mateixes +mateixos +me +mentre +més +meu +meus +meva +meves +molt +molta +moltes +molts +mon +mons +n'he +n'hi +ne +ni +no +nogensmenys +només +nosaltres +nostra +nostre +nostres +o +oh +oi +on +pas +pel +pels +per +però +perquè +poc +poca +pocs +poques +potser +propi +qual +quals +quan +quant +que +què +quelcom +qui +quin +quina +quines +quins +s'ha +s'han +sa +semblant +semblants +ses +seu +seus +seva +seva +seves +si +sobre +sobretot +sóc +solament +sols +son +són +sons +sota +sou +t'ha +t'han +t'he +ta +tal +també +tampoc +tan +tant +tanta +tantes +teu +teus +teva +teves +ton +tons +tot +tota +totes +tots +un +una +unes +uns +us +va +vaig +vam +van +vas +veu +vosaltres +vostra +vostre +vostres diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ckb.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ckb.txt new file mode 100755 index 0000000..87abf11 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ckb.txt @@ -0,0 +1,136 @@ +# set of kurdish stopwords +# note these have been normalized with our scheme (e represented with U+06D5, etc) +# constructed from: +# * Fig 5 of "Building A Test Collection For Sorani Kurdish" (Esmaili et al) +# * "Sorani Kurdish: A Reference Grammar with selected readings" (Thackston) +# * Corpus-based analysis of 77M word Sorani collection: wikipedia, news, blogs, etc + +# and +و +# which +کە +# of +ی +# made/did +کرد +# that/which +ئەوەی +# on/head +سەر +# two +دوو +# also +هەروەها +# from/that +لەو +# makes/does +دەکات +# some +چەند +# every +هەر + +# demonstratives +# that +ئەو +# this +ئەم + +# personal pronouns +# I +من +# we +ئێمە +# you +تۆ +# you +ئێوە +# he/she/it +ئەو +# they +ئەوان + +# prepositions +# to/with/by +بە +پێ +# without +بەبێ +# along with/while/during +بەدەم +# in the opinion of +بەلای +# according to +بەپێی +# before +بەرلە +# in the direction of +بەرەوی +# in front of/toward +بەرەوە +# before/in the face of +بەردەم +# without +بێ +# except for +بێجگە +# for +بۆ +# on/in +دە +تێ +# with +دەگەڵ +# after +دوای +# except for/aside from +جگە +# in/from +لە +لێ +# in front of/before/because of +لەبەر +# between/among +لەبەینی +# concerning/about +لەبابەت +# concerning +لەبارەی +# instead of +لەباتی +# beside +لەبن +# instead of +لەبرێتی +# behind +لەدەم +# with/together with +لەگەڵ +# by +لەلایەن +# within +لەناو +# between/among +لەنێو +# for the sake of +لەپێناوی +# with respect to +لەرەوی +# by means of/for +لەرێ +# for the sake of +لەرێگا +# on/on top of/according to +لەسەر +# under +لەژێر +# between/among +ناو +# between/among +نێوان +# after +پاش +# before +پێش +# like +وەک diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_cz.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_cz.txt new file mode 100755 index 0000000..53c6097 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_cz.txt @@ -0,0 +1,172 @@ +a +s +k +o +i +u +v +z +dnes +cz +tímto +budeš +budem +byli +jseš +můj +svým +ta +tomto +tohle +tuto +tyto +jej +zda +proč +máte +tato +kam +tohoto +kdo +kteří +mi +nám +tom +tomuto +mít +nic +proto +kterou +byla +toho +protože +asi +ho +naši +napište +re +což +tím +takže +svých +její +svými +jste +aj +tu +tedy +teto +bylo +kde +ke +pravé +ji +nad +nejsou +či +pod +téma +mezi +přes +ty +pak +vám +ani +když +však +neg +jsem +tento +článku +články +aby +jsme +před +pta +jejich +byl +ještě +až +bez +také +pouze +první +vaše +která +nás +nový +tipy +pokud +může +strana +jeho +své +jiné +zprávy +nové +není +vás +jen +podle +zde +už +být +více +bude +již +než +který +by +které +co +nebo +ten +tak +má +při +od +po +jsou +jak +další +ale +si +se +ve +to +jako +za +zpět +ze +do +pro +je +na +atd +atp +jakmile +přičemž +já +on +ona +ono +oni +ony +my +vy +jí +ji +mě +mne +jemu +tomu +těm +těmu +němu +němuž +jehož +jíž +jelikož +jež +jakož +načež diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_da.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_da.txt new file mode 100755 index 0000000..42e6145 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_da.txt @@ -0,0 +1,110 @@ + | From svn.tartarus.org/snowball/trunk/website/algorithms/danish/stop.txt + | This file is distributed under the BSD License. + | See http://snowball.tartarus.org/license.php + | Also see http://www.opensource.org/licenses/bsd-license.html + | - Encoding was converted to UTF-8. + | - This notice was added. + | + | NOTE: To use this file with StopFilterFactory, you must specify format="snowball" + + | A Danish stop word list. Comments begin with vertical bar. Each stop + | word is at the start of a line. + + | This is a ranked list (commonest to rarest) of stopwords derived from + | a large text sample. + + +og | and +i | in +jeg | I +det | that (dem. pronoun)/it (pers. pronoun) +at | that (in front of a sentence)/to (with infinitive) +en | a/an +den | it (pers. pronoun)/that (dem. pronoun) +til | to/at/for/until/against/by/of/into, more +er | present tense of "to be" +som | who, as +på | on/upon/in/on/at/to/after/of/with/for, on +de | they +med | with/by/in, along +han | he +af | of/by/from/off/for/in/with/on, off +for | at/for/to/from/by/of/ago, in front/before, because +ikke | not +der | who/which, there/those +var | past tense of "to be" +mig | me/myself +sig | oneself/himself/herself/itself/themselves +men | but +et | a/an/one, one (number), someone/somebody/one +har | present tense of "to have" +om | round/about/for/in/a, about/around/down, if +vi | we +min | my +havde | past tense of "to have" +ham | him +hun | she +nu | now +over | over/above/across/by/beyond/past/on/about, over/past +da | then, when/as/since +fra | from/off/since, off, since +du | you +ud | out +sin | his/her/its/one's +dem | them +os | us/ourselves +op | up +man | you/one +hans | his +hvor | where +eller | or +hvad | what +skal | must/shall etc. +selv | myself/youself/herself/ourselves etc., even +her | here +alle | all/everyone/everybody etc. +vil | will (verb) +blev | past tense of "to stay/to remain/to get/to become" +kunne | could +ind | in +når | when +være | present tense of "to be" +dog | however/yet/after all +noget | something +ville | would +jo | you know/you see (adv), yes +deres | their/theirs +efter | after/behind/according to/for/by/from, later/afterwards +ned | down +skulle | should +denne | this +end | than +dette | this +mit | my/mine +også | also +under | under/beneath/below/during, below/underneath +have | have +dig | you +anden | other +hende | her +mine | my +alt | everything +meget | much/very, plenty of +sit | his, her, its, one's +sine | his, her, its, one's +vor | our +mod | against +disse | these +hvis | if +din | your/yours +nogle | some +hos | by/at +blive | be/become +mange | many +ad | by/through +bliver | present tense of "to be/to become" +hendes | her/hers +været | be +thi | for (conj) +jer | you +sådan | such, like this/like that diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_de.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_de.txt new file mode 100755 index 0000000..86525e7 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_de.txt @@ -0,0 +1,294 @@ + | From svn.tartarus.org/snowball/trunk/website/algorithms/german/stop.txt + | This file is distributed under the BSD License. + | See http://snowball.tartarus.org/license.php + | Also see http://www.opensource.org/licenses/bsd-license.html + | - Encoding was converted to UTF-8. + | - This notice was added. + | + | NOTE: To use this file with StopFilterFactory, you must specify format="snowball" + + | A German stop word list. Comments begin with vertical bar. Each stop + | word is at the start of a line. + + | The number of forms in this list is reduced significantly by passing it + | through the German stemmer. + + +aber | but + +alle | all +allem +allen +aller +alles + +als | than, as +also | so +am | an + dem +an | at + +ander | other +andere +anderem +anderen +anderer +anderes +anderm +andern +anderr +anders + +auch | also +auf | on +aus | out of +bei | by +bin | am +bis | until +bist | art +da | there +damit | with it +dann | then + +der | the +den +des +dem +die +das + +daß | that + +derselbe | the same +derselben +denselben +desselben +demselben +dieselbe +dieselben +dasselbe + +dazu | to that + +dein | thy +deine +deinem +deinen +deiner +deines + +denn | because + +derer | of those +dessen | of him + +dich | thee +dir | to thee +du | thou + +dies | this +diese +diesem +diesen +dieser +dieses + + +doch | (several meanings) +dort | (over) there + + +durch | through + +ein | a +eine +einem +einen +einer +eines + +einig | some +einige +einigem +einigen +einiger +einiges + +einmal | once + +er | he +ihn | him +ihm | to him + +es | it +etwas | something + +euer | your +eure +eurem +euren +eurer +eures + +für | for +gegen | towards +gewesen | p.p. of sein +hab | have +habe | have +haben | have +hat | has +hatte | had +hatten | had +hier | here +hin | there +hinter | behind + +ich | I +mich | me +mir | to me + + +ihr | you, to her +ihre +ihrem +ihren +ihrer +ihres +euch | to you + +im | in + dem +in | in +indem | while +ins | in + das +ist | is + +jede | each, every +jedem +jeden +jeder +jedes + +jene | that +jenem +jenen +jener +jenes + +jetzt | now +kann | can + +kein | no +keine +keinem +keinen +keiner +keines + +können | can +könnte | could +machen | do +man | one + +manche | some, many a +manchem +manchen +mancher +manches + +mein | my +meine +meinem +meinen +meiner +meines + +mit | with +muss | must +musste | had to +nach | to(wards) +nicht | not +nichts | nothing +noch | still, yet +nun | now +nur | only +ob | whether +oder | or +ohne | without +sehr | very + +sein | his +seine +seinem +seinen +seiner +seines + +selbst | self +sich | herself + +sie | they, she +ihnen | to them + +sind | are +so | so + +solche | such +solchem +solchen +solcher +solches + +soll | shall +sollte | should +sondern | but +sonst | else +über | over +um | about, around +und | and + +uns | us +unse +unsem +unsen +unser +unses + +unter | under +viel | much +vom | von + dem +von | from +vor | before +während | while +war | was +waren | were +warst | wast +was | what +weg | away, off +weil | because +weiter | further + +welche | which +welchem +welchen +welcher +welches + +wenn | when +werde | will +werden | will +wie | how +wieder | again +will | want +wir | we +wird | will +wirst | willst +wo | where +wollen | want +wollte | wanted +würde | would +würden | would +zu | to +zum | zu + dem +zur | zu + der +zwar | indeed +zwischen | between + diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_el.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_el.txt new file mode 100755 index 0000000..232681f --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_el.txt @@ -0,0 +1,78 @@ +# Lucene Greek Stopwords list +# Note: by default this file is used after GreekLowerCaseFilter, +# so when modifying this file use 'σ' instead of 'ς' +ο +η +το +οι +τα +του +τησ +των +τον +την +και +κι +κ +ειμαι +εισαι +ειναι +ειμαστε +ειστε +στο +στον +στη +στην +μα +αλλα +απο +για +προσ +με +σε +ωσ +παρα +αντι +κατα +μετα +θα +να +δε +δεν +μη +μην +επι +ενω +εαν +αν +τοτε +που +πωσ +ποιοσ +ποια +ποιο +ποιοι +ποιεσ +ποιων +ποιουσ +αυτοσ +αυτη +αυτο +αυτοι +αυτων +αυτουσ +αυτεσ +αυτα +εκεινοσ +εκεινη +εκεινο +εκεινοι +εκεινεσ +εκεινα +εκεινων +εκεινουσ +οπωσ +ομωσ +ισωσ +οσο +οτι diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_en.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_en.txt new file mode 100755 index 0000000..2c164c0 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_en.txt @@ -0,0 +1,54 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +# a couple of test stopwords to test that the words are really being +# configured from this file: +stopworda +stopwordb + +# Standard english stop words taken from Lucene's StopAnalyzer +a +an +and +are +as +at +be +but +by +for +if +in +into +is +it +no +not +of +on +or +such +that +the +their +then +there +these +they +this +to +was +will +with diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_es.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_es.txt new file mode 100755 index 0000000..487d78c --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_es.txt @@ -0,0 +1,356 @@ + | From svn.tartarus.org/snowball/trunk/website/algorithms/spanish/stop.txt + | This file is distributed under the BSD License. + | See http://snowball.tartarus.org/license.php + | Also see http://www.opensource.org/licenses/bsd-license.html + | - Encoding was converted to UTF-8. + | - This notice was added. + | + | NOTE: To use this file with StopFilterFactory, you must specify format="snowball" + + | A Spanish stop word list. Comments begin with vertical bar. Each stop + | word is at the start of a line. + + + | The following is a ranked list (commonest to rarest) of stopwords + | deriving from a large sample of text. + + | Extra words have been added at the end. + +de | from, of +la | the, her +que | who, that +el | the +en | in +y | and +a | to +los | the, them +del | de + el +se | himself, from him etc +las | the, them +por | for, by, etc +un | a +para | for +con | with +no | no +una | a +su | his, her +al | a + el + | es from SER +lo | him +como | how +más | more +pero | pero +sus | su plural +le | to him, her +ya | already +o | or + | fue from SER +este | this + | ha from HABER +sí | himself etc +porque | because +esta | this + | son from SER +entre | between + | está from ESTAR +cuando | when +muy | very +sin | without +sobre | on + | ser from SER + | tiene from TENER +también | also +me | me +hasta | until +hay | there is/are +donde | where + | han from HABER +quien | whom, that + | están from ESTAR + | estado from ESTAR +desde | from +todo | all +nos | us +durante | during + | estados from ESTAR +todos | all +uno | a +les | to them +ni | nor +contra | against +otros | other + | fueron from SER +ese | that +eso | that + | había from HABER +ante | before +ellos | they +e | and (variant of y) +esto | this +mí | me +antes | before +algunos | some +qué | what? +unos | a +yo | I +otro | other +otras | other +otra | other +él | he +tanto | so much, many +esa | that +estos | these +mucho | much, many +quienes | who +nada | nothing +muchos | many +cual | who + | sea from SER +poco | few +ella | she +estar | to be + | haber from HABER +estas | these + | estaba from ESTAR + | estamos from ESTAR +algunas | some +algo | something +nosotros | we + + | other forms + +mi | me +mis | mi plural +tú | thou +te | thee +ti | thee +tu | thy +tus | tu plural +ellas | they +nosotras | we +vosotros | you +vosotras | you +os | you +mío | mine +mía | +míos | +mías | +tuyo | thine +tuya | +tuyos | +tuyas | +suyo | his, hers, theirs +suya | +suyos | +suyas | +nuestro | ours +nuestra | +nuestros | +nuestras | +vuestro | yours +vuestra | +vuestros | +vuestras | +esos | those +esas | those + + | forms of estar, to be (not including the infinitive): +estoy +estás +está +estamos +estáis +están +esté +estés +estemos +estéis +estén +estaré +estarás +estará +estaremos +estaréis +estarán +estaría +estarías +estaríamos +estaríais +estarían +estaba +estabas +estábamos +estabais +estaban +estuve +estuviste +estuvo +estuvimos +estuvisteis +estuvieron +estuviera +estuvieras +estuviéramos +estuvierais +estuvieran +estuviese +estuvieses +estuviésemos +estuvieseis +estuviesen +estando +estado +estada +estados +estadas +estad + + | forms of haber, to have (not including the infinitive): +he +has +ha +hemos +habéis +han +haya +hayas +hayamos +hayáis +hayan +habré +habrás +habrá +habremos +habréis +habrán +habría +habrías +habríamos +habríais +habrían +había +habías +habíamos +habíais +habían +hube +hubiste +hubo +hubimos +hubisteis +hubieron +hubiera +hubieras +hubiéramos +hubierais +hubieran +hubiese +hubieses +hubiésemos +hubieseis +hubiesen +habiendo +habido +habida +habidos +habidas + + | forms of ser, to be (not including the infinitive): +soy +eres +es +somos +sois +son +sea +seas +seamos +seáis +sean +seré +serás +será +seremos +seréis +serán +sería +serías +seríamos +seríais +serían +era +eras +éramos +erais +eran +fui +fuiste +fue +fuimos +fuisteis +fueron +fuera +fueras +fuéramos +fuerais +fueran +fuese +fueses +fuésemos +fueseis +fuesen +siendo +sido + | sed also means 'thirst' + + | forms of tener, to have (not including the infinitive): +tengo +tienes +tiene +tenemos +tenéis +tienen +tenga +tengas +tengamos +tengáis +tengan +tendré +tendrás +tendrá +tendremos +tendréis +tendrán +tendría +tendrías +tendríamos +tendríais +tendrían +tenía +tenías +teníamos +teníais +tenían +tuve +tuviste +tuvo +tuvimos +tuvisteis +tuvieron +tuviera +tuvieras +tuviéramos +tuvierais +tuvieran +tuviese +tuvieses +tuviésemos +tuvieseis +tuviesen +teniendo +tenido +tenida +tenidos +tenidas +tened + diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_eu.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_eu.txt new file mode 100755 index 0000000..25f1db9 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_eu.txt @@ -0,0 +1,99 @@ +# example set of basque stopwords +al +anitz +arabera +asko +baina +bat +batean +batek +bati +batzuei +batzuek +batzuetan +batzuk +bera +beraiek +berau +berauek +bere +berori +beroriek +beste +bezala +da +dago +dira +ditu +du +dute +edo +egin +ere +eta +eurak +ez +gainera +gu +gutxi +guzti +haiei +haiek +haietan +hainbeste +hala +han +handik +hango +hara +hari +hark +hartan +hau +hauei +hauek +hauetan +hemen +hemendik +hemengo +hi +hona +honek +honela +honetan +honi +hor +hori +horiei +horiek +horietan +horko +horra +horrek +horrela +horretan +horri +hortik +hura +izan +ni +noiz +nola +non +nondik +nongo +nor +nora +ze +zein +zen +zenbait +zenbat +zer +zergatik +ziren +zituen +zu +zuek +zuen +zuten diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_fa.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_fa.txt new file mode 100755 index 0000000..723641c --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_fa.txt @@ -0,0 +1,313 @@ +# This file was created by Jacques Savoy and is distributed under the BSD license. +# See http://members.unine.ch/jacques.savoy/clef/index.html. +# Also see http://www.opensource.org/licenses/bsd-license.html +# Note: by default this file is used after normalization, so when adding entries +# to this file, use the arabic 'ي' instead of 'ی' +انان +نداشته +سراسر +خياه +ايشان +وي +تاكنون +بيشتري +دوم +پس +ناشي +وگو +يا +داشتند +سپس +هنگام +هرگز +پنج +نشان +امسال +ديگر +گروهي +شدند +چطور +ده +و +دو +نخستين +ولي +چرا +چه +وسط +ه +كدام +قابل +يك +رفت +هفت +همچنين +در +هزار +بله +بلي +شايد +اما +شناسي +گرفته +دهد +داشته +دانست +داشتن +خواهيم +ميليارد +وقتيكه +امد +خواهد +جز +اورده +شده +بلكه +خدمات +شدن +برخي +نبود +بسياري +جلوگيري +حق +كردند +نوعي +بعري +نكرده +نظير +نبايد +بوده +بودن +داد +اورد +هست +جايي +شود +دنبال +داده +بايد +سابق +هيچ +همان +انجا +كمتر +كجاست +گردد +كسي +تر +مردم +تان +دادن +بودند +سري +جدا +ندارند +مگر +يكديگر +دارد +دهند +بنابراين +هنگامي +سمت +جا +انچه +خود +دادند +زياد +دارند +اثر +بدون +بهترين +بيشتر +البته +به +براساس +بيرون +كرد +بعضي +گرفت +توي +اي +ميليون +او +جريان +تول +بر +مانند +برابر +باشيم +مدتي +گويند +اكنون +تا +تنها +جديد +چند +بي +نشده +كردن +كردم +گويد +كرده +كنيم +نمي +نزد +روي +قصد +فقط +بالاي +ديگران +اين +ديروز +توسط +سوم +ايم +دانند +سوي +استفاده +شما +كنار +داريم +ساخته +طور +امده +رفته +نخست +بيست +نزديك +طي +كنيد +از +انها +تمامي +داشت +يكي +طريق +اش +چيست +روب +نمايد +گفت +چندين +چيزي +تواند +ام +ايا +با +ان +ايد +ترين +اينكه +ديگري +راه +هايي +بروز +همچنان +پاعين +كس +حدود +مختلف +مقابل +چيز +گيرد +ندارد +ضد +همچون +سازي +شان +مورد +باره +مرسي +خويش +برخوردار +چون +خارج +شش +هنوز +تحت +ضمن +هستيم +گفته +فكر +بسيار +پيش +براي +روزهاي +انكه +نخواهد +بالا +كل +وقتي +كي +چنين +كه +گيري +نيست +است +كجا +كند +نيز +يابد +بندي +حتي +توانند +عقب +خواست +كنند +بين +تمام +همه +ما +باشند +مثل +شد +اري +باشد +اره +طبق +بعد +اگر +صورت +غير +جاي +بيش +ريزي +اند +زيرا +چگونه +بار +لطفا +مي +درباره +من +ديده +همين +گذاري +برداري +علت +گذاشته +هم +فوق +نه +ها +شوند +اباد +همواره +هر +اول +خواهند +چهار +نام +امروز +مان +هاي +قبل +كنم +سعي +تازه +را +هستند +زير +جلوي +عنوان +بود diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_fi.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_fi.txt new file mode 100755 index 0000000..4372c9a --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_fi.txt @@ -0,0 +1,97 @@ + | From svn.tartarus.org/snowball/trunk/website/algorithms/finnish/stop.txt + | This file is distributed under the BSD License. + | See http://snowball.tartarus.org/license.php + | Also see http://www.opensource.org/licenses/bsd-license.html + | - Encoding was converted to UTF-8. + | - This notice was added. + | + | NOTE: To use this file with StopFilterFactory, you must specify format="snowball" + +| forms of BE + +olla +olen +olet +on +olemme +olette +ovat +ole | negative form + +oli +olisi +olisit +olisin +olisimme +olisitte +olisivat +olit +olin +olimme +olitte +olivat +ollut +olleet + +en | negation +et +ei +emme +ette +eivät + +|Nom Gen Acc Part Iness Elat Illat Adess Ablat Allat Ess Trans +minä minun minut minua minussa minusta minuun minulla minulta minulle | I +sinä sinun sinut sinua sinussa sinusta sinuun sinulla sinulta sinulle | you +hän hänen hänet häntä hänessä hänestä häneen hänellä häneltä hänelle | he she +me meidän meidät meitä meissä meistä meihin meillä meiltä meille | we +te teidän teidät teitä teissä teistä teihin teillä teiltä teille | you +he heidän heidät heitä heissä heistä heihin heillä heiltä heille | they + +tämä tämän tätä tässä tästä tähän tallä tältä tälle tänä täksi | this +tuo tuon tuotä tuossa tuosta tuohon tuolla tuolta tuolle tuona tuoksi | that +se sen sitä siinä siitä siihen sillä siltä sille sinä siksi | it +nämä näiden näitä näissä näistä näihin näillä näiltä näille näinä näiksi | these +nuo noiden noita noissa noista noihin noilla noilta noille noina noiksi | those +ne niiden niitä niissä niistä niihin niillä niiltä niille niinä niiksi | they + +kuka kenen kenet ketä kenessä kenestä keneen kenellä keneltä kenelle kenenä keneksi| who +ketkä keiden ketkä keitä keissä keistä keihin keillä keiltä keille keinä keiksi | (pl) +mikä minkä minkä mitä missä mistä mihin millä miltä mille minä miksi | which what +mitkä | (pl) + +joka jonka jota jossa josta johon jolla jolta jolle jona joksi | who which +jotka joiden joita joissa joista joihin joilla joilta joille joina joiksi | (pl) + +| conjunctions + +että | that +ja | and +jos | if +koska | because +kuin | than +mutta | but +niin | so +sekä | and +sillä | for +tai | or +vaan | but +vai | or +vaikka | although + + +| prepositions + +kanssa | with +mukaan | according to +noin | about +poikki | across +yli | over, across + +| other + +kun | when +niin | so +nyt | now +itse | self + diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_fr.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_fr.txt new file mode 100755 index 0000000..749abae --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_fr.txt @@ -0,0 +1,186 @@ + | From svn.tartarus.org/snowball/trunk/website/algorithms/french/stop.txt + | This file is distributed under the BSD License. + | See http://snowball.tartarus.org/license.php + | Also see http://www.opensource.org/licenses/bsd-license.html + | - Encoding was converted to UTF-8. + | - This notice was added. + | + | NOTE: To use this file with StopFilterFactory, you must specify format="snowball" + + | A French stop word list. Comments begin with vertical bar. Each stop + | word is at the start of a line. + +au | a + le +aux | a + les +avec | with +ce | this +ces | these +dans | with +de | of +des | de + les +du | de + le +elle | she +en | `of them' etc +et | and +eux | them +il | he +je | I +la | the +le | the +leur | their +lui | him +ma | my (fem) +mais | but +me | me +même | same; as in moi-même (myself) etc +mes | me (pl) +moi | me +mon | my (masc) +ne | not +nos | our (pl) +notre | our +nous | we +on | one +ou | where +par | by +pas | not +pour | for +qu | que before vowel +que | that +qui | who +sa | his, her (fem) +se | oneself +ses | his (pl) +son | his, her (masc) +sur | on +ta | thy (fem) +te | thee +tes | thy (pl) +toi | thee +ton | thy (masc) +tu | thou +un | a +une | a +vos | your (pl) +votre | your +vous | you + + | single letter forms + +c | c' +d | d' +j | j' +l | l' +à | to, at +m | m' +n | n' +s | s' +t | t' +y | there + + | forms of être (not including the infinitive): +été +étée +étées +étés +étant +suis +es +est +sommes +êtes +sont +serai +seras +sera +serons +serez +seront +serais +serait +serions +seriez +seraient +étais +était +étions +étiez +étaient +fus +fut +fûmes +fûtes +furent +sois +soit +soyons +soyez +soient +fusse +fusses +fût +fussions +fussiez +fussent + + | forms of avoir (not including the infinitive): +ayant +eu +eue +eues +eus +ai +as +avons +avez +ont +aurai +auras +aura +aurons +aurez +auront +aurais +aurait +aurions +auriez +auraient +avais +avait +avions +aviez +avaient +eut +eûmes +eûtes +eurent +aie +aies +ait +ayons +ayez +aient +eusse +eusses +eût +eussions +eussiez +eussent + + | Later additions (from Jean-Christophe Deschamps) +ceci | this +cela | that +celà | that +cet | this +cette | this +ici | here +ils | they +les | the (pl) +leurs | their (pl) +quel | which +quels | which +quelle | which +quelles | which +sans | without +soi | oneself + diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ga.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ga.txt new file mode 100755 index 0000000..9ff88d7 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ga.txt @@ -0,0 +1,110 @@ + +a +ach +ag +agus +an +aon +ar +arna +as +b' +ba +beirt +bhúr +caoga +ceathair +ceathrar +chomh +chtó +chuig +chun +cois +céad +cúig +cúigear +d' +daichead +dar +de +deich +deichniúr +den +dhá +do +don +dtí +dá +dár +dó +faoi +faoin +faoina +faoinár +fara +fiche +gach +gan +go +gur +haon +hocht +i +iad +idir +in +ina +ins +inár +is +le +leis +lena +lenár +m' +mar +mo +mé +na +nach +naoi +naonúr +ná +ní +níor +nó +nócha +ocht +ochtar +os +roimh +sa +seacht +seachtar +seachtó +seasca +seisear +siad +sibh +sinn +sna +sé +sí +tar +thar +thú +triúr +trí +trína +trínár +tríocha +tú +um +ár +é +éis +í +ó +ón +óna +ónár diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_gl.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_gl.txt new file mode 100755 index 0000000..d8760b1 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_gl.txt @@ -0,0 +1,161 @@ +# galican stopwords +a +aínda +alí +aquel +aquela +aquelas +aqueles +aquilo +aquí +ao +aos +as +así +á +ben +cando +che +co +coa +comigo +con +connosco +contigo +convosco +coas +cos +cun +cuns +cunha +cunhas +da +dalgunha +dalgunhas +dalgún +dalgúns +das +de +del +dela +delas +deles +desde +deste +do +dos +dun +duns +dunha +dunhas +e +el +ela +elas +eles +en +era +eran +esa +esas +ese +eses +esta +estar +estaba +está +están +este +estes +estiven +estou +eu +é +facer +foi +foron +fun +había +hai +iso +isto +la +las +lle +lles +lo +los +mais +me +meu +meus +min +miña +miñas +moi +na +nas +neste +nin +no +non +nos +nosa +nosas +noso +nosos +nós +nun +nunha +nuns +nunhas +o +os +ou +ó +ós +para +pero +pode +pois +pola +polas +polo +polos +por +que +se +senón +ser +seu +seus +sexa +sido +sobre +súa +súas +tamén +tan +te +ten +teñen +teño +ter +teu +teus +ti +tido +tiña +tiven +túa +túas +un +unha +unhas +uns +vos +vosa +vosas +voso +vosos +vós diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_hi.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_hi.txt new file mode 100755 index 0000000..86286bb --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_hi.txt @@ -0,0 +1,235 @@ +# Also see http://www.opensource.org/licenses/bsd-license.html +# See http://members.unine.ch/jacques.savoy/clef/index.html. +# This file was created by Jacques Savoy and is distributed under the BSD license. +# Note: by default this file also contains forms normalized by HindiNormalizer +# for spelling variation (see section below), such that it can be used whether or +# not you enable that feature. When adding additional entries to this list, +# please add the normalized form as well. +अंदर +अत +अपना +अपनी +अपने +अभी +आदि +आप +इत्यादि +इन +इनका +इन्हीं +इन्हें +इन्हों +इस +इसका +इसकी +इसके +इसमें +इसी +इसे +उन +उनका +उनकी +उनके +उनको +उन्हीं +उन्हें +उन्हों +उस +उसके +उसी +उसे +एक +एवं +एस +ऐसे +और +कई +कर +करता +करते +करना +करने +करें +कहते +कहा +का +काफ़ी +कि +कितना +किन्हें +किन्हों +किया +किर +किस +किसी +किसे +की +कुछ +कुल +के +को +कोई +कौन +कौनसा +गया +घर +जब +जहाँ +जा +जितना +जिन +जिन्हें +जिन्हों +जिस +जिसे +जीधर +जैसा +जैसे +जो +तक +तब +तरह +तिन +तिन्हें +तिन्हों +तिस +तिसे +तो +था +थी +थे +दबारा +दिया +दुसरा +दूसरे +दो +द्वारा +न +नहीं +ना +निहायत +नीचे +ने +पर +पर +पहले +पूरा +पे +फिर +बनी +बही +बहुत +बाद +बाला +बिलकुल +भी +भीतर +मगर +मानो +मे +में +यदि +यह +यहाँ +यही +या +यिह +ये +रखें +रहा +रहे +ऱ्वासा +लिए +लिये +लेकिन +व +वर्ग +वह +वह +वहाँ +वहीं +वाले +वुह +वे +वग़ैरह +संग +सकता +सकते +सबसे +सभी +साथ +साबुत +साभ +सारा +से +सो +ही +हुआ +हुई +हुए +है +हैं +हो +होता +होती +होते +होना +होने +# additional normalized forms of the above +अपनि +जेसे +होति +सभि +तिंहों +इंहों +दवारा +इसि +किंहें +थि +उंहों +ओर +जिंहें +वहिं +अभि +बनि +हि +उंहिं +उंहें +हें +वगेरह +एसे +रवासा +कोन +निचे +काफि +उसि +पुरा +भितर +हे +बहि +वहां +कोइ +यहां +जिंहों +तिंहें +किसि +कइ +यहि +इंहिं +जिधर +इंहें +अदि +इतयादि +हुइ +कोनसा +इसकि +दुसरे +जहां +अप +किंहों +उनकि +भि +वरग +हुअ +जेसा +नहिं diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_hu.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_hu.txt new file mode 100755 index 0000000..37526da --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_hu.txt @@ -0,0 +1,211 @@ + | From svn.tartarus.org/snowball/trunk/website/algorithms/hungarian/stop.txt + | This file is distributed under the BSD License. + | See http://snowball.tartarus.org/license.php + | Also see http://www.opensource.org/licenses/bsd-license.html + | - Encoding was converted to UTF-8. + | - This notice was added. + | + | NOTE: To use this file with StopFilterFactory, you must specify format="snowball" + +| Hungarian stop word list +| prepared by Anna Tordai + +a +ahogy +ahol +aki +akik +akkor +alatt +által +általában +amely +amelyek +amelyekben +amelyeket +amelyet +amelynek +ami +amit +amolyan +amíg +amikor +át +abban +ahhoz +annak +arra +arról +az +azok +azon +azt +azzal +azért +aztán +azután +azonban +bár +be +belül +benne +cikk +cikkek +cikkeket +csak +de +e +eddig +egész +egy +egyes +egyetlen +egyéb +egyik +egyre +ekkor +el +elég +ellen +elő +először +előtt +első +én +éppen +ebben +ehhez +emilyen +ennek +erre +ez +ezt +ezek +ezen +ezzel +ezért +és +fel +felé +hanem +hiszen +hogy +hogyan +igen +így +illetve +ill. +ill +ilyen +ilyenkor +ison +ismét +itt +jó +jól +jobban +kell +kellett +keresztül +keressünk +ki +kívül +között +közül +legalább +lehet +lehetett +legyen +lenne +lenni +lesz +lett +maga +magát +majd +majd +már +más +másik +meg +még +mellett +mert +mely +melyek +mi +mit +míg +miért +milyen +mikor +minden +mindent +mindenki +mindig +mint +mintha +mivel +most +nagy +nagyobb +nagyon +ne +néha +nekem +neki +nem +néhány +nélkül +nincs +olyan +ott +össze +ő +ők +őket +pedig +persze +rá +s +saját +sem +semmi +sok +sokat +sokkal +számára +szemben +szerint +szinte +talán +tehát +teljes +tovább +továbbá +több +úgy +ugyanis +új +újabb +újra +után +utána +utolsó +vagy +vagyis +valaki +valami +valamint +való +vagyok +van +vannak +volt +voltam +voltak +voltunk +vissza +vele +viszont +volna diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_hy.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_hy.txt new file mode 100755 index 0000000..60c1c50 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_hy.txt @@ -0,0 +1,46 @@ +# example set of Armenian stopwords. +այդ +այլ +այն +այս +դու +դուք +եմ +են +ենք +ես +եք +է +էի +էին +էինք +էիր +էիք +էր +ըստ +թ +ի +ին +իսկ +իր +կամ +համար +հետ +հետո +մենք +մեջ +մի +ն +նա +նաև +նրա +նրանք +որ +որը +որոնք +որպես +ու +ում +պիտի +վրա +և diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_id.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_id.txt new file mode 100755 index 0000000..4617f83 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_id.txt @@ -0,0 +1,359 @@ +# from appendix D of: A Study of Stemming Effects on Information +# Retrieval in Bahasa Indonesia +ada +adanya +adalah +adapun +agak +agaknya +agar +akan +akankah +akhirnya +aku +akulah +amat +amatlah +anda +andalah +antar +diantaranya +antara +antaranya +diantara +apa +apaan +mengapa +apabila +apakah +apalagi +apatah +atau +ataukah +ataupun +bagai +bagaikan +sebagai +sebagainya +bagaimana +bagaimanapun +sebagaimana +bagaimanakah +bagi +bahkan +bahwa +bahwasanya +sebaliknya +banyak +sebanyak +beberapa +seberapa +begini +beginian +beginikah +beginilah +sebegini +begitu +begitukah +begitulah +begitupun +sebegitu +belum +belumlah +sebelum +sebelumnya +sebenarnya +berapa +berapakah +berapalah +berapapun +betulkah +sebetulnya +biasa +biasanya +bila +bilakah +bisa +bisakah +sebisanya +boleh +bolehkah +bolehlah +buat +bukan +bukankah +bukanlah +bukannya +cuma +percuma +dahulu +dalam +dan +dapat +dari +daripada +dekat +demi +demikian +demikianlah +sedemikian +dengan +depan +di +dia +dialah +dini +diri +dirinya +terdiri +dong +dulu +enggak +enggaknya +entah +entahlah +terhadap +terhadapnya +hal +hampir +hanya +hanyalah +harus +haruslah +harusnya +seharusnya +hendak +hendaklah +hendaknya +hingga +sehingga +ia +ialah +ibarat +ingin +inginkah +inginkan +ini +inikah +inilah +itu +itukah +itulah +jangan +jangankan +janganlah +jika +jikalau +juga +justru +kala +kalau +kalaulah +kalaupun +kalian +kami +kamilah +kamu +kamulah +kan +kapan +kapankah +kapanpun +dikarenakan +karena +karenanya +ke +kecil +kemudian +kenapa +kepada +kepadanya +ketika +seketika +khususnya +kini +kinilah +kiranya +sekiranya +kita +kitalah +kok +lagi +lagian +selagi +lah +lain +lainnya +melainkan +selaku +lalu +melalui +terlalu +lama +lamanya +selama +selama +selamanya +lebih +terlebih +bermacam +macam +semacam +maka +makanya +makin +malah +malahan +mampu +mampukah +mana +manakala +manalagi +masih +masihkah +semasih +masing +mau +maupun +semaunya +memang +mereka +merekalah +meski +meskipun +semula +mungkin +mungkinkah +nah +namun +nanti +nantinya +nyaris +oleh +olehnya +seorang +seseorang +pada +padanya +padahal +paling +sepanjang +pantas +sepantasnya +sepantasnyalah +para +pasti +pastilah +per +pernah +pula +pun +merupakan +rupanya +serupa +saat +saatnya +sesaat +saja +sajalah +saling +bersama +sama +sesama +sambil +sampai +sana +sangat +sangatlah +saya +sayalah +se +sebab +sebabnya +sebuah +tersebut +tersebutlah +sedang +sedangkan +sedikit +sedikitnya +segala +segalanya +segera +sesegera +sejak +sejenak +sekali +sekalian +sekalipun +sesekali +sekaligus +sekarang +sekarang +sekitar +sekitarnya +sela +selain +selalu +seluruh +seluruhnya +semakin +sementara +sempat +semua +semuanya +sendiri +sendirinya +seolah +seperti +sepertinya +sering +seringnya +serta +siapa +siapakah +siapapun +disini +disinilah +sini +sinilah +sesuatu +sesuatunya +suatu +sesudah +sesudahnya +sudah +sudahkah +sudahlah +supaya +tadi +tadinya +tak +tanpa +setelah +telah +tentang +tentu +tentulah +tentunya +tertentu +seterusnya +tapi +tetapi +setiap +tiap +setidaknya +tidak +tidakkah +tidaklah +toh +waduh +wah +wahai +sewaktu +walau +walaupun +wong +yaitu +yakni +yang diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_it.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_it.txt new file mode 100755 index 0000000..1219cc7 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_it.txt @@ -0,0 +1,303 @@ + | From svn.tartarus.org/snowball/trunk/website/algorithms/italian/stop.txt + | This file is distributed under the BSD License. + | See http://snowball.tartarus.org/license.php + | Also see http://www.opensource.org/licenses/bsd-license.html + | - Encoding was converted to UTF-8. + | - This notice was added. + | + | NOTE: To use this file with StopFilterFactory, you must specify format="snowball" + + | An Italian stop word list. Comments begin with vertical bar. Each stop + | word is at the start of a line. + +ad | a (to) before vowel +al | a + il +allo | a + lo +ai | a + i +agli | a + gli +all | a + l' +agl | a + gl' +alla | a + la +alle | a + le +con | with +col | con + il +coi | con + i (forms collo, cogli etc are now very rare) +da | from +dal | da + il +dallo | da + lo +dai | da + i +dagli | da + gli +dall | da + l' +dagl | da + gll' +dalla | da + la +dalle | da + le +di | of +del | di + il +dello | di + lo +dei | di + i +degli | di + gli +dell | di + l' +degl | di + gl' +della | di + la +delle | di + le +in | in +nel | in + el +nello | in + lo +nei | in + i +negli | in + gli +nell | in + l' +negl | in + gl' +nella | in + la +nelle | in + le +su | on +sul | su + il +sullo | su + lo +sui | su + i +sugli | su + gli +sull | su + l' +sugl | su + gl' +sulla | su + la +sulle | su + le +per | through, by +tra | among +contro | against +io | I +tu | thou +lui | he +lei | she +noi | we +voi | you +loro | they +mio | my +mia | +miei | +mie | +tuo | +tua | +tuoi | thy +tue | +suo | +sua | +suoi | his, her +sue | +nostro | our +nostra | +nostri | +nostre | +vostro | your +vostra | +vostri | +vostre | +mi | me +ti | thee +ci | us, there +vi | you, there +lo | him, the +la | her, the +li | them +le | them, the +gli | to him, the +ne | from there etc +il | the +un | a +uno | a +una | a +ma | but +ed | and +se | if +perché | why, because +anche | also +come | how +dov | where (as dov') +dove | where +che | who, that +chi | who +cui | whom +non | not +più | more +quale | who, that +quanto | how much +quanti | +quanta | +quante | +quello | that +quelli | +quella | +quelle | +questo | this +questi | +questa | +queste | +si | yes +tutto | all +tutti | all + + | single letter forms: + +a | at +c | as c' for ce or ci +e | and +i | the +l | as l' +o | or + + | forms of avere, to have (not including the infinitive): + +ho +hai +ha +abbiamo +avete +hanno +abbia +abbiate +abbiano +avrò +avrai +avrà +avremo +avrete +avranno +avrei +avresti +avrebbe +avremmo +avreste +avrebbero +avevo +avevi +aveva +avevamo +avevate +avevano +ebbi +avesti +ebbe +avemmo +aveste +ebbero +avessi +avesse +avessimo +avessero +avendo +avuto +avuta +avuti +avute + + | forms of essere, to be (not including the infinitive): +sono +sei +è +siamo +siete +sia +siate +siano +sarò +sarai +sarà +saremo +sarete +saranno +sarei +saresti +sarebbe +saremmo +sareste +sarebbero +ero +eri +era +eravamo +eravate +erano +fui +fosti +fu +fummo +foste +furono +fossi +fosse +fossimo +fossero +essendo + + | forms of fare, to do (not including the infinitive, fa, fat-): +faccio +fai +facciamo +fanno +faccia +facciate +facciano +farò +farai +farà +faremo +farete +faranno +farei +faresti +farebbe +faremmo +fareste +farebbero +facevo +facevi +faceva +facevamo +facevate +facevano +feci +facesti +fece +facemmo +faceste +fecero +facessi +facesse +facessimo +facessero +facendo + + | forms of stare, to be (not including the infinitive): +sto +stai +sta +stiamo +stanno +stia +stiate +stiano +starò +starai +starà +staremo +starete +staranno +starei +staresti +starebbe +staremmo +stareste +starebbero +stavo +stavi +stava +stavamo +stavate +stavano +stetti +stesti +stette +stemmo +steste +stettero +stessi +stesse +stessimo +stessero +stando diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ja.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ja.txt new file mode 100755 index 0000000..d4321be --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ja.txt @@ -0,0 +1,127 @@ +# +# This file defines a stopword set for Japanese. +# +# This set is made up of hand-picked frequent terms from segmented Japanese Wikipedia. +# Punctuation characters and frequent kanji have mostly been left out. See LUCENE-3745 +# for frequency lists, etc. that can be useful for making your own set (if desired) +# +# Note that there is an overlap between these stopwords and the terms stopped when used +# in combination with the JapanesePartOfSpeechStopFilter. When editing this file, note +# that comments are not allowed on the same line as stopwords. +# +# Also note that stopping is done in a case-insensitive manner. Change your StopFilter +# configuration if you need case-sensitive stopping. Lastly, note that stopping is done +# using the same character width as the entries in this file. Since this StopFilter is +# normally done after a CJKWidthFilter in your chain, you would usually want your romaji +# entries to be in half-width and your kana entries to be in full-width. +# +の +に +は +を +た +が +で +て +と +し +れ +さ +ある +いる +も +する +から +な +こと +として +い +や +れる +など +なっ +ない +この +ため +その +あっ +よう +また +もの +という +あり +まで +られ +なる +へ +か +だ +これ +によって +により +おり +より +による +ず +なり +られる +において +ば +なかっ +なく +しかし +について +せ +だっ +その後 +できる +それ +う +ので +なお +のみ +でき +き +つ +における +および +いう +さらに +でも +ら +たり +その他 +に関する +たち +ます +ん +なら +に対して +特に +せる +及び +これら +とき +では +にて +ほか +ながら +うち +そして +とともに +ただし +かつて +それぞれ +または +お +ほど +ものの +に対する +ほとんど +と共に +といった +です +とも +ところ +ここ +##### End of file diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_lv.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_lv.txt new file mode 100755 index 0000000..e21a23c --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_lv.txt @@ -0,0 +1,172 @@ +# Set of Latvian stopwords from A Stemming Algorithm for Latvian, Karlis Kreslins +# the original list of over 800 forms was refined: +# pronouns, adverbs, interjections were removed +# +# prepositions +aiz +ap +ar +apakš +ārpus +augšpus +bez +caur +dēļ +gar +iekš +iz +kopš +labad +lejpus +līdz +no +otrpus +pa +par +pār +pēc +pie +pirms +pret +priekš +starp +šaipus +uz +viņpus +virs +virspus +zem +apakšpus +# Conjunctions +un +bet +jo +ja +ka +lai +tomēr +tikko +turpretī +arī +kaut +gan +tādēļ +tā +ne +tikvien +vien +kā +ir +te +vai +kamēr +# Particles +ar +diezin +droši +diemžēl +nebūt +ik +it +taču +nu +pat +tiklab +iekšpus +nedz +tik +nevis +turpretim +jeb +iekam +iekām +iekāms +kolīdz +līdzko +tiklīdz +jebšu +tālab +tāpēc +nekā +itin +jā +jau +jel +nē +nezin +tad +tikai +vis +tak +iekams +vien +# modal verbs +būt +biju +biji +bija +bijām +bijāt +esmu +esi +esam +esat +būšu +būsi +būs +būsim +būsiet +tikt +tiku +tiki +tika +tikām +tikāt +tieku +tiec +tiek +tiekam +tiekat +tikšu +tiks +tiksim +tiksiet +tapt +tapi +tapāt +topat +tapšu +tapsi +taps +tapsim +tapsiet +kļūt +kļuvu +kļuvi +kļuva +kļuvām +kļuvāt +kļūstu +kļūsti +kļūst +kļūstam +kļūstat +kļūšu +kļūsi +kļūs +kļūsim +kļūsiet +# verbs +varēt +varēju +varējām +varēšu +varēsim +var +varēji +varējāt +varēsi +varēsiet +varat +varēja +varēs diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_nl.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_nl.txt new file mode 100755 index 0000000..47a2aea --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_nl.txt @@ -0,0 +1,119 @@ + | From svn.tartarus.org/snowball/trunk/website/algorithms/dutch/stop.txt + | This file is distributed under the BSD License. + | See http://snowball.tartarus.org/license.php + | Also see http://www.opensource.org/licenses/bsd-license.html + | - Encoding was converted to UTF-8. + | - This notice was added. + | + | NOTE: To use this file with StopFilterFactory, you must specify format="snowball" + + | A Dutch stop word list. Comments begin with vertical bar. Each stop + | word is at the start of a line. + + | This is a ranked list (commonest to rarest) of stopwords derived from + | a large sample of Dutch text. + + | Dutch stop words frequently exhibit homonym clashes. These are indicated + | clearly below. + +de | the +en | and +van | of, from +ik | I, the ego +te | (1) chez, at etc, (2) to, (3) too +dat | that, which +die | that, those, who, which +in | in, inside +een | a, an, one +hij | he +het | the, it +niet | not, nothing, naught +zijn | (1) to be, being, (2) his, one's, its +is | is +was | (1) was, past tense of all persons sing. of 'zijn' (to be) (2) wax, (3) the washing, (4) rise of river +op | on, upon, at, in, up, used up +aan | on, upon, to (as dative) +met | with, by +als | like, such as, when +voor | (1) before, in front of, (2) furrow +had | had, past tense all persons sing. of 'hebben' (have) +er | there +maar | but, only +om | round, about, for etc +hem | him +dan | then +zou | should/would, past tense all persons sing. of 'zullen' +of | or, whether, if +wat | what, something, anything +mijn | possessive and noun 'mine' +men | people, 'one' +dit | this +zo | so, thus, in this way +door | through by +over | over, across +ze | she, her, they, them +zich | oneself +bij | (1) a bee, (2) by, near, at +ook | also, too +tot | till, until +je | you +mij | me +uit | out of, from +der | Old Dutch form of 'van der' still found in surnames +daar | (1) there, (2) because +haar | (1) her, their, them, (2) hair +naar | (1) unpleasant, unwell etc, (2) towards, (3) as +heb | present first person sing. of 'to have' +hoe | how, why +heeft | present third person sing. of 'to have' +hebben | 'to have' and various parts thereof +deze | this +u | you +want | (1) for, (2) mitten, (3) rigging +nog | yet, still +zal | 'shall', first and third person sing. of verb 'zullen' (will) +me | me +zij | she, they +nu | now +ge | 'thou', still used in Belgium and south Netherlands +geen | none +omdat | because +iets | something, somewhat +worden | to become, grow, get +toch | yet, still +al | all, every, each +waren | (1) 'were' (2) to wander, (3) wares, (3) +veel | much, many +meer | (1) more, (2) lake +doen | to do, to make +toen | then, when +moet | noun 'spot/mote' and present form of 'to must' +ben | (1) am, (2) 'are' in interrogative second person singular of 'to be' +zonder | without +kan | noun 'can' and present form of 'to be able' +hun | their, them +dus | so, consequently +alles | all, everything, anything +onder | under, beneath +ja | yes, of course +eens | once, one day +hier | here +wie | who +werd | imperfect third person sing. of 'become' +altijd | always +doch | yet, but etc +wordt | present third person sing. of 'become' +wezen | (1) to be, (2) 'been' as in 'been fishing', (3) orphans +kunnen | to be able +ons | us/our +zelf | self +tegen | against, towards, at +na | after, near +reeds | already +wil | (1) present tense of 'want', (2) 'will', noun, (3) fender +kon | could; past tense of 'to be able' +niets | nothing +uw | your +iemand | somebody +geweest | been; past participle of 'be' +andere | other diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_no.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_no.txt new file mode 100755 index 0000000..a7a2c28 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_no.txt @@ -0,0 +1,194 @@ + | From svn.tartarus.org/snowball/trunk/website/algorithms/norwegian/stop.txt + | This file is distributed under the BSD License. + | See http://snowball.tartarus.org/license.php + | Also see http://www.opensource.org/licenses/bsd-license.html + | - Encoding was converted to UTF-8. + | - This notice was added. + | + | NOTE: To use this file with StopFilterFactory, you must specify format="snowball" + + | A Norwegian stop word list. Comments begin with vertical bar. Each stop + | word is at the start of a line. + + | This stop word list is for the dominant bokmål dialect. Words unique + | to nynorsk are marked *. + + | Revised by Jan Bruusgaard , Jan 2005 + +og | and +i | in +jeg | I +det | it/this/that +at | to (w. inf.) +en | a/an +et | a/an +den | it/this/that +til | to +er | is/am/are +som | who/that +på | on +de | they / you(formal) +med | with +han | he +av | of +ikke | not +ikkje | not * +der | there +så | so +var | was/were +meg | me +seg | you +men | but +ett | one +har | have +om | about +vi | we +min | my +mitt | my +ha | have +hadde | had +hun | she +nå | now +over | over +da | when/as +ved | by/know +fra | from +du | you +ut | out +sin | your +dem | them +oss | us +opp | up +man | you/one +kan | can +hans | his +hvor | where +eller | or +hva | what +skal | shall/must +selv | self (reflective) +sjøl | self (reflective) +her | here +alle | all +vil | will +bli | become +ble | became +blei | became * +blitt | have become +kunne | could +inn | in +når | when +være | be +kom | come +noen | some +noe | some +ville | would +dere | you +som | who/which/that +deres | their/theirs +kun | only/just +ja | yes +etter | after +ned | down +skulle | should +denne | this +for | for/because +deg | you +si | hers/his +sine | hers/his +sitt | hers/his +mot | against +å | to +meget | much +hvorfor | why +dette | this +disse | these/those +uten | without +hvordan | how +ingen | none +din | your +ditt | your +blir | become +samme | same +hvilken | which +hvilke | which (plural) +sånn | such a +inni | inside/within +mellom | between +vår | our +hver | each +hvem | who +vors | us/ours +hvis | whose +både | both +bare | only/just +enn | than +fordi | as/because +før | before +mange | many +også | also +slik | just +vært | been +være | to be +båe | both * +begge | both +siden | since +dykk | your * +dykkar | yours * +dei | they * +deira | them * +deires | theirs * +deim | them * +di | your (fem.) * +då | as/when * +eg | I * +ein | a/an * +eit | a/an * +eitt | a/an * +elles | or * +honom | he * +hjå | at * +ho | she * +hoe | she * +henne | her +hennar | her/hers +hennes | hers +hoss | how * +hossen | how * +ikkje | not * +ingi | noone * +inkje | noone * +korleis | how * +korso | how * +kva | what/which * +kvar | where * +kvarhelst | where * +kven | who/whom * +kvi | why * +kvifor | why * +me | we * +medan | while * +mi | my * +mine | my * +mykje | much * +no | now * +nokon | some (masc./neut.) * +noka | some (fem.) * +nokor | some * +noko | some * +nokre | some * +si | his/hers * +sia | since * +sidan | since * +so | so * +somt | some * +somme | some * +um | about* +upp | up * +vere | be * +vore | was * +verte | become * +vort | become * +varte | became * +vart | became * + diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_pt.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_pt.txt new file mode 100755 index 0000000..acfeb01 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_pt.txt @@ -0,0 +1,253 @@ + | From svn.tartarus.org/snowball/trunk/website/algorithms/portuguese/stop.txt + | This file is distributed under the BSD License. + | See http://snowball.tartarus.org/license.php + | Also see http://www.opensource.org/licenses/bsd-license.html + | - Encoding was converted to UTF-8. + | - This notice was added. + | + | NOTE: To use this file with StopFilterFactory, you must specify format="snowball" + + | A Portuguese stop word list. Comments begin with vertical bar. Each stop + | word is at the start of a line. + + + | The following is a ranked list (commonest to rarest) of stopwords + | deriving from a large sample of text. + + | Extra words have been added at the end. + +de | of, from +a | the; to, at; her +o | the; him +que | who, that +e | and +do | de + o +da | de + a +em | in +um | a +para | for + | é from SER +com | with +não | not, no +uma | a +os | the; them +no | em + o +se | himself etc +na | em + a +por | for +mais | more +as | the; them +dos | de + os +como | as, like +mas | but + | foi from SER +ao | a + o +ele | he +das | de + as + | tem from TER +à | a + a +seu | his +sua | her +ou | or + | ser from SER +quando | when +muito | much + | há from HAV +nos | em + os; us +já | already, now + | está from EST +eu | I +também | also +só | only, just +pelo | per + o +pela | per + a +até | up to +isso | that +ela | he +entre | between + | era from SER +depois | after +sem | without +mesmo | same +aos | a + os + | ter from TER +seus | his +quem | whom +nas | em + as +me | me +esse | that +eles | they + | estão from EST +você | you + | tinha from TER + | foram from SER +essa | that +num | em + um +nem | nor +suas | her +meu | my +às | a + as +minha | my + | têm from TER +numa | em + uma +pelos | per + os +elas | they + | havia from HAV + | seja from SER +qual | which + | será from SER +nós | we + | tenho from TER +lhe | to him, her +deles | of them +essas | those +esses | those +pelas | per + as +este | this + | fosse from SER +dele | of him + + | other words. There are many contractions such as naquele = em+aquele, + | mo = me+o, but they are rare. + | Indefinite article plural forms are also rare. + +tu | thou +te | thee +vocês | you (plural) +vos | you +lhes | to them +meus | my +minhas +teu | thy +tua +teus +tuas +nosso | our +nossa +nossos +nossas + +dela | of her +delas | of them + +esta | this +estes | these +estas | these +aquele | that +aquela | that +aqueles | those +aquelas | those +isto | this +aquilo | that + + | forms of estar, to be (not including the infinitive): +estou +está +estamos +estão +estive +esteve +estivemos +estiveram +estava +estávamos +estavam +estivera +estivéramos +esteja +estejamos +estejam +estivesse +estivéssemos +estivessem +estiver +estivermos +estiverem + + | forms of haver, to have (not including the infinitive): +hei +há +havemos +hão +houve +houvemos +houveram +houvera +houvéramos +haja +hajamos +hajam +houvesse +houvéssemos +houvessem +houver +houvermos +houverem +houverei +houverá +houveremos +houverão +houveria +houveríamos +houveriam + + | forms of ser, to be (not including the infinitive): +sou +somos +são +era +éramos +eram +fui +foi +fomos +foram +fora +fôramos +seja +sejamos +sejam +fosse +fôssemos +fossem +for +formos +forem +serei +será +seremos +serão +seria +seríamos +seriam + + | forms of ter, to have (not including the infinitive): +tenho +tem +temos +tém +tinha +tínhamos +tinham +tive +teve +tivemos +tiveram +tivera +tivéramos +tenha +tenhamos +tenham +tivesse +tivéssemos +tivessem +tiver +tivermos +tiverem +terei +terá +teremos +terão +teria +teríamos +teriam diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ro.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ro.txt new file mode 100755 index 0000000..4fdee90 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ro.txt @@ -0,0 +1,233 @@ +# This file was created by Jacques Savoy and is distributed under the BSD license. +# See http://members.unine.ch/jacques.savoy/clef/index.html. +# Also see http://www.opensource.org/licenses/bsd-license.html +acea +aceasta +această +aceea +acei +aceia +acel +acela +acele +acelea +acest +acesta +aceste +acestea +aceşti +aceştia +acolo +acum +ai +aia +aibă +aici +al +ăla +ale +alea +ălea +altceva +altcineva +am +ar +are +aş +aşadar +asemenea +asta +ăsta +astăzi +astea +ăstea +ăştia +asupra +aţi +au +avea +avem +aveţi +azi +bine +bucur +bună +ca +că +căci +când +care +cărei +căror +cărui +cât +câte +câţi +către +câtva +ce +cel +ceva +chiar +cînd +cine +cineva +cît +cîte +cîţi +cîtva +contra +cu +cum +cumva +curând +curînd +da +dă +dacă +dar +datorită +de +deci +deja +deoarece +departe +deşi +din +dinaintea +dintr +dintre +drept +după +ea +ei +el +ele +eram +este +eşti +eu +face +fără +fi +fie +fiecare +fii +fim +fiţi +iar +ieri +îi +îl +îmi +împotriva +în +înainte +înaintea +încât +încît +încotro +între +întrucât +întrucît +îţi +la +lângă +le +li +lîngă +lor +lui +mă +mâine +mea +mei +mele +mereu +meu +mi +mine +mult +multă +mulţi +ne +nicăieri +nici +nimeni +nişte +noastră +noastre +noi +noştri +nostru +nu +ori +oricând +oricare +oricât +orice +oricînd +oricine +oricît +oricum +oriunde +până +pe +pentru +peste +pînă +poate +pot +prea +prima +primul +prin +printr +sa +să +săi +sale +sau +său +se +şi +sînt +sîntem +sînteţi +spre +sub +sunt +suntem +sunteţi +ta +tăi +tale +tău +te +ţi +ţie +tine +toată +toate +tot +toţi +totuşi +tu +un +una +unde +undeva +unei +unele +uneori +unor +vă +vi +voastră +voastre +voi +voştri +vostru +vouă +vreo +vreun diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ru.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ru.txt new file mode 100755 index 0000000..5527140 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_ru.txt @@ -0,0 +1,243 @@ + | From svn.tartarus.org/snowball/trunk/website/algorithms/russian/stop.txt + | This file is distributed under the BSD License. + | See http://snowball.tartarus.org/license.php + | Also see http://www.opensource.org/licenses/bsd-license.html + | - Encoding was converted to UTF-8. + | - This notice was added. + | + | NOTE: To use this file with StopFilterFactory, you must specify format="snowball" + + | a russian stop word list. comments begin with vertical bar. each stop + | word is at the start of a line. + + | this is a ranked list (commonest to rarest) of stopwords derived from + | a large text sample. + + | letter `ё' is translated to `е'. + +и | and +в | in/into +во | alternative form +не | not +что | what/that +он | he +на | on/onto +я | i +с | from +со | alternative form +как | how +а | milder form of `no' (but) +то | conjunction and form of `that' +все | all +она | she +так | so, thus +его | him +но | but +да | yes/and +ты | thou +к | towards, by +у | around, chez +же | intensifier particle +вы | you +за | beyond, behind +бы | conditional/subj. particle +по | up to, along +только | only +ее | her +мне | to me +было | it was +вот | here is/are, particle +от | away from +меня | me +еще | still, yet, more +нет | no, there isnt/arent +о | about +из | out of +ему | to him +теперь | now +когда | when +даже | even +ну | so, well +вдруг | suddenly +ли | interrogative particle +если | if +уже | already, but homonym of `narrower' +или | or +ни | neither +быть | to be +был | he was +него | prepositional form of его +до | up to +вас | you accusative +нибудь | indef. suffix preceded by hyphen +опять | again +уж | already, but homonym of `adder' +вам | to you +сказал | he said +ведь | particle `after all' +там | there +потом | then +себя | oneself +ничего | nothing +ей | to her +может | usually with `быть' as `maybe' +они | they +тут | here +где | where +есть | there is/are +надо | got to, must +ней | prepositional form of ей +для | for +мы | we +тебя | thee +их | them, their +чем | than +была | she was +сам | self +чтоб | in order to +без | without +будто | as if +человек | man, person, one +чего | genitive form of `what' +раз | once +тоже | also +себе | to oneself +под | beneath +жизнь | life +будет | will be +ж | short form of intensifer particle `же' +тогда | then +кто | who +этот | this +говорил | was saying +того | genitive form of `that' +потому | for that reason +этого | genitive form of `this' +какой | which +совсем | altogether +ним | prepositional form of `его', `они' +здесь | here +этом | prepositional form of `этот' +один | one +почти | almost +мой | my +тем | instrumental/dative plural of `тот', `то' +чтобы | full form of `in order that' +нее | her (acc.) +кажется | it seems +сейчас | now +были | they were +куда | where to +зачем | why +сказать | to say +всех | all (acc., gen. preposn. plural) +никогда | never +сегодня | today +можно | possible, one can +при | by +наконец | finally +два | two +об | alternative form of `о', about +другой | another +хоть | even +после | after +над | above +больше | more +тот | that one (masc.) +через | across, in +эти | these +нас | us +про | about +всего | in all, only, of all +них | prepositional form of `они' (they) +какая | which, feminine +много | lots +разве | interrogative particle +сказала | she said +три | three +эту | this, acc. fem. sing. +моя | my, feminine +впрочем | moreover, besides +хорошо | good +свою | ones own, acc. fem. sing. +этой | oblique form of `эта', fem. `this' +перед | in front of +иногда | sometimes +лучше | better +чуть | a little +том | preposn. form of `that one' +нельзя | one must not +такой | such a one +им | to them +более | more +всегда | always +конечно | of course +всю | acc. fem. sing of `all' +между | between + + + | b: some paradigms + | + | personal pronouns + | + | я меня мне мной [мною] + | ты тебя тебе тобой [тобою] + | он его ему им [него, нему, ним] + | она ее эи ею [нее, нэи, нею] + | оно его ему им [него, нему, ним] + | + | мы нас нам нами + | вы вас вам вами + | они их им ими [них, ним, ними] + | + | себя себе собой [собою] + | + | demonstrative pronouns: этот (this), тот (that) + | + | этот эта это эти + | этого эты это эти + | этого этой этого этих + | этому этой этому этим + | этим этой этим [этою] этими + | этом этой этом этих + | + | тот та то те + | того ту то те + | того той того тех + | тому той тому тем + | тем той тем [тою] теми + | том той том тех + | + | determinative pronouns + | + | (a) весь (all) + | + | весь вся все все + | всего всю все все + | всего всей всего всех + | всему всей всему всем + | всем всей всем [всею] всеми + | всем всей всем всех + | + | (b) сам (himself etc) + | + | сам сама само сами + | самого саму само самих + | самого самой самого самих + | самому самой самому самим + | самим самой самим [самою] самими + | самом самой самом самих + | + | stems of verbs `to be', `to have', `to do' and modal + | + | быть бы буд быв есть суть + | име + | дел + | мог мож мочь + | уме + | хоч хот + | долж + | можн + | нужн + | нельзя + diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_sv.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_sv.txt new file mode 100755 index 0000000..096f87f --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_sv.txt @@ -0,0 +1,133 @@ + | From svn.tartarus.org/snowball/trunk/website/algorithms/swedish/stop.txt + | This file is distributed under the BSD License. + | See http://snowball.tartarus.org/license.php + | Also see http://www.opensource.org/licenses/bsd-license.html + | - Encoding was converted to UTF-8. + | - This notice was added. + | + | NOTE: To use this file with StopFilterFactory, you must specify format="snowball" + + | A Swedish stop word list. Comments begin with vertical bar. Each stop + | word is at the start of a line. + + | This is a ranked list (commonest to rarest) of stopwords derived from + | a large text sample. + + | Swedish stop words occasionally exhibit homonym clashes. For example + | så = so, but also seed. These are indicated clearly below. + +och | and +det | it, this/that +att | to (with infinitive) +i | in, at +en | a +jag | I +hon | she +som | who, that +han | he +på | on +den | it, this/that +med | with +var | where, each +sig | him(self) etc +för | for +så | so (also: seed) +till | to +är | is +men | but +ett | a +om | if; around, about +hade | had +de | they, these/those +av | of +icke | not, no +mig | me +du | you +henne | her +då | then, when +sin | his +nu | now +har | have +inte | inte någon = no one +hans | his +honom | him +skulle | 'sake' +hennes | her +där | there +min | my +man | one (pronoun) +ej | nor +vid | at, by, on (also: vast) +kunde | could +något | some etc +från | from, off +ut | out +när | when +efter | after, behind +upp | up +vi | we +dem | them +vara | be +vad | what +över | over +än | than +dig | you +kan | can +sina | his +här | here +ha | have +mot | towards +alla | all +under | under (also: wonder) +någon | some etc +eller | or (else) +allt | all +mycket | much +sedan | since +ju | why +denna | this/that +själv | myself, yourself etc +detta | this/that +åt | to +utan | without +varit | was +hur | how +ingen | no +mitt | my +ni | you +bli | to be, become +blev | from bli +oss | us +din | thy +dessa | these/those +några | some etc +deras | their +blir | from bli +mina | my +samma | (the) same +vilken | who, that +er | you, your +sådan | such a +vår | our +blivit | from bli +dess | its +inom | within +mellan | between +sådant | such a +varför | why +varje | each +vilka | who, that +ditt | thy +vem | who +vilket | who, that +sitta | his +sådana | such a +vart | each +dina | thy +vars | whose +vårt | our +våra | our +ert | your +era | your +vilkas | whose + diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_th.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_th.txt new file mode 100755 index 0000000..07f0fab --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_th.txt @@ -0,0 +1,119 @@ +# Thai stopwords from: +# "Opinion Detection in Thai Political News Columns +# Based on Subjectivity Analysis" +# Khampol Sukhum, Supot Nitsuwat, and Choochart Haruechaiyasak +ไว้ +ไม่ +ไป +ได้ +ให้ +ใน +โดย +แห่ง +แล้ว +และ +แรก +แบบ +แต่ +เอง +เห็น +เลย +เริ่ม +เรา +เมื่อ +เพื่อ +เพราะ +เป็นการ +เป็น +เปิดเผย +เปิด +เนื่องจาก +เดียวกัน +เดียว +เช่น +เฉพาะ +เคย +เข้า +เขา +อีก +อาจ +อะไร +ออก +อย่าง +อยู่ +อยาก +หาก +หลาย +หลังจาก +หลัง +หรือ +หนึ่ง +ส่วน +ส่ง +สุด +สําหรับ +ว่า +วัน +ลง +ร่วม +ราย +รับ +ระหว่าง +รวม +ยัง +มี +มาก +มา +พร้อม +พบ +ผ่าน +ผล +บาง +น่า +นี้ +นํา +นั้น +นัก +นอกจาก +ทุก +ที่สุด +ที่ +ทําให้ +ทํา +ทาง +ทั้งนี้ +ทั้ง +ถ้า +ถูก +ถึง +ต้อง +ต่างๆ +ต่าง +ต่อ +ตาม +ตั้งแต่ +ตั้ง +ด้าน +ด้วย +ดัง +ซึ่ง +ช่วง +จึง +จาก +จัด +จะ +คือ +ความ +ครั้ง +คง +ขึ้น +ของ +ขอ +ขณะ +ก่อน +ก็ +การ +กับ +กัน +กว่า +กล่าว diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_tr.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_tr.txt new file mode 100755 index 0000000..84d9408 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/stopwords_tr.txt @@ -0,0 +1,212 @@ +# Turkish stopwords from LUCENE-559 +# merged with the list from "Information Retrieval on Turkish Texts" +# (http://www.users.muohio.edu/canf/papers/JASIST2008offPrint.pdf) +acaba +altmış +altı +ama +ancak +arada +aslında +ayrıca +bana +bazı +belki +ben +benden +beni +benim +beri +beş +bile +bin +bir +birçok +biri +birkaç +birkez +birşey +birşeyi +biz +bize +bizden +bizi +bizim +böyle +böylece +bu +buna +bunda +bundan +bunlar +bunları +bunların +bunu +bunun +burada +çok +çünkü +da +daha +dahi +de +defa +değil +diğer +diye +doksan +dokuz +dolayı +dolayısıyla +dört +edecek +eden +ederek +edilecek +ediliyor +edilmesi +ediyor +eğer +elli +en +etmesi +etti +ettiği +ettiğini +gibi +göre +halen +hangi +hatta +hem +henüz +hep +hepsi +her +herhangi +herkesin +hiç +hiçbir +için +iki +ile +ilgili +ise +işte +itibaren +itibariyle +kadar +karşın +katrilyon +kendi +kendilerine +kendini +kendisi +kendisine +kendisini +kez +ki +kim +kimden +kime +kimi +kimse +kırk +milyar +milyon +mu +mü +mı +nasıl +ne +neden +nedenle +nerde +nerede +nereye +niye +niçin +o +olan +olarak +oldu +olduğu +olduğunu +olduklarını +olmadı +olmadığı +olmak +olması +olmayan +olmaz +olsa +olsun +olup +olur +olursa +oluyor +on +ona +ondan +onlar +onlardan +onları +onların +onu +onun +otuz +oysa +öyle +pek +rağmen +sadece +sanki +sekiz +seksen +sen +senden +seni +senin +siz +sizden +sizi +sizin +şey +şeyden +şeyi +şeyler +şöyle +şu +şuna +şunda +şundan +şunları +şunu +tarafından +trilyon +tüm +üç +üzere +var +vardı +ve +veya +ya +yani +yapacak +yapılan +yapılması +yapıyor +yapmak +yaptı +yaptığı +yaptığını +yaptıkları +yedi +yerine +yetmiş +yine +yirmi +yoksa +yüz +zaten diff --git a/molecule/default/templates/collections/sample_techproducts_configs/lang/userdict_ja.txt b/molecule/default/templates/collections/sample_techproducts_configs/lang/userdict_ja.txt new file mode 100755 index 0000000..6f0368e --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/lang/userdict_ja.txt @@ -0,0 +1,29 @@ +# +# This is a sample user dictionary for Kuromoji (JapaneseTokenizer) +# +# Add entries to this file in order to override the statistical model in terms +# of segmentation, readings and part-of-speech tags. Notice that entries do +# not have weights since they are always used when found. This is by-design +# in order to maximize ease-of-use. +# +# Entries are defined using the following CSV format: +# , ... , ... , +# +# Notice that a single half-width space separates tokens and readings, and +# that the number tokens and readings must match exactly. +# +# Also notice that multiple entries with the same is undefined. +# +# Whitespace only lines are ignored. Comments are not allowed on entry lines. +# + +# Custom segmentation for kanji compounds +日本経済新聞,日本 経済 新聞,ニホン ケイザイ シンブン,カスタム名詞 +関西国際空港,関西 国際 空港,カンサイ コクサイ クウコウ,カスタム名詞 + +# Custom segmentation for compound katakana +トートバッグ,トート バッグ,トート バッグ,かずカナ名詞 +ショルダーバッグ,ショルダー バッグ,ショルダー バッグ,かずカナ名詞 + +# Custom reading for former sumo wrestler +朝青龍,朝青龍,アサショウリュウ,カスタム人名 diff --git a/molecule/default/templates/collections/sample_techproducts_configs/managed-schema b/molecule/default/templates/collections/sample_techproducts_configs/managed-schema new file mode 100755 index 0000000..b6d3d16 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/managed-schema @@ -0,0 +1,1187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/molecule/default/templates/collections/sample_techproducts_configs/mapping-FoldToASCII.txt b/molecule/default/templates/collections/sample_techproducts_configs/mapping-FoldToASCII.txt new file mode 100755 index 0000000..9a84b6e --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/mapping-FoldToASCII.txt @@ -0,0 +1,3813 @@ +# The ASF licenses this file to You 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. + + +# This map converts alphabetic, numeric, and symbolic Unicode characters +# which are not in the first 127 ASCII characters (the "Basic Latin" Unicode +# block) into their ASCII equivalents, if one exists. +# +# Characters from the following Unicode blocks are converted; however, only +# those characters with reasonable ASCII alternatives are converted: +# +# - C1 Controls and Latin-1 Supplement: http://www.unicode.org/charts/PDF/U0080.pdf +# - Latin Extended-A: http://www.unicode.org/charts/PDF/U0100.pdf +# - Latin Extended-B: http://www.unicode.org/charts/PDF/U0180.pdf +# - Latin Extended Additional: http://www.unicode.org/charts/PDF/U1E00.pdf +# - Latin Extended-C: http://www.unicode.org/charts/PDF/U2C60.pdf +# - Latin Extended-D: http://www.unicode.org/charts/PDF/UA720.pdf +# - IPA Extensions: http://www.unicode.org/charts/PDF/U0250.pdf +# - Phonetic Extensions: http://www.unicode.org/charts/PDF/U1D00.pdf +# - Phonetic Extensions Supplement: http://www.unicode.org/charts/PDF/U1D80.pdf +# - General Punctuation: http://www.unicode.org/charts/PDF/U2000.pdf +# - Superscripts and Subscripts: http://www.unicode.org/charts/PDF/U2070.pdf +# - Enclosed Alphanumerics: http://www.unicode.org/charts/PDF/U2460.pdf +# - Dingbats: http://www.unicode.org/charts/PDF/U2700.pdf +# - Supplemental Punctuation: http://www.unicode.org/charts/PDF/U2E00.pdf +# - Alphabetic Presentation Forms: http://www.unicode.org/charts/PDF/UFB00.pdf +# - Halfwidth and Fullwidth Forms: http://www.unicode.org/charts/PDF/UFF00.pdf +# +# See: http://en.wikipedia.org/wiki/Latin_characters_in_Unicode +# +# The set of character conversions supported by this map is a superset of +# those supported by the map represented by mapping-ISOLatin1Accent.txt. +# +# See the bottom of this file for the Perl script used to generate the contents +# of this file (without this header) from ASCIIFoldingFilter.java. + + +# Syntax: +# "source" => "target" +# "source".length() > 0 (source cannot be empty.) +# "target".length() >= 0 (target can be empty.) + + +# À [LATIN CAPITAL LETTER A WITH GRAVE] +"\u00C0" => "A" + +# Á [LATIN CAPITAL LETTER A WITH ACUTE] +"\u00C1" => "A" + +#  [LATIN CAPITAL LETTER A WITH CIRCUMFLEX] +"\u00C2" => "A" + +# à [LATIN CAPITAL LETTER A WITH TILDE] +"\u00C3" => "A" + +# Ä [LATIN CAPITAL LETTER A WITH DIAERESIS] +"\u00C4" => "A" + +# Å [LATIN CAPITAL LETTER A WITH RING ABOVE] +"\u00C5" => "A" + +# Ā [LATIN CAPITAL LETTER A WITH MACRON] +"\u0100" => "A" + +# Ă [LATIN CAPITAL LETTER A WITH BREVE] +"\u0102" => "A" + +# Ą [LATIN CAPITAL LETTER A WITH OGONEK] +"\u0104" => "A" + +# Ə http://en.wikipedia.org/wiki/Schwa [LATIN CAPITAL LETTER SCHWA] +"\u018F" => "A" + +# Ǎ [LATIN CAPITAL LETTER A WITH CARON] +"\u01CD" => "A" + +# Ǟ [LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON] +"\u01DE" => "A" + +# Ǡ [LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON] +"\u01E0" => "A" + +# Ǻ [LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE] +"\u01FA" => "A" + +# Ȁ [LATIN CAPITAL LETTER A WITH DOUBLE GRAVE] +"\u0200" => "A" + +# Ȃ [LATIN CAPITAL LETTER A WITH INVERTED BREVE] +"\u0202" => "A" + +# Ȧ [LATIN CAPITAL LETTER A WITH DOT ABOVE] +"\u0226" => "A" + +# Ⱥ [LATIN CAPITAL LETTER A WITH STROKE] +"\u023A" => "A" + +# ᴀ [LATIN LETTER SMALL CAPITAL A] +"\u1D00" => "A" + +# Ḁ [LATIN CAPITAL LETTER A WITH RING BELOW] +"\u1E00" => "A" + +# Ạ [LATIN CAPITAL LETTER A WITH DOT BELOW] +"\u1EA0" => "A" + +# Ả [LATIN CAPITAL LETTER A WITH HOOK ABOVE] +"\u1EA2" => "A" + +# Ấ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE] +"\u1EA4" => "A" + +# Ầ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE] +"\u1EA6" => "A" + +# Ẩ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE] +"\u1EA8" => "A" + +# Ẫ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE] +"\u1EAA" => "A" + +# Ậ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW] +"\u1EAC" => "A" + +# Ắ [LATIN CAPITAL LETTER A WITH BREVE AND ACUTE] +"\u1EAE" => "A" + +# Ằ [LATIN CAPITAL LETTER A WITH BREVE AND GRAVE] +"\u1EB0" => "A" + +# Ẳ [LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE] +"\u1EB2" => "A" + +# Ẵ [LATIN CAPITAL LETTER A WITH BREVE AND TILDE] +"\u1EB4" => "A" + +# Ặ [LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW] +"\u1EB6" => "A" + +# Ⓐ [CIRCLED LATIN CAPITAL LETTER A] +"\u24B6" => "A" + +# A [FULLWIDTH LATIN CAPITAL LETTER A] +"\uFF21" => "A" + +# à [LATIN SMALL LETTER A WITH GRAVE] +"\u00E0" => "a" + +# á [LATIN SMALL LETTER A WITH ACUTE] +"\u00E1" => "a" + +# â [LATIN SMALL LETTER A WITH CIRCUMFLEX] +"\u00E2" => "a" + +# ã [LATIN SMALL LETTER A WITH TILDE] +"\u00E3" => "a" + +# ä [LATIN SMALL LETTER A WITH DIAERESIS] +"\u00E4" => "a" + +# å [LATIN SMALL LETTER A WITH RING ABOVE] +"\u00E5" => "a" + +# ā [LATIN SMALL LETTER A WITH MACRON] +"\u0101" => "a" + +# ă [LATIN SMALL LETTER A WITH BREVE] +"\u0103" => "a" + +# ą [LATIN SMALL LETTER A WITH OGONEK] +"\u0105" => "a" + +# ǎ [LATIN SMALL LETTER A WITH CARON] +"\u01CE" => "a" + +# ǟ [LATIN SMALL LETTER A WITH DIAERESIS AND MACRON] +"\u01DF" => "a" + +# ǡ [LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON] +"\u01E1" => "a" + +# ǻ [LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE] +"\u01FB" => "a" + +# ȁ [LATIN SMALL LETTER A WITH DOUBLE GRAVE] +"\u0201" => "a" + +# ȃ [LATIN SMALL LETTER A WITH INVERTED BREVE] +"\u0203" => "a" + +# ȧ [LATIN SMALL LETTER A WITH DOT ABOVE] +"\u0227" => "a" + +# ɐ [LATIN SMALL LETTER TURNED A] +"\u0250" => "a" + +# ə [LATIN SMALL LETTER SCHWA] +"\u0259" => "a" + +# ɚ [LATIN SMALL LETTER SCHWA WITH HOOK] +"\u025A" => "a" + +# ᶏ [LATIN SMALL LETTER A WITH RETROFLEX HOOK] +"\u1D8F" => "a" + +# ᶕ [LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK] +"\u1D95" => "a" + +# ạ [LATIN SMALL LETTER A WITH RING BELOW] +"\u1E01" => "a" + +# ả [LATIN SMALL LETTER A WITH RIGHT HALF RING] +"\u1E9A" => "a" + +# ạ [LATIN SMALL LETTER A WITH DOT BELOW] +"\u1EA1" => "a" + +# ả [LATIN SMALL LETTER A WITH HOOK ABOVE] +"\u1EA3" => "a" + +# ấ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE] +"\u1EA5" => "a" + +# ầ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE] +"\u1EA7" => "a" + +# ẩ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE] +"\u1EA9" => "a" + +# ẫ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE] +"\u1EAB" => "a" + +# ậ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW] +"\u1EAD" => "a" + +# ắ [LATIN SMALL LETTER A WITH BREVE AND ACUTE] +"\u1EAF" => "a" + +# ằ [LATIN SMALL LETTER A WITH BREVE AND GRAVE] +"\u1EB1" => "a" + +# ẳ [LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE] +"\u1EB3" => "a" + +# ẵ [LATIN SMALL LETTER A WITH BREVE AND TILDE] +"\u1EB5" => "a" + +# ặ [LATIN SMALL LETTER A WITH BREVE AND DOT BELOW] +"\u1EB7" => "a" + +# ₐ [LATIN SUBSCRIPT SMALL LETTER A] +"\u2090" => "a" + +# ₔ [LATIN SUBSCRIPT SMALL LETTER SCHWA] +"\u2094" => "a" + +# ⓐ [CIRCLED LATIN SMALL LETTER A] +"\u24D0" => "a" + +# ⱥ [LATIN SMALL LETTER A WITH STROKE] +"\u2C65" => "a" + +# Ɐ [LATIN CAPITAL LETTER TURNED A] +"\u2C6F" => "a" + +# a [FULLWIDTH LATIN SMALL LETTER A] +"\uFF41" => "a" + +# Ꜳ [LATIN CAPITAL LETTER AA] +"\uA732" => "AA" + +# Æ [LATIN CAPITAL LETTER AE] +"\u00C6" => "AE" + +# Ǣ [LATIN CAPITAL LETTER AE WITH MACRON] +"\u01E2" => "AE" + +# Ǽ [LATIN CAPITAL LETTER AE WITH ACUTE] +"\u01FC" => "AE" + +# ᴁ [LATIN LETTER SMALL CAPITAL AE] +"\u1D01" => "AE" + +# Ꜵ [LATIN CAPITAL LETTER AO] +"\uA734" => "AO" + +# Ꜷ [LATIN CAPITAL LETTER AU] +"\uA736" => "AU" + +# Ꜹ [LATIN CAPITAL LETTER AV] +"\uA738" => "AV" + +# Ꜻ [LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR] +"\uA73A" => "AV" + +# Ꜽ [LATIN CAPITAL LETTER AY] +"\uA73C" => "AY" + +# ⒜ [PARENTHESIZED LATIN SMALL LETTER A] +"\u249C" => "(a)" + +# ꜳ [LATIN SMALL LETTER AA] +"\uA733" => "aa" + +# æ [LATIN SMALL LETTER AE] +"\u00E6" => "ae" + +# ǣ [LATIN SMALL LETTER AE WITH MACRON] +"\u01E3" => "ae" + +# ǽ [LATIN SMALL LETTER AE WITH ACUTE] +"\u01FD" => "ae" + +# ᴂ [LATIN SMALL LETTER TURNED AE] +"\u1D02" => "ae" + +# ꜵ [LATIN SMALL LETTER AO] +"\uA735" => "ao" + +# ꜷ [LATIN SMALL LETTER AU] +"\uA737" => "au" + +# ꜹ [LATIN SMALL LETTER AV] +"\uA739" => "av" + +# ꜻ [LATIN SMALL LETTER AV WITH HORIZONTAL BAR] +"\uA73B" => "av" + +# ꜽ [LATIN SMALL LETTER AY] +"\uA73D" => "ay" + +# Ɓ [LATIN CAPITAL LETTER B WITH HOOK] +"\u0181" => "B" + +# Ƃ [LATIN CAPITAL LETTER B WITH TOPBAR] +"\u0182" => "B" + +# Ƀ [LATIN CAPITAL LETTER B WITH STROKE] +"\u0243" => "B" + +# ʙ [LATIN LETTER SMALL CAPITAL B] +"\u0299" => "B" + +# ᴃ [LATIN LETTER SMALL CAPITAL BARRED B] +"\u1D03" => "B" + +# Ḃ [LATIN CAPITAL LETTER B WITH DOT ABOVE] +"\u1E02" => "B" + +# Ḅ [LATIN CAPITAL LETTER B WITH DOT BELOW] +"\u1E04" => "B" + +# Ḇ [LATIN CAPITAL LETTER B WITH LINE BELOW] +"\u1E06" => "B" + +# Ⓑ [CIRCLED LATIN CAPITAL LETTER B] +"\u24B7" => "B" + +# B [FULLWIDTH LATIN CAPITAL LETTER B] +"\uFF22" => "B" + +# ƀ [LATIN SMALL LETTER B WITH STROKE] +"\u0180" => "b" + +# ƃ [LATIN SMALL LETTER B WITH TOPBAR] +"\u0183" => "b" + +# ɓ [LATIN SMALL LETTER B WITH HOOK] +"\u0253" => "b" + +# ᵬ [LATIN SMALL LETTER B WITH MIDDLE TILDE] +"\u1D6C" => "b" + +# ᶀ [LATIN SMALL LETTER B WITH PALATAL HOOK] +"\u1D80" => "b" + +# ḃ [LATIN SMALL LETTER B WITH DOT ABOVE] +"\u1E03" => "b" + +# ḅ [LATIN SMALL LETTER B WITH DOT BELOW] +"\u1E05" => "b" + +# ḇ [LATIN SMALL LETTER B WITH LINE BELOW] +"\u1E07" => "b" + +# ⓑ [CIRCLED LATIN SMALL LETTER B] +"\u24D1" => "b" + +# b [FULLWIDTH LATIN SMALL LETTER B] +"\uFF42" => "b" + +# ⒝ [PARENTHESIZED LATIN SMALL LETTER B] +"\u249D" => "(b)" + +# Ç [LATIN CAPITAL LETTER C WITH CEDILLA] +"\u00C7" => "C" + +# Ć [LATIN CAPITAL LETTER C WITH ACUTE] +"\u0106" => "C" + +# Ĉ [LATIN CAPITAL LETTER C WITH CIRCUMFLEX] +"\u0108" => "C" + +# Ċ [LATIN CAPITAL LETTER C WITH DOT ABOVE] +"\u010A" => "C" + +# Č [LATIN CAPITAL LETTER C WITH CARON] +"\u010C" => "C" + +# Ƈ [LATIN CAPITAL LETTER C WITH HOOK] +"\u0187" => "C" + +# Ȼ [LATIN CAPITAL LETTER C WITH STROKE] +"\u023B" => "C" + +# ʗ [LATIN LETTER STRETCHED C] +"\u0297" => "C" + +# ᴄ [LATIN LETTER SMALL CAPITAL C] +"\u1D04" => "C" + +# Ḉ [LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE] +"\u1E08" => "C" + +# Ⓒ [CIRCLED LATIN CAPITAL LETTER C] +"\u24B8" => "C" + +# C [FULLWIDTH LATIN CAPITAL LETTER C] +"\uFF23" => "C" + +# ç [LATIN SMALL LETTER C WITH CEDILLA] +"\u00E7" => "c" + +# ć [LATIN SMALL LETTER C WITH ACUTE] +"\u0107" => "c" + +# ĉ [LATIN SMALL LETTER C WITH CIRCUMFLEX] +"\u0109" => "c" + +# ċ [LATIN SMALL LETTER C WITH DOT ABOVE] +"\u010B" => "c" + +# č [LATIN SMALL LETTER C WITH CARON] +"\u010D" => "c" + +# ƈ [LATIN SMALL LETTER C WITH HOOK] +"\u0188" => "c" + +# ȼ [LATIN SMALL LETTER C WITH STROKE] +"\u023C" => "c" + +# ɕ [LATIN SMALL LETTER C WITH CURL] +"\u0255" => "c" + +# ḉ [LATIN SMALL LETTER C WITH CEDILLA AND ACUTE] +"\u1E09" => "c" + +# ↄ [LATIN SMALL LETTER REVERSED C] +"\u2184" => "c" + +# ⓒ [CIRCLED LATIN SMALL LETTER C] +"\u24D2" => "c" + +# Ꜿ [LATIN CAPITAL LETTER REVERSED C WITH DOT] +"\uA73E" => "c" + +# ꜿ [LATIN SMALL LETTER REVERSED C WITH DOT] +"\uA73F" => "c" + +# c [FULLWIDTH LATIN SMALL LETTER C] +"\uFF43" => "c" + +# ⒞ [PARENTHESIZED LATIN SMALL LETTER C] +"\u249E" => "(c)" + +# Ð [LATIN CAPITAL LETTER ETH] +"\u00D0" => "D" + +# Ď [LATIN CAPITAL LETTER D WITH CARON] +"\u010E" => "D" + +# Đ [LATIN CAPITAL LETTER D WITH STROKE] +"\u0110" => "D" + +# Ɖ [LATIN CAPITAL LETTER AFRICAN D] +"\u0189" => "D" + +# Ɗ [LATIN CAPITAL LETTER D WITH HOOK] +"\u018A" => "D" + +# Ƌ [LATIN CAPITAL LETTER D WITH TOPBAR] +"\u018B" => "D" + +# ᴅ [LATIN LETTER SMALL CAPITAL D] +"\u1D05" => "D" + +# ᴆ [LATIN LETTER SMALL CAPITAL ETH] +"\u1D06" => "D" + +# Ḋ [LATIN CAPITAL LETTER D WITH DOT ABOVE] +"\u1E0A" => "D" + +# Ḍ [LATIN CAPITAL LETTER D WITH DOT BELOW] +"\u1E0C" => "D" + +# Ḏ [LATIN CAPITAL LETTER D WITH LINE BELOW] +"\u1E0E" => "D" + +# Ḑ [LATIN CAPITAL LETTER D WITH CEDILLA] +"\u1E10" => "D" + +# Ḓ [LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW] +"\u1E12" => "D" + +# Ⓓ [CIRCLED LATIN CAPITAL LETTER D] +"\u24B9" => "D" + +# Ꝺ [LATIN CAPITAL LETTER INSULAR D] +"\uA779" => "D" + +# D [FULLWIDTH LATIN CAPITAL LETTER D] +"\uFF24" => "D" + +# ð [LATIN SMALL LETTER ETH] +"\u00F0" => "d" + +# ď [LATIN SMALL LETTER D WITH CARON] +"\u010F" => "d" + +# đ [LATIN SMALL LETTER D WITH STROKE] +"\u0111" => "d" + +# ƌ [LATIN SMALL LETTER D WITH TOPBAR] +"\u018C" => "d" + +# ȡ [LATIN SMALL LETTER D WITH CURL] +"\u0221" => "d" + +# ɖ [LATIN SMALL LETTER D WITH TAIL] +"\u0256" => "d" + +# ɗ [LATIN SMALL LETTER D WITH HOOK] +"\u0257" => "d" + +# ᵭ [LATIN SMALL LETTER D WITH MIDDLE TILDE] +"\u1D6D" => "d" + +# ᶁ [LATIN SMALL LETTER D WITH PALATAL HOOK] +"\u1D81" => "d" + +# ᶑ [LATIN SMALL LETTER D WITH HOOK AND TAIL] +"\u1D91" => "d" + +# ḋ [LATIN SMALL LETTER D WITH DOT ABOVE] +"\u1E0B" => "d" + +# ḍ [LATIN SMALL LETTER D WITH DOT BELOW] +"\u1E0D" => "d" + +# ḏ [LATIN SMALL LETTER D WITH LINE BELOW] +"\u1E0F" => "d" + +# ḑ [LATIN SMALL LETTER D WITH CEDILLA] +"\u1E11" => "d" + +# ḓ [LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW] +"\u1E13" => "d" + +# ⓓ [CIRCLED LATIN SMALL LETTER D] +"\u24D3" => "d" + +# ꝺ [LATIN SMALL LETTER INSULAR D] +"\uA77A" => "d" + +# d [FULLWIDTH LATIN SMALL LETTER D] +"\uFF44" => "d" + +# DŽ [LATIN CAPITAL LETTER DZ WITH CARON] +"\u01C4" => "DZ" + +# DZ [LATIN CAPITAL LETTER DZ] +"\u01F1" => "DZ" + +# Dž [LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON] +"\u01C5" => "Dz" + +# Dz [LATIN CAPITAL LETTER D WITH SMALL LETTER Z] +"\u01F2" => "Dz" + +# ⒟ [PARENTHESIZED LATIN SMALL LETTER D] +"\u249F" => "(d)" + +# ȸ [LATIN SMALL LETTER DB DIGRAPH] +"\u0238" => "db" + +# dž [LATIN SMALL LETTER DZ WITH CARON] +"\u01C6" => "dz" + +# dz [LATIN SMALL LETTER DZ] +"\u01F3" => "dz" + +# ʣ [LATIN SMALL LETTER DZ DIGRAPH] +"\u02A3" => "dz" + +# ʥ [LATIN SMALL LETTER DZ DIGRAPH WITH CURL] +"\u02A5" => "dz" + +# È [LATIN CAPITAL LETTER E WITH GRAVE] +"\u00C8" => "E" + +# É [LATIN CAPITAL LETTER E WITH ACUTE] +"\u00C9" => "E" + +# Ê [LATIN CAPITAL LETTER E WITH CIRCUMFLEX] +"\u00CA" => "E" + +# Ë [LATIN CAPITAL LETTER E WITH DIAERESIS] +"\u00CB" => "E" + +# Ē [LATIN CAPITAL LETTER E WITH MACRON] +"\u0112" => "E" + +# Ĕ [LATIN CAPITAL LETTER E WITH BREVE] +"\u0114" => "E" + +# Ė [LATIN CAPITAL LETTER E WITH DOT ABOVE] +"\u0116" => "E" + +# Ę [LATIN CAPITAL LETTER E WITH OGONEK] +"\u0118" => "E" + +# Ě [LATIN CAPITAL LETTER E WITH CARON] +"\u011A" => "E" + +# Ǝ [LATIN CAPITAL LETTER REVERSED E] +"\u018E" => "E" + +# Ɛ [LATIN CAPITAL LETTER OPEN E] +"\u0190" => "E" + +# Ȅ [LATIN CAPITAL LETTER E WITH DOUBLE GRAVE] +"\u0204" => "E" + +# Ȇ [LATIN CAPITAL LETTER E WITH INVERTED BREVE] +"\u0206" => "E" + +# Ȩ [LATIN CAPITAL LETTER E WITH CEDILLA] +"\u0228" => "E" + +# Ɇ [LATIN CAPITAL LETTER E WITH STROKE] +"\u0246" => "E" + +# ᴇ [LATIN LETTER SMALL CAPITAL E] +"\u1D07" => "E" + +# Ḕ [LATIN CAPITAL LETTER E WITH MACRON AND GRAVE] +"\u1E14" => "E" + +# Ḗ [LATIN CAPITAL LETTER E WITH MACRON AND ACUTE] +"\u1E16" => "E" + +# Ḙ [LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW] +"\u1E18" => "E" + +# Ḛ [LATIN CAPITAL LETTER E WITH TILDE BELOW] +"\u1E1A" => "E" + +# Ḝ [LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE] +"\u1E1C" => "E" + +# Ẹ [LATIN CAPITAL LETTER E WITH DOT BELOW] +"\u1EB8" => "E" + +# Ẻ [LATIN CAPITAL LETTER E WITH HOOK ABOVE] +"\u1EBA" => "E" + +# Ẽ [LATIN CAPITAL LETTER E WITH TILDE] +"\u1EBC" => "E" + +# Ế [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE] +"\u1EBE" => "E" + +# Ề [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE] +"\u1EC0" => "E" + +# Ể [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE] +"\u1EC2" => "E" + +# Ễ [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE] +"\u1EC4" => "E" + +# Ệ [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW] +"\u1EC6" => "E" + +# Ⓔ [CIRCLED LATIN CAPITAL LETTER E] +"\u24BA" => "E" + +# ⱻ [LATIN LETTER SMALL CAPITAL TURNED E] +"\u2C7B" => "E" + +# E [FULLWIDTH LATIN CAPITAL LETTER E] +"\uFF25" => "E" + +# è [LATIN SMALL LETTER E WITH GRAVE] +"\u00E8" => "e" + +# é [LATIN SMALL LETTER E WITH ACUTE] +"\u00E9" => "e" + +# ê [LATIN SMALL LETTER E WITH CIRCUMFLEX] +"\u00EA" => "e" + +# ë [LATIN SMALL LETTER E WITH DIAERESIS] +"\u00EB" => "e" + +# ē [LATIN SMALL LETTER E WITH MACRON] +"\u0113" => "e" + +# ĕ [LATIN SMALL LETTER E WITH BREVE] +"\u0115" => "e" + +# ė [LATIN SMALL LETTER E WITH DOT ABOVE] +"\u0117" => "e" + +# ę [LATIN SMALL LETTER E WITH OGONEK] +"\u0119" => "e" + +# ě [LATIN SMALL LETTER E WITH CARON] +"\u011B" => "e" + +# ǝ [LATIN SMALL LETTER TURNED E] +"\u01DD" => "e" + +# ȅ [LATIN SMALL LETTER E WITH DOUBLE GRAVE] +"\u0205" => "e" + +# ȇ [LATIN SMALL LETTER E WITH INVERTED BREVE] +"\u0207" => "e" + +# ȩ [LATIN SMALL LETTER E WITH CEDILLA] +"\u0229" => "e" + +# ɇ [LATIN SMALL LETTER E WITH STROKE] +"\u0247" => "e" + +# ɘ [LATIN SMALL LETTER REVERSED E] +"\u0258" => "e" + +# ɛ [LATIN SMALL LETTER OPEN E] +"\u025B" => "e" + +# ɜ [LATIN SMALL LETTER REVERSED OPEN E] +"\u025C" => "e" + +# ɝ [LATIN SMALL LETTER REVERSED OPEN E WITH HOOK] +"\u025D" => "e" + +# ɞ [LATIN SMALL LETTER CLOSED REVERSED OPEN E] +"\u025E" => "e" + +# ʚ [LATIN SMALL LETTER CLOSED OPEN E] +"\u029A" => "e" + +# ᴈ [LATIN SMALL LETTER TURNED OPEN E] +"\u1D08" => "e" + +# ᶒ [LATIN SMALL LETTER E WITH RETROFLEX HOOK] +"\u1D92" => "e" + +# ᶓ [LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK] +"\u1D93" => "e" + +# ᶔ [LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK] +"\u1D94" => "e" + +# ḕ [LATIN SMALL LETTER E WITH MACRON AND GRAVE] +"\u1E15" => "e" + +# ḗ [LATIN SMALL LETTER E WITH MACRON AND ACUTE] +"\u1E17" => "e" + +# ḙ [LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW] +"\u1E19" => "e" + +# ḛ [LATIN SMALL LETTER E WITH TILDE BELOW] +"\u1E1B" => "e" + +# ḝ [LATIN SMALL LETTER E WITH CEDILLA AND BREVE] +"\u1E1D" => "e" + +# ẹ [LATIN SMALL LETTER E WITH DOT BELOW] +"\u1EB9" => "e" + +# ẻ [LATIN SMALL LETTER E WITH HOOK ABOVE] +"\u1EBB" => "e" + +# ẽ [LATIN SMALL LETTER E WITH TILDE] +"\u1EBD" => "e" + +# ế [LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE] +"\u1EBF" => "e" + +# ề [LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE] +"\u1EC1" => "e" + +# ể [LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE] +"\u1EC3" => "e" + +# ễ [LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE] +"\u1EC5" => "e" + +# ệ [LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW] +"\u1EC7" => "e" + +# ₑ [LATIN SUBSCRIPT SMALL LETTER E] +"\u2091" => "e" + +# ⓔ [CIRCLED LATIN SMALL LETTER E] +"\u24D4" => "e" + +# ⱸ [LATIN SMALL LETTER E WITH NOTCH] +"\u2C78" => "e" + +# e [FULLWIDTH LATIN SMALL LETTER E] +"\uFF45" => "e" + +# ⒠ [PARENTHESIZED LATIN SMALL LETTER E] +"\u24A0" => "(e)" + +# Ƒ [LATIN CAPITAL LETTER F WITH HOOK] +"\u0191" => "F" + +# Ḟ [LATIN CAPITAL LETTER F WITH DOT ABOVE] +"\u1E1E" => "F" + +# Ⓕ [CIRCLED LATIN CAPITAL LETTER F] +"\u24BB" => "F" + +# ꜰ [LATIN LETTER SMALL CAPITAL F] +"\uA730" => "F" + +# Ꝼ [LATIN CAPITAL LETTER INSULAR F] +"\uA77B" => "F" + +# ꟻ [LATIN EPIGRAPHIC LETTER REVERSED F] +"\uA7FB" => "F" + +# F [FULLWIDTH LATIN CAPITAL LETTER F] +"\uFF26" => "F" + +# ƒ [LATIN SMALL LETTER F WITH HOOK] +"\u0192" => "f" + +# ᵮ [LATIN SMALL LETTER F WITH MIDDLE TILDE] +"\u1D6E" => "f" + +# ᶂ [LATIN SMALL LETTER F WITH PALATAL HOOK] +"\u1D82" => "f" + +# ḟ [LATIN SMALL LETTER F WITH DOT ABOVE] +"\u1E1F" => "f" + +# ẛ [LATIN SMALL LETTER LONG S WITH DOT ABOVE] +"\u1E9B" => "f" + +# ⓕ [CIRCLED LATIN SMALL LETTER F] +"\u24D5" => "f" + +# ꝼ [LATIN SMALL LETTER INSULAR F] +"\uA77C" => "f" + +# f [FULLWIDTH LATIN SMALL LETTER F] +"\uFF46" => "f" + +# ⒡ [PARENTHESIZED LATIN SMALL LETTER F] +"\u24A1" => "(f)" + +# ff [LATIN SMALL LIGATURE FF] +"\uFB00" => "ff" + +# ffi [LATIN SMALL LIGATURE FFI] +"\uFB03" => "ffi" + +# ffl [LATIN SMALL LIGATURE FFL] +"\uFB04" => "ffl" + +# fi [LATIN SMALL LIGATURE FI] +"\uFB01" => "fi" + +# fl [LATIN SMALL LIGATURE FL] +"\uFB02" => "fl" + +# Ĝ [LATIN CAPITAL LETTER G WITH CIRCUMFLEX] +"\u011C" => "G" + +# Ğ [LATIN CAPITAL LETTER G WITH BREVE] +"\u011E" => "G" + +# Ġ [LATIN CAPITAL LETTER G WITH DOT ABOVE] +"\u0120" => "G" + +# Ģ [LATIN CAPITAL LETTER G WITH CEDILLA] +"\u0122" => "G" + +# Ɠ [LATIN CAPITAL LETTER G WITH HOOK] +"\u0193" => "G" + +# Ǥ [LATIN CAPITAL LETTER G WITH STROKE] +"\u01E4" => "G" + +# ǥ [LATIN SMALL LETTER G WITH STROKE] +"\u01E5" => "G" + +# Ǧ [LATIN CAPITAL LETTER G WITH CARON] +"\u01E6" => "G" + +# ǧ [LATIN SMALL LETTER G WITH CARON] +"\u01E7" => "G" + +# Ǵ [LATIN CAPITAL LETTER G WITH ACUTE] +"\u01F4" => "G" + +# ɢ [LATIN LETTER SMALL CAPITAL G] +"\u0262" => "G" + +# ʛ [LATIN LETTER SMALL CAPITAL G WITH HOOK] +"\u029B" => "G" + +# Ḡ [LATIN CAPITAL LETTER G WITH MACRON] +"\u1E20" => "G" + +# Ⓖ [CIRCLED LATIN CAPITAL LETTER G] +"\u24BC" => "G" + +# Ᵹ [LATIN CAPITAL LETTER INSULAR G] +"\uA77D" => "G" + +# Ꝿ [LATIN CAPITAL LETTER TURNED INSULAR G] +"\uA77E" => "G" + +# G [FULLWIDTH LATIN CAPITAL LETTER G] +"\uFF27" => "G" + +# ĝ [LATIN SMALL LETTER G WITH CIRCUMFLEX] +"\u011D" => "g" + +# ğ [LATIN SMALL LETTER G WITH BREVE] +"\u011F" => "g" + +# ġ [LATIN SMALL LETTER G WITH DOT ABOVE] +"\u0121" => "g" + +# ģ [LATIN SMALL LETTER G WITH CEDILLA] +"\u0123" => "g" + +# ǵ [LATIN SMALL LETTER G WITH ACUTE] +"\u01F5" => "g" + +# ɠ [LATIN SMALL LETTER G WITH HOOK] +"\u0260" => "g" + +# ɡ [LATIN SMALL LETTER SCRIPT G] +"\u0261" => "g" + +# ᵷ [LATIN SMALL LETTER TURNED G] +"\u1D77" => "g" + +# ᵹ [LATIN SMALL LETTER INSULAR G] +"\u1D79" => "g" + +# ᶃ [LATIN SMALL LETTER G WITH PALATAL HOOK] +"\u1D83" => "g" + +# ḡ [LATIN SMALL LETTER G WITH MACRON] +"\u1E21" => "g" + +# ⓖ [CIRCLED LATIN SMALL LETTER G] +"\u24D6" => "g" + +# ꝿ [LATIN SMALL LETTER TURNED INSULAR G] +"\uA77F" => "g" + +# g [FULLWIDTH LATIN SMALL LETTER G] +"\uFF47" => "g" + +# ⒢ [PARENTHESIZED LATIN SMALL LETTER G] +"\u24A2" => "(g)" + +# Ĥ [LATIN CAPITAL LETTER H WITH CIRCUMFLEX] +"\u0124" => "H" + +# Ħ [LATIN CAPITAL LETTER H WITH STROKE] +"\u0126" => "H" + +# Ȟ [LATIN CAPITAL LETTER H WITH CARON] +"\u021E" => "H" + +# ʜ [LATIN LETTER SMALL CAPITAL H] +"\u029C" => "H" + +# Ḣ [LATIN CAPITAL LETTER H WITH DOT ABOVE] +"\u1E22" => "H" + +# Ḥ [LATIN CAPITAL LETTER H WITH DOT BELOW] +"\u1E24" => "H" + +# Ḧ [LATIN CAPITAL LETTER H WITH DIAERESIS] +"\u1E26" => "H" + +# Ḩ [LATIN CAPITAL LETTER H WITH CEDILLA] +"\u1E28" => "H" + +# Ḫ [LATIN CAPITAL LETTER H WITH BREVE BELOW] +"\u1E2A" => "H" + +# Ⓗ [CIRCLED LATIN CAPITAL LETTER H] +"\u24BD" => "H" + +# Ⱨ [LATIN CAPITAL LETTER H WITH DESCENDER] +"\u2C67" => "H" + +# Ⱶ [LATIN CAPITAL LETTER HALF H] +"\u2C75" => "H" + +# H [FULLWIDTH LATIN CAPITAL LETTER H] +"\uFF28" => "H" + +# ĥ [LATIN SMALL LETTER H WITH CIRCUMFLEX] +"\u0125" => "h" + +# ħ [LATIN SMALL LETTER H WITH STROKE] +"\u0127" => "h" + +# ȟ [LATIN SMALL LETTER H WITH CARON] +"\u021F" => "h" + +# ɥ [LATIN SMALL LETTER TURNED H] +"\u0265" => "h" + +# ɦ [LATIN SMALL LETTER H WITH HOOK] +"\u0266" => "h" + +# ʮ [LATIN SMALL LETTER TURNED H WITH FISHHOOK] +"\u02AE" => "h" + +# ʯ [LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL] +"\u02AF" => "h" + +# ḣ [LATIN SMALL LETTER H WITH DOT ABOVE] +"\u1E23" => "h" + +# ḥ [LATIN SMALL LETTER H WITH DOT BELOW] +"\u1E25" => "h" + +# ḧ [LATIN SMALL LETTER H WITH DIAERESIS] +"\u1E27" => "h" + +# ḩ [LATIN SMALL LETTER H WITH CEDILLA] +"\u1E29" => "h" + +# ḫ [LATIN SMALL LETTER H WITH BREVE BELOW] +"\u1E2B" => "h" + +# ẖ [LATIN SMALL LETTER H WITH LINE BELOW] +"\u1E96" => "h" + +# ⓗ [CIRCLED LATIN SMALL LETTER H] +"\u24D7" => "h" + +# ⱨ [LATIN SMALL LETTER H WITH DESCENDER] +"\u2C68" => "h" + +# ⱶ [LATIN SMALL LETTER HALF H] +"\u2C76" => "h" + +# h [FULLWIDTH LATIN SMALL LETTER H] +"\uFF48" => "h" + +# Ƕ http://en.wikipedia.org/wiki/Hwair [LATIN CAPITAL LETTER HWAIR] +"\u01F6" => "HV" + +# ⒣ [PARENTHESIZED LATIN SMALL LETTER H] +"\u24A3" => "(h)" + +# ƕ [LATIN SMALL LETTER HV] +"\u0195" => "hv" + +# Ì [LATIN CAPITAL LETTER I WITH GRAVE] +"\u00CC" => "I" + +# Í [LATIN CAPITAL LETTER I WITH ACUTE] +"\u00CD" => "I" + +# Î [LATIN CAPITAL LETTER I WITH CIRCUMFLEX] +"\u00CE" => "I" + +# Ï [LATIN CAPITAL LETTER I WITH DIAERESIS] +"\u00CF" => "I" + +# Ĩ [LATIN CAPITAL LETTER I WITH TILDE] +"\u0128" => "I" + +# Ī [LATIN CAPITAL LETTER I WITH MACRON] +"\u012A" => "I" + +# Ĭ [LATIN CAPITAL LETTER I WITH BREVE] +"\u012C" => "I" + +# Į [LATIN CAPITAL LETTER I WITH OGONEK] +"\u012E" => "I" + +# İ [LATIN CAPITAL LETTER I WITH DOT ABOVE] +"\u0130" => "I" + +# Ɩ [LATIN CAPITAL LETTER IOTA] +"\u0196" => "I" + +# Ɨ [LATIN CAPITAL LETTER I WITH STROKE] +"\u0197" => "I" + +# Ǐ [LATIN CAPITAL LETTER I WITH CARON] +"\u01CF" => "I" + +# Ȉ [LATIN CAPITAL LETTER I WITH DOUBLE GRAVE] +"\u0208" => "I" + +# Ȋ [LATIN CAPITAL LETTER I WITH INVERTED BREVE] +"\u020A" => "I" + +# ɪ [LATIN LETTER SMALL CAPITAL I] +"\u026A" => "I" + +# ᵻ [LATIN SMALL CAPITAL LETTER I WITH STROKE] +"\u1D7B" => "I" + +# Ḭ [LATIN CAPITAL LETTER I WITH TILDE BELOW] +"\u1E2C" => "I" + +# Ḯ [LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE] +"\u1E2E" => "I" + +# Ỉ [LATIN CAPITAL LETTER I WITH HOOK ABOVE] +"\u1EC8" => "I" + +# Ị [LATIN CAPITAL LETTER I WITH DOT BELOW] +"\u1ECA" => "I" + +# Ⓘ [CIRCLED LATIN CAPITAL LETTER I] +"\u24BE" => "I" + +# ꟾ [LATIN EPIGRAPHIC LETTER I LONGA] +"\uA7FE" => "I" + +# I [FULLWIDTH LATIN CAPITAL LETTER I] +"\uFF29" => "I" + +# ì [LATIN SMALL LETTER I WITH GRAVE] +"\u00EC" => "i" + +# í [LATIN SMALL LETTER I WITH ACUTE] +"\u00ED" => "i" + +# î [LATIN SMALL LETTER I WITH CIRCUMFLEX] +"\u00EE" => "i" + +# ï [LATIN SMALL LETTER I WITH DIAERESIS] +"\u00EF" => "i" + +# ĩ [LATIN SMALL LETTER I WITH TILDE] +"\u0129" => "i" + +# ī [LATIN SMALL LETTER I WITH MACRON] +"\u012B" => "i" + +# ĭ [LATIN SMALL LETTER I WITH BREVE] +"\u012D" => "i" + +# į [LATIN SMALL LETTER I WITH OGONEK] +"\u012F" => "i" + +# ı [LATIN SMALL LETTER DOTLESS I] +"\u0131" => "i" + +# ǐ [LATIN SMALL LETTER I WITH CARON] +"\u01D0" => "i" + +# ȉ [LATIN SMALL LETTER I WITH DOUBLE GRAVE] +"\u0209" => "i" + +# ȋ [LATIN SMALL LETTER I WITH INVERTED BREVE] +"\u020B" => "i" + +# ɨ [LATIN SMALL LETTER I WITH STROKE] +"\u0268" => "i" + +# ᴉ [LATIN SMALL LETTER TURNED I] +"\u1D09" => "i" + +# ᵢ [LATIN SUBSCRIPT SMALL LETTER I] +"\u1D62" => "i" + +# ᵼ [LATIN SMALL LETTER IOTA WITH STROKE] +"\u1D7C" => "i" + +# ᶖ [LATIN SMALL LETTER I WITH RETROFLEX HOOK] +"\u1D96" => "i" + +# ḭ [LATIN SMALL LETTER I WITH TILDE BELOW] +"\u1E2D" => "i" + +# ḯ [LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE] +"\u1E2F" => "i" + +# ỉ [LATIN SMALL LETTER I WITH HOOK ABOVE] +"\u1EC9" => "i" + +# ị [LATIN SMALL LETTER I WITH DOT BELOW] +"\u1ECB" => "i" + +# ⁱ [SUPERSCRIPT LATIN SMALL LETTER I] +"\u2071" => "i" + +# ⓘ [CIRCLED LATIN SMALL LETTER I] +"\u24D8" => "i" + +# i [FULLWIDTH LATIN SMALL LETTER I] +"\uFF49" => "i" + +# IJ [LATIN CAPITAL LIGATURE IJ] +"\u0132" => "IJ" + +# ⒤ [PARENTHESIZED LATIN SMALL LETTER I] +"\u24A4" => "(i)" + +# ij [LATIN SMALL LIGATURE IJ] +"\u0133" => "ij" + +# Ĵ [LATIN CAPITAL LETTER J WITH CIRCUMFLEX] +"\u0134" => "J" + +# Ɉ [LATIN CAPITAL LETTER J WITH STROKE] +"\u0248" => "J" + +# ᴊ [LATIN LETTER SMALL CAPITAL J] +"\u1D0A" => "J" + +# Ⓙ [CIRCLED LATIN CAPITAL LETTER J] +"\u24BF" => "J" + +# J [FULLWIDTH LATIN CAPITAL LETTER J] +"\uFF2A" => "J" + +# ĵ [LATIN SMALL LETTER J WITH CIRCUMFLEX] +"\u0135" => "j" + +# ǰ [LATIN SMALL LETTER J WITH CARON] +"\u01F0" => "j" + +# ȷ [LATIN SMALL LETTER DOTLESS J] +"\u0237" => "j" + +# ɉ [LATIN SMALL LETTER J WITH STROKE] +"\u0249" => "j" + +# ɟ [LATIN SMALL LETTER DOTLESS J WITH STROKE] +"\u025F" => "j" + +# ʄ [LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK] +"\u0284" => "j" + +# ʝ [LATIN SMALL LETTER J WITH CROSSED-TAIL] +"\u029D" => "j" + +# ⓙ [CIRCLED LATIN SMALL LETTER J] +"\u24D9" => "j" + +# ⱼ [LATIN SUBSCRIPT SMALL LETTER J] +"\u2C7C" => "j" + +# j [FULLWIDTH LATIN SMALL LETTER J] +"\uFF4A" => "j" + +# ⒥ [PARENTHESIZED LATIN SMALL LETTER J] +"\u24A5" => "(j)" + +# Ķ [LATIN CAPITAL LETTER K WITH CEDILLA] +"\u0136" => "K" + +# Ƙ [LATIN CAPITAL LETTER K WITH HOOK] +"\u0198" => "K" + +# Ǩ [LATIN CAPITAL LETTER K WITH CARON] +"\u01E8" => "K" + +# ᴋ [LATIN LETTER SMALL CAPITAL K] +"\u1D0B" => "K" + +# Ḱ [LATIN CAPITAL LETTER K WITH ACUTE] +"\u1E30" => "K" + +# Ḳ [LATIN CAPITAL LETTER K WITH DOT BELOW] +"\u1E32" => "K" + +# Ḵ [LATIN CAPITAL LETTER K WITH LINE BELOW] +"\u1E34" => "K" + +# Ⓚ [CIRCLED LATIN CAPITAL LETTER K] +"\u24C0" => "K" + +# Ⱪ [LATIN CAPITAL LETTER K WITH DESCENDER] +"\u2C69" => "K" + +# Ꝁ [LATIN CAPITAL LETTER K WITH STROKE] +"\uA740" => "K" + +# Ꝃ [LATIN CAPITAL LETTER K WITH DIAGONAL STROKE] +"\uA742" => "K" + +# Ꝅ [LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE] +"\uA744" => "K" + +# K [FULLWIDTH LATIN CAPITAL LETTER K] +"\uFF2B" => "K" + +# ķ [LATIN SMALL LETTER K WITH CEDILLA] +"\u0137" => "k" + +# ƙ [LATIN SMALL LETTER K WITH HOOK] +"\u0199" => "k" + +# ǩ [LATIN SMALL LETTER K WITH CARON] +"\u01E9" => "k" + +# ʞ [LATIN SMALL LETTER TURNED K] +"\u029E" => "k" + +# ᶄ [LATIN SMALL LETTER K WITH PALATAL HOOK] +"\u1D84" => "k" + +# ḱ [LATIN SMALL LETTER K WITH ACUTE] +"\u1E31" => "k" + +# ḳ [LATIN SMALL LETTER K WITH DOT BELOW] +"\u1E33" => "k" + +# ḵ [LATIN SMALL LETTER K WITH LINE BELOW] +"\u1E35" => "k" + +# ⓚ [CIRCLED LATIN SMALL LETTER K] +"\u24DA" => "k" + +# ⱪ [LATIN SMALL LETTER K WITH DESCENDER] +"\u2C6A" => "k" + +# ꝁ [LATIN SMALL LETTER K WITH STROKE] +"\uA741" => "k" + +# ꝃ [LATIN SMALL LETTER K WITH DIAGONAL STROKE] +"\uA743" => "k" + +# ꝅ [LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE] +"\uA745" => "k" + +# k [FULLWIDTH LATIN SMALL LETTER K] +"\uFF4B" => "k" + +# ⒦ [PARENTHESIZED LATIN SMALL LETTER K] +"\u24A6" => "(k)" + +# Ĺ [LATIN CAPITAL LETTER L WITH ACUTE] +"\u0139" => "L" + +# Ļ [LATIN CAPITAL LETTER L WITH CEDILLA] +"\u013B" => "L" + +# Ľ [LATIN CAPITAL LETTER L WITH CARON] +"\u013D" => "L" + +# Ŀ [LATIN CAPITAL LETTER L WITH MIDDLE DOT] +"\u013F" => "L" + +# Ł [LATIN CAPITAL LETTER L WITH STROKE] +"\u0141" => "L" + +# Ƚ [LATIN CAPITAL LETTER L WITH BAR] +"\u023D" => "L" + +# ʟ [LATIN LETTER SMALL CAPITAL L] +"\u029F" => "L" + +# ᴌ [LATIN LETTER SMALL CAPITAL L WITH STROKE] +"\u1D0C" => "L" + +# Ḷ [LATIN CAPITAL LETTER L WITH DOT BELOW] +"\u1E36" => "L" + +# Ḹ [LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON] +"\u1E38" => "L" + +# Ḻ [LATIN CAPITAL LETTER L WITH LINE BELOW] +"\u1E3A" => "L" + +# Ḽ [LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW] +"\u1E3C" => "L" + +# Ⓛ [CIRCLED LATIN CAPITAL LETTER L] +"\u24C1" => "L" + +# Ⱡ [LATIN CAPITAL LETTER L WITH DOUBLE BAR] +"\u2C60" => "L" + +# Ɫ [LATIN CAPITAL LETTER L WITH MIDDLE TILDE] +"\u2C62" => "L" + +# Ꝇ [LATIN CAPITAL LETTER BROKEN L] +"\uA746" => "L" + +# Ꝉ [LATIN CAPITAL LETTER L WITH HIGH STROKE] +"\uA748" => "L" + +# Ꞁ [LATIN CAPITAL LETTER TURNED L] +"\uA780" => "L" + +# L [FULLWIDTH LATIN CAPITAL LETTER L] +"\uFF2C" => "L" + +# ĺ [LATIN SMALL LETTER L WITH ACUTE] +"\u013A" => "l" + +# ļ [LATIN SMALL LETTER L WITH CEDILLA] +"\u013C" => "l" + +# ľ [LATIN SMALL LETTER L WITH CARON] +"\u013E" => "l" + +# ŀ [LATIN SMALL LETTER L WITH MIDDLE DOT] +"\u0140" => "l" + +# ł [LATIN SMALL LETTER L WITH STROKE] +"\u0142" => "l" + +# ƚ [LATIN SMALL LETTER L WITH BAR] +"\u019A" => "l" + +# ȴ [LATIN SMALL LETTER L WITH CURL] +"\u0234" => "l" + +# ɫ [LATIN SMALL LETTER L WITH MIDDLE TILDE] +"\u026B" => "l" + +# ɬ [LATIN SMALL LETTER L WITH BELT] +"\u026C" => "l" + +# ɭ [LATIN SMALL LETTER L WITH RETROFLEX HOOK] +"\u026D" => "l" + +# ᶅ [LATIN SMALL LETTER L WITH PALATAL HOOK] +"\u1D85" => "l" + +# ḷ [LATIN SMALL LETTER L WITH DOT BELOW] +"\u1E37" => "l" + +# ḹ [LATIN SMALL LETTER L WITH DOT BELOW AND MACRON] +"\u1E39" => "l" + +# ḻ [LATIN SMALL LETTER L WITH LINE BELOW] +"\u1E3B" => "l" + +# ḽ [LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW] +"\u1E3D" => "l" + +# ⓛ [CIRCLED LATIN SMALL LETTER L] +"\u24DB" => "l" + +# ⱡ [LATIN SMALL LETTER L WITH DOUBLE BAR] +"\u2C61" => "l" + +# ꝇ [LATIN SMALL LETTER BROKEN L] +"\uA747" => "l" + +# ꝉ [LATIN SMALL LETTER L WITH HIGH STROKE] +"\uA749" => "l" + +# ꞁ [LATIN SMALL LETTER TURNED L] +"\uA781" => "l" + +# l [FULLWIDTH LATIN SMALL LETTER L] +"\uFF4C" => "l" + +# LJ [LATIN CAPITAL LETTER LJ] +"\u01C7" => "LJ" + +# Ỻ [LATIN CAPITAL LETTER MIDDLE-WELSH LL] +"\u1EFA" => "LL" + +# Lj [LATIN CAPITAL LETTER L WITH SMALL LETTER J] +"\u01C8" => "Lj" + +# ⒧ [PARENTHESIZED LATIN SMALL LETTER L] +"\u24A7" => "(l)" + +# lj [LATIN SMALL LETTER LJ] +"\u01C9" => "lj" + +# ỻ [LATIN SMALL LETTER MIDDLE-WELSH LL] +"\u1EFB" => "ll" + +# ʪ [LATIN SMALL LETTER LS DIGRAPH] +"\u02AA" => "ls" + +# ʫ [LATIN SMALL LETTER LZ DIGRAPH] +"\u02AB" => "lz" + +# Ɯ [LATIN CAPITAL LETTER TURNED M] +"\u019C" => "M" + +# ᴍ [LATIN LETTER SMALL CAPITAL M] +"\u1D0D" => "M" + +# Ḿ [LATIN CAPITAL LETTER M WITH ACUTE] +"\u1E3E" => "M" + +# Ṁ [LATIN CAPITAL LETTER M WITH DOT ABOVE] +"\u1E40" => "M" + +# Ṃ [LATIN CAPITAL LETTER M WITH DOT BELOW] +"\u1E42" => "M" + +# Ⓜ [CIRCLED LATIN CAPITAL LETTER M] +"\u24C2" => "M" + +# Ɱ [LATIN CAPITAL LETTER M WITH HOOK] +"\u2C6E" => "M" + +# ꟽ [LATIN EPIGRAPHIC LETTER INVERTED M] +"\uA7FD" => "M" + +# ꟿ [LATIN EPIGRAPHIC LETTER ARCHAIC M] +"\uA7FF" => "M" + +# M [FULLWIDTH LATIN CAPITAL LETTER M] +"\uFF2D" => "M" + +# ɯ [LATIN SMALL LETTER TURNED M] +"\u026F" => "m" + +# ɰ [LATIN SMALL LETTER TURNED M WITH LONG LEG] +"\u0270" => "m" + +# ɱ [LATIN SMALL LETTER M WITH HOOK] +"\u0271" => "m" + +# ᵯ [LATIN SMALL LETTER M WITH MIDDLE TILDE] +"\u1D6F" => "m" + +# ᶆ [LATIN SMALL LETTER M WITH PALATAL HOOK] +"\u1D86" => "m" + +# ḿ [LATIN SMALL LETTER M WITH ACUTE] +"\u1E3F" => "m" + +# ṁ [LATIN SMALL LETTER M WITH DOT ABOVE] +"\u1E41" => "m" + +# ṃ [LATIN SMALL LETTER M WITH DOT BELOW] +"\u1E43" => "m" + +# ⓜ [CIRCLED LATIN SMALL LETTER M] +"\u24DC" => "m" + +# m [FULLWIDTH LATIN SMALL LETTER M] +"\uFF4D" => "m" + +# ⒨ [PARENTHESIZED LATIN SMALL LETTER M] +"\u24A8" => "(m)" + +# Ñ [LATIN CAPITAL LETTER N WITH TILDE] +"\u00D1" => "N" + +# Ń [LATIN CAPITAL LETTER N WITH ACUTE] +"\u0143" => "N" + +# Ņ [LATIN CAPITAL LETTER N WITH CEDILLA] +"\u0145" => "N" + +# Ň [LATIN CAPITAL LETTER N WITH CARON] +"\u0147" => "N" + +# Ŋ http://en.wikipedia.org/wiki/Eng_(letter) [LATIN CAPITAL LETTER ENG] +"\u014A" => "N" + +# Ɲ [LATIN CAPITAL LETTER N WITH LEFT HOOK] +"\u019D" => "N" + +# Ǹ [LATIN CAPITAL LETTER N WITH GRAVE] +"\u01F8" => "N" + +# Ƞ [LATIN CAPITAL LETTER N WITH LONG RIGHT LEG] +"\u0220" => "N" + +# ɴ [LATIN LETTER SMALL CAPITAL N] +"\u0274" => "N" + +# ᴎ [LATIN LETTER SMALL CAPITAL REVERSED N] +"\u1D0E" => "N" + +# Ṅ [LATIN CAPITAL LETTER N WITH DOT ABOVE] +"\u1E44" => "N" + +# Ṇ [LATIN CAPITAL LETTER N WITH DOT BELOW] +"\u1E46" => "N" + +# Ṉ [LATIN CAPITAL LETTER N WITH LINE BELOW] +"\u1E48" => "N" + +# Ṋ [LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW] +"\u1E4A" => "N" + +# Ⓝ [CIRCLED LATIN CAPITAL LETTER N] +"\u24C3" => "N" + +# N [FULLWIDTH LATIN CAPITAL LETTER N] +"\uFF2E" => "N" + +# ñ [LATIN SMALL LETTER N WITH TILDE] +"\u00F1" => "n" + +# ń [LATIN SMALL LETTER N WITH ACUTE] +"\u0144" => "n" + +# ņ [LATIN SMALL LETTER N WITH CEDILLA] +"\u0146" => "n" + +# ň [LATIN SMALL LETTER N WITH CARON] +"\u0148" => "n" + +# ʼn [LATIN SMALL LETTER N PRECEDED BY APOSTROPHE] +"\u0149" => "n" + +# ŋ http://en.wikipedia.org/wiki/Eng_(letter) [LATIN SMALL LETTER ENG] +"\u014B" => "n" + +# ƞ [LATIN SMALL LETTER N WITH LONG RIGHT LEG] +"\u019E" => "n" + +# ǹ [LATIN SMALL LETTER N WITH GRAVE] +"\u01F9" => "n" + +# ȵ [LATIN SMALL LETTER N WITH CURL] +"\u0235" => "n" + +# ɲ [LATIN SMALL LETTER N WITH LEFT HOOK] +"\u0272" => "n" + +# ɳ [LATIN SMALL LETTER N WITH RETROFLEX HOOK] +"\u0273" => "n" + +# ᵰ [LATIN SMALL LETTER N WITH MIDDLE TILDE] +"\u1D70" => "n" + +# ᶇ [LATIN SMALL LETTER N WITH PALATAL HOOK] +"\u1D87" => "n" + +# ṅ [LATIN SMALL LETTER N WITH DOT ABOVE] +"\u1E45" => "n" + +# ṇ [LATIN SMALL LETTER N WITH DOT BELOW] +"\u1E47" => "n" + +# ṉ [LATIN SMALL LETTER N WITH LINE BELOW] +"\u1E49" => "n" + +# ṋ [LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW] +"\u1E4B" => "n" + +# ⁿ [SUPERSCRIPT LATIN SMALL LETTER N] +"\u207F" => "n" + +# ⓝ [CIRCLED LATIN SMALL LETTER N] +"\u24DD" => "n" + +# n [FULLWIDTH LATIN SMALL LETTER N] +"\uFF4E" => "n" + +# NJ [LATIN CAPITAL LETTER NJ] +"\u01CA" => "NJ" + +# Nj [LATIN CAPITAL LETTER N WITH SMALL LETTER J] +"\u01CB" => "Nj" + +# ⒩ [PARENTHESIZED LATIN SMALL LETTER N] +"\u24A9" => "(n)" + +# nj [LATIN SMALL LETTER NJ] +"\u01CC" => "nj" + +# Ò [LATIN CAPITAL LETTER O WITH GRAVE] +"\u00D2" => "O" + +# Ó [LATIN CAPITAL LETTER O WITH ACUTE] +"\u00D3" => "O" + +# Ô [LATIN CAPITAL LETTER O WITH CIRCUMFLEX] +"\u00D4" => "O" + +# Õ [LATIN CAPITAL LETTER O WITH TILDE] +"\u00D5" => "O" + +# Ö [LATIN CAPITAL LETTER O WITH DIAERESIS] +"\u00D6" => "O" + +# Ø [LATIN CAPITAL LETTER O WITH STROKE] +"\u00D8" => "O" + +# Ō [LATIN CAPITAL LETTER O WITH MACRON] +"\u014C" => "O" + +# Ŏ [LATIN CAPITAL LETTER O WITH BREVE] +"\u014E" => "O" + +# Ő [LATIN CAPITAL LETTER O WITH DOUBLE ACUTE] +"\u0150" => "O" + +# Ɔ [LATIN CAPITAL LETTER OPEN O] +"\u0186" => "O" + +# Ɵ [LATIN CAPITAL LETTER O WITH MIDDLE TILDE] +"\u019F" => "O" + +# Ơ [LATIN CAPITAL LETTER O WITH HORN] +"\u01A0" => "O" + +# Ǒ [LATIN CAPITAL LETTER O WITH CARON] +"\u01D1" => "O" + +# Ǫ [LATIN CAPITAL LETTER O WITH OGONEK] +"\u01EA" => "O" + +# Ǭ [LATIN CAPITAL LETTER O WITH OGONEK AND MACRON] +"\u01EC" => "O" + +# Ǿ [LATIN CAPITAL LETTER O WITH STROKE AND ACUTE] +"\u01FE" => "O" + +# Ȍ [LATIN CAPITAL LETTER O WITH DOUBLE GRAVE] +"\u020C" => "O" + +# Ȏ [LATIN CAPITAL LETTER O WITH INVERTED BREVE] +"\u020E" => "O" + +# Ȫ [LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON] +"\u022A" => "O" + +# Ȭ [LATIN CAPITAL LETTER O WITH TILDE AND MACRON] +"\u022C" => "O" + +# Ȯ [LATIN CAPITAL LETTER O WITH DOT ABOVE] +"\u022E" => "O" + +# Ȱ [LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON] +"\u0230" => "O" + +# ᴏ [LATIN LETTER SMALL CAPITAL O] +"\u1D0F" => "O" + +# ᴐ [LATIN LETTER SMALL CAPITAL OPEN O] +"\u1D10" => "O" + +# Ṍ [LATIN CAPITAL LETTER O WITH TILDE AND ACUTE] +"\u1E4C" => "O" + +# Ṏ [LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS] +"\u1E4E" => "O" + +# Ṑ [LATIN CAPITAL LETTER O WITH MACRON AND GRAVE] +"\u1E50" => "O" + +# Ṓ [LATIN CAPITAL LETTER O WITH MACRON AND ACUTE] +"\u1E52" => "O" + +# Ọ [LATIN CAPITAL LETTER O WITH DOT BELOW] +"\u1ECC" => "O" + +# Ỏ [LATIN CAPITAL LETTER O WITH HOOK ABOVE] +"\u1ECE" => "O" + +# Ố [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE] +"\u1ED0" => "O" + +# Ồ [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE] +"\u1ED2" => "O" + +# Ổ [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE] +"\u1ED4" => "O" + +# Ỗ [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE] +"\u1ED6" => "O" + +# Ộ [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW] +"\u1ED8" => "O" + +# Ớ [LATIN CAPITAL LETTER O WITH HORN AND ACUTE] +"\u1EDA" => "O" + +# Ờ [LATIN CAPITAL LETTER O WITH HORN AND GRAVE] +"\u1EDC" => "O" + +# Ở [LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE] +"\u1EDE" => "O" + +# Ỡ [LATIN CAPITAL LETTER O WITH HORN AND TILDE] +"\u1EE0" => "O" + +# Ợ [LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW] +"\u1EE2" => "O" + +# Ⓞ [CIRCLED LATIN CAPITAL LETTER O] +"\u24C4" => "O" + +# Ꝋ [LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY] +"\uA74A" => "O" + +# Ꝍ [LATIN CAPITAL LETTER O WITH LOOP] +"\uA74C" => "O" + +# O [FULLWIDTH LATIN CAPITAL LETTER O] +"\uFF2F" => "O" + +# ò [LATIN SMALL LETTER O WITH GRAVE] +"\u00F2" => "o" + +# ó [LATIN SMALL LETTER O WITH ACUTE] +"\u00F3" => "o" + +# ô [LATIN SMALL LETTER O WITH CIRCUMFLEX] +"\u00F4" => "o" + +# õ [LATIN SMALL LETTER O WITH TILDE] +"\u00F5" => "o" + +# ö [LATIN SMALL LETTER O WITH DIAERESIS] +"\u00F6" => "o" + +# ø [LATIN SMALL LETTER O WITH STROKE] +"\u00F8" => "o" + +# ō [LATIN SMALL LETTER O WITH MACRON] +"\u014D" => "o" + +# ŏ [LATIN SMALL LETTER O WITH BREVE] +"\u014F" => "o" + +# ő [LATIN SMALL LETTER O WITH DOUBLE ACUTE] +"\u0151" => "o" + +# ơ [LATIN SMALL LETTER O WITH HORN] +"\u01A1" => "o" + +# ǒ [LATIN SMALL LETTER O WITH CARON] +"\u01D2" => "o" + +# ǫ [LATIN SMALL LETTER O WITH OGONEK] +"\u01EB" => "o" + +# ǭ [LATIN SMALL LETTER O WITH OGONEK AND MACRON] +"\u01ED" => "o" + +# ǿ [LATIN SMALL LETTER O WITH STROKE AND ACUTE] +"\u01FF" => "o" + +# ȍ [LATIN SMALL LETTER O WITH DOUBLE GRAVE] +"\u020D" => "o" + +# ȏ [LATIN SMALL LETTER O WITH INVERTED BREVE] +"\u020F" => "o" + +# ȫ [LATIN SMALL LETTER O WITH DIAERESIS AND MACRON] +"\u022B" => "o" + +# ȭ [LATIN SMALL LETTER O WITH TILDE AND MACRON] +"\u022D" => "o" + +# ȯ [LATIN SMALL LETTER O WITH DOT ABOVE] +"\u022F" => "o" + +# ȱ [LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON] +"\u0231" => "o" + +# ɔ [LATIN SMALL LETTER OPEN O] +"\u0254" => "o" + +# ɵ [LATIN SMALL LETTER BARRED O] +"\u0275" => "o" + +# ᴖ [LATIN SMALL LETTER TOP HALF O] +"\u1D16" => "o" + +# ᴗ [LATIN SMALL LETTER BOTTOM HALF O] +"\u1D17" => "o" + +# ᶗ [LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK] +"\u1D97" => "o" + +# ṍ [LATIN SMALL LETTER O WITH TILDE AND ACUTE] +"\u1E4D" => "o" + +# ṏ [LATIN SMALL LETTER O WITH TILDE AND DIAERESIS] +"\u1E4F" => "o" + +# ṑ [LATIN SMALL LETTER O WITH MACRON AND GRAVE] +"\u1E51" => "o" + +# ṓ [LATIN SMALL LETTER O WITH MACRON AND ACUTE] +"\u1E53" => "o" + +# ọ [LATIN SMALL LETTER O WITH DOT BELOW] +"\u1ECD" => "o" + +# ỏ [LATIN SMALL LETTER O WITH HOOK ABOVE] +"\u1ECF" => "o" + +# ố [LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE] +"\u1ED1" => "o" + +# ồ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE] +"\u1ED3" => "o" + +# ổ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE] +"\u1ED5" => "o" + +# ỗ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE] +"\u1ED7" => "o" + +# ộ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW] +"\u1ED9" => "o" + +# ớ [LATIN SMALL LETTER O WITH HORN AND ACUTE] +"\u1EDB" => "o" + +# ờ [LATIN SMALL LETTER O WITH HORN AND GRAVE] +"\u1EDD" => "o" + +# ở [LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE] +"\u1EDF" => "o" + +# ỡ [LATIN SMALL LETTER O WITH HORN AND TILDE] +"\u1EE1" => "o" + +# ợ [LATIN SMALL LETTER O WITH HORN AND DOT BELOW] +"\u1EE3" => "o" + +# ₒ [LATIN SUBSCRIPT SMALL LETTER O] +"\u2092" => "o" + +# ⓞ [CIRCLED LATIN SMALL LETTER O] +"\u24DE" => "o" + +# ⱺ [LATIN SMALL LETTER O WITH LOW RING INSIDE] +"\u2C7A" => "o" + +# ꝋ [LATIN SMALL LETTER O WITH LONG STROKE OVERLAY] +"\uA74B" => "o" + +# ꝍ [LATIN SMALL LETTER O WITH LOOP] +"\uA74D" => "o" + +# o [FULLWIDTH LATIN SMALL LETTER O] +"\uFF4F" => "o" + +# Œ [LATIN CAPITAL LIGATURE OE] +"\u0152" => "OE" + +# ɶ [LATIN LETTER SMALL CAPITAL OE] +"\u0276" => "OE" + +# Ꝏ [LATIN CAPITAL LETTER OO] +"\uA74E" => "OO" + +# Ȣ http://en.wikipedia.org/wiki/OU [LATIN CAPITAL LETTER OU] +"\u0222" => "OU" + +# ᴕ [LATIN LETTER SMALL CAPITAL OU] +"\u1D15" => "OU" + +# ⒪ [PARENTHESIZED LATIN SMALL LETTER O] +"\u24AA" => "(o)" + +# œ [LATIN SMALL LIGATURE OE] +"\u0153" => "oe" + +# ᴔ [LATIN SMALL LETTER TURNED OE] +"\u1D14" => "oe" + +# ꝏ [LATIN SMALL LETTER OO] +"\uA74F" => "oo" + +# ȣ http://en.wikipedia.org/wiki/OU [LATIN SMALL LETTER OU] +"\u0223" => "ou" + +# Ƥ [LATIN CAPITAL LETTER P WITH HOOK] +"\u01A4" => "P" + +# ᴘ [LATIN LETTER SMALL CAPITAL P] +"\u1D18" => "P" + +# Ṕ [LATIN CAPITAL LETTER P WITH ACUTE] +"\u1E54" => "P" + +# Ṗ [LATIN CAPITAL LETTER P WITH DOT ABOVE] +"\u1E56" => "P" + +# Ⓟ [CIRCLED LATIN CAPITAL LETTER P] +"\u24C5" => "P" + +# Ᵽ [LATIN CAPITAL LETTER P WITH STROKE] +"\u2C63" => "P" + +# Ꝑ [LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER] +"\uA750" => "P" + +# Ꝓ [LATIN CAPITAL LETTER P WITH FLOURISH] +"\uA752" => "P" + +# Ꝕ [LATIN CAPITAL LETTER P WITH SQUIRREL TAIL] +"\uA754" => "P" + +# P [FULLWIDTH LATIN CAPITAL LETTER P] +"\uFF30" => "P" + +# ƥ [LATIN SMALL LETTER P WITH HOOK] +"\u01A5" => "p" + +# ᵱ [LATIN SMALL LETTER P WITH MIDDLE TILDE] +"\u1D71" => "p" + +# ᵽ [LATIN SMALL LETTER P WITH STROKE] +"\u1D7D" => "p" + +# ᶈ [LATIN SMALL LETTER P WITH PALATAL HOOK] +"\u1D88" => "p" + +# ṕ [LATIN SMALL LETTER P WITH ACUTE] +"\u1E55" => "p" + +# ṗ [LATIN SMALL LETTER P WITH DOT ABOVE] +"\u1E57" => "p" + +# ⓟ [CIRCLED LATIN SMALL LETTER P] +"\u24DF" => "p" + +# ꝑ [LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER] +"\uA751" => "p" + +# ꝓ [LATIN SMALL LETTER P WITH FLOURISH] +"\uA753" => "p" + +# ꝕ [LATIN SMALL LETTER P WITH SQUIRREL TAIL] +"\uA755" => "p" + +# ꟼ [LATIN EPIGRAPHIC LETTER REVERSED P] +"\uA7FC" => "p" + +# p [FULLWIDTH LATIN SMALL LETTER P] +"\uFF50" => "p" + +# ⒫ [PARENTHESIZED LATIN SMALL LETTER P] +"\u24AB" => "(p)" + +# Ɋ [LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL] +"\u024A" => "Q" + +# Ⓠ [CIRCLED LATIN CAPITAL LETTER Q] +"\u24C6" => "Q" + +# Ꝗ [LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER] +"\uA756" => "Q" + +# Ꝙ [LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE] +"\uA758" => "Q" + +# Q [FULLWIDTH LATIN CAPITAL LETTER Q] +"\uFF31" => "Q" + +# ĸ http://en.wikipedia.org/wiki/Kra_(letter) [LATIN SMALL LETTER KRA] +"\u0138" => "q" + +# ɋ [LATIN SMALL LETTER Q WITH HOOK TAIL] +"\u024B" => "q" + +# ʠ [LATIN SMALL LETTER Q WITH HOOK] +"\u02A0" => "q" + +# ⓠ [CIRCLED LATIN SMALL LETTER Q] +"\u24E0" => "q" + +# ꝗ [LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER] +"\uA757" => "q" + +# ꝙ [LATIN SMALL LETTER Q WITH DIAGONAL STROKE] +"\uA759" => "q" + +# q [FULLWIDTH LATIN SMALL LETTER Q] +"\uFF51" => "q" + +# ⒬ [PARENTHESIZED LATIN SMALL LETTER Q] +"\u24AC" => "(q)" + +# ȹ [LATIN SMALL LETTER QP DIGRAPH] +"\u0239" => "qp" + +# Ŕ [LATIN CAPITAL LETTER R WITH ACUTE] +"\u0154" => "R" + +# Ŗ [LATIN CAPITAL LETTER R WITH CEDILLA] +"\u0156" => "R" + +# Ř [LATIN CAPITAL LETTER R WITH CARON] +"\u0158" => "R" + +# Ȓ [LATIN CAPITAL LETTER R WITH DOUBLE GRAVE] +"\u0210" => "R" + +# Ȓ [LATIN CAPITAL LETTER R WITH INVERTED BREVE] +"\u0212" => "R" + +# Ɍ [LATIN CAPITAL LETTER R WITH STROKE] +"\u024C" => "R" + +# ʀ [LATIN LETTER SMALL CAPITAL R] +"\u0280" => "R" + +# ʁ [LATIN LETTER SMALL CAPITAL INVERTED R] +"\u0281" => "R" + +# ᴙ [LATIN LETTER SMALL CAPITAL REVERSED R] +"\u1D19" => "R" + +# ᴚ [LATIN LETTER SMALL CAPITAL TURNED R] +"\u1D1A" => "R" + +# Ṙ [LATIN CAPITAL LETTER R WITH DOT ABOVE] +"\u1E58" => "R" + +# Ṛ [LATIN CAPITAL LETTER R WITH DOT BELOW] +"\u1E5A" => "R" + +# Ṝ [LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON] +"\u1E5C" => "R" + +# Ṟ [LATIN CAPITAL LETTER R WITH LINE BELOW] +"\u1E5E" => "R" + +# Ⓡ [CIRCLED LATIN CAPITAL LETTER R] +"\u24C7" => "R" + +# Ɽ [LATIN CAPITAL LETTER R WITH TAIL] +"\u2C64" => "R" + +# Ꝛ [LATIN CAPITAL LETTER R ROTUNDA] +"\uA75A" => "R" + +# Ꞃ [LATIN CAPITAL LETTER INSULAR R] +"\uA782" => "R" + +# R [FULLWIDTH LATIN CAPITAL LETTER R] +"\uFF32" => "R" + +# ŕ [LATIN SMALL LETTER R WITH ACUTE] +"\u0155" => "r" + +# ŗ [LATIN SMALL LETTER R WITH CEDILLA] +"\u0157" => "r" + +# ř [LATIN SMALL LETTER R WITH CARON] +"\u0159" => "r" + +# ȑ [LATIN SMALL LETTER R WITH DOUBLE GRAVE] +"\u0211" => "r" + +# ȓ [LATIN SMALL LETTER R WITH INVERTED BREVE] +"\u0213" => "r" + +# ɍ [LATIN SMALL LETTER R WITH STROKE] +"\u024D" => "r" + +# ɼ [LATIN SMALL LETTER R WITH LONG LEG] +"\u027C" => "r" + +# ɽ [LATIN SMALL LETTER R WITH TAIL] +"\u027D" => "r" + +# ɾ [LATIN SMALL LETTER R WITH FISHHOOK] +"\u027E" => "r" + +# ɿ [LATIN SMALL LETTER REVERSED R WITH FISHHOOK] +"\u027F" => "r" + +# ᵣ [LATIN SUBSCRIPT SMALL LETTER R] +"\u1D63" => "r" + +# ᵲ [LATIN SMALL LETTER R WITH MIDDLE TILDE] +"\u1D72" => "r" + +# ᵳ [LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE] +"\u1D73" => "r" + +# ᶉ [LATIN SMALL LETTER R WITH PALATAL HOOK] +"\u1D89" => "r" + +# ṙ [LATIN SMALL LETTER R WITH DOT ABOVE] +"\u1E59" => "r" + +# ṛ [LATIN SMALL LETTER R WITH DOT BELOW] +"\u1E5B" => "r" + +# ṝ [LATIN SMALL LETTER R WITH DOT BELOW AND MACRON] +"\u1E5D" => "r" + +# ṟ [LATIN SMALL LETTER R WITH LINE BELOW] +"\u1E5F" => "r" + +# ⓡ [CIRCLED LATIN SMALL LETTER R] +"\u24E1" => "r" + +# ꝛ [LATIN SMALL LETTER R ROTUNDA] +"\uA75B" => "r" + +# ꞃ [LATIN SMALL LETTER INSULAR R] +"\uA783" => "r" + +# r [FULLWIDTH LATIN SMALL LETTER R] +"\uFF52" => "r" + +# ⒭ [PARENTHESIZED LATIN SMALL LETTER R] +"\u24AD" => "(r)" + +# Ś [LATIN CAPITAL LETTER S WITH ACUTE] +"\u015A" => "S" + +# Ŝ [LATIN CAPITAL LETTER S WITH CIRCUMFLEX] +"\u015C" => "S" + +# Ş [LATIN CAPITAL LETTER S WITH CEDILLA] +"\u015E" => "S" + +# Š [LATIN CAPITAL LETTER S WITH CARON] +"\u0160" => "S" + +# Ș [LATIN CAPITAL LETTER S WITH COMMA BELOW] +"\u0218" => "S" + +# Ṡ [LATIN CAPITAL LETTER S WITH DOT ABOVE] +"\u1E60" => "S" + +# Ṣ [LATIN CAPITAL LETTER S WITH DOT BELOW] +"\u1E62" => "S" + +# Ṥ [LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE] +"\u1E64" => "S" + +# Ṧ [LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE] +"\u1E66" => "S" + +# Ṩ [LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE] +"\u1E68" => "S" + +# Ⓢ [CIRCLED LATIN CAPITAL LETTER S] +"\u24C8" => "S" + +# ꜱ [LATIN LETTER SMALL CAPITAL S] +"\uA731" => "S" + +# ꞅ [LATIN SMALL LETTER INSULAR S] +"\uA785" => "S" + +# S [FULLWIDTH LATIN CAPITAL LETTER S] +"\uFF33" => "S" + +# ś [LATIN SMALL LETTER S WITH ACUTE] +"\u015B" => "s" + +# ŝ [LATIN SMALL LETTER S WITH CIRCUMFLEX] +"\u015D" => "s" + +# ş [LATIN SMALL LETTER S WITH CEDILLA] +"\u015F" => "s" + +# š [LATIN SMALL LETTER S WITH CARON] +"\u0161" => "s" + +# ſ http://en.wikipedia.org/wiki/Long_S [LATIN SMALL LETTER LONG S] +"\u017F" => "s" + +# ș [LATIN SMALL LETTER S WITH COMMA BELOW] +"\u0219" => "s" + +# ȿ [LATIN SMALL LETTER S WITH SWASH TAIL] +"\u023F" => "s" + +# ʂ [LATIN SMALL LETTER S WITH HOOK] +"\u0282" => "s" + +# ᵴ [LATIN SMALL LETTER S WITH MIDDLE TILDE] +"\u1D74" => "s" + +# ᶊ [LATIN SMALL LETTER S WITH PALATAL HOOK] +"\u1D8A" => "s" + +# ṡ [LATIN SMALL LETTER S WITH DOT ABOVE] +"\u1E61" => "s" + +# ṣ [LATIN SMALL LETTER S WITH DOT BELOW] +"\u1E63" => "s" + +# ṥ [LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE] +"\u1E65" => "s" + +# ṧ [LATIN SMALL LETTER S WITH CARON AND DOT ABOVE] +"\u1E67" => "s" + +# ṩ [LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE] +"\u1E69" => "s" + +# ẜ [LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE] +"\u1E9C" => "s" + +# ẝ [LATIN SMALL LETTER LONG S WITH HIGH STROKE] +"\u1E9D" => "s" + +# ⓢ [CIRCLED LATIN SMALL LETTER S] +"\u24E2" => "s" + +# Ꞅ [LATIN CAPITAL LETTER INSULAR S] +"\uA784" => "s" + +# s [FULLWIDTH LATIN SMALL LETTER S] +"\uFF53" => "s" + +# ẞ [LATIN CAPITAL LETTER SHARP S] +"\u1E9E" => "SS" + +# ⒮ [PARENTHESIZED LATIN SMALL LETTER S] +"\u24AE" => "(s)" + +# ß [LATIN SMALL LETTER SHARP S] +"\u00DF" => "ss" + +# st [LATIN SMALL LIGATURE ST] +"\uFB06" => "st" + +# Ţ [LATIN CAPITAL LETTER T WITH CEDILLA] +"\u0162" => "T" + +# Ť [LATIN CAPITAL LETTER T WITH CARON] +"\u0164" => "T" + +# Ŧ [LATIN CAPITAL LETTER T WITH STROKE] +"\u0166" => "T" + +# Ƭ [LATIN CAPITAL LETTER T WITH HOOK] +"\u01AC" => "T" + +# Ʈ [LATIN CAPITAL LETTER T WITH RETROFLEX HOOK] +"\u01AE" => "T" + +# Ț [LATIN CAPITAL LETTER T WITH COMMA BELOW] +"\u021A" => "T" + +# Ⱦ [LATIN CAPITAL LETTER T WITH DIAGONAL STROKE] +"\u023E" => "T" + +# ᴛ [LATIN LETTER SMALL CAPITAL T] +"\u1D1B" => "T" + +# Ṫ [LATIN CAPITAL LETTER T WITH DOT ABOVE] +"\u1E6A" => "T" + +# Ṭ [LATIN CAPITAL LETTER T WITH DOT BELOW] +"\u1E6C" => "T" + +# Ṯ [LATIN CAPITAL LETTER T WITH LINE BELOW] +"\u1E6E" => "T" + +# Ṱ [LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW] +"\u1E70" => "T" + +# Ⓣ [CIRCLED LATIN CAPITAL LETTER T] +"\u24C9" => "T" + +# Ꞇ [LATIN CAPITAL LETTER INSULAR T] +"\uA786" => "T" + +# T [FULLWIDTH LATIN CAPITAL LETTER T] +"\uFF34" => "T" + +# ţ [LATIN SMALL LETTER T WITH CEDILLA] +"\u0163" => "t" + +# ť [LATIN SMALL LETTER T WITH CARON] +"\u0165" => "t" + +# ŧ [LATIN SMALL LETTER T WITH STROKE] +"\u0167" => "t" + +# ƫ [LATIN SMALL LETTER T WITH PALATAL HOOK] +"\u01AB" => "t" + +# ƭ [LATIN SMALL LETTER T WITH HOOK] +"\u01AD" => "t" + +# ț [LATIN SMALL LETTER T WITH COMMA BELOW] +"\u021B" => "t" + +# ȶ [LATIN SMALL LETTER T WITH CURL] +"\u0236" => "t" + +# ʇ [LATIN SMALL LETTER TURNED T] +"\u0287" => "t" + +# ʈ [LATIN SMALL LETTER T WITH RETROFLEX HOOK] +"\u0288" => "t" + +# ᵵ [LATIN SMALL LETTER T WITH MIDDLE TILDE] +"\u1D75" => "t" + +# ṫ [LATIN SMALL LETTER T WITH DOT ABOVE] +"\u1E6B" => "t" + +# ṭ [LATIN SMALL LETTER T WITH DOT BELOW] +"\u1E6D" => "t" + +# ṯ [LATIN SMALL LETTER T WITH LINE BELOW] +"\u1E6F" => "t" + +# ṱ [LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW] +"\u1E71" => "t" + +# ẗ [LATIN SMALL LETTER T WITH DIAERESIS] +"\u1E97" => "t" + +# ⓣ [CIRCLED LATIN SMALL LETTER T] +"\u24E3" => "t" + +# ⱦ [LATIN SMALL LETTER T WITH DIAGONAL STROKE] +"\u2C66" => "t" + +# t [FULLWIDTH LATIN SMALL LETTER T] +"\uFF54" => "t" + +# Þ [LATIN CAPITAL LETTER THORN] +"\u00DE" => "TH" + +# Ꝧ [LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER] +"\uA766" => "TH" + +# Ꜩ [LATIN CAPITAL LETTER TZ] +"\uA728" => "TZ" + +# ⒯ [PARENTHESIZED LATIN SMALL LETTER T] +"\u24AF" => "(t)" + +# ʨ [LATIN SMALL LETTER TC DIGRAPH WITH CURL] +"\u02A8" => "tc" + +# þ [LATIN SMALL LETTER THORN] +"\u00FE" => "th" + +# ᵺ [LATIN SMALL LETTER TH WITH STRIKETHROUGH] +"\u1D7A" => "th" + +# ꝧ [LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER] +"\uA767" => "th" + +# ʦ [LATIN SMALL LETTER TS DIGRAPH] +"\u02A6" => "ts" + +# ꜩ [LATIN SMALL LETTER TZ] +"\uA729" => "tz" + +# Ù [LATIN CAPITAL LETTER U WITH GRAVE] +"\u00D9" => "U" + +# Ú [LATIN CAPITAL LETTER U WITH ACUTE] +"\u00DA" => "U" + +# Û [LATIN CAPITAL LETTER U WITH CIRCUMFLEX] +"\u00DB" => "U" + +# Ü [LATIN CAPITAL LETTER U WITH DIAERESIS] +"\u00DC" => "U" + +# Ũ [LATIN CAPITAL LETTER U WITH TILDE] +"\u0168" => "U" + +# Ū [LATIN CAPITAL LETTER U WITH MACRON] +"\u016A" => "U" + +# Ŭ [LATIN CAPITAL LETTER U WITH BREVE] +"\u016C" => "U" + +# Ů [LATIN CAPITAL LETTER U WITH RING ABOVE] +"\u016E" => "U" + +# Ű [LATIN CAPITAL LETTER U WITH DOUBLE ACUTE] +"\u0170" => "U" + +# Ų [LATIN CAPITAL LETTER U WITH OGONEK] +"\u0172" => "U" + +# Ư [LATIN CAPITAL LETTER U WITH HORN] +"\u01AF" => "U" + +# Ǔ [LATIN CAPITAL LETTER U WITH CARON] +"\u01D3" => "U" + +# Ǖ [LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON] +"\u01D5" => "U" + +# Ǘ [LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE] +"\u01D7" => "U" + +# Ǚ [LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON] +"\u01D9" => "U" + +# Ǜ [LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE] +"\u01DB" => "U" + +# Ȕ [LATIN CAPITAL LETTER U WITH DOUBLE GRAVE] +"\u0214" => "U" + +# Ȗ [LATIN CAPITAL LETTER U WITH INVERTED BREVE] +"\u0216" => "U" + +# Ʉ [LATIN CAPITAL LETTER U BAR] +"\u0244" => "U" + +# ᴜ [LATIN LETTER SMALL CAPITAL U] +"\u1D1C" => "U" + +# ᵾ [LATIN SMALL CAPITAL LETTER U WITH STROKE] +"\u1D7E" => "U" + +# Ṳ [LATIN CAPITAL LETTER U WITH DIAERESIS BELOW] +"\u1E72" => "U" + +# Ṵ [LATIN CAPITAL LETTER U WITH TILDE BELOW] +"\u1E74" => "U" + +# Ṷ [LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW] +"\u1E76" => "U" + +# Ṹ [LATIN CAPITAL LETTER U WITH TILDE AND ACUTE] +"\u1E78" => "U" + +# Ṻ [LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS] +"\u1E7A" => "U" + +# Ụ [LATIN CAPITAL LETTER U WITH DOT BELOW] +"\u1EE4" => "U" + +# Ủ [LATIN CAPITAL LETTER U WITH HOOK ABOVE] +"\u1EE6" => "U" + +# Ứ [LATIN CAPITAL LETTER U WITH HORN AND ACUTE] +"\u1EE8" => "U" + +# Ừ [LATIN CAPITAL LETTER U WITH HORN AND GRAVE] +"\u1EEA" => "U" + +# Ử [LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE] +"\u1EEC" => "U" + +# Ữ [LATIN CAPITAL LETTER U WITH HORN AND TILDE] +"\u1EEE" => "U" + +# Ự [LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW] +"\u1EF0" => "U" + +# Ⓤ [CIRCLED LATIN CAPITAL LETTER U] +"\u24CA" => "U" + +# U [FULLWIDTH LATIN CAPITAL LETTER U] +"\uFF35" => "U" + +# ù [LATIN SMALL LETTER U WITH GRAVE] +"\u00F9" => "u" + +# ú [LATIN SMALL LETTER U WITH ACUTE] +"\u00FA" => "u" + +# û [LATIN SMALL LETTER U WITH CIRCUMFLEX] +"\u00FB" => "u" + +# ü [LATIN SMALL LETTER U WITH DIAERESIS] +"\u00FC" => "u" + +# ũ [LATIN SMALL LETTER U WITH TILDE] +"\u0169" => "u" + +# ū [LATIN SMALL LETTER U WITH MACRON] +"\u016B" => "u" + +# ŭ [LATIN SMALL LETTER U WITH BREVE] +"\u016D" => "u" + +# ů [LATIN SMALL LETTER U WITH RING ABOVE] +"\u016F" => "u" + +# ű [LATIN SMALL LETTER U WITH DOUBLE ACUTE] +"\u0171" => "u" + +# ų [LATIN SMALL LETTER U WITH OGONEK] +"\u0173" => "u" + +# ư [LATIN SMALL LETTER U WITH HORN] +"\u01B0" => "u" + +# ǔ [LATIN SMALL LETTER U WITH CARON] +"\u01D4" => "u" + +# ǖ [LATIN SMALL LETTER U WITH DIAERESIS AND MACRON] +"\u01D6" => "u" + +# ǘ [LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE] +"\u01D8" => "u" + +# ǚ [LATIN SMALL LETTER U WITH DIAERESIS AND CARON] +"\u01DA" => "u" + +# ǜ [LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE] +"\u01DC" => "u" + +# ȕ [LATIN SMALL LETTER U WITH DOUBLE GRAVE] +"\u0215" => "u" + +# ȗ [LATIN SMALL LETTER U WITH INVERTED BREVE] +"\u0217" => "u" + +# ʉ [LATIN SMALL LETTER U BAR] +"\u0289" => "u" + +# ᵤ [LATIN SUBSCRIPT SMALL LETTER U] +"\u1D64" => "u" + +# ᶙ [LATIN SMALL LETTER U WITH RETROFLEX HOOK] +"\u1D99" => "u" + +# ṳ [LATIN SMALL LETTER U WITH DIAERESIS BELOW] +"\u1E73" => "u" + +# ṵ [LATIN SMALL LETTER U WITH TILDE BELOW] +"\u1E75" => "u" + +# ṷ [LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW] +"\u1E77" => "u" + +# ṹ [LATIN SMALL LETTER U WITH TILDE AND ACUTE] +"\u1E79" => "u" + +# ṻ [LATIN SMALL LETTER U WITH MACRON AND DIAERESIS] +"\u1E7B" => "u" + +# ụ [LATIN SMALL LETTER U WITH DOT BELOW] +"\u1EE5" => "u" + +# ủ [LATIN SMALL LETTER U WITH HOOK ABOVE] +"\u1EE7" => "u" + +# ứ [LATIN SMALL LETTER U WITH HORN AND ACUTE] +"\u1EE9" => "u" + +# ừ [LATIN SMALL LETTER U WITH HORN AND GRAVE] +"\u1EEB" => "u" + +# ử [LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE] +"\u1EED" => "u" + +# ữ [LATIN SMALL LETTER U WITH HORN AND TILDE] +"\u1EEF" => "u" + +# ự [LATIN SMALL LETTER U WITH HORN AND DOT BELOW] +"\u1EF1" => "u" + +# ⓤ [CIRCLED LATIN SMALL LETTER U] +"\u24E4" => "u" + +# u [FULLWIDTH LATIN SMALL LETTER U] +"\uFF55" => "u" + +# ⒰ [PARENTHESIZED LATIN SMALL LETTER U] +"\u24B0" => "(u)" + +# ᵫ [LATIN SMALL LETTER UE] +"\u1D6B" => "ue" + +# Ʋ [LATIN CAPITAL LETTER V WITH HOOK] +"\u01B2" => "V" + +# Ʌ [LATIN CAPITAL LETTER TURNED V] +"\u0245" => "V" + +# ᴠ [LATIN LETTER SMALL CAPITAL V] +"\u1D20" => "V" + +# Ṽ [LATIN CAPITAL LETTER V WITH TILDE] +"\u1E7C" => "V" + +# Ṿ [LATIN CAPITAL LETTER V WITH DOT BELOW] +"\u1E7E" => "V" + +# Ỽ [LATIN CAPITAL LETTER MIDDLE-WELSH V] +"\u1EFC" => "V" + +# Ⓥ [CIRCLED LATIN CAPITAL LETTER V] +"\u24CB" => "V" + +# Ꝟ [LATIN CAPITAL LETTER V WITH DIAGONAL STROKE] +"\uA75E" => "V" + +# Ꝩ [LATIN CAPITAL LETTER VEND] +"\uA768" => "V" + +# V [FULLWIDTH LATIN CAPITAL LETTER V] +"\uFF36" => "V" + +# ʋ [LATIN SMALL LETTER V WITH HOOK] +"\u028B" => "v" + +# ʌ [LATIN SMALL LETTER TURNED V] +"\u028C" => "v" + +# ᵥ [LATIN SUBSCRIPT SMALL LETTER V] +"\u1D65" => "v" + +# ᶌ [LATIN SMALL LETTER V WITH PALATAL HOOK] +"\u1D8C" => "v" + +# ṽ [LATIN SMALL LETTER V WITH TILDE] +"\u1E7D" => "v" + +# ṿ [LATIN SMALL LETTER V WITH DOT BELOW] +"\u1E7F" => "v" + +# ⓥ [CIRCLED LATIN SMALL LETTER V] +"\u24E5" => "v" + +# ⱱ [LATIN SMALL LETTER V WITH RIGHT HOOK] +"\u2C71" => "v" + +# ⱴ [LATIN SMALL LETTER V WITH CURL] +"\u2C74" => "v" + +# ꝟ [LATIN SMALL LETTER V WITH DIAGONAL STROKE] +"\uA75F" => "v" + +# v [FULLWIDTH LATIN SMALL LETTER V] +"\uFF56" => "v" + +# Ꝡ [LATIN CAPITAL LETTER VY] +"\uA760" => "VY" + +# ⒱ [PARENTHESIZED LATIN SMALL LETTER V] +"\u24B1" => "(v)" + +# ꝡ [LATIN SMALL LETTER VY] +"\uA761" => "vy" + +# Ŵ [LATIN CAPITAL LETTER W WITH CIRCUMFLEX] +"\u0174" => "W" + +# Ƿ http://en.wikipedia.org/wiki/Wynn [LATIN CAPITAL LETTER WYNN] +"\u01F7" => "W" + +# ᴡ [LATIN LETTER SMALL CAPITAL W] +"\u1D21" => "W" + +# Ẁ [LATIN CAPITAL LETTER W WITH GRAVE] +"\u1E80" => "W" + +# Ẃ [LATIN CAPITAL LETTER W WITH ACUTE] +"\u1E82" => "W" + +# Ẅ [LATIN CAPITAL LETTER W WITH DIAERESIS] +"\u1E84" => "W" + +# Ẇ [LATIN CAPITAL LETTER W WITH DOT ABOVE] +"\u1E86" => "W" + +# Ẉ [LATIN CAPITAL LETTER W WITH DOT BELOW] +"\u1E88" => "W" + +# Ⓦ [CIRCLED LATIN CAPITAL LETTER W] +"\u24CC" => "W" + +# Ⱳ [LATIN CAPITAL LETTER W WITH HOOK] +"\u2C72" => "W" + +# W [FULLWIDTH LATIN CAPITAL LETTER W] +"\uFF37" => "W" + +# ŵ [LATIN SMALL LETTER W WITH CIRCUMFLEX] +"\u0175" => "w" + +# ƿ http://en.wikipedia.org/wiki/Wynn [LATIN LETTER WYNN] +"\u01BF" => "w" + +# ʍ [LATIN SMALL LETTER TURNED W] +"\u028D" => "w" + +# ẁ [LATIN SMALL LETTER W WITH GRAVE] +"\u1E81" => "w" + +# ẃ [LATIN SMALL LETTER W WITH ACUTE] +"\u1E83" => "w" + +# ẅ [LATIN SMALL LETTER W WITH DIAERESIS] +"\u1E85" => "w" + +# ẇ [LATIN SMALL LETTER W WITH DOT ABOVE] +"\u1E87" => "w" + +# ẉ [LATIN SMALL LETTER W WITH DOT BELOW] +"\u1E89" => "w" + +# ẘ [LATIN SMALL LETTER W WITH RING ABOVE] +"\u1E98" => "w" + +# ⓦ [CIRCLED LATIN SMALL LETTER W] +"\u24E6" => "w" + +# ⱳ [LATIN SMALL LETTER W WITH HOOK] +"\u2C73" => "w" + +# w [FULLWIDTH LATIN SMALL LETTER W] +"\uFF57" => "w" + +# ⒲ [PARENTHESIZED LATIN SMALL LETTER W] +"\u24B2" => "(w)" + +# Ẋ [LATIN CAPITAL LETTER X WITH DOT ABOVE] +"\u1E8A" => "X" + +# Ẍ [LATIN CAPITAL LETTER X WITH DIAERESIS] +"\u1E8C" => "X" + +# Ⓧ [CIRCLED LATIN CAPITAL LETTER X] +"\u24CD" => "X" + +# X [FULLWIDTH LATIN CAPITAL LETTER X] +"\uFF38" => "X" + +# ᶍ [LATIN SMALL LETTER X WITH PALATAL HOOK] +"\u1D8D" => "x" + +# ẋ [LATIN SMALL LETTER X WITH DOT ABOVE] +"\u1E8B" => "x" + +# ẍ [LATIN SMALL LETTER X WITH DIAERESIS] +"\u1E8D" => "x" + +# ₓ [LATIN SUBSCRIPT SMALL LETTER X] +"\u2093" => "x" + +# ⓧ [CIRCLED LATIN SMALL LETTER X] +"\u24E7" => "x" + +# x [FULLWIDTH LATIN SMALL LETTER X] +"\uFF58" => "x" + +# ⒳ [PARENTHESIZED LATIN SMALL LETTER X] +"\u24B3" => "(x)" + +# Ý [LATIN CAPITAL LETTER Y WITH ACUTE] +"\u00DD" => "Y" + +# Ŷ [LATIN CAPITAL LETTER Y WITH CIRCUMFLEX] +"\u0176" => "Y" + +# Ÿ [LATIN CAPITAL LETTER Y WITH DIAERESIS] +"\u0178" => "Y" + +# Ƴ [LATIN CAPITAL LETTER Y WITH HOOK] +"\u01B3" => "Y" + +# Ȳ [LATIN CAPITAL LETTER Y WITH MACRON] +"\u0232" => "Y" + +# Ɏ [LATIN CAPITAL LETTER Y WITH STROKE] +"\u024E" => "Y" + +# ʏ [LATIN LETTER SMALL CAPITAL Y] +"\u028F" => "Y" + +# Ẏ [LATIN CAPITAL LETTER Y WITH DOT ABOVE] +"\u1E8E" => "Y" + +# Ỳ [LATIN CAPITAL LETTER Y WITH GRAVE] +"\u1EF2" => "Y" + +# Ỵ [LATIN CAPITAL LETTER Y WITH DOT BELOW] +"\u1EF4" => "Y" + +# Ỷ [LATIN CAPITAL LETTER Y WITH HOOK ABOVE] +"\u1EF6" => "Y" + +# Ỹ [LATIN CAPITAL LETTER Y WITH TILDE] +"\u1EF8" => "Y" + +# Ỿ [LATIN CAPITAL LETTER Y WITH LOOP] +"\u1EFE" => "Y" + +# Ⓨ [CIRCLED LATIN CAPITAL LETTER Y] +"\u24CE" => "Y" + +# Y [FULLWIDTH LATIN CAPITAL LETTER Y] +"\uFF39" => "Y" + +# ý [LATIN SMALL LETTER Y WITH ACUTE] +"\u00FD" => "y" + +# ÿ [LATIN SMALL LETTER Y WITH DIAERESIS] +"\u00FF" => "y" + +# ŷ [LATIN SMALL LETTER Y WITH CIRCUMFLEX] +"\u0177" => "y" + +# ƴ [LATIN SMALL LETTER Y WITH HOOK] +"\u01B4" => "y" + +# ȳ [LATIN SMALL LETTER Y WITH MACRON] +"\u0233" => "y" + +# ɏ [LATIN SMALL LETTER Y WITH STROKE] +"\u024F" => "y" + +# ʎ [LATIN SMALL LETTER TURNED Y] +"\u028E" => "y" + +# ẏ [LATIN SMALL LETTER Y WITH DOT ABOVE] +"\u1E8F" => "y" + +# ẙ [LATIN SMALL LETTER Y WITH RING ABOVE] +"\u1E99" => "y" + +# ỳ [LATIN SMALL LETTER Y WITH GRAVE] +"\u1EF3" => "y" + +# ỵ [LATIN SMALL LETTER Y WITH DOT BELOW] +"\u1EF5" => "y" + +# ỷ [LATIN SMALL LETTER Y WITH HOOK ABOVE] +"\u1EF7" => "y" + +# ỹ [LATIN SMALL LETTER Y WITH TILDE] +"\u1EF9" => "y" + +# ỿ [LATIN SMALL LETTER Y WITH LOOP] +"\u1EFF" => "y" + +# ⓨ [CIRCLED LATIN SMALL LETTER Y] +"\u24E8" => "y" + +# y [FULLWIDTH LATIN SMALL LETTER Y] +"\uFF59" => "y" + +# ⒴ [PARENTHESIZED LATIN SMALL LETTER Y] +"\u24B4" => "(y)" + +# Ź [LATIN CAPITAL LETTER Z WITH ACUTE] +"\u0179" => "Z" + +# Ż [LATIN CAPITAL LETTER Z WITH DOT ABOVE] +"\u017B" => "Z" + +# Ž [LATIN CAPITAL LETTER Z WITH CARON] +"\u017D" => "Z" + +# Ƶ [LATIN CAPITAL LETTER Z WITH STROKE] +"\u01B5" => "Z" + +# Ȝ http://en.wikipedia.org/wiki/Yogh [LATIN CAPITAL LETTER YOGH] +"\u021C" => "Z" + +# Ȥ [LATIN CAPITAL LETTER Z WITH HOOK] +"\u0224" => "Z" + +# ᴢ [LATIN LETTER SMALL CAPITAL Z] +"\u1D22" => "Z" + +# Ẑ [LATIN CAPITAL LETTER Z WITH CIRCUMFLEX] +"\u1E90" => "Z" + +# Ẓ [LATIN CAPITAL LETTER Z WITH DOT BELOW] +"\u1E92" => "Z" + +# Ẕ [LATIN CAPITAL LETTER Z WITH LINE BELOW] +"\u1E94" => "Z" + +# Ⓩ [CIRCLED LATIN CAPITAL LETTER Z] +"\u24CF" => "Z" + +# Ⱬ [LATIN CAPITAL LETTER Z WITH DESCENDER] +"\u2C6B" => "Z" + +# Ꝣ [LATIN CAPITAL LETTER VISIGOTHIC Z] +"\uA762" => "Z" + +# Z [FULLWIDTH LATIN CAPITAL LETTER Z] +"\uFF3A" => "Z" + +# ź [LATIN SMALL LETTER Z WITH ACUTE] +"\u017A" => "z" + +# ż [LATIN SMALL LETTER Z WITH DOT ABOVE] +"\u017C" => "z" + +# ž [LATIN SMALL LETTER Z WITH CARON] +"\u017E" => "z" + +# ƶ [LATIN SMALL LETTER Z WITH STROKE] +"\u01B6" => "z" + +# ȝ http://en.wikipedia.org/wiki/Yogh [LATIN SMALL LETTER YOGH] +"\u021D" => "z" + +# ȥ [LATIN SMALL LETTER Z WITH HOOK] +"\u0225" => "z" + +# ɀ [LATIN SMALL LETTER Z WITH SWASH TAIL] +"\u0240" => "z" + +# ʐ [LATIN SMALL LETTER Z WITH RETROFLEX HOOK] +"\u0290" => "z" + +# ʑ [LATIN SMALL LETTER Z WITH CURL] +"\u0291" => "z" + +# ᵶ [LATIN SMALL LETTER Z WITH MIDDLE TILDE] +"\u1D76" => "z" + +# ᶎ [LATIN SMALL LETTER Z WITH PALATAL HOOK] +"\u1D8E" => "z" + +# ẑ [LATIN SMALL LETTER Z WITH CIRCUMFLEX] +"\u1E91" => "z" + +# ẓ [LATIN SMALL LETTER Z WITH DOT BELOW] +"\u1E93" => "z" + +# ẕ [LATIN SMALL LETTER Z WITH LINE BELOW] +"\u1E95" => "z" + +# ⓩ [CIRCLED LATIN SMALL LETTER Z] +"\u24E9" => "z" + +# ⱬ [LATIN SMALL LETTER Z WITH DESCENDER] +"\u2C6C" => "z" + +# ꝣ [LATIN SMALL LETTER VISIGOTHIC Z] +"\uA763" => "z" + +# z [FULLWIDTH LATIN SMALL LETTER Z] +"\uFF5A" => "z" + +# ⒵ [PARENTHESIZED LATIN SMALL LETTER Z] +"\u24B5" => "(z)" + +# ⁰ [SUPERSCRIPT ZERO] +"\u2070" => "0" + +# ₀ [SUBSCRIPT ZERO] +"\u2080" => "0" + +# ⓪ [CIRCLED DIGIT ZERO] +"\u24EA" => "0" + +# ⓿ [NEGATIVE CIRCLED DIGIT ZERO] +"\u24FF" => "0" + +# 0 [FULLWIDTH DIGIT ZERO] +"\uFF10" => "0" + +# ¹ [SUPERSCRIPT ONE] +"\u00B9" => "1" + +# ₁ [SUBSCRIPT ONE] +"\u2081" => "1" + +# ① [CIRCLED DIGIT ONE] +"\u2460" => "1" + +# ⓵ [DOUBLE CIRCLED DIGIT ONE] +"\u24F5" => "1" + +# ❶ [DINGBAT NEGATIVE CIRCLED DIGIT ONE] +"\u2776" => "1" + +# ➀ [DINGBAT CIRCLED SANS-SERIF DIGIT ONE] +"\u2780" => "1" + +# ➊ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE] +"\u278A" => "1" + +# 1 [FULLWIDTH DIGIT ONE] +"\uFF11" => "1" + +# ⒈ [DIGIT ONE FULL STOP] +"\u2488" => "1." + +# ⑴ [PARENTHESIZED DIGIT ONE] +"\u2474" => "(1)" + +# ² [SUPERSCRIPT TWO] +"\u00B2" => "2" + +# ₂ [SUBSCRIPT TWO] +"\u2082" => "2" + +# ② [CIRCLED DIGIT TWO] +"\u2461" => "2" + +# ⓶ [DOUBLE CIRCLED DIGIT TWO] +"\u24F6" => "2" + +# ❷ [DINGBAT NEGATIVE CIRCLED DIGIT TWO] +"\u2777" => "2" + +# ➁ [DINGBAT CIRCLED SANS-SERIF DIGIT TWO] +"\u2781" => "2" + +# ➋ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO] +"\u278B" => "2" + +# 2 [FULLWIDTH DIGIT TWO] +"\uFF12" => "2" + +# ⒉ [DIGIT TWO FULL STOP] +"\u2489" => "2." + +# ⑵ [PARENTHESIZED DIGIT TWO] +"\u2475" => "(2)" + +# ³ [SUPERSCRIPT THREE] +"\u00B3" => "3" + +# ₃ [SUBSCRIPT THREE] +"\u2083" => "3" + +# ③ [CIRCLED DIGIT THREE] +"\u2462" => "3" + +# ⓷ [DOUBLE CIRCLED DIGIT THREE] +"\u24F7" => "3" + +# ❸ [DINGBAT NEGATIVE CIRCLED DIGIT THREE] +"\u2778" => "3" + +# ➂ [DINGBAT CIRCLED SANS-SERIF DIGIT THREE] +"\u2782" => "3" + +# ➌ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE] +"\u278C" => "3" + +# 3 [FULLWIDTH DIGIT THREE] +"\uFF13" => "3" + +# ⒊ [DIGIT THREE FULL STOP] +"\u248A" => "3." + +# ⑶ [PARENTHESIZED DIGIT THREE] +"\u2476" => "(3)" + +# ⁴ [SUPERSCRIPT FOUR] +"\u2074" => "4" + +# ₄ [SUBSCRIPT FOUR] +"\u2084" => "4" + +# ④ [CIRCLED DIGIT FOUR] +"\u2463" => "4" + +# ⓸ [DOUBLE CIRCLED DIGIT FOUR] +"\u24F8" => "4" + +# ❹ [DINGBAT NEGATIVE CIRCLED DIGIT FOUR] +"\u2779" => "4" + +# ➃ [DINGBAT CIRCLED SANS-SERIF DIGIT FOUR] +"\u2783" => "4" + +# ➍ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR] +"\u278D" => "4" + +# 4 [FULLWIDTH DIGIT FOUR] +"\uFF14" => "4" + +# ⒋ [DIGIT FOUR FULL STOP] +"\u248B" => "4." + +# ⑷ [PARENTHESIZED DIGIT FOUR] +"\u2477" => "(4)" + +# ⁵ [SUPERSCRIPT FIVE] +"\u2075" => "5" + +# ₅ [SUBSCRIPT FIVE] +"\u2085" => "5" + +# ⑤ [CIRCLED DIGIT FIVE] +"\u2464" => "5" + +# ⓹ [DOUBLE CIRCLED DIGIT FIVE] +"\u24F9" => "5" + +# ❺ [DINGBAT NEGATIVE CIRCLED DIGIT FIVE] +"\u277A" => "5" + +# ➄ [DINGBAT CIRCLED SANS-SERIF DIGIT FIVE] +"\u2784" => "5" + +# ➎ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE] +"\u278E" => "5" + +# 5 [FULLWIDTH DIGIT FIVE] +"\uFF15" => "5" + +# ⒌ [DIGIT FIVE FULL STOP] +"\u248C" => "5." + +# ⑸ [PARENTHESIZED DIGIT FIVE] +"\u2478" => "(5)" + +# ⁶ [SUPERSCRIPT SIX] +"\u2076" => "6" + +# ₆ [SUBSCRIPT SIX] +"\u2086" => "6" + +# ⑥ [CIRCLED DIGIT SIX] +"\u2465" => "6" + +# ⓺ [DOUBLE CIRCLED DIGIT SIX] +"\u24FA" => "6" + +# ❻ [DINGBAT NEGATIVE CIRCLED DIGIT SIX] +"\u277B" => "6" + +# ➅ [DINGBAT CIRCLED SANS-SERIF DIGIT SIX] +"\u2785" => "6" + +# ➏ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX] +"\u278F" => "6" + +# 6 [FULLWIDTH DIGIT SIX] +"\uFF16" => "6" + +# ⒍ [DIGIT SIX FULL STOP] +"\u248D" => "6." + +# ⑹ [PARENTHESIZED DIGIT SIX] +"\u2479" => "(6)" + +# ⁷ [SUPERSCRIPT SEVEN] +"\u2077" => "7" + +# ₇ [SUBSCRIPT SEVEN] +"\u2087" => "7" + +# ⑦ [CIRCLED DIGIT SEVEN] +"\u2466" => "7" + +# ⓻ [DOUBLE CIRCLED DIGIT SEVEN] +"\u24FB" => "7" + +# ❼ [DINGBAT NEGATIVE CIRCLED DIGIT SEVEN] +"\u277C" => "7" + +# ➆ [DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN] +"\u2786" => "7" + +# ➐ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN] +"\u2790" => "7" + +# 7 [FULLWIDTH DIGIT SEVEN] +"\uFF17" => "7" + +# ⒎ [DIGIT SEVEN FULL STOP] +"\u248E" => "7." + +# ⑺ [PARENTHESIZED DIGIT SEVEN] +"\u247A" => "(7)" + +# ⁸ [SUPERSCRIPT EIGHT] +"\u2078" => "8" + +# ₈ [SUBSCRIPT EIGHT] +"\u2088" => "8" + +# ⑧ [CIRCLED DIGIT EIGHT] +"\u2467" => "8" + +# ⓼ [DOUBLE CIRCLED DIGIT EIGHT] +"\u24FC" => "8" + +# ❽ [DINGBAT NEGATIVE CIRCLED DIGIT EIGHT] +"\u277D" => "8" + +# ➇ [DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT] +"\u2787" => "8" + +# ➑ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT] +"\u2791" => "8" + +# 8 [FULLWIDTH DIGIT EIGHT] +"\uFF18" => "8" + +# ⒏ [DIGIT EIGHT FULL STOP] +"\u248F" => "8." + +# ⑻ [PARENTHESIZED DIGIT EIGHT] +"\u247B" => "(8)" + +# ⁹ [SUPERSCRIPT NINE] +"\u2079" => "9" + +# ₉ [SUBSCRIPT NINE] +"\u2089" => "9" + +# ⑨ [CIRCLED DIGIT NINE] +"\u2468" => "9" + +# ⓽ [DOUBLE CIRCLED DIGIT NINE] +"\u24FD" => "9" + +# ❾ [DINGBAT NEGATIVE CIRCLED DIGIT NINE] +"\u277E" => "9" + +# ➈ [DINGBAT CIRCLED SANS-SERIF DIGIT NINE] +"\u2788" => "9" + +# ➒ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE] +"\u2792" => "9" + +# 9 [FULLWIDTH DIGIT NINE] +"\uFF19" => "9" + +# ⒐ [DIGIT NINE FULL STOP] +"\u2490" => "9." + +# ⑼ [PARENTHESIZED DIGIT NINE] +"\u247C" => "(9)" + +# ⑩ [CIRCLED NUMBER TEN] +"\u2469" => "10" + +# ⓾ [DOUBLE CIRCLED NUMBER TEN] +"\u24FE" => "10" + +# ❿ [DINGBAT NEGATIVE CIRCLED NUMBER TEN] +"\u277F" => "10" + +# ➉ [DINGBAT CIRCLED SANS-SERIF NUMBER TEN] +"\u2789" => "10" + +# ➓ [DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN] +"\u2793" => "10" + +# ⒑ [NUMBER TEN FULL STOP] +"\u2491" => "10." + +# ⑽ [PARENTHESIZED NUMBER TEN] +"\u247D" => "(10)" + +# ⑪ [CIRCLED NUMBER ELEVEN] +"\u246A" => "11" + +# ⓫ [NEGATIVE CIRCLED NUMBER ELEVEN] +"\u24EB" => "11" + +# ⒒ [NUMBER ELEVEN FULL STOP] +"\u2492" => "11." + +# ⑾ [PARENTHESIZED NUMBER ELEVEN] +"\u247E" => "(11)" + +# ⑫ [CIRCLED NUMBER TWELVE] +"\u246B" => "12" + +# ⓬ [NEGATIVE CIRCLED NUMBER TWELVE] +"\u24EC" => "12" + +# ⒓ [NUMBER TWELVE FULL STOP] +"\u2493" => "12." + +# ⑿ [PARENTHESIZED NUMBER TWELVE] +"\u247F" => "(12)" + +# ⑬ [CIRCLED NUMBER THIRTEEN] +"\u246C" => "13" + +# ⓭ [NEGATIVE CIRCLED NUMBER THIRTEEN] +"\u24ED" => "13" + +# ⒔ [NUMBER THIRTEEN FULL STOP] +"\u2494" => "13." + +# ⒀ [PARENTHESIZED NUMBER THIRTEEN] +"\u2480" => "(13)" + +# ⑭ [CIRCLED NUMBER FOURTEEN] +"\u246D" => "14" + +# ⓮ [NEGATIVE CIRCLED NUMBER FOURTEEN] +"\u24EE" => "14" + +# ⒕ [NUMBER FOURTEEN FULL STOP] +"\u2495" => "14." + +# ⒁ [PARENTHESIZED NUMBER FOURTEEN] +"\u2481" => "(14)" + +# ⑮ [CIRCLED NUMBER FIFTEEN] +"\u246E" => "15" + +# ⓯ [NEGATIVE CIRCLED NUMBER FIFTEEN] +"\u24EF" => "15" + +# ⒖ [NUMBER FIFTEEN FULL STOP] +"\u2496" => "15." + +# ⒂ [PARENTHESIZED NUMBER FIFTEEN] +"\u2482" => "(15)" + +# ⑯ [CIRCLED NUMBER SIXTEEN] +"\u246F" => "16" + +# ⓰ [NEGATIVE CIRCLED NUMBER SIXTEEN] +"\u24F0" => "16" + +# ⒗ [NUMBER SIXTEEN FULL STOP] +"\u2497" => "16." + +# ⒃ [PARENTHESIZED NUMBER SIXTEEN] +"\u2483" => "(16)" + +# ⑰ [CIRCLED NUMBER SEVENTEEN] +"\u2470" => "17" + +# ⓱ [NEGATIVE CIRCLED NUMBER SEVENTEEN] +"\u24F1" => "17" + +# ⒘ [NUMBER SEVENTEEN FULL STOP] +"\u2498" => "17." + +# ⒄ [PARENTHESIZED NUMBER SEVENTEEN] +"\u2484" => "(17)" + +# ⑱ [CIRCLED NUMBER EIGHTEEN] +"\u2471" => "18" + +# ⓲ [NEGATIVE CIRCLED NUMBER EIGHTEEN] +"\u24F2" => "18" + +# ⒙ [NUMBER EIGHTEEN FULL STOP] +"\u2499" => "18." + +# ⒅ [PARENTHESIZED NUMBER EIGHTEEN] +"\u2485" => "(18)" + +# ⑲ [CIRCLED NUMBER NINETEEN] +"\u2472" => "19" + +# ⓳ [NEGATIVE CIRCLED NUMBER NINETEEN] +"\u24F3" => "19" + +# ⒚ [NUMBER NINETEEN FULL STOP] +"\u249A" => "19." + +# ⒆ [PARENTHESIZED NUMBER NINETEEN] +"\u2486" => "(19)" + +# ⑳ [CIRCLED NUMBER TWENTY] +"\u2473" => "20" + +# ⓴ [NEGATIVE CIRCLED NUMBER TWENTY] +"\u24F4" => "20" + +# ⒛ [NUMBER TWENTY FULL STOP] +"\u249B" => "20." + +# ⒇ [PARENTHESIZED NUMBER TWENTY] +"\u2487" => "(20)" + +# « [LEFT-POINTING DOUBLE ANGLE QUOTATION MARK] +"\u00AB" => "\"" + +# » [RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK] +"\u00BB" => "\"" + +# “ [LEFT DOUBLE QUOTATION MARK] +"\u201C" => "\"" + +# ” [RIGHT DOUBLE QUOTATION MARK] +"\u201D" => "\"" + +# „ [DOUBLE LOW-9 QUOTATION MARK] +"\u201E" => "\"" + +# ″ [DOUBLE PRIME] +"\u2033" => "\"" + +# ‶ [REVERSED DOUBLE PRIME] +"\u2036" => "\"" + +# ❝ [HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT] +"\u275D" => "\"" + +# ❞ [HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT] +"\u275E" => "\"" + +# ❮ [HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT] +"\u276E" => "\"" + +# ❯ [HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT] +"\u276F" => "\"" + +# " [FULLWIDTH QUOTATION MARK] +"\uFF02" => "\"" + +# ‘ [LEFT SINGLE QUOTATION MARK] +"\u2018" => "\'" + +# ’ [RIGHT SINGLE QUOTATION MARK] +"\u2019" => "\'" + +# ‚ [SINGLE LOW-9 QUOTATION MARK] +"\u201A" => "\'" + +# ‛ [SINGLE HIGH-REVERSED-9 QUOTATION MARK] +"\u201B" => "\'" + +# ′ [PRIME] +"\u2032" => "\'" + +# ‵ [REVERSED PRIME] +"\u2035" => "\'" + +# ‹ [SINGLE LEFT-POINTING ANGLE QUOTATION MARK] +"\u2039" => "\'" + +# › [SINGLE RIGHT-POINTING ANGLE QUOTATION MARK] +"\u203A" => "\'" + +# ❛ [HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT] +"\u275B" => "\'" + +# ❜ [HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT] +"\u275C" => "\'" + +# ' [FULLWIDTH APOSTROPHE] +"\uFF07" => "\'" + +# ‐ [HYPHEN] +"\u2010" => "-" + +# ‑ [NON-BREAKING HYPHEN] +"\u2011" => "-" + +# ‒ [FIGURE DASH] +"\u2012" => "-" + +# – [EN DASH] +"\u2013" => "-" + +# — [EM DASH] +"\u2014" => "-" + +# ⁻ [SUPERSCRIPT MINUS] +"\u207B" => "-" + +# ₋ [SUBSCRIPT MINUS] +"\u208B" => "-" + +# - [FULLWIDTH HYPHEN-MINUS] +"\uFF0D" => "-" + +# ⁅ [LEFT SQUARE BRACKET WITH QUILL] +"\u2045" => "[" + +# ❲ [LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT] +"\u2772" => "[" + +# [ [FULLWIDTH LEFT SQUARE BRACKET] +"\uFF3B" => "[" + +# ⁆ [RIGHT SQUARE BRACKET WITH QUILL] +"\u2046" => "]" + +# ❳ [LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT] +"\u2773" => "]" + +# ] [FULLWIDTH RIGHT SQUARE BRACKET] +"\uFF3D" => "]" + +# ⁽ [SUPERSCRIPT LEFT PARENTHESIS] +"\u207D" => "(" + +# ₍ [SUBSCRIPT LEFT PARENTHESIS] +"\u208D" => "(" + +# ❨ [MEDIUM LEFT PARENTHESIS ORNAMENT] +"\u2768" => "(" + +# ❪ [MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT] +"\u276A" => "(" + +# ( [FULLWIDTH LEFT PARENTHESIS] +"\uFF08" => "(" + +# ⸨ [LEFT DOUBLE PARENTHESIS] +"\u2E28" => "((" + +# ⁾ [SUPERSCRIPT RIGHT PARENTHESIS] +"\u207E" => ")" + +# ₎ [SUBSCRIPT RIGHT PARENTHESIS] +"\u208E" => ")" + +# ❩ [MEDIUM RIGHT PARENTHESIS ORNAMENT] +"\u2769" => ")" + +# ❫ [MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT] +"\u276B" => ")" + +# ) [FULLWIDTH RIGHT PARENTHESIS] +"\uFF09" => ")" + +# ⸩ [RIGHT DOUBLE PARENTHESIS] +"\u2E29" => "))" + +# ❬ [MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT] +"\u276C" => "<" + +# ❰ [HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT] +"\u2770" => "<" + +# < [FULLWIDTH LESS-THAN SIGN] +"\uFF1C" => "<" + +# ❭ [MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT] +"\u276D" => ">" + +# ❱ [HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT] +"\u2771" => ">" + +# > [FULLWIDTH GREATER-THAN SIGN] +"\uFF1E" => ">" + +# ❴ [MEDIUM LEFT CURLY BRACKET ORNAMENT] +"\u2774" => "{" + +# { [FULLWIDTH LEFT CURLY BRACKET] +"\uFF5B" => "{" + +# ❵ [MEDIUM RIGHT CURLY BRACKET ORNAMENT] +"\u2775" => "}" + +# } [FULLWIDTH RIGHT CURLY BRACKET] +"\uFF5D" => "}" + +# ⁺ [SUPERSCRIPT PLUS SIGN] +"\u207A" => "+" + +# ₊ [SUBSCRIPT PLUS SIGN] +"\u208A" => "+" + +# + [FULLWIDTH PLUS SIGN] +"\uFF0B" => "+" + +# ⁼ [SUPERSCRIPT EQUALS SIGN] +"\u207C" => "=" + +# ₌ [SUBSCRIPT EQUALS SIGN] +"\u208C" => "=" + +# = [FULLWIDTH EQUALS SIGN] +"\uFF1D" => "=" + +# ! [FULLWIDTH EXCLAMATION MARK] +"\uFF01" => "!" + +# ‼ [DOUBLE EXCLAMATION MARK] +"\u203C" => "!!" + +# ⁉ [EXCLAMATION QUESTION MARK] +"\u2049" => "!?" + +# # [FULLWIDTH NUMBER SIGN] +"\uFF03" => "#" + +# $ [FULLWIDTH DOLLAR SIGN] +"\uFF04" => "$" + +# ⁒ [COMMERCIAL MINUS SIGN] +"\u2052" => "%" + +# % [FULLWIDTH PERCENT SIGN] +"\uFF05" => "%" + +# & [FULLWIDTH AMPERSAND] +"\uFF06" => "&" + +# ⁎ [LOW ASTERISK] +"\u204E" => "*" + +# * [FULLWIDTH ASTERISK] +"\uFF0A" => "*" + +# , [FULLWIDTH COMMA] +"\uFF0C" => "," + +# . [FULLWIDTH FULL STOP] +"\uFF0E" => "." + +# ⁄ [FRACTION SLASH] +"\u2044" => "/" + +# / [FULLWIDTH SOLIDUS] +"\uFF0F" => "/" + +# : [FULLWIDTH COLON] +"\uFF1A" => ":" + +# ⁏ [REVERSED SEMICOLON] +"\u204F" => ";" + +# ; [FULLWIDTH SEMICOLON] +"\uFF1B" => ";" + +# ? [FULLWIDTH QUESTION MARK] +"\uFF1F" => "?" + +# ⁇ [DOUBLE QUESTION MARK] +"\u2047" => "??" + +# ⁈ [QUESTION EXCLAMATION MARK] +"\u2048" => "?!" + +# @ [FULLWIDTH COMMERCIAL AT] +"\uFF20" => "@" + +# \ [FULLWIDTH REVERSE SOLIDUS] +"\uFF3C" => "\\" + +# ‸ [CARET] +"\u2038" => "^" + +# ^ [FULLWIDTH CIRCUMFLEX ACCENT] +"\uFF3E" => "^" + +# _ [FULLWIDTH LOW LINE] +"\uFF3F" => "_" + +# ⁓ [SWUNG DASH] +"\u2053" => "~" + +# ~ [FULLWIDTH TILDE] +"\uFF5E" => "~" + +################################################################ +# Below is the Perl script used to generate the above mappings # +# from ASCIIFoldingFilter.java: # +################################################################ +# +# #!/usr/bin/perl +# +# use warnings; +# use strict; +# +# my @source_chars = (); +# my @source_char_descriptions = (); +# my $target = ''; +# +# while (<>) { +# if (/case\s+'(\\u[A-F0-9]+)':\s*\/\/\s*(.*)/i) { +# push @source_chars, $1; +# push @source_char_descriptions, $2; +# next; +# } +# if (/output\[[^\]]+\]\s*=\s*'(\\'|\\\\|.)'/) { +# $target .= $1; +# next; +# } +# if (/break;/) { +# $target = "\\\"" if ($target eq '"'); +# for my $source_char_num (0..$#source_chars) { +# print "# $source_char_descriptions[$source_char_num]\n"; +# print "\"$source_chars[$source_char_num]\" => \"$target\"\n\n"; +# } +# @source_chars = (); +# @source_char_descriptions = (); +# $target = ''; +# } +# } diff --git a/molecule/default/templates/collections/sample_techproducts_configs/mapping-ISOLatin1Accent.txt b/molecule/default/templates/collections/sample_techproducts_configs/mapping-ISOLatin1Accent.txt new file mode 100755 index 0000000..ede7742 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/mapping-ISOLatin1Accent.txt @@ -0,0 +1,246 @@ +# The ASF licenses this file to You 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. + +# Syntax: +# "source" => "target" +# "source".length() > 0 (source cannot be empty.) +# "target".length() >= 0 (target can be empty.) + +# example: +# "À" => "A" +# "\u00C0" => "A" +# "\u00C0" => "\u0041" +# "ß" => "ss" +# "\t" => " " +# "\n" => "" + +# À => A +"\u00C0" => "A" + +# Á => A +"\u00C1" => "A" + +#  => A +"\u00C2" => "A" + +# à => A +"\u00C3" => "A" + +# Ä => A +"\u00C4" => "A" + +# Å => A +"\u00C5" => "A" + +# Æ => AE +"\u00C6" => "AE" + +# Ç => C +"\u00C7" => "C" + +# È => E +"\u00C8" => "E" + +# É => E +"\u00C9" => "E" + +# Ê => E +"\u00CA" => "E" + +# Ë => E +"\u00CB" => "E" + +# Ì => I +"\u00CC" => "I" + +# Í => I +"\u00CD" => "I" + +# Î => I +"\u00CE" => "I" + +# Ï => I +"\u00CF" => "I" + +# IJ => IJ +"\u0132" => "IJ" + +# Ð => D +"\u00D0" => "D" + +# Ñ => N +"\u00D1" => "N" + +# Ò => O +"\u00D2" => "O" + +# Ó => O +"\u00D3" => "O" + +# Ô => O +"\u00D4" => "O" + +# Õ => O +"\u00D5" => "O" + +# Ö => O +"\u00D6" => "O" + +# Ø => O +"\u00D8" => "O" + +# Œ => OE +"\u0152" => "OE" + +# Þ +"\u00DE" => "TH" + +# Ù => U +"\u00D9" => "U" + +# Ú => U +"\u00DA" => "U" + +# Û => U +"\u00DB" => "U" + +# Ü => U +"\u00DC" => "U" + +# Ý => Y +"\u00DD" => "Y" + +# Ÿ => Y +"\u0178" => "Y" + +# à => a +"\u00E0" => "a" + +# á => a +"\u00E1" => "a" + +# â => a +"\u00E2" => "a" + +# ã => a +"\u00E3" => "a" + +# ä => a +"\u00E4" => "a" + +# å => a +"\u00E5" => "a" + +# æ => ae +"\u00E6" => "ae" + +# ç => c +"\u00E7" => "c" + +# è => e +"\u00E8" => "e" + +# é => e +"\u00E9" => "e" + +# ê => e +"\u00EA" => "e" + +# ë => e +"\u00EB" => "e" + +# ì => i +"\u00EC" => "i" + +# í => i +"\u00ED" => "i" + +# î => i +"\u00EE" => "i" + +# ï => i +"\u00EF" => "i" + +# ij => ij +"\u0133" => "ij" + +# ð => d +"\u00F0" => "d" + +# ñ => n +"\u00F1" => "n" + +# ò => o +"\u00F2" => "o" + +# ó => o +"\u00F3" => "o" + +# ô => o +"\u00F4" => "o" + +# õ => o +"\u00F5" => "o" + +# ö => o +"\u00F6" => "o" + +# ø => o +"\u00F8" => "o" + +# œ => oe +"\u0153" => "oe" + +# ß => ss +"\u00DF" => "ss" + +# þ => th +"\u00FE" => "th" + +# ù => u +"\u00F9" => "u" + +# ú => u +"\u00FA" => "u" + +# û => u +"\u00FB" => "u" + +# ü => u +"\u00FC" => "u" + +# ý => y +"\u00FD" => "y" + +# ÿ => y +"\u00FF" => "y" + +# ff => ff +"\uFB00" => "ff" + +# fi => fi +"\uFB01" => "fi" + +# fl => fl +"\uFB02" => "fl" + +# ffi => ffi +"\uFB03" => "ffi" + +# ffl => ffl +"\uFB04" => "ffl" + +# ſt => ft +"\uFB05" => "ft" + +# st => st +"\uFB06" => "st" diff --git a/molecule/default/templates/collections/sample_techproducts_configs/params.json b/molecule/default/templates/collections/sample_techproducts_configs/params.json new file mode 100755 index 0000000..ac72676 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/params.json @@ -0,0 +1,11 @@ +{ + "params": { + "_UPDATE_JSON_DOCS": { + "srcField": "_src_", + "mapUniqueKeyOnly": true, + "": { + "v": 0 + } + } + } +} \ No newline at end of file diff --git a/molecule/default/templates/collections/sample_techproducts_configs/protwords.txt b/molecule/default/templates/collections/sample_techproducts_configs/protwords.txt new file mode 100755 index 0000000..1dfc0ab --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/protwords.txt @@ -0,0 +1,21 @@ +# The ASF licenses this file to You 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. + +#----------------------------------------------------------------------- +# Use a protected word file to protect against the stemmer reducing two +# unrelated words to the same base word. + +# Some non-words that normally won't be encountered, +# just to test that they won't be stemmed. +dontstems +zwhacky + diff --git a/molecule/default/templates/collections/sample_techproducts_configs/solrconfig.xml b/molecule/default/templates/collections/sample_techproducts_configs/solrconfig.xml new file mode 100755 index 0000000..a28da09 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/solrconfig.xml @@ -0,0 +1,1616 @@ + + + + + + + + + 8.0.0 + + + + + + + + + + + + + + + + + + + + + + + ${solr.data.dir:} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${solr.lock.type:native} + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + ${solr.ulog.dir:} + ${solr.ulog.numVersionBuckets:65536} + + + + + ${solr.autoCommit.maxTime:15000} + false + + + + + + ${solr.autoSoftCommit.maxTime:-1} + + + + + + + + + + + + + + 1024 + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + 20 + + + 200 + + + + + + + + + + + + static firstSearcher warming in solrconfig.xml + + + + + + false + + + + + + + + + + + + + + + + + + + + + + explicit + 10 + + + + false + + + + + + + + + + + + + + explicit + json + true + text + + + + + + + explicit + + + velocity + browse + layout + Solritas + + + edismax + + text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0 manu^1.1 cat^1.4 + title^10.0 description^5.0 keywords^5.0 author^2.0 resourcename^1.0 + + 100% + *:* + 10 + *,score + + + text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0 manu^1.1 cat^1.4 + title^10.0 description^5.0 keywords^5.0 author^2.0 resourcename^1.0 + + text,features,name,sku,id,manu,cat,title,description,keywords,author,resourcename + 3 + + + on + true + cat + manu_exact + content_type + author_s + ipod + GB + 1 + cat,inStock + after + price + 0 + 600 + 50 + popularity + 0 + 10 + 3 + manufacturedate_dt + NOW/YEAR-10YEARS + NOW + +1YEAR + before + after + + + on + content features title name + true + html + <b> + </b> + 0 + title + 0 + name + 3 + 200 + content + 750 + + + on + false + 5 + 2 + 5 + true + true + 5 + 3 + + + + + spellcheck + + + + + + + text + + + + + + + + + true + ignored_ + + + true + links + ignored_ + + + + + + + + + text_general + + + + + + default + text + solr.DirectSolrSpellChecker + + internal + + 0.5 + + 2 + + 1 + + 5 + + 4 + + 0.01 + + + + + + wordbreak + solr.WordBreakSolrSpellChecker + name + true + true + 10 + + + + + + + + + + + + + + + + + default + wordbreak + on + true + 10 + 5 + 5 + true + true + 10 + 5 + + + spellcheck + + + + + + + mySuggester + FuzzyLookupFactory + DocumentDictionaryFactory + cat + price + string + false + + + + + + true + 10 + + + suggest + + + + + + + + + + + true + + + tvComponent + + + + + + + + + lingo3g + true + com.carrotsearch.lingo3g.Lingo3GClusteringAlgorithm + clustering/carrot2 + + + + lingo + org.carrot2.clustering.lingo.LingoClusteringAlgorithm + clustering/carrot2 + + + + stc + org.carrot2.clustering.stc.STCClusteringAlgorithm + clustering/carrot2 + + + + kmeans + org.carrot2.clustering.kmeans.BisectingKMeansClusteringAlgorithm + clustering/carrot2 + + + + + + + true + true + + name + + id + + features + + true + + + + false + + + edismax + + text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0 manu^1.1 cat^1.4 + + *:* + 100 + *,score + + + clustering + + + + + + + + + + true + false + + + terms + + + + + + + + string + elevate.xml + + + + + + explicit + + + elevator + + + + + + + + + + + 100 + + + + + + + + 70 + + 0.5 + + [-\w ,/\n\"']{20,200} + + + + + + + ]]> + ]]> + + + + + + + + + + + + + + + + + + + + + + + + ,, + ,, + ,, + ,, + ,]]> + ]]> + + + + + + 10 + .,!? + + + + + + + WORD + + + en + US + + + + + + + + + + + + + + + + + + + + + + text/plain; charset=UTF-8 + + + + + ${velocity.template.base.dir:} + + + + + + 5 + + + + + + + + + + + + + + + + + + + QUERY_DOC_FV + + + diff --git a/molecule/default/templates/collections/sample_techproducts_configs/spellings.txt b/molecule/default/templates/collections/sample_techproducts_configs/spellings.txt new file mode 100755 index 0000000..d7ede6f --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/spellings.txt @@ -0,0 +1,2 @@ +pizza +history \ No newline at end of file diff --git a/molecule/default/templates/collections/sample_techproducts_configs/stopwords.txt b/molecule/default/templates/collections/sample_techproducts_configs/stopwords.txt new file mode 100755 index 0000000..ae1e83e --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/stopwords.txt @@ -0,0 +1,14 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. diff --git a/molecule/default/templates/collections/sample_techproducts_configs/synonyms.txt b/molecule/default/templates/collections/sample_techproducts_configs/synonyms.txt new file mode 100755 index 0000000..eab4ee8 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/synonyms.txt @@ -0,0 +1,29 @@ +# The ASF licenses this file to You 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. + +#----------------------------------------------------------------------- +#some test synonym mappings unlikely to appear in real input text +aaafoo => aaabar +bbbfoo => bbbfoo bbbbar +cccfoo => cccbar cccbaz +fooaaa,baraaa,bazaaa + +# Some synonym groups specific to this example +GB,gib,gigabyte,gigabytes +MB,mib,megabyte,megabytes +Television, Televisions, TV, TVs +#notice we use "gib" instead of "GiB" so any WordDelimiterGraphFilter coming +#after us won't split it into two words. + +# Synonym mappings can be used for spelling correction too +pixima => pixma + diff --git a/molecule/default/templates/collections/sample_techproducts_configs/update-script.js b/molecule/default/templates/collections/sample_techproducts_configs/update-script.js new file mode 100755 index 0000000..49b07f9 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/update-script.js @@ -0,0 +1,53 @@ +/* + This is a basic skeleton JavaScript update processor. + + In order for this to be executed, it must be properly wired into solrconfig.xml; by default it is commented out in + the example solrconfig.xml and must be uncommented to be enabled. + + See http://wiki.apache.org/solr/ScriptUpdateProcessor for more details. +*/ + +function processAdd(cmd) { + + doc = cmd.solrDoc; // org.apache.solr.common.SolrInputDocument + id = doc.getFieldValue("id"); + logger.info("update-script#processAdd: id=" + id); + +// Set a field value: +// doc.setField("foo_s", "whatever"); + +// Get a configuration parameter: +// config_param = params.get('config_param'); // "params" only exists if processor configured with + +// Get a request parameter: +// some_param = req.getParams().get("some_param") + +// Add a field of field names that match a pattern: +// - Potentially useful to determine the fields/attributes represented in a result set, via faceting on field_name_ss +// field_names = doc.getFieldNames().toArray(); +// for(i=0; i < field_names.length; i++) { +// field_name = field_names[i]; +// if (/attr_.*/.test(field_name)) { doc.addField("attribute_ss", field_names[i]); } +// } + +} + +function processDelete(cmd) { + // no-op +} + +function processMergeIndexes(cmd) { + // no-op +} + +function processCommit(cmd) { + // no-op +} + +function processRollback(cmd) { + // no-op +} + +function finish() { + // no-op +} diff --git a/molecule/default/templates/collections/sample_techproducts_configs/velocity/README.txt b/molecule/default/templates/collections/sample_techproducts_configs/velocity/README.txt new file mode 100755 index 0000000..5d560ba --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/velocity/README.txt @@ -0,0 +1,101 @@ +Introduction +------------ +Solr Search Velocity Templates + +A quick demo of using Solr using http://wiki.apache.org/solr/VelocityResponseWriter + +You typically access these templates via: + http://localhost:8983/solr/collection1/browse + +It's called "browse" because you can click around with your mouse +without needing to type any search terms. And of course it +also works as a standard search app as well. + +Known Limitations +----------------- +* The /browse and the VelocityResponseWriter component + serve content directly from Solr, which usually requires + Solr's HTTP API to be exposed. Advanced users could + potentially access other parts of Solr directly. +* There are some hard coded fields in these templates. + Since these templates live under conf, they should be + considered part of the overall configuration, and + must be coordinated with schema.xml and solrconfig.xml + +Velocity Info +------------- +Java-based template language. + +It's nice in this context because change to the templates +are immediately visible in browser on the next visit. + +Links: + http://velocity.apache.org + http://wiki.apache.org/velocity/ + http://velocity.apache.org/engine/releases/velocity-1.7/user-guide.html + + +File List +--------- + +System and Misc: + VM_global_library.vm - Macros used other templates, + exact filename is important for Velocity to see it + error.vm - shows errors, if any + debug.vm - includes toggle links for "explain" and "all fields" + activated by debug link in footer.vm + README.txt - this file + +Overall Page Composition: + browse.vm - Main entry point into templates + layout.vm - overall HTML page layout + head.vm - elements in the section of the HTML document + header.vm - top section of page visible to users + footer.vm - bottom section of page visible to users, + includes debug and help links + main.css - CSS style for overall pages + see also jquery.autocomplete.css + +Query Form and Options: + query_form.vm - renders query form + query_group.vm - group by fields + e.g.: Manufacturer or Poplularity + query_spatial.vm - select box for location based Geospacial search + +Spelling Suggestions: + did_you_mean.vm - hyperlinked spelling suggestions in results + suggest.vm - dynamic spelling suggestions + as you type in the search form + jquery.autocomplete.js - supporting files for dynamic suggestions + jquery.autocomplete.css - Most CSS is defined in main.css + + +Search Results, General: + (see also browse.vm) + tabs.vm - provides navigation to advanced search options + pagination_top.vm - paging and staticis at top of results + pagination_bottom.vm - paging and staticis at bottom of results + results_list.vm + hit.vm - called for each matching doc, + decides which template to use + hit_grouped.vm - display results grouped by field values + product_doc.vm - display a Product + join_doc.vm - display a joined document + richtext_doc.vm - display a complex/misc. document + hit_plain.vm - basic display of all fields, + edit results_list.vm to enable this + + +Search Results, Facets & Clusters: + facets.vm - calls the 4 facet and 1 cluster template + facet_fields.vm - display facets based on field values + e.g.: fields specified by &facet.field= + facet_queries.vm - display facets based on specific facet queries + e.g.: facets specified by &facet.query= + facet_ranges.vm - display facets based on ranges + e.g.: ranges specified by &facet.range= + facet_pivot.vm - display pivot based facets + e.g.: facets specified by &facet.pivot= + cluster.vm - if clustering is available + then call cluster_results.vm + cluster_results.vm - actual rendering of clusters diff --git a/molecule/default/templates/collections/sample_techproducts_configs/velocity/VM_global_library.vm b/molecule/default/templates/collections/sample_techproducts_configs/velocity/VM_global_library.vm new file mode 100755 index 0000000..ef2157c --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/velocity/VM_global_library.vm @@ -0,0 +1,186 @@ +#** + * Global macros used by other templates. + * This file must be named VM_global_library.vm + * in order for Velocity to find it. + *# + +#macro(param $key)$request.params.get($key)#end + +#macro(url_root)/solr#end + +## TODO: s/url_for_solr/url_for_core/ and s/url_root/url_for_solr/ +#macro(core_name)$request.core.name#end +#macro(url_for_solr)#{url_root}#if($request.core.name != "")/$request.core.name#end#end +#macro(url_for_home)#url_for_solr/browse#end + +#macro(q)&q=$!{esc.url($params.get('q'))}#end + +#macro(fqs $p)#foreach($fq in $p)#if($velocityCount>1)&#{end}fq=$esc.url($fq)#end#end + +#macro(debug)#if($request.params.get('debugQuery'))&debugQuery=true#end#end + +#macro(boostPrice)#if($request.params.get('bf') == 'price')&bf=price#end#end + +#macro(annotate)#if($request.params.get('annotateBrowse'))&annotateBrowse=true#end#end + +#macro(annTitle $msg)#if($annotate == true)title="$msg"#end#end + +#macro(spatial)#if($request.params.get('sfield'))&sfield=store#end#if($request.params.get('pt'))&pt=$request.params.get('pt')#end#if($request.params.get('d'))&d=$request.params.get('d')#end#end + +#macro(qOpts)#set($queryOpts = $request.params.get("queryOpts"))#if($queryOpts && $queryOpts != "")&queryOpts=$queryOpts#end#end + +#macro(group)#if($request.params.getBool("group") == true)&group=true#end#if($request.params.get("group.field"))#foreach($grp in $request.params.getParams('group.field'))&group.field=$grp#end#end#end + +#macro(sort $p)#if($p)#foreach($s in $p)&sort=$esc.url($s)#end#end#end + +#macro(lensNoQ)?#if($request.params.getParams('fq') and $list.size($request.params.getParams('fq')) > 0)&#fqs($request.params.getParams('fq'))#end#sort($request.params.getParams('sort'))#debug#boostPrice#annotate#spatial#qOpts#group#end +#macro(lens)#lensNoQ#q#end + + +#macro(url_for_lens)#{url_for_home}#lens#end + +#macro(url_for_start $start)#url_for_home#lens&start=$start#end + +#macro(url_for_filters $p)#url_for_home?#q#boostPrice#spatial#qOpts#if($list.size($p) > 0)&#fqs($p)#end#debug#end + +#macro(url_for_nested_facet_query $field)#url_for_home#lens&fq=$esc.url($field)#end + +## TODO: convert to use {!raw f=$field}$value (with escaping of course) +#macro(url_for_facet_filter $field $value)#url_for_home#lens&fq=#if($value!=$null)$esc.url($field):%22$esc.url($value)%22#else-$esc.url($field):[*+TO+*]#end#end + +#macro(url_for_facet_date_filter $field $value)#url_for_home#lens&fq=$esc.url($field):$esc.url($value)#end + +#macro(url_for_facet_range_filter $field $value)#url_for_home#lens&fq=$esc.url($field):$esc.url($value)#end + + +#macro(link_to_previous_page $text) + #if($page.current_page_number > 1) + #set($prev_start = $page.start - $page.results_per_page) + $text + #end +#end + +#macro(link_to_next_page $text) + #if($page.current_page_number < $page.page_count) + #set($next_start = $page.start + $page.results_per_page) + $text + #end +#end + +#macro(link_to_page $page_number $text) + #if($page_number == $page.current_page_number) + $text + #else + #if($page_number <= $page.page_count) + #set($page_start = $page_number * $page.results_per_page - $page.results_per_page) + $text + #end + #end +#end + +#macro(display_facet_query $field, $display, $fieldName) + #if($field.size() > 0) + $display +

    + #foreach ($facet in $field) + #if ($facet.value > 0) + #set($facetURL = "#url_for_nested_facet_query($facet.key)") + #if ($facetURL != '') +
  • $facet.key ($facet.value)
  • + #end + #end + #end +
+ #end +#end + + +#macro(display_facet_range $field, $display, $fieldName, $start, $end, $gap, $before, $after) + $display +
    + #if($before && $before != "") + #set($value = "[* TO " + "#format_value($start)" + "}") + #set($facetURL = "#url_for_facet_range_filter($fieldName, $value)") +
  • Less than #format_value($start) ($before)
  • + #end + #foreach ($facet in $field) + #set($rangeEnd = "#range_get_to_value($facet.key, $gap)") + #set($value = "[" + $facet.key + " TO " + $rangeEnd + "}") + #set($facetURL = "#url_for_facet_range_filter($fieldName, $value)") + #if ($facetURL != '') +
  • $facet.key - #format_value($rangeEnd) ($facet.value)
  • + #end + #end + #if($end && $end != "" && $after > 0) + #set($value = "[" + "#format_value($end)" + " TO *}") + #set($facetURL = "#url_for_facet_range_filter($fieldName, $value)") +
  • More than #format_value($end) ($after)
  • + #end +
+#end + +## $pivots is a list of facet_pivot +#macro(display_facet_pivot $pivots, $display) + #if($pivots.size() > 0) + $display + + #end +#end + +#macro(field $f) + #if($response.response.highlighting.get($docId).get($f).get(0)) + #set($pad = "") + #foreach($v in $response.response.highlighting.get($docId).get($f)) +$pad$v## + #set($pad = " ... ") + #end + #else + #foreach($v in $doc.getFieldValues($f)) +$v## + #end + #end +#end + +#macro(utc_date $theDate) +$date.format("yyyy-MM-dd'T'HH:mm:ss'Z'",$theDate,$date.getLocale(),$date.getTimeZone().getTimeZone("UTC"))## +#end + +#macro(format_value $val) +#if(${val.class.name} == "java.util.Date") +#utc_date($val)## +#else +$val## +#end +#end + +#macro(range_get_to_value $inval, $gapval) +#if(${gapval.class.name} == "java.lang.String") +#if($gapval.startsWith("+")) +$inval$gapval## Typically date gaps start with + +#else +$inval+$gapval## If the gap does not start with a "+", we add it, such as for currency value +#end +#elseif(${gapval.class.name} == "java.lang.Float" || ${inval.class.name} == "java.lang.Float") +$math.toDouble($math.add($inval,$gapval))## +#else +$math.add($inval,$gapval)## +#end +#end diff --git a/molecule/default/templates/collections/sample_techproducts_configs/velocity/browse.vm b/molecule/default/templates/collections/sample_techproducts_configs/velocity/browse.vm new file mode 100755 index 0000000..10ecaeb --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/velocity/browse.vm @@ -0,0 +1,33 @@ +#** + * Main entry point into the /browse templates + *# + +#set($searcher = $request.searcher) +#set($params = $request.params) +#set($clusters = $response.response.clusters) +#set($mltResults = $response.response.get("moreLikeThis")) +#set($annotate = $params.get("annotateBrowse")) +#parse('query_form.vm') +#parse('did_you_mean.vm') + + + + + +## Show Error Message, if any +
+ #parse("error.vm") +
+ +## Render Results, actual matching docs +
+ #parse("results_list.vm") +
+ + diff --git a/molecule/default/templates/collections/sample_techproducts_configs/velocity/cluster.vm b/molecule/default/templates/collections/sample_techproducts_configs/velocity/cluster.vm new file mode 100755 index 0000000..09885f3 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/velocity/cluster.vm @@ -0,0 +1,19 @@ +#** + * Check if Clustering is Enabled and then + * call cluster_results.vm + *# + +

+ Clusters +

+ +## Div tag has placeholder text by default +
+ Run Solr with option -Dsolr.clustering.enabled=true to see clustered search results. +
+ +## Replace the div content *if* Carrot^2 is available + diff --git a/molecule/default/templates/collections/sample_techproducts_configs/velocity/cluster_results.vm b/molecule/default/templates/collections/sample_techproducts_configs/velocity/cluster_results.vm new file mode 100755 index 0000000..204480d --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/velocity/cluster_results.vm @@ -0,0 +1,31 @@ +#** + * Actual rendering of Clusters + *# + +## For each cluster +#foreach ($clusters in $response.response.clusters) + + #set($labels = $clusters.get('labels')) + #set($docs = $clusters.get('docs')) + + ## This Cluster's Heading +

+ #foreach ($label in $labels) + ## Keep the following line together to prevent + ## a space appearing before each comma + $label#if( $foreach.hasNext ),#end + #end +

+ + ## This Cluster's Documents +
    + ## For each doc in this cluster + #foreach ($cluDoc in $docs) +
  1. + + $cluDoc +
  2. + #end +
+ +#end ## end for each Cluster diff --git a/molecule/default/templates/collections/sample_techproducts_configs/velocity/debug.vm b/molecule/default/templates/collections/sample_techproducts_configs/velocity/debug.vm new file mode 100755 index 0000000..8f6d232 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/velocity/debug.vm @@ -0,0 +1,28 @@ +#** + * Show Debugging Information, if enabled + *# + +#if( $params.getBool("debugQuery",false) ) + + toggle explain + +
+    $response.getExplainMap().get($doc.getFirstValue('id'))
+  
+ + + toggle all fields + + + #foreach($fieldname in $doc.fieldNames) +
+ $fieldname : + + #foreach($value in $doc.getFieldValues($fieldname)) + $esc.html($value) + #end + +
+ #end +
+#end diff --git a/molecule/default/templates/collections/sample_techproducts_configs/velocity/did_you_mean.vm b/molecule/default/templates/collections/sample_techproducts_configs/velocity/did_you_mean.vm new file mode 100755 index 0000000..606733a --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/velocity/did_you_mean.vm @@ -0,0 +1,11 @@ +#** + * Hyperlinked spelling suggestions in results list + *# + +#set($collations = $response.response.spellcheck.collations.getAll("collation")) +#if($collations.size() > 0) + Did you mean + #foreach($collation in $collations) + $esc.html($collation.collationQuery) ($collation.hits)? + #end +#end diff --git a/molecule/default/templates/collections/sample_techproducts_configs/velocity/error.vm b/molecule/default/templates/collections/sample_techproducts_configs/velocity/error.vm new file mode 100755 index 0000000..80b5819 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/velocity/error.vm @@ -0,0 +1,11 @@ +#** + * Show Error Message, if any + *# + +## Show Error Message, if any +## Usually rendered inside div class=error + +#if( $response.response.error.code ) +

ERROR $response.response.error.code

+ $response.response.error.msg +#end diff --git a/molecule/default/templates/collections/sample_techproducts_configs/velocity/facet_fields.vm b/molecule/default/templates/collections/sample_techproducts_configs/velocity/facet_fields.vm new file mode 100755 index 0000000..2926817 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/velocity/facet_fields.vm @@ -0,0 +1,24 @@ +#** + * Display facets based on field values + * e.g.: fields specified by &facet.field= + *# + +#if($response.facetFields) +

+ Field Facets +

+ #foreach($field in $response.facetFields) + ## Hide facets without value + #if($field.values.size() > 0) + $field.name + + #end ## end if > 0 + #end ## end for each facet field +#end ## end if response has facet fields diff --git a/molecule/default/templates/collections/sample_techproducts_configs/velocity/facet_pivot.vm b/molecule/default/templates/collections/sample_techproducts_configs/velocity/facet_pivot.vm new file mode 100755 index 0000000..7aa50da --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/velocity/facet_pivot.vm @@ -0,0 +1,12 @@ +#** + * Display Pivot-Based Facets + * e.g.: facets specified by &facet.pivot= + *# + +

+ Pivot Facets +

+ +#set($pivot = $response.response.facet_counts.facet_pivot) + +#display_facet_pivot($pivot, "") diff --git a/molecule/default/templates/collections/sample_techproducts_configs/velocity/facet_queries.vm b/molecule/default/templates/collections/sample_techproducts_configs/velocity/facet_queries.vm new file mode 100755 index 0000000..37489c7 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/velocity/facet_queries.vm @@ -0,0 +1,12 @@ +#** + * Display facets based on specific facet queries + * e.g.: facets specified by &facet.query= + *# + +#set($field = $response.response.facet_counts.facet_queries) + +

+ Query Facets +

+ +#display_facet_query($field, "", "") diff --git a/molecule/default/templates/collections/sample_techproducts_configs/velocity/facet_ranges.vm b/molecule/default/templates/collections/sample_techproducts_configs/velocity/facet_ranges.vm new file mode 100755 index 0000000..a769415 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/velocity/facet_ranges.vm @@ -0,0 +1,23 @@ +#** + * Display facets based on ranges of values, AKA "Bukets" + * e.g.: ranges specified by &facet.range= + *# + +

+ Range Facets +

+ +#foreach ($field in $response.response.facet_counts.facet_ranges) + ## Hide facets without value + #if($field.value.counts.size() > 0) + #set($name = $field.key) + #set($display = $name) + #set($f = $field.value.counts) + #set($start = $field.value.start) + #set($end = $field.value.end) + #set($gap = $field.value.gap) + #set($before = $field.value.before) + #set($after = $field.value.after) + #display_facet_range($f, $display, $name, $start, $end, $gap, $before, $after) + #end ## end if has any values +#end ## end for each facet range diff --git a/molecule/default/templates/collections/sample_techproducts_configs/velocity/facets.vm b/molecule/default/templates/collections/sample_techproducts_configs/velocity/facets.vm new file mode 100755 index 0000000..55d40c9 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/velocity/facets.vm @@ -0,0 +1,10 @@ +#** + * Overall Facet display block + * Invokes the 4 facet and 1 cluster template + *# + +#parse('facet_fields.vm') +#parse('facet_queries.vm') +#parse('facet_ranges.vm') +#parse('facet_pivot.vm') +#parse('cluster.vm') diff --git a/molecule/default/templates/collections/sample_techproducts_configs/velocity/footer.vm b/molecule/default/templates/collections/sample_techproducts_configs/velocity/footer.vm new file mode 100755 index 0000000..0604c34 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/velocity/footer.vm @@ -0,0 +1,43 @@ +#** + * Render the bottom section of the page visible to users + *# + +
+
+ Options: + + #if($request.params.get('debugQuery')) + + disable debug + #else + + enable debug + #end + - + #if($annotate) + + disable annotation + #else + + enable annotation + #end + - + + XML results + +
+ +
+ Generated by VelocityResponseWriter +
+
+ Documentation: + Solr Home Page, + Solr Wiki +
+
+ Disclaimer: + The locations displayed in this demonstration are purely fictional. + It is more than likely that no store with the items listed actually + exists at that location! +
diff --git a/molecule/default/templates/collections/sample_techproducts_configs/velocity/head.vm b/molecule/default/templates/collections/sample_techproducts_configs/velocity/head.vm new file mode 100755 index 0000000..15dc0e8 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/velocity/head.vm @@ -0,0 +1,37 @@ +#** + * Provide elements for the section of the HTML document + *# + + ## An example of using an arbitrary request parameter + #param('title') + + + + + + + + + + + diff --git a/molecule/default/templates/collections/sample_techproducts_configs/velocity/header.vm b/molecule/default/templates/collections/sample_techproducts_configs/velocity/header.vm new file mode 100755 index 0000000..a408451 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/velocity/header.vm @@ -0,0 +1,7 @@ +#** + * Render the top section of the page visible to users + *# + + diff --git a/molecule/default/templates/collections/sample_techproducts_configs/velocity/hit.vm b/molecule/default/templates/collections/sample_techproducts_configs/velocity/hit.vm new file mode 100755 index 0000000..a9c11f4 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/velocity/hit.vm @@ -0,0 +1,25 @@ +#** + * Called for each matching document but then + * calls one of product_doc, join_doc or richtext_doc + * depending on which fields the doc has + *# + +#set($docId = $doc.getFieldValue('id')) + +
+ + ## Has a "name" field ? + #if($doc.getFieldValue('name')) + #parse("product_doc.vm") + + ## Has a "compName_s" field ? + #elseif($doc.getFieldValue('compName_s')) + #parse("join_doc.vm") + + ## Fallback to richtext_doc + #else + #parse("richtext_doc.vm") + + #end + +
diff --git a/molecule/default/templates/collections/sample_techproducts_configs/velocity/hit_grouped.vm b/molecule/default/templates/collections/sample_techproducts_configs/velocity/hit_grouped.vm new file mode 100755 index 0000000..5297f1e --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/velocity/hit_grouped.vm @@ -0,0 +1,43 @@ +#** + * Display grouped results + *# + +
+ +
+ $grouping.key +
+ +
+ Total Matches in Group: $grouping.value.matches +
+ +
## list of groups + + #foreach ($group in $grouping.value.groups) +
+ #if($group.groupValue)$group.groupValue#{else}No group#end + + ($group.doclist.numFound) + +
+ +
+ #foreach ($doc in $group.doclist) + #set($docId = $doc.getFieldValue('id')) + #if($doc.getFieldValue('name')) + #parse("product_doc.vm") + #elseif($doc.getFieldValue('compName_s')) + #parse("join_doc.vm") + #else + #parse("richtext_doc.vm") + #end + #end +
+ + #end ## end of foreach group in grouping.value.groups +
## div tag for entire list of groups + +
## end of div class=result-document diff --git a/molecule/default/templates/collections/sample_techproducts_configs/velocity/hit_plain.vm b/molecule/default/templates/collections/sample_techproducts_configs/velocity/hit_plain.vm new file mode 100755 index 0000000..193439b --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/velocity/hit_plain.vm @@ -0,0 +1,25 @@ +#** + * An extremely plain / debug version of hit.vm + *# + + + ## For each field + #foreach( $fieldName in $doc.fieldNames ) + ## For each value + #foreach( $value in $doc.getFieldValues($fieldName) ) + + ## Field Name + + ## Field Value(s) + + + #end ## end for each value + #end ## end for each field +
+ #if( $foreach.count == 1 ) + $fieldName: + #end + + $esc.html($value)
+
+
diff --git a/molecule/default/templates/collections/sample_techproducts_configs/velocity/join_doc.vm b/molecule/default/templates/collections/sample_techproducts_configs/velocity/join_doc.vm new file mode 100755 index 0000000..9956012 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/velocity/join_doc.vm @@ -0,0 +1,20 @@ +#** + * Display documents that are joined to other documents + *# + +
+ #field('compName_s') +
+ +
+ Id: #field('id') + (company-details document for + join + ) +
+ +
+ Address: #field('address_s') +
+ +#parse('debug.vm') diff --git a/molecule/default/templates/collections/sample_techproducts_configs/velocity/jquery.autocomplete.css b/molecule/default/templates/collections/sample_techproducts_configs/velocity/jquery.autocomplete.css new file mode 100755 index 0000000..97a62e0 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/velocity/jquery.autocomplete.css @@ -0,0 +1,48 @@ +.ac_results { + padding: 0px; + border: 1px solid black; + background-color: white; + overflow: hidden; + z-index: 99999; +} + +.ac_results ul { + width: 100%; + list-style-position: outside; + list-style: none; + padding: 0; + margin: 0; +} + +.ac_results li { + margin: 0px; + padding: 2px 5px; + cursor: default; + display: block; + /* + if width will be 100% horizontal scrollbar will apear + when scroll mode will be used + */ + /*width: 100%;*/ + font: menu; + font-size: 12px; + /* + it is very important, if line-height not setted or setted + in relative units scroll will be broken in firefox + */ + line-height: 16px; + overflow: hidden; +} + +.ac_loading { + background: white url('indicator.gif') right center no-repeat; +} + +.ac_odd { + background-color: #eee; +} + +.ac_over { + background-color: #0A246A; + color: white; +} diff --git a/molecule/default/templates/collections/sample_techproducts_configs/velocity/jquery.autocomplete.js b/molecule/default/templates/collections/sample_techproducts_configs/velocity/jquery.autocomplete.js new file mode 100755 index 0000000..442f5a0 --- /dev/null +++ b/molecule/default/templates/collections/sample_techproducts_configs/velocity/jquery.autocomplete.js @@ -0,0 +1,763 @@ +/* + * Autocomplete - jQuery plugin 1.1pre + * + * Copyright (c) 2007 Dylan Verheul, Dan G. Switzer, Anjesh Tuladhar, Jörn Zaefferer + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Revision: Id: jquery.autocomplete.js 5785 2008-07-12 10:37:33Z joern.zaefferer $ + * + */ + +;(function($) { + +$.fn.extend({ + autocomplete: function(urlOrData, options) { + var isUrl = typeof urlOrData == "string"; + options = $.extend({}, $.Autocompleter.defaults, { + url: isUrl ? urlOrData : null, + data: isUrl ? null : urlOrData, + delay: isUrl ? $.Autocompleter.defaults.delay : 10, + max: options && !options.scroll ? 10 : 150 + }, options); + + // if highlight is set to false, replace it with a do-nothing function + options.highlight = options.highlight || function(value) { return value; }; + + // if the formatMatch option is not specified, then use formatItem for backwards compatibility + options.formatMatch = options.formatMatch || options.formatItem; + + return this.each(function() { + new $.Autocompleter(this, options); + }); + }, + result: function(handler) { + return this.bind("result", handler); + }, + search: function(handler) { + return this.trigger("search", [handler]); + }, + flushCache: function() { + return this.trigger("flushCache"); + }, + setOptions: function(options){ + return this.trigger("setOptions", [options]); + }, + unautocomplete: function() { + return this.trigger("unautocomplete"); + } +}); + +$.Autocompleter = function(input, options) { + + var KEY = { + UP: 38, + DOWN: 40, + DEL: 46, + TAB: 9, + RETURN: 13, + ESC: 27, + COMMA: 188, + PAGEUP: 33, + PAGEDOWN: 34, + BACKSPACE: 8 + }; + + // Create $ object for input element + var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass); + + var timeout; + var previousValue = ""; + var cache = $.Autocompleter.Cache(options); + var hasFocus = 0; + var lastKeyPressCode; + var config = { + mouseDownOnSelect: false + }; + var select = $.Autocompleter.Select(options, input, selectCurrent, config); + + var blockSubmit; + + // prevent form submit in opera when selecting with return key + $.browser.opera && $(input.form).bind("submit.autocomplete", function() { + if (blockSubmit) { + blockSubmit = false; + return false; + } + }); + + // only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all + $input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) { + // track last key pressed + lastKeyPressCode = event.keyCode; + switch(event.keyCode) { + + case KEY.UP: + event.preventDefault(); + if ( select.visible() ) { + select.prev(); + } else { + onChange(0, true); + } + break; + + case KEY.DOWN: + event.preventDefault(); + if ( select.visible() ) { + select.next(); + } else { + onChange(0, true); + } + break; + + case KEY.PAGEUP: + event.preventDefault(); + if ( select.visible() ) { + select.pageUp(); + } else { + onChange(0, true); + } + break; + + case KEY.PAGEDOWN: + event.preventDefault(); + if ( select.visible() ) { + select.pageDown(); + } else { + onChange(0, true); + } + break; + + // matches also semicolon + case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA: + case KEY.TAB: + case KEY.RETURN: + if( selectCurrent() ) { + // stop default to prevent a form submit, Opera needs special handling + event.preventDefault(); + blockSubmit = true; + return false; + } + break; + + case KEY.ESC: + select.hide(); + break; + + default: + clearTimeout(timeout); + timeout = setTimeout(onChange, options.delay); + break; + } + }).focus(function(){ + // track whether the field has focus, we shouldn't process any + // results if the field no longer has focus + hasFocus++; + }).blur(function() { + hasFocus = 0; + if (!config.mouseDownOnSelect) { + hideResults(); + } + }).click(function() { + // show select when clicking in a focused field + if ( hasFocus++ > 1 && !select.visible() ) { + onChange(0, true); + } + }).bind("search", function() { + // TODO why not just specifying both arguments? + var fn = (arguments.length > 1) ? arguments[1] : null; + function findValueCallback(q, data) { + var result; + if( data && data.length ) { + for (var i=0; i < data.length; i++) { + if( data[i].result.toLowerCase() == q.toLowerCase() ) { + result = data[i]; + break; + } + } + } + if( typeof fn == "function" ) fn(result); + else $input.trigger("result", result && [result.data, result.value]); + } + $.each(trimWords($input.val()), function(i, value) { + request(value, findValueCallback, findValueCallback); + }); + }).bind("flushCache", function() { + cache.flush(); + }).bind("setOptions", function() { + $.extend(options, arguments[1]); + // if we've updated the data, repopulate + if ( "data" in arguments[1] ) + cache.populate(); + }).bind("unautocomplete", function() { + select.unbind(); + $input.unbind(); + $(input.form).unbind(".autocomplete"); + }); + + + function selectCurrent() { + var selected = select.selected(); + if( !selected ) + return false; + + var v = selected.result; + previousValue = v; + + if ( options.multiple ) { + var words = trimWords($input.val()); + if ( words.length > 1 ) { + v = words.slice(0, words.length - 1).join( options.multipleSeparator ) + options.multipleSeparator + v; + } + v += options.multipleSeparator; + } + + $input.val(v); + hideResultsNow(); + $input.trigger("result", [selected.data, selected.value]); + return true; + } + + function onChange(crap, skipPrevCheck) { + if( lastKeyPressCode == KEY.DEL ) { + select.hide(); + return; + } + + var currentValue = $input.val(); + + if ( !skipPrevCheck && currentValue == previousValue ) + return; + + previousValue = currentValue; + + currentValue = lastWord(currentValue); + if ( currentValue.length >= options.minChars) { + $input.addClass(options.loadingClass); + if (!options.matchCase) + currentValue = currentValue.toLowerCase(); + request(currentValue, receiveData, hideResultsNow); + } else { + stopLoading(); + select.hide(); + } + }; + + function trimWords(value) { + if ( !value ) { + return [""]; + } + var words = value.split( options.multipleSeparator ); + var result = []; + $.each(words, function(i, value) { + if ( $.trim(value) ) + result[i] = $.trim(value); + }); + return result; + } + + function lastWord(value) { + if ( !options.multiple ) + return value; + var words = trimWords(value); + return words[words.length - 1]; + } + + // fills in the input box w/the first match (assumed to be the best match) + // q: the term entered + // sValue: the first matching result + function autoFill(q, sValue){ + // autofill in the complete box w/the first match as long as the user hasn't entered in more data + // if the last user key pressed was backspace, don't autofill + if( options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE ) { + // fill in the value (keep the case the user has typed) + $input.val($input.val() + sValue.substring(lastWord(previousValue).length)); + // select the portion of the value not typed by the user (so the next character will erase) + $.Autocompleter.Selection(input, previousValue.length, previousValue.length + sValue.length); + } + }; + + function hideResults() { + clearTimeout(timeout); + timeout = setTimeout(hideResultsNow, 200); + }; + + function hideResultsNow() { + var wasVisible = select.visible(); + select.hide(); + clearTimeout(timeout); + stopLoading(); + if (options.mustMatch) { + // call search and run callback + $input.search( + function (result){ + // if no value found, clear the input box + if( !result ) { + if (options.multiple) { + var words = trimWords($input.val()).slice(0, -1); + $input.val( words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "") ); + } + else + $input.val( "" ); + } + } + ); + } + if (wasVisible) + // position cursor at end of input field + $.Autocompleter.Selection(input, input.value.length, input.value.length); + }; + + function receiveData(q, data) { + if ( data && data.length && hasFocus ) { + stopLoading(); + select.display(data, q); + autoFill(q, data[0].value); + select.show(); + } else { + hideResultsNow(); + } + }; + + function request(term, success, failure) { + if (!options.matchCase) + term = term.toLowerCase(); + var data = cache.load(term); + data = null; // Avoid buggy cache and go to Solr every time + // recieve the cached data + if (data && data.length) { + success(term, data); + // if an AJAX url has been supplied, try loading the data now + } else if( (typeof options.url == "string") && (options.url.length > 0) ){ + + var extraParams = { + timestamp: +new Date() + }; + $.each(options.extraParams, function(key, param) { + extraParams[key] = typeof param == "function" ? param() : param; + }); + + $.ajax({ + // try to leverage ajaxQueue plugin to abort previous requests + mode: "abort", + // limit abortion to this input + port: "autocomplete" + input.name, + dataType: options.dataType, + url: options.url, + data: $.extend({ + q: lastWord(term), + limit: options.max + }, extraParams), + success: function(data) { + var parsed = options.parse && options.parse(data) || parse(data); + cache.add(term, parsed); + success(term, parsed); + } + }); + } else { + // if we have a failure, we need to empty the list -- this prevents the the [TAB] key from selecting the last successful match + select.emptyList(); + failure(term); + } + }; + + function parse(data) { + var parsed = []; + var rows = data.split("\n"); + for (var i=0; i < rows.length; i++) { + var row = $.trim(rows[i]); + if (row) { + row = row.split("|"); + parsed[parsed.length] = { + data: row, + value: row[0], + result: options.formatResult && options.formatResult(row, row[0]) || row[0] + }; + } + } + return parsed; + }; + + function stopLoading() { + $input.removeClass(options.loadingClass); + }; + +}; + +$.Autocompleter.defaults = { + inputClass: "ac_input", + resultsClass: "ac_results", + loadingClass: "ac_loading", + minChars: 1, + delay: 400, + matchCase: false, + matchSubset: true, + matchContains: false, + cacheLength: 10, + max: 100, + mustMatch: false, + extraParams: {}, + selectFirst: false, + formatItem: function(row) { return row[0]; }, + formatMatch: null, + autoFill: false, + width: 0, + multiple: false, + multipleSeparator: ", ", + highlight: function(value, term) { + return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "$1"); + }, + scroll: true, + scrollHeight: 180 +}; + +$.Autocompleter.Cache = function(options) { + + var data = {}; + var length = 0; + + function matchSubset(s, sub) { + if (!options.matchCase) + s = s.toLowerCase(); + var i = s.indexOf(sub); + if (options.matchContains == "word"){ + i = s.toLowerCase().search("\\b" + sub.toLowerCase()); + } + if (i == -1) return false; + return i == 0 || options.matchContains; + }; + + function add(q, value) { + if (length > options.cacheLength){ + flush(); + } + if (!data[q]){ + length++; + } + data[q] = value; + } + + function populate(){ + if( !options.data ) return false; + // track the matches + var stMatchSets = {}, + nullData = 0; + + // no url was specified, we need to adjust the cache length to make sure it fits the local data store + if( !options.url ) options.cacheLength = 1; + + // track all options for minChars = 0 + stMatchSets[""] = []; + + // loop through the array and create a lookup structure + for ( var i = 0, ol = options.data.length; i < ol; i++ ) { + var rawValue = options.data[i]; + // if rawValue is a string, make an array otherwise just reference the array + rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue; + + var value = options.formatMatch(rawValue, i+1, options.data.length); + if ( value === false ) + continue; + + var firstChar = value.charAt(0).toLowerCase(); + // if no lookup array for this character exists, look it up now + if( !stMatchSets[firstChar] ) + stMatchSets[firstChar] = []; + + // if the match is a string + var row = { + value: value, + data: rawValue, + result: options.formatResult && options.formatResult(rawValue) || value + }; + + // push the current match into the set list + stMatchSets[firstChar].push(row); + + // keep track of minChars zero items + if ( nullData++ < options.max ) { + stMatchSets[""].push(row); + } + }; + + // add the data items to the cache + $.each(stMatchSets, function(i, value) { + // increase the cache size + options.cacheLength++; + // add to the cache + add(i, value); + }); + } + + // populate any existing data + setTimeout(populate, 25); + + function flush(){ + data = {}; + length = 0; + } + + return { + flush: flush, + add: add, + populate: populate, + load: function(q) { + if (!options.cacheLength || !length) + return null; + /* + * if dealing w/local data and matchContains than we must make sure + * to loop through all the data collections looking for matches + */ + if( !options.url && options.matchContains ){ + // track all matches + var csub = []; + // loop through all the data grids for matches + for( var k in data ){ + // don't search through the stMatchSets[""] (minChars: 0) cache + // this prevents duplicates + if( k.length > 0 ){ + var c = data[k]; + $.each(c, function(i, x) { + // if we've got a match, add it to the array + if (matchSubset(x.value, q)) { + csub.push(x); + } + }); + } + } + return csub; + } else + // if the exact item exists, use it + if (data[q]){ + return data[q]; + } else + if (options.matchSubset) { + for (var i = q.length - 1; i >= options.minChars; i--) { + var c = data[q.substr(0, i)]; + if (c) { + var csub = []; + $.each(c, function(i, x) { + if (matchSubset(x.value, q)) { + csub[csub.length] = x; + } + }); + return csub; + } + } + } + return null; + } + }; +}; + +$.Autocompleter.Select = function (options, input, select, config) { + var CLASSES = { + ACTIVE: "ac_over" + }; + + var listItems, + active = -1, + data, + term = "", + needsInit = true, + element, + list; + + // Create results + function init() { + if (!needsInit) + return; + element = $("
") + .hide() + .addClass(options.resultsClass) + .css("position", "absolute") + .appendTo(document.body); + + list = $("