From e9648946dd6f80a9961c5e23d7cfbcb4086ecc18 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Fri, 9 Aug 2024 19:30:42 +0300 Subject: [PATCH 001/128] Added/Updated tests\bugs\core_5231_test.py: added combine_output=True in order to see STDERR text in mismatch --- tests/bugs/core_5231_test.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/bugs/core_5231_test.py b/tests/bugs/core_5231_test.py index 4519b083..326ddeef 100644 --- a/tests/bugs/core_5231_test.py +++ b/tests/bugs/core_5231_test.py @@ -2,15 +2,15 @@ """ ID: issue-5510 -ISSUE: 5510 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/5510 TITLE: EXECUTE STATEMENT: BLR error if more than 256 output parameters exist DESCRIPTION: - We define here number of output args for which one need to made test - see var 'sp_args_count'. - Then we open .sql file and GENERATE it content based on value of 'sp_args_count' (procedure will - have header and body with appropriate number of arguments and statement to be executed). - Finally, we run ISQL subprocess with giving to it for execution just generated .sql script. - ISQL should _not_ issue any error and all lines of its STDOUT should start from the names of - output arguments (letter 'O': O1, O2, ... O5000). + We define here number of output args for which one need to made test - see var 'sp_args_count'. + Then we open .sql file and GENERATE it content based on value of 'sp_args_count' (procedure will + have header and body with appropriate number of arguments and statement to be executed). + Finally, we run ISQL subprocess with giving to it for execution just generated .sql script. + ISQL should _not_ issue any error and all lines of its STDOUT should start from the names of + output arguments (letter 'O': O1, O2, ... O5000). JIRA: CORE-5231 FBTEST: bugs.core_5231 """ @@ -71,5 +71,5 @@ def build_script(ddl_script: Path): @pytest.mark.version('>=3.0') def test_1(act: Action, ddl_script: Path): build_script(ddl_script) - act.isql(switches=[], input_file=ddl_script, charset='NONE') + act.isql(switches=[], input_file=ddl_script, charset='NONE', combine_output = True) assert act.clean_stdout == act.clean_expected_stdout From cc1fbc5d3b9d9302fb9547f27006e1bd8f32f068 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sun, 11 Aug 2024 09:18:45 +0300 Subject: [PATCH 002/128] Added/Updated tests\bugs\gh_8211_test.py: Checked on intermediate snapshots: 6.0.0.431-16bb157; 5.0.2.1477-c71eb20; 4.0.6.3141 --- tests/bugs/gh_8211_test.py | 50 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 tests/bugs/gh_8211_test.py diff --git a/tests/bugs/gh_8211_test.py b/tests/bugs/gh_8211_test.py new file mode 100644 index 00000000..4650a235 --- /dev/null +++ b/tests/bugs/gh_8211_test.py @@ -0,0 +1,50 @@ +#coding:utf-8 + +""" +ID: issue-8211 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8211 +TITLE: DATEADD truncates milliseconds for month and year deltas. +DESCRIPTION: +NOTES: + [11.08.2024] pzotov + Confirmed bug on 6.0.0.423 + Checked on intermediate snapshots: 6.0.0.431-16bb157; 5.0.2.1477-c71eb20; 4.0.6.3141 +""" + +import pytest +from firebird.qa import * + +db = db_factory() + +test_script = """ + set list on; + select + ''||dateadd(0 millisecond to cast('01.01.2001 01:01:01.1111' as timestamp)) a_millisecond, + ''||dateadd(0 second to cast('01.01.2001 01:01:01.1111' as timestamp)) a_second, + ''||dateadd(0 minute to cast('01.01.2001 01:01:01.1111' as timestamp)) a_minute, + ''||dateadd(0 hour to cast('01.01.2001 01:01:01.1111' as timestamp)) a_hour, + ''||dateadd(0 day to cast('01.01.2001 01:01:01.1111' as timestamp)) a_day, + ''||dateadd(0 week to cast('01.01.2001 01:01:01.1111' as timestamp)) a_week, + ''||dateadd(0 month to cast('01.01.2001 01:01:01.1111' as timestamp)) a_month, + ''||dateadd(0 year to cast('01.01.2001 01:01:01.1111' as timestamp)) a_year + from rdb$database; +""" + +act = isql_act('db', test_script, substitutions=[('[ \t]+', ' ')]) + +expected_stdout = """ + A_MILLISECOND 2001-01-01 01:01:01.1111 + A_SECOND 2001-01-01 01:01:01.1111 + A_MINUTE 2001-01-01 01:01:01.1111 + A_HOUR 2001-01-01 01:01:01.1111 + A_DAY 2001-01-01 01:01:01.1111 + A_WEEK 2001-01-01 01:01:01.1111 + A_MONTH 2001-01-01 01:01:01.1111 + A_YEAR 2001-01-01 01:01:01.1111 +""" + +@pytest.mark.version('>=4.0.6') +def test_1(act: Action): + act.expected_stdout = expected_stdout + act.execute(combine_output = True) + assert act.clean_stdout == act.clean_expected_stdout From 77146b3ba88b74728b6c062929a51d37ef1d4555 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sun, 11 Aug 2024 16:14:34 +0300 Subject: [PATCH 003/128] Added/Updated tests\bugs\gh_8203_test.py: Checked on 6.0.0.423, 5.0.2.1477. See notes. --- tests/bugs/gh_8203_test.py | 239 +++++++++++++++++++++++++++++++++++++ 1 file changed, 239 insertions(+) create mode 100644 tests/bugs/gh_8203_test.py diff --git a/tests/bugs/gh_8203_test.py b/tests/bugs/gh_8203_test.py new file mode 100644 index 00000000..5604102c --- /dev/null +++ b/tests/bugs/gh_8203_test.py @@ -0,0 +1,239 @@ +#coding:utf-8 + +""" +ID: issue-8203 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8203 +TITLE: MAKE_DBKEY can raise 'malformed string' for some table names +DESCRIPTION: + Test verifies ability to create table with random name for each of Unicode ranges + defined in https://jrgraphix.net/r/Unicode/, except following: + (0xD800, 0xDB7F), # High Surrogates + (0xDB80, 0xDBFF), # High Private Use Surrogates + (0xDC00, 0xDFFF), # Low Surrogates + Random name is generated for each range, with random length from scope NAME_MIN_LEN ... NAME_MAX_LEN scope. + Then we create table with such name and stored procedure that attempts to use make_dbkey() with 1st argument + equals to just created table. + This action is repeated REPEAT_CHECKS_FOR_SELECTED_UNICODE_RANGE times for each Unicode range. + Some characters from 'Basic Latin' are NOT included in any table names - see CHARS_TO_SKIP. + No error must raise for any of checked Unicode scopes. + Example of output when problem does exist: + iter=4 of REPEAT_CHECKS_FOR_SELECTED_UNICODE_RANGE=5: SUCCESS + range_name='Basic Latin', ..., table_random_unicode_name='}JIry@frnWdzb]5[:A=IomGozwyM*rmJ' + Error while parsing procedure SP_CHK's BLR + -Malformed string + err.gds_codes=(335544876, 335544849) + err.sqlcode=-901 + err.sqlstate='2F000' +NOTES: + [11.08.2024] pzotov + Confirmed bug on 6.0.0.421, 5.0.1.1469 + Checked on 6.0.0.423, 5.0.2.1477 +""" +import pytest +from firebird.qa import * +from io import BytesIO +from firebird.driver import SrvRestoreFlag, DatabaseError +import locale +import random + +db = db_factory() +act = python_act('db', substitutions=[('[ \t]+', ' ')]) + +######################### +### s e t t i n g s ### +######################### +CHARS_TO_SKIP = set('<>|"\'^') +NAME_MIN_LEN = 32 +NAME_MAX_LEN = 63 +REPEAT_CHECKS_FOR_SELECTED_UNICODE_RANGE = 5 # duration: ~60" + +#------------------------------------------------ + +def get_random_unicode(length, bound_points): + # https://stackoverflow.com/questions/1477294/generate-random-utf-8-string-in-python + try: + get_char = unichr + except NameError: + get_char = chr + + alphabet = [ + get_char(code_point) for code_point in range(bound_points[0],bound_points[1]) + ] + return ''.join(random.choice(alphabet) for i in range(length)) + +#------------------------------------------------ + +@pytest.mark.version('>=5.0.2') +def test_1(act: Action, capsys): + + # https://jrgraphix.net/r/Unicode/ + UNICODE_RANGES_MAP = { + (0x0020, 0x007F) : 'Basic Latin', + (0x00A0, 0x00FF) : 'Latin-1 Supplement', + (0x0100, 0x017F) : 'Latin Extended-A', + (0x0180, 0x024F) : 'Latin Extended-B', + (0x0400, 0x04FF) : 'Cyrillic', + (0x0500, 0x052F) : 'Cyrillic Supplementary', + (0x0300, 0x036F) : 'Combining Diacritical Marks', + (0x0250, 0x02AF) : 'IPA Extensions', + (0x0370, 0x03FF) : 'Greek and Coptic', + (0x0530, 0x058F) : 'Armenian', + (0x02B0, 0x02FF) : 'Spacing Modifier Letters', + (0x0590, 0x05FF) : 'Hebrew', + (0x0600, 0x06FF) : 'Arabic', + (0x0700, 0x074F) : 'Syriac', + (0x0780, 0x07BF) : 'Thaana', + (0x0900, 0x097F) : 'Devanagari', + (0x0980, 0x09FF) : 'Bengali', + (0x0A00, 0x0A7F) : 'Gurmukhi', + (0x0A80, 0x0AFF) : 'Gujarati', + (0x0B00, 0x0B7F) : 'Oriya', + (0x0B80, 0x0BFF) : 'Tamil', + (0x0C00, 0x0C7F) : 'Telugu', + (0x0C80, 0x0CFF) : 'Kannada', + (0x0D00, 0x0D7F) : 'Malayalam', + (0x0D80, 0x0DFF) : 'Sinhala', + (0x0E00, 0x0E7F) : 'Thai', + (0x0E80, 0x0EFF) : 'Lao', + (0x0F00, 0x0FFF) : 'Tibetan', + (0x1000, 0x109F) : 'Myanmar', + (0x10A0, 0x10FF) : 'Georgian', + (0x1100, 0x11FF) : 'Hangul Jamo', + (0x1200, 0x137F) : 'Ethiopic', + (0x13A0, 0x13FF) : 'Cherokee', + (0x1400, 0x167F) : 'Unified Canadian Aboriginal Syllabics', + (0x1680, 0x169F) : 'Ogham', + (0x16A0, 0x16FF) : 'Runic', + (0x1700, 0x171F) : 'Tagalog', + (0x1720, 0x173F) : 'Hanunoo', + (0x1740, 0x175F) : 'Buhid', + (0x1760, 0x177F) : 'Tagbanwa', + (0x1780, 0x17FF) : 'Khmer', + (0x1800, 0x18AF) : 'Mongolian', + (0x1900, 0x194F) : 'Limbu', + (0x1950, 0x197F) : 'Tai Le', + (0x19E0, 0x19FF) : 'Khmer Symbols', + (0x1D00, 0x1D7F) : 'Phonetic Extensions', + (0x1E00, 0x1EFF) : 'Latin Extended Additional', + (0x1F00, 0x1FFF) : 'Greek Extended', + (0x2000, 0x206F) : 'General Punctuation', + (0x2070, 0x209F) : 'Superscripts and Subscripts', + (0x20A0, 0x20CF) : 'Currency Symbols', + (0x20D0, 0x20FF) : 'Combining Diacritical Marks for Symbols', + (0x2100, 0x214F) : 'Letterlike Symbols', + (0x2150, 0x218F) : 'Number Forms', + (0x2190, 0x21FF) : 'Arrows', + (0x2200, 0x22FF) : 'Mathematical Operators', + (0x2300, 0x23FF) : 'Miscellaneous Technical', + (0x2400, 0x243F) : 'Control Pictures', + (0x2440, 0x245F) : 'Optical Character Recognition', + (0x2460, 0x24FF) : 'Enclosed Alphanumerics', + (0x2500, 0x257F) : 'Box Drawing', + (0x2580, 0x259F) : 'Block Elements', + (0x25A0, 0x25FF) : 'Geometric Shapes', + (0x2600, 0x26FF) : 'Miscellaneous Symbols', + (0x2700, 0x27BF) : 'Dingbats', + (0x27C0, 0x27EF) : 'Miscellaneous Mathematical Symbols-A', + (0x27F0, 0x27FF) : 'Supplemental Arrows-A', + (0x2800, 0x28FF) : 'Braille Patterns', + (0x2900, 0x297F) : 'Supplemental Arrows-B', + (0x2980, 0x29FF) : 'Miscellaneous Mathematical Symbols-B', + (0x2A00, 0x2AFF) : 'Supplemental Mathematical Operators', + (0x2B00, 0x2BFF) : 'Miscellaneous Symbols and Arrows', + (0x2E80, 0x2EFF) : 'CJK Radicals Supplement', + (0x2F00, 0x2FDF) : 'Kangxi Radicals', + (0x2FF0, 0x2FFF) : 'Ideographic Description Characters', + (0x3000, 0x303F) : 'CJK Symbols and Punctuation', + (0x3040, 0x309F) : 'Hiragana', + (0x30A0, 0x30FF) : 'Katakana', + (0x3100, 0x312F) : 'Bopomofo', + (0x3130, 0x318F) : 'Hangul Compatibility Jamo', + (0x3190, 0x319F) : 'Kanbun', + (0x31A0, 0x31BF) : 'Bopomofo Extended', + (0x31F0, 0x31FF) : 'Katakana Phonetic Extensions', + (0x3200, 0x32FF) : 'Enclosed CJK Letters and Months', + (0x3300, 0x33FF) : 'CJK Compatibility', + (0x3400, 0x4DBF) : 'CJK Unified Ideographs Extension A', + (0x4DC0, 0x4DFF) : 'Yijing Hexagram Symbols', + (0x4E00, 0x9FFF) : 'CJK Unified Ideographs', + (0xA000, 0xA48F) : 'Yi Syllables', + (0xA490, 0xA4CF) : 'Yi Radicals', + (0xAC00, 0xD7AF) : 'Hangul Syllables', + (0xE000, 0xF8FF) : 'Private Use Area', + (0xF900, 0xFAFF) : 'CJK Compatibility Ideographs', + (0xFB00, 0xFB4F) : 'Alphabetic Presentation Forms', + (0xFB50, 0xFDFF) : 'Arabic Presentation Forms-A', + (0xFE00, 0xFE0F) : 'Variation Selectors', + (0xFE20, 0xFE2F) : 'Combining Half Marks', + (0xFE30, 0xFE4F) : 'CJK Compatibility Forms', + (0xFE50, 0xFE6F) : 'Small Form Variants', + (0xFE70, 0xFEFF) : 'Arabic Presentation Forms-B', + (0xFF00, 0xFFEF) : 'Halfwidth and Fullwidth Forms', + (0xFFF0, 0xFFFF) : 'Specials', + (0x10000, 0x1007F) : 'Linear B Syllabary', + (0x10080, 0x100FF) : 'Linear B Ideograms', + (0x10100, 0x1013F) : 'Aegean Numbers', + (0x10300, 0x1032F) : 'Old Italic', + (0x10330, 0x1034F) : 'Gothic', + (0x10380, 0x1039F) : 'Ugaritic', + (0x10400, 0x1044F) : 'Deseret', + (0x10450, 0x1047F) : 'Shavian', + (0x10480, 0x104AF) : 'Osmanya', + (0x10800, 0x1083F) : 'Cypriot Syllabary', + (0x1D000, 0x1D0FF) : 'Byzantine Musical Symbols', + (0x1D100, 0x1D1FF) : 'Musical Symbols', + (0x1D300, 0x1D35F) : 'Tai Xuan Jing Symbols', + (0x1D400, 0x1D7FF) : 'Mathematical Alphanumeric Symbols', + (0x20000, 0x2A6DF) : 'CJK Unified Ideographs Extension B', + (0x2F800, 0x2FA1F) : 'CJK Compatibility Ideographs Supplement', + (0xE0000, 0xE007F) : 'Tags', + } + + for bound_points, range_name in UNICODE_RANGES_MAP.items(): + + for iter in range(1,REPEAT_CHECKS_FOR_SELECTED_UNICODE_RANGE+1): + + + table_random_unicode_name = get_random_unicode( random.randint(NAME_MIN_LEN, NAME_MAX_LEN), bound_points ) + table_random_unicode_name = ''.join(c for c in table_random_unicode_name if c not in CHARS_TO_SKIP) + + test_sql = f""" + recreate table "{table_random_unicode_name.replace('"','""')}"(id int) + ^ + create or alter procedure sp_chk as + declare id1 int; + begin + select /* {range_name=} {iter=} */ id from "{table_random_unicode_name.replace('"','""')}" where rdb$db_key = make_dbkey('{table_random_unicode_name}', 0) into id1; + end + ^ + """ + # select id from "{table_random_unicode_name.replace('"','""')}" where rdb$db_key = make_dbkey('{table_random_unicode_name.replace("'","''")}', 0) into id1; + + expected_txt = f'{iter=} of {REPEAT_CHECKS_FOR_SELECTED_UNICODE_RANGE=}: SUCCESS' + with act.db.connect(charset = 'utf-8') as con: + try: + for line in test_sql.split('^'): + if (expr := line.strip()): + if expr != '^': + con.execute_immediate(expr) + else: + con.commit() + con.commit() + print(expected_txt) + except DatabaseError as err: + print(f'{range_name=}, {iter=} of {REPEAT_CHECKS_FOR_SELECTED_UNICODE_RANGE=}, {table_random_unicode_name=}') + print(err) + print(f'{err.gds_codes=}') + print(f'{err.sqlcode=}') + print(f'{err.sqlstate=}') + ''' + backup = BytesIO() + with act.connect_server() as srv: + srv.database.local_backup(database=act.db.db_path, backup_stream=backup) + backup.seek(0) + srv.database.local_restore(backup_stream=backup, database=act.db.db_path, flags = SrvRestoreFlag.REPLACE) + ''' + act.expected_stdout = expected_txt + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout + act.reset() From ec8f44b9897bdb0e2866e2661d57f791c144430c Mon Sep 17 00:00:00 2001 From: Adriano dos Santos Fernandes Date: Sun, 11 Aug 2024 11:13:42 -0300 Subject: [PATCH 004/128] Do not run encryption tests in docker. --- docker/run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/run.sh b/docker/run.sh index 10c687fd..ce0d7970 100755 --- a/docker/run.sh +++ b/docker/run.sh @@ -21,5 +21,5 @@ pytest \ --md-report-output /qa-out/md_report.md \ --ignore=tests/functional/replication \ --ignore=tests/functional/basic/isql/test_08.py \ - -m "not replication" \ + -m "not replication and not encryption" \ "$@" From 1d19a27575b4622bf60136cde6edbb54bd31b179 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Mon, 12 Aug 2024 09:42:14 +0300 Subject: [PATCH 005/128] Added alias 'tmp_fd0fa8a3_alias' for upcoming test --- files/qa-databases.conf | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/files/qa-databases.conf b/files/qa-databases.conf index 8ef4f321..5681f655 100644 --- a/files/qa-databases.conf +++ b/files/qa-databases.conf @@ -262,6 +262,13 @@ tmp_gh_8194_alias = $(dir_sampleDb)/qa/tmp_gh_8194.fdb DefaultDbCachePages = 128 } +# https://github.com/FirebirdSQL/firebird/commit/fd0fa8a3a58fbfe7fdc0641b4e48258643d72127 +# Let include file name into error message when creation of temp file failed +tmp_fd0fa8a3_alias = $(dir_sampleDb)/qa/tmp_fd0fa8a3.fdb +{ + TempTableDirectory = <> +} + # Databases for replication tests: # From a3639776965424785fce43a348bbf684f3824b60 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Mon, 12 Aug 2024 09:58:06 +0300 Subject: [PATCH 006/128] Added/Updated tests\functional\tabloid\test_fd0fa8a3.py: Checked on Windows/Linux, 6.0.0.423, 5.0.2.1477, 4.0.6.3141. --- tests/functional/tabloid/test_fd0fa8a3.py | 137 ++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 tests/functional/tabloid/test_fd0fa8a3.py diff --git a/tests/functional/tabloid/test_fd0fa8a3.py b/tests/functional/tabloid/test_fd0fa8a3.py new file mode 100644 index 00000000..d3a6768e --- /dev/null +++ b/tests/functional/tabloid/test_fd0fa8a3.py @@ -0,0 +1,137 @@ +#coding:utf-8 + +""" +ID: None +ISSUE: https://github.com/FirebirdSQL/firebird/commit/fd0fa8a3a58fbfe7fdc0641b4e48258643d72127 +TITLE: Let include file name into error message when creation of temp file failed. +DESCRIPTION: + Test uses pre-created databases.conf which has alias 'tmp_fd0fa8a3_alias' (see variable REQUIRED_ALIAS). + Database file for that alias must NOT exist in the $(dir_sampleDb)/qa/ subdirectory: it will be created here. + For this alias parameter TempTableDirectory is defined and it points to invalid/inaccessible directory. + Currently its value is: '<>' (without single quotes), so there is no way to create any file in it. + We check that: + * client still has ability to create GTT and put data in it, without getting error; + * firebird.log will have appropriate message about problem with creating file ('fb_*****') in TempTableDirectory +NOTES: + [12.08.2024] pzotov + 1. One need to be sure that firebird.conf does NOT contain DatabaseAccess = None. + 2. Value of REQUIRED_ALIAS must be EXACTLY the same as alias specified in the pre-created databases.conf + (for LINUX this equality is case-sensitive, even when aliases are compared!) + 3. Content of databases.conf must be taken from $QA_ROOT/files/qa-databases.conf (one need to replace it before every test session). + Discussed with pcisar, letters since 30-may-2022 13:48, subject: + "new qa, core_4964_test.py: strange outcome when use... shutil.copy() // comparing to shutil.copy2()" + 4. Invalid value of TempTableDirectory causes appropriate message to appear in firebird.log TWO times: first when QA-plugin prepares + test database (and this is out of scope to be checked by this test), and second when we try to insert data in the GTT. + DDL statement ('create global temporary table') does NOT cause any message in firebird.log until we do not try to add data in it. + Because of that, difference between content of firebird.log will contain only ONE message "Error creating file...". + + Parameter 'TempTableDirectory' exists in FB-4.x since 20.04.2021, commit f2805020a6f34d253c93b8edac6068c1b35f9b89., build 4.0.0.2436. + Checked on Windows/Linux, 6.0.0.423, 5.0.2.1477, 4.0.6.3141. +""" + +import os +import re +import locale +from difflib import unified_diff +from pathlib import Path + +import pytest +from firebird.qa import * + +REQUIRED_ALIAS = 'tmp_fd0fa8a3_alias' + +substitutions = [ ('[ \t]+', ' ') + ,('Error creating file in TempTableDirectory.*', 'Error creating file in TempTableDirectory') + ,('I/O error during "((CreateFile\\s+\\(create\\))|open)" operation for file.*', 'I/O error during CreateFile operation for file') + ] +db = db_factory(filename = '#' + REQUIRED_ALIAS) +act = python_act('db', substitutions = substitutions) + +@pytest.mark.version('>=4.0') +def test_1(act: Action, capsys): + + # Scan line-by-line through databases.conf, find line starting with REQUIRED_ALIAS and extract name of file that + # must be created in the $(dir_sampleDb)/qa/ folder. This name will be used further as target database (tmp_fdb). + # NOTE: we have to SKIP lines which are commented out, i.e. if they starts with '#': + p_required_alias_ptn = re.compile( '^(?!#)((^|\\s+)' + REQUIRED_ALIAS + ')\\s*=\\s*\\$\\(dir_sampleDb\\)/qa/', re.IGNORECASE ) + fname_in_dbconf = None + + with open(act.home_dir/'databases.conf', 'r') as f: + for line in f: + if p_required_alias_ptn.search(line): + # If databases.conf contains line like this: + # tmp_NNNN_alias = $(dir_sampleDb)/qa/tmp_qa_NNNN.fdb + # - then we extract filename: 'tmp_qa_NNNN.fdb' (see below): + fname_in_dbconf = Path(line.split('=')[1].strip()).name + break + + # if 'fname_in_dbconf' remains undefined here then propably REQUIRED_ALIAS not equals to specified in the databases.conf! + # + assert fname_in_dbconf + + check_sql = f""" + set bail on; + recreate global temporary table test(x int); + set count on; + insert into test(x) values(1); + """ + + # Check-1: no error must be issued on client-side, all records have to be inserted: + # + expected_stdout = f""" + Records affected: 1 + """ + + # Get content of firebird.log BEFORE test. + # ::: NB ::: + # At this point firebird.log must already contain message about unable to create file because of inaccessible TempTableDirectory value. + # This message was added when test database have been created by QA-plugin, i.e. out of this test code. So, the difference between + # log content will NOT contain this message! + # + log_before = act.get_firebird_log() + + act.expected_stdout = expected_stdout + act.isql(switches=['-q'], input = check_sql, combine_output = True, io_enc = locale.getpreferredencoding()) + assert act.clean_stdout == act.clean_expected_stdout + act.reset() + + # Get content of firebird.log AFTER test. + # ONLY ONE message about invalid TempTableDirectory value will be taken in account! + # + log_after = act.get_firebird_log() + + #---------------------------------------------------- + + # Check-2: firebird.log must have message (partially localized): + # on Windows: + # Database: ... + # Error creating file in TempTableDirectory "..." + # I/O error during "CreateFile (create)" operation for file "..." + # Error while trying to create file + # Syntax error in file name, folder name, or volume label [ NB: THIS LINE CAN BE LOCALIZED ] + # + # on LINUX: + # Database: ... + # Error creating file in TempTableDirectory "..." + # I/O error during "open" operation for file "..." + # Error while trying to create file + # No such file or directory + + allowed_patterns = [ re.compile('Error creating file in TempTableDirectory',re.IGNORECASE), + re.compile('I/O error during "((CreateFile\\s+\\(create\\))|open)" operation for file',re.IGNORECASE), + re.compile('Error while trying to create file',re.IGNORECASE) + ] + + for line in unified_diff(log_before, log_after): + if (msg := line.strip()): + if msg.startswith('+') and act.match_any(msg, allowed_patterns): + print(msg[1:]) + + act.expected_stdout = """ + Error creating file in TempTableDirectory + I/O error during "CreateFile (create)" operation for file + Error while trying to create file + """ + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout + act.reset() From 4d3822464ddbeb4d71915e510efe7438d9613d89 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Mon, 12 Aug 2024 10:04:10 +0300 Subject: [PATCH 007/128] Added/Updated tests\bugs\core_6487_test.py: minor adjustment --- tests/bugs/core_6487_test.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/bugs/core_6487_test.py b/tests/bugs/core_6487_test.py index 68156a0f..38a51bb8 100644 --- a/tests/bugs/core_6487_test.py +++ b/tests/bugs/core_6487_test.py @@ -3,8 +3,7 @@ """ ID: issue-6717 ISSUE: 6717 -TITLE: FETCH ABSOLUTE and RELATIVE beyond bounds of cursor should always position - immediately before-first or after-last +TITLE: FETCH ABSOLUTE and RELATIVE beyond bounds of cursor should always position immediately before-first or after-last DESCRIPTION: JIRA: CORE-6487 FBTEST: bugs.core_6487 From 980cf2950e0e0e0ccd60d0ab93feb54e41123fb8 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Mon, 12 Aug 2024 14:47:01 +0300 Subject: [PATCH 008/128] Added/Updated tests\functional\tabloid\test_80fd0682.py: Checked on 4.0.0.2372. Checked on 6.0.0.423, 5.0.2.1477. --- tests/functional/tabloid/test_80fd0682.py | 179 ++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 tests/functional/tabloid/test_80fd0682.py diff --git a/tests/functional/tabloid/test_80fd0682.py b/tests/functional/tabloid/test_80fd0682.py new file mode 100644 index 00000000..352c63b4 --- /dev/null +++ b/tests/functional/tabloid/test_80fd0682.py @@ -0,0 +1,179 @@ +#coding:utf-8 + +""" +ID: None +ISSUE: https://github.com/FirebirdSQL/firebird/commit/80fd06828e72f9e8335150c923350730013b3b28 +TITLE: Fixed bug with index names patterns in online validation service +DESCRIPTION: + Sources to read (19-feb-2021): + https://sourceforge.net/p/firebird/mailman/message/37222898/ + https://sourceforge.net/p/firebird/mailman/message/37223338/ + (Firebird-devel Digest, Vol 178, Issue 34; Vol 178, Issue 35) +NOTES: + Confirmed bug on 4.0.0.2369. + Checked on 4.0.0.2372 -- all fine. + Checked on 6.0.0.423, 5.0.2.1477. +""" + +import re +import pytest +from firebird.qa import * + +init_sql = """ + create table a(id int); + create index a on a(id); + create table b(id int); + create index x on b(id); + create table c(id int); + create index c on c(id); + commit; +""" +db = db_factory(init = init_sql) + +substitutions = [ ('[ \t]+', ' ') + ] +act = python_act('db', substitutions = substitutions) + +#------------------------------------------------------------- + +def clean_text(line: str): + # Used to remove timestamp from the beginning of line, + # then remove ID of relation / index.: + line = re.sub(r'^\d{2}:\d{2}:\d{2}.\d{2,3}\s+', '', line) + line = re.sub('Relation \\d+ \\(', 'Relation (', line) + line = re.sub('Index \\d+ \\(', 'Index (', line) + return line + +#------------------------------------------------------------- + +@pytest.mark.version('>=4.0') +def test_1(act: Action, capsys): + + validation_log = [] + # Run online database validation: + with act.connect_server() as srv: + for ix_key in ('incl', 'excl'): + for tab_name in ('A', 'B'): + if ix_key == 'incl': + srv.database.validate(database=act.db.db_path, include_table = tab_name.upper()) + else: + srv.database.validate(database=act.db.db_path, exclude_table = tab_name.upper()) + validation_log.append(f'{ix_key=}, {tab_name=}') + validation_log.extend( [clean_text(line) for line in srv.readlines()] ) + for idx_name in ('A', 'X'): + if ix_key == 'incl': + srv.database.validate(database=act.db.db_path, include_index = idx_name.upper()) + else: + srv.database.validate(database=act.db.db_path, exclude_index = idx_name.upper()) + validation_log.append(f'{ix_key=}, {idx_name=}') + validation_log.extend( [clean_text(line) for line in srv.readlines()] ) + # validation_log.extend( [ re.sub('Index \\d+ \\(', 'Index (', re.sub(r'^\d{2}:\d{2}:\d{2}.\d{2,3}\s+', '', line)) for line in srv.readlines() ] ) + #for line in srv.readlines(): + # validation_log.append( clean_text(line) ) + + + for line in validation_log: + print(line) + + act.expected_stdout = """ + ix_key='incl', tab_name='A' + Validation started + Relation (A) + process pointer page 0 of 1 + Index (A) + Relation (A) is ok + Validation finished + + ix_key='incl', tab_name='B' + Validation started + Relation (B) + process pointer page 0 of 1 + Index (X) + Relation (B) is ok + Validation finished + + ix_key='incl', idx_name='A' + Validation started + Relation (A) + process pointer page 0 of 1 + Index (A) + Relation (A) is ok + Relation (B) + process pointer page 0 of 1 + Relation (B) is ok + Relation (C) + process pointer page 0 of 1 + Relation (C) is ok + Validation finished + + ix_key='incl', idx_name='X' + Validation started + Relation (A) + process pointer page 0 of 1 + Relation (A) is ok + Relation (B) + process pointer page 0 of 1 + Index (X) + Relation (B) is ok + Relation (C) + process pointer page 0 of 1 + Relation (C) is ok + Validation finished + + ix_key='excl', tab_name='A' + Validation started + Relation (B) + process pointer page 0 of 1 + Index (X) + Relation (B) is ok + Relation (C) + process pointer page 0 of 1 + Index (C) + Relation (C) is ok + Validation finished + + ix_key='excl', tab_name='B' + Validation started + Relation (A) + process pointer page 0 of 1 + Index (A) + Relation (A) is ok + Relation (C) + process pointer page 0 of 1 + Index (C) + Relation (C) is ok + Validation finished + + ix_key='excl', idx_name='A' + Validation started + Relation (A) + process pointer page 0 of 1 + Relation (A) is ok + Relation (B) + process pointer page 0 of 1 + Index (X) + Relation (B) is ok + Relation (C) + process pointer page 0 of 1 + Index (C) + Relation (C) is ok + Validation finished + + ix_key='excl', idx_name='X' + Validation started + Relation (A) + process pointer page 0 of 1 + Index (A) + Relation (A) is ok + Relation (B) + process pointer page 0 of 1 + Relation (B) is ok + Relation (C) + process pointer page 0 of 1 + Index (C) + Relation (C) is ok + Validation finished + """ + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout + act.reset() From be6cd50fccfcf95c8c1cd01966ae2cdefbab2973 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Wed, 14 Aug 2024 12:14:05 +0300 Subject: [PATCH 009/128] Added/Updated tests\bugs\gh_7767_test.py: Checked on 6.0.0.436, 5.0.2.1478, 4.0.6.3142 (all SS/CS; both Windows and Linux). --- tests/bugs/gh_7767_test.py | 171 +++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 tests/bugs/gh_7767_test.py diff --git a/tests/bugs/gh_7767_test.py b/tests/bugs/gh_7767_test.py new file mode 100644 index 00000000..817f750c --- /dev/null +++ b/tests/bugs/gh_7767_test.py @@ -0,0 +1,171 @@ +#coding:utf-8 + +""" +ID: issue-7767 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/7767 +TITLE: Slow drop trigger command execution under FB5.0 +DESCRIPTION: + The issued problem can NOT be stably reproduced if we compare time ratio between 'DROP TRIGGER' vs 'DROP PROCEDURE' statements. + ratio between execution time differed for too small value (e.g. 7.2 before fix and 6.9 after it). + + But regression can be noted if we check ratio between CPU time spent for 'DROP TRIGGER' and some code that does not relate + to any DB operations and makes some evaluation. Such code can be single call to CRYPT_HASH function (doing in loop many times). + This function must be called EVAL_CRYPT_HASH_COUNT times. + Result of evaluating of CRYPT_HASH is stored in var. 'eval_crypt_hash_time' and serves further as "etalone" value. + + Test database is initialized by creation of PSQL_OBJECTS_COUNT triggers and is copied to backup FDB (see 'tmp_fdb'). + Then we call 'DROP TRIGGER' using 'for select ... from rdb$triggers' cursor (so their count is also PSQL_OBJECTS_COUNT). + We repeat this in loop for MEASURES_COUNT iterations, doing restore from DB copy before every iteration (copy 'tmp_fdb' to act.db). + Median of ratios between CPU times obtained in this loop and eval_crypt_hash_time must be less than MAX_RATIO. + Duration is measured as difference between psutil.Process(fb_pid).cpu_times() counters. +NOTES: + [14.08.2024] pzotov + Problem did exist in FB 5.x until commit "Fix #7759 - Routine calling overhead increased by factor 6 vs Firebird 4.0.0." + https://github.com/FirebirdSQL/firebird/commit/d621ffbe0cf2d43e13480628992180c28a5044fe (03-oct-2023 13:32). + Before this commit (up to 5.0.0.1236) median of ratios was more than 6.5. + After fix it was reduced to ~3.5 ... 4.0 (5.0.0.1237 and above). + This ratio seems to be same on Windows and Linux. + + Built-in function CRYPT_HASH appeared in 4.0.0.2180, 27-aug-2020, commit: + https://github.com/FirebirdSQL/firebird/commit/e9f3eb360db41ddff27fa419b908876be0d2daa5 + ("Moved cryptographic hashes to separate function crypt_hash(), crc32 - into function hash()") + + Test duration time: about 50s. + Checked on 6.0.0.436, 5.0.2.1478, 4.0.6.3142 (all SS/CS; both Windows and Linux). +""" +import shutil +from pathlib import Path +import psutil +import pytest +from firebird.qa import * +import time + +########################### +### S E T T I N G S ### +########################### + +# How many times to generate crypt_hash: +EVAL_CRYPT_HASH_COUNT=5000 + +# How many times we call procedures: +MEASURES_COUNT = 11 + +# How many procedures and triggers must be created: +PSQL_OBJECTS_COUNT = 500 + +# Maximal value for ratio between maximal and minimal medians +# +MAX_RATIO = 6 +############# + +init_sql = """ + set bail on; + alter database set linger to 0; + create sequence g; + create table test(id int); + commit; + set term ^; +""" +init_sql = '\n'.join( + ( init_sql + ,'\n'.join( [ f'create trigger tg_{i} for test before insert as declare v int; begin v = gen_id(g,1); end ^' for i in range(PSQL_OBJECTS_COUNT) ] ) + ,'^ set term ;^' + ,'commit;' + ) + ) + +db = db_factory(init = init_sql) +act = python_act('db') + +tmp_fdb = temp_file('tmp_gh_7767_copy.tmp') + +expected_stdout = """ + Medians ratio: acceptable +""" + +eval_crypt_code = f""" + execute block as + declare v_hash varbinary(64); + declare n int = {EVAL_CRYPT_HASH_COUNT}; + begin + while (n > 0) do begin + v_hash = crypt_hash(lpad('', 32765, uuid_to_char(gen_uuid())) using SHA512); + n = n - 1; + end + end +""" + +drop_trg_code = """ + execute block as + declare trg_drop type of column rdb$triggers.rdb$trigger_name; + begin + for select 'DROP TRIGGER '||trim(rdb$trigger_name) + from rdb$triggers + where rdb$system_flag=0 + into :trg_drop do + begin + in autonomous transaction do + begin + execute statement :trg_drop; + end + end + end +""" + +#-------------------------------------------------------------------- +def median(lst): + n = len(lst) + s = sorted(lst) + return (sum(s[n//2-1:n//2+1])/2.0, s[n//2])[n % 2] if n else None + +#-------------------------------------------------------------------- + +def get_server_pid(con): + with con.cursor() as cur: + cur.execute('select mon$server_pid as p from mon$attachments where mon$attachment_id = current_connection') + fb_pid = int(cur.fetchone()[0]) + return fb_pid + +#-------------------------------------------------------------------- + +@pytest.mark.version('>=4.0.0') +def test_1(act: Action, tmp_fdb: Path, capsys): + + shutil.copy2(act.db.db_path, tmp_fdb) + + with act.db.connect() as con: + fb_pid = get_server_pid(con) + fb_info_init = psutil.Process(fb_pid).cpu_times() + con.execute_immediate( eval_crypt_code ) + fb_info_curr = psutil.Process(fb_pid).cpu_times() + eval_crypt_hash_time = max(fb_info_curr.user - fb_info_init.user, 0.000001) + + ddl_time = {} + for iter in range(MEASURES_COUNT): + + with act.db.connect() as con: + fb_pid = get_server_pid(con) + fb_info_init = psutil.Process(fb_pid).cpu_times() + con.execute_immediate( drop_trg_code ) + fb_info_curr = psutil.Process(fb_pid).cpu_times() + ddl_time[ 'tg', iter ] = max(fb_info_curr.user - fb_info_init.user, 0.000001) + + # Quick jump back to database with PSQL_OBJECTS_COUNT triggers that we made on init phase: + shutil.copy2(tmp_fdb, act.db.db_path) + + ratios = [ ddl_time['tg',iter] / eval_crypt_hash_time for iter in range(MEASURES_COUNT) ] + median_ratio = median(ratios) + + SUCCESS_MSG = 'Medians ratio: acceptable' + if median_ratio < MAX_RATIO: + print(SUCCESS_MSG) + else: + print( 'Medians ratio: /* perf_issue_tag */ POOR: %s, more than threshold: %s' % ( '{:.2f}'.format(median_ratio), '{:.2f}'.format(MAX_RATIO) ) ) + print('ratios:',['{:.2f}'.format(r) for r in ratios]) + print('CPU times:') + for k,v in ddl_time.items(): + print(k,':::','{:.2f}'.format(v)) + + act.expected_stdout = SUCCESS_MSG + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From 572c7c78b07d6f5d36b6af3d2e960ce5b72544b9 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 15 Aug 2024 13:23:14 +0300 Subject: [PATCH 010/128] Added/Updated tests\bugs\gh_5978_test.py: minor change in comments --- tests/bugs/gh_5978_test.py | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/tests/bugs/gh_5978_test.py b/tests/bugs/gh_5978_test.py index 6bdba7a3..c443c4ca 100644 --- a/tests/bugs/gh_5978_test.py +++ b/tests/bugs/gh_5978_test.py @@ -5,21 +5,33 @@ ID: issue-5978 ISSUE: https://github.com/FirebirdSQL/firebird/issues/5978 TITLE: Access to the name of DB encryption key [CORE5712] DESCRIPTION: - Test creates temporary user with system privilege GET_DBCRYPT_INFO in order to allow him to obtain encryption info. - Then we run following: - 1) encrypt DB using plugin 'fbSampleDbCrypt' provided in every FB 4.x+ snapshot; - 2) make connection as SYSDBA and ask DB-crypt info (DbInfoCode.CRYPT_PLUGIN and DbInfoCode.CRYPT_KEY) - 3) decrypt DB - After this we repeat these actions, except that in "2)" we use temporary user ('tmp_senior') instead of SYSDBA - (he must get same info as was obtained in previous step for SYSDBA). + Test uses Firebird built-in encryption plugin wich actually does encryption using trivial algorithm. + Before running this test following prerequisites must be met: + 1. Files fbSampleKeyHolder.conf, fbSampleKeyHolder.dll, fbSampleDbCrypt.conf and fbSampleDbCrypt.dll + must be copied from $FB_HOME/examples/prebuilt/plugins/ to $FB_HOME/plugins/ + (on Linux name of binaries are: libfbSampleDbCrypt.so and libfbSampleKeyHolder.so) + 2. File fbSampleKeyHolder.conf must contain lines: Auto = true and KeyRed = + 3. File $QA_HOME/pytest.ini must contain line with 'encryption' marker declaration. + + We create temporary user with system privilege GET_DBCRYPT_INFO in order to allow him to obtain encryption info. + Then we run following: + 1) encrypt DB using plugin 'fbSampleDbCrypt' provided in every FB 4.x+ snapshot; + 2) make connection as SYSDBA and ask DB-crypt info (DbInfoCode.CRYPT_PLUGIN and DbInfoCode.CRYPT_KEY) + 3) decrypt DB + After this we repeat these actions, except that in "2)" we use temporary user ('tmp_senior') instead of SYSDBA + (he must get same info as was obtained in previous step for SYSDBA). NOTES: - [08.05.2024] pzotov + [08.05.2024] pzotov - ### ACHTUNG ### TEST REQUIRES FIREBIRD-DRIVER VERSION 1.10.4+ (date: 07-may-2024). - See reply from pcisar, letters with subj: "fb_info_crypt_key: how it can be obtained using firebird-driver ? // GH-5978, 2018" + ### ACHTUNG ### TEST REQUIRES FIREBIRD-DRIVER VERSION 1.10.4+ (date: 07-may-2024). + Thanks to pcisar for explanation of DbInfoCode usage. + See letters with subj "fb_info_crypt_key: how it can be obtained using firebird-driver ? // GH-5978, 2018" (27.04.2024 14:55). - Checked on 4.0.5.3092, 5.0.1.1395, 6.0.0.346. - FB 3.x is not checked. + Firebird 3.x can not be checked. Exception: + raise NotSupportedError(f"Info code {info_code} not supported by engine version {self.__engine_version}") + firebird.driver.types.NotSupportedError: Info code 138 not supported by engine version 3.0 + + Checked on 4.0.5.3092, 5.0.1.1395, 6.0.0.346. """ import os import locale From 2333bc1db1173fc3533b1448735cddb557955913 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 15 Aug 2024 22:03:24 +0300 Subject: [PATCH 011/128] Added/Updated tests\bugs\gh_6545_test.py: Checked on 4.0.0.436, 5.0.2.1478, 4.0.6.3142. NOTE: TEST REQUIRES FIREBIRD-DRIVER VERSION 1.10.6+ --- tests/bugs/gh_6545_test.py | 689 +++++++++++++++++++++++++++++++++++++ 1 file changed, 689 insertions(+) create mode 100644 tests/bugs/gh_6545_test.py diff --git a/tests/bugs/gh_6545_test.py b/tests/bugs/gh_6545_test.py new file mode 100644 index 00000000..89bab2b5 --- /dev/null +++ b/tests/bugs/gh_6545_test.py @@ -0,0 +1,689 @@ +#coding:utf-8 + +""" +ID: issue-6545 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/6545 +TITLE: Error writing to TIMESTAMP/TIME WITH TIME ZONE array +DESCRIPTION: + Test generates values which will be inserted into ARRAY columns defined as 'time with time zone' and 'timestamp with time zone'. + We process time zones defined in the FB_HOME/include/firebird/TimeZones.h (except several, see notes below), + and use every time zone value as argument to 'get_timezone()' in datetime.dsatetime / datetime.time calls. + Then we run DML which tries to insert tuple of generated data into appropriate ARRAY columns. This must not raise error. + Finally, we run query to get just inserted data and compare its result with input argument that was used in previous step. +NOTES: + [15.08.2024] pzotov + 1. ### ACHTUNG ### TEST REQUIRES FIREBIRD-DRIVER VERSION 1.10.6+ (date: 15-aug-2024). + See also addition in firebird-driver doc: + https://firebird-driver.readthedocs.io/en/latest/usage-guide.html#working-with-time-timestamp-with-timezone + + 2. Following timezones present in $FB_HOME/include/firebird/TimeZones.h + and in https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + but are absent in pytz.all_timezones list: + America/Ciudad_Juarez + Europe/Kyiv + Pacific/Kanton + We have to SKIP them from handling. + + Checked on 4.0.0.436, 5.0.2.1478, 4.0.6.3142 +""" +import datetime +from firebird.driver import get_timezone +import random + +import pytest +from firebird.qa import * + +init_script = """ + create table test ( + arr_tmtz time with time zone [0:2] + ,arr_tstz timestamp with time zone [0:2] + ); +""" +db = db_factory(init = init_script) + +act = python_act('db') + +@pytest.mark.version('>=4.0') +def test_1(act: Action, capsys): + fb_time_zones = [ + 'Africa/Abidjan' + ,'Africa/Accra' + ,'Africa/Addis_Ababa' + ,'Africa/Algiers' + ,'Africa/Asmara' + ,'Africa/Asmera' + ,'Africa/Bamako' + ,'Africa/Bangui' + ,'Africa/Banjul' + ,'Africa/Bissau' + ,'Africa/Blantyre' + ,'Africa/Brazzaville' + ,'Africa/Bujumbura' + ,'Africa/Cairo' + ,'Africa/Casablanca' + ,'Africa/Ceuta' + ,'Africa/Conakry' + ,'Africa/Dakar' + ,'Africa/Dar_es_Salaam' + ,'Africa/Djibouti' + ,'Africa/Douala' + ,'Africa/El_Aaiun' + ,'Africa/Freetown' + ,'Africa/Gaborone' + ,'Africa/Harare' + ,'Africa/Johannesburg' + ,'Africa/Juba' + ,'Africa/Kampala' + ,'Africa/Khartoum' + ,'Africa/Kigali' + ,'Africa/Kinshasa' + ,'Africa/Lagos' + ,'Africa/Libreville' + ,'Africa/Lome' + ,'Africa/Luanda' + ,'Africa/Lubumbashi' + ,'Africa/Lusaka' + ,'Africa/Malabo' + ,'Africa/Maputo' + ,'Africa/Maseru' + ,'Africa/Mbabane' + ,'Africa/Mogadishu' + ,'Africa/Monrovia' + ,'Africa/Nairobi' + ,'Africa/Ndjamena' + ,'Africa/Niamey' + ,'Africa/Nouakchott' + ,'Africa/Ouagadougou' + ,'Africa/Porto-Novo' + ,'Africa/Sao_Tome' + ,'Africa/Timbuktu' + ,'Africa/Tripoli' + ,'Africa/Tunis' + ,'Africa/Windhoek' + ,'America/Adak' + ,'America/Anchorage' + ,'America/Anguilla' + ,'America/Antigua' + ,'America/Araguaina' + ,'America/Argentina/Buenos_Aires' + ,'America/Argentina/Catamarca' + ,'America/Argentina/ComodRivadavia' + ,'America/Argentina/Cordoba' + ,'America/Argentina/Jujuy' + ,'America/Argentina/La_Rioja' + ,'America/Argentina/Mendoza' + ,'America/Argentina/Rio_Gallegos' + ,'America/Argentina/Salta' + ,'America/Argentina/San_Juan' + ,'America/Argentina/San_Luis' + ,'America/Argentina/Tucuman' + ,'America/Argentina/Ushuaia' + ,'America/Aruba' + ,'America/Asuncion' + ,'America/Atikokan' + ,'America/Atka' + ,'America/Bahia' + ,'America/Bahia_Banderas' + ,'America/Barbados' + ,'America/Belem' + ,'America/Belize' + ,'America/Blanc-Sablon' + ,'America/Boa_Vista' + ,'America/Bogota' + ,'America/Boise' + ,'America/Buenos_Aires' + ,'America/Cambridge_Bay' + ,'America/Campo_Grande' + ,'America/Cancun' + ,'America/Caracas' + ,'America/Catamarca' + ,'America/Cayenne' + ,'America/Cayman' + ,'America/Chicago' + ,'America/Chihuahua' + # -- !! -- ,'America/Ciudad_Juarez' + ,'America/Coral_Harbour' + ,'America/Cordoba' + ,'America/Costa_Rica' + ,'America/Creston' + ,'America/Cuiaba' + ,'America/Curacao' + ,'America/Danmarkshavn' + ,'America/Dawson' + ,'America/Dawson_Creek' + ,'America/Denver' + ,'America/Detroit' + ,'America/Dominica' + ,'America/Edmonton' + ,'America/Eirunepe' + ,'America/El_Salvador' + ,'America/Ensenada' + ,'America/Fort_Nelson' + ,'America/Fort_Wayne' + ,'America/Fortaleza' + ,'America/Glace_Bay' + ,'America/Godthab' + ,'America/Goose_Bay' + ,'America/Grand_Turk' + ,'America/Grenada' + ,'America/Guadeloupe' + ,'America/Guatemala' + ,'America/Guayaquil' + ,'America/Guyana' + ,'America/Halifax' + ,'America/Havana' + ,'America/Hermosillo' + ,'America/Indiana/Indianapolis' + ,'America/Indiana/Knox' + ,'America/Indiana/Marengo' + ,'America/Indiana/Petersburg' + ,'America/Indiana/Tell_City' + ,'America/Indiana/Vevay' + ,'America/Indiana/Vincennes' + ,'America/Indiana/Winamac' + ,'America/Indianapolis' + ,'America/Inuvik' + ,'America/Iqaluit' + ,'America/Jamaica' + ,'America/Jujuy' + ,'America/Juneau' + ,'America/Kentucky/Louisville' + ,'America/Kentucky/Monticello' + ,'America/Knox_IN' + ,'America/Kralendijk' + ,'America/La_Paz' + ,'America/Lima' + ,'America/Los_Angeles' + ,'America/Louisville' + ,'America/Lower_Princes' + ,'America/Maceio' + ,'America/Managua' + ,'America/Manaus' + ,'America/Marigot' + ,'America/Martinique' + ,'America/Matamoros' + ,'America/Mazatlan' + ,'America/Mendoza' + ,'America/Menominee' + ,'America/Merida' + ,'America/Metlakatla' + ,'America/Mexico_City' + ,'America/Miquelon' + ,'America/Moncton' + ,'America/Monterrey' + ,'America/Montevideo' + ,'America/Montreal' + ,'America/Montserrat' + ,'America/Nassau' + ,'America/New_York' + ,'America/Nipigon' + ,'America/Nome' + ,'America/Noronha' + ,'America/North_Dakota/Beulah' + ,'America/North_Dakota/Center' + ,'America/North_Dakota/New_Salem' + ,'America/Nuuk' + ,'America/Ojinaga' + ,'America/Panama' + ,'America/Pangnirtung' + ,'America/Paramaribo' + ,'America/Phoenix' + ,'America/Port-au-Prince' + ,'America/Port_of_Spain' + ,'America/Porto_Acre' + ,'America/Porto_Velho' + ,'America/Puerto_Rico' + ,'America/Punta_Arenas' + ,'America/Rainy_River' + ,'America/Rankin_Inlet' + ,'America/Recife' + ,'America/Regina' + ,'America/Resolute' + ,'America/Rio_Branco' + ,'America/Rosario' + ,'America/Santa_Isabel' + ,'America/Santarem' + ,'America/Santiago' + ,'America/Santo_Domingo' + ,'America/Sao_Paulo' + ,'America/Scoresbysund' + ,'America/Shiprock' + ,'America/Sitka' + ,'America/St_Barthelemy' + ,'America/St_Johns' + ,'America/St_Kitts' + ,'America/St_Lucia' + ,'America/St_Thomas' + ,'America/St_Vincent' + ,'America/Swift_Current' + ,'America/Tegucigalpa' + ,'America/Thule' + ,'America/Thunder_Bay' + ,'America/Tijuana' + ,'America/Toronto' + ,'America/Tortola' + ,'America/Vancouver' + ,'America/Virgin' + ,'America/Whitehorse' + ,'America/Winnipeg' + ,'America/Yakutat' + ,'America/Yellowknife' + ,'Antarctica/Casey' + ,'Antarctica/Davis' + ,'Antarctica/DumontDUrville' + ,'Antarctica/Macquarie' + ,'Antarctica/Mawson' + ,'Antarctica/McMurdo' + ,'Antarctica/Palmer' + ,'Antarctica/Rothera' + ,'Antarctica/South_Pole' + ,'Antarctica/Syowa' + ,'Antarctica/Troll' + ,'Antarctica/Vostok' + ,'Arctic/Longyearbyen' + ,'Asia/Aden' + ,'Asia/Almaty' + ,'Asia/Amman' + ,'Asia/Anadyr' + ,'Asia/Aqtau' + ,'Asia/Aqtobe' + ,'Asia/Ashgabat' + ,'Asia/Ashkhabad' + ,'Asia/Atyrau' + ,'Asia/Baghdad' + ,'Asia/Bahrain' + ,'Asia/Baku' + ,'Asia/Bangkok' + ,'Asia/Barnaul' + ,'Asia/Beirut' + ,'Asia/Bishkek' + ,'Asia/Brunei' + ,'Asia/Calcutta' + ,'Asia/Chita' + ,'Asia/Choibalsan' + ,'Asia/Chongqing' + ,'Asia/Chungking' + ,'Asia/Colombo' + ,'Asia/Dacca' + ,'Asia/Damascus' + ,'Asia/Dhaka' + ,'Asia/Dili' + ,'Asia/Dubai' + ,'Asia/Dushanbe' + ,'Asia/Famagusta' + ,'Asia/Gaza' + ,'Asia/Harbin' + ,'Asia/Hebron' + ,'Asia/Ho_Chi_Minh' + ,'Asia/Hong_Kong' + ,'Asia/Hovd' + ,'Asia/Irkutsk' + ,'Asia/Istanbul' + ,'Asia/Jakarta' + ,'Asia/Jayapura' + ,'Asia/Jerusalem' + ,'Asia/Kabul' + ,'Asia/Kamchatka' + ,'Asia/Karachi' + ,'Asia/Kashgar' + ,'Asia/Kathmandu' + ,'Asia/Katmandu' + ,'Asia/Khandyga' + ,'Asia/Kolkata' + ,'Asia/Krasnoyarsk' + ,'Asia/Kuala_Lumpur' + ,'Asia/Kuching' + ,'Asia/Kuwait' + ,'Asia/Macao' + ,'Asia/Macau' + ,'Asia/Magadan' + ,'Asia/Makassar' + ,'Asia/Manila' + ,'Asia/Muscat' + ,'Asia/Nicosia' + ,'Asia/Novokuznetsk' + ,'Asia/Novosibirsk' + ,'Asia/Omsk' + ,'Asia/Oral' + ,'Asia/Phnom_Penh' + ,'Asia/Pontianak' + ,'Asia/Pyongyang' + ,'Asia/Qatar' + ,'Asia/Qostanay' + ,'Asia/Qyzylorda' + ,'Asia/Rangoon' + ,'Asia/Riyadh' + ,'Asia/Saigon' + ,'Asia/Sakhalin' + ,'Asia/Samarkand' + ,'Asia/Seoul' + ,'Asia/Shanghai' + ,'Asia/Singapore' + ,'Asia/Srednekolymsk' + ,'Asia/Taipei' + ,'Asia/Tashkent' + ,'Asia/Tbilisi' + ,'Asia/Tehran' + ,'Asia/Tel_Aviv' + ,'Asia/Thimbu' + ,'Asia/Thimphu' + ,'Asia/Tokyo' + ,'Asia/Tomsk' + ,'Asia/Ujung_Pandang' + ,'Asia/Ulaanbaatar' + ,'Asia/Ulan_Bator' + ,'Asia/Urumqi' + ,'Asia/Ust-Nera' + ,'Asia/Vientiane' + ,'Asia/Vladivostok' + ,'Asia/Yakutsk' + ,'Asia/Yangon' + ,'Asia/Yekaterinburg' + ,'Asia/Yerevan' + ,'Atlantic/Azores' + ,'Atlantic/Bermuda' + ,'Atlantic/Canary' + ,'Atlantic/Cape_Verde' + ,'Atlantic/Faeroe' + ,'Atlantic/Faroe' + ,'Atlantic/Jan_Mayen' + ,'Atlantic/Madeira' + ,'Atlantic/Reykjavik' + ,'Atlantic/South_Georgia' + ,'Atlantic/St_Helena' + ,'Atlantic/Stanley' + ,'Australia/ACT' + ,'Australia/Adelaide' + ,'Australia/Brisbane' + ,'Australia/Broken_Hill' + ,'Australia/Canberra' + ,'Australia/Currie' + ,'Australia/Darwin' + ,'Australia/Eucla' + ,'Australia/Hobart' + ,'Australia/LHI' + ,'Australia/Lindeman' + ,'Australia/Lord_Howe' + ,'Australia/Melbourne' + ,'Australia/NSW' + ,'Australia/North' + ,'Australia/Perth' + ,'Australia/Queensland' + ,'Australia/South' + ,'Australia/Sydney' + ,'Australia/Tasmania' + ,'Australia/Victoria' + ,'Australia/West' + ,'Australia/Yancowinna' + ,'Brazil/Acre' + ,'Brazil/DeNoronha' + ,'Brazil/East' + ,'Brazil/West' + ,'CET' + ,'CST6CDT' + ,'Canada/Atlantic' + ,'Canada/Central' + ,'Canada/Eastern' + ,'Canada/Mountain' + ,'Canada/Newfoundland' + ,'Canada/Pacific' + ,'Canada/Saskatchewan' + ,'Canada/Yukon' + ,'Chile/Continental' + ,'Chile/EasterIsland' + ,'Cuba' + ,'EET' + ,'EST' + ,'EST5EDT' + ,'Egypt' + ,'Eire' + ,'Etc/GMT' + ,'Etc/GMT+0' + ,'Etc/GMT+1' + ,'Etc/GMT+10' + ,'Etc/GMT+11' + ,'Etc/GMT+12' + ,'Etc/GMT+2' + ,'Etc/GMT+3' + ,'Etc/GMT+4' + ,'Etc/GMT+5' + ,'Etc/GMT+6' + ,'Etc/GMT+7' + ,'Etc/GMT+8' + ,'Etc/GMT+9' + ,'Etc/GMT-0' + ,'Etc/GMT-1' + ,'Etc/GMT-10' + ,'Etc/GMT-11' + ,'Etc/GMT-12' + ,'Etc/GMT-13' + ,'Etc/GMT-14' + ,'Etc/GMT-2' + ,'Etc/GMT-3' + ,'Etc/GMT-4' + ,'Etc/GMT-5' + ,'Etc/GMT-6' + ,'Etc/GMT-7' + ,'Etc/GMT-8' + ,'Etc/GMT-9' + ,'Etc/GMT0' + ,'Etc/Greenwich' + ,'Etc/UCT' + ,'Etc/UTC' + ,'Etc/Universal' + ,'Etc/Zulu' + ,'Europe/Amsterdam' + ,'Europe/Andorra' + ,'Europe/Astrakhan' + ,'Europe/Athens' + ,'Europe/Belfast' + ,'Europe/Belgrade' + ,'Europe/Berlin' + ,'Europe/Bratislava' + ,'Europe/Brussels' + ,'Europe/Bucharest' + ,'Europe/Budapest' + ,'Europe/Busingen' + ,'Europe/Chisinau' + ,'Europe/Copenhagen' + ,'Europe/Dublin' + ,'Europe/Gibraltar' + ,'Europe/Guernsey' + ,'Europe/Helsinki' + ,'Europe/Isle_of_Man' + ,'Europe/Istanbul' + ,'Europe/Jersey' + ,'Europe/Kaliningrad' + ,'Europe/Kiev' + ,'Europe/Kirov' + # -- !! -- ,'Europe/Kyiv' + ,'Europe/Lisbon' + ,'Europe/Ljubljana' + ,'Europe/London' + ,'Europe/Luxembourg' + ,'Europe/Madrid' + ,'Europe/Malta' + ,'Europe/Mariehamn' + ,'Europe/Minsk' + ,'Europe/Monaco' + ,'Europe/Moscow' + ,'Europe/Nicosia' + ,'Europe/Oslo' + ,'Europe/Paris' + ,'Europe/Podgorica' + ,'Europe/Prague' + ,'Europe/Riga' + ,'Europe/Rome' + ,'Europe/Samara' + ,'Europe/San_Marino' + ,'Europe/Sarajevo' + ,'Europe/Saratov' + ,'Europe/Simferopol' + ,'Europe/Skopje' + ,'Europe/Sofia' + ,'Europe/Stockholm' + ,'Europe/Tallinn' + ,'Europe/Tirane' + ,'Europe/Tiraspol' + ,'Europe/Ulyanovsk' + ,'Europe/Uzhgorod' + ,'Europe/Vaduz' + ,'Europe/Vatican' + ,'Europe/Vienna' + ,'Europe/Vilnius' + ,'Europe/Volgograd' + ,'Europe/Warsaw' + ,'Europe/Zagreb' + ,'Europe/Zaporozhye' + ,'Europe/Zurich' + ,'Factory' + ,'GB' + ,'GB-Eire' + ,'GMT+0' + ,'GMT-0' + ,'GMT0' + ,'Greenwich' + ,'HST' + ,'Hongkong' + ,'Iceland' + ,'Indian/Antananarivo' + ,'Indian/Chagos' + ,'Indian/Christmas' + ,'Indian/Cocos' + ,'Indian/Comoro' + ,'Indian/Kerguelen' + ,'Indian/Mahe' + ,'Indian/Maldives' + ,'Indian/Mauritius' + ,'Indian/Mayotte' + ,'Indian/Reunion' + ,'Iran' + ,'Israel' + ,'Jamaica' + ,'Japan' + ,'Kwajalein' + ,'Libya' + ,'MET' + ,'MST' + ,'MST7MDT' + ,'Mexico/BajaNorte' + ,'Mexico/BajaSur' + ,'Mexico/General' + ,'NZ' + ,'NZ-CHAT' + ,'Navajo' + ,'PRC' + ,'PST8PDT' + ,'Pacific/Apia' + ,'Pacific/Auckland' + ,'Pacific/Bougainville' + ,'Pacific/Chatham' + ,'Pacific/Chuuk' + ,'Pacific/Easter' + ,'Pacific/Efate' + ,'Pacific/Enderbury' + ,'Pacific/Fakaofo' + ,'Pacific/Fiji' + ,'Pacific/Funafuti' + ,'Pacific/Galapagos' + ,'Pacific/Gambier' + ,'Pacific/Guadalcanal' + ,'Pacific/Guam' + ,'Pacific/Honolulu' + ,'Pacific/Johnston' + # -- !! -- ,'Pacific/Kanton' + ,'Pacific/Kiritimati' + ,'Pacific/Kosrae' + ,'Pacific/Kwajalein' + ,'Pacific/Majuro' + ,'Pacific/Marquesas' + ,'Pacific/Midway' + ,'Pacific/Nauru' + ,'Pacific/Niue' + ,'Pacific/Norfolk' + ,'Pacific/Noumea' + ,'Pacific/Pago_Pago' + ,'Pacific/Palau' + ,'Pacific/Pitcairn' + ,'Pacific/Pohnpei' + ,'Pacific/Ponape' + ,'Pacific/Port_Moresby' + ,'Pacific/Rarotonga' + ,'Pacific/Saipan' + ,'Pacific/Samoa' + ,'Pacific/Tahiti' + ,'Pacific/Tarawa' + ,'Pacific/Tongatapu' + ,'Pacific/Truk' + ,'Pacific/Wake' + ,'Pacific/Wallis' + ,'Pacific/Yap' + ,'Poland' + ,'Portugal' + ,'ROC' + ,'ROK' + ,'Singapore' + ,'Turkey' + ,'UCT' + ,'US/Alaska' + ,'US/Aleutian' + ,'US/Arizona' + ,'US/Central' + ,'US/East-Indiana' + ,'US/Eastern' + ,'US/Hawaii' + ,'US/Indiana-Starke' + ,'US/Michigan' + ,'US/Mountain' + ,'US/Pacific' + ,'US/Samoa' + ,'UTC' + ,'Universal' + ,'W-SU' + ,'WET' + ,'Zulu' + ] + + problematic_timezones_map = {} + with act.db.connect() as con: + cur = con.cursor() + # random.choice(fb_time_zones) + for tz_name in fb_time_zones: + try: + tz_info = get_timezone(tz_name) + # print(tz_name) + tm_region = ( + datetime.time(11, 22, 33, 561400, get_timezone(tz_name)) + ,datetime.time(12, 23, 34, 672400, get_timezone(tz_name)) + ,datetime.time(13, 24, 35, 783400, get_timezone(tz_name)) + ) + ts_region = ( + datetime.datetime(2020, 10, 20, 11, 22, 33, 561400, get_timezone(tz_name)) + ,datetime.datetime(2021, 11, 21, 12, 23, 34, 672400, get_timezone(tz_name)) + ,datetime.datetime(2022, 12, 22, 13, 24, 35, 783400, get_timezone(tz_name)) + ) + + #------------------------------------------------ + cur.execute("insert into test(arr_tmtz, arr_tstz) values (?, ?) returning arr_tmtz,arr_tstz", ( tm_region, ts_region ) ) + inserted_tmtz_array, inserted_tstz_array = cur.fetchone()[:2] + if set(inserted_tmtz_array) == set(tm_region) and set(inserted_tstz_array) == set(ts_region): + pass + else: + print('MISMATCH detected between input data and stored result:') + for i,x in enumerate(inserted_tmtz_array): + print(i, f'Input element (TIME WITH TIME ZONE): {tm_region[i]}', f'; stored data: {x}') + for i,x in enumerate(inserted_tstz_array): + print(i, f'Input element (TIMESTAMP WITH TIME ZONE): {ts_region[i]}', f'; stored data: {x}') + + cur.execute("delete from test") + except Exception as e: + problematic_timezones_map[tz_name] = e.__str__() + + if problematic_timezones_map: + print('Problems detected with time zone(s):') + for k,v in problematic_timezones_map.items(): + print(k,v) + + act.stdout = capsys.readouterr().out + assert act.clean_stdout == '' + act.reset() From ca59cc988bf847cefbaf1a0b0f986da5e1388a91 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sat, 17 Aug 2024 23:17:45 +0300 Subject: [PATCH 012/128] Added/Updated tests\bugs\gh_6706_test.py: Confirmed bug on 4.0.0.2336. Solved since 4.0.0.2341. Checked on 6.0.0.438, 5.0.2.1478, 4.0.6.3142. --- tests/bugs/gh_6706_test.py | 108 +++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 tests/bugs/gh_6706_test.py diff --git a/tests/bugs/gh_6706_test.py b/tests/bugs/gh_6706_test.py new file mode 100644 index 00000000..103fc041 --- /dev/null +++ b/tests/bugs/gh_6706_test.py @@ -0,0 +1,108 @@ +#coding:utf-8 + +""" +ID: issue-6706 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/6706 +TITLE: Memory leak when running EXECUTE STATEMENT with named parameters [CORE6475] +DESCRIPTION: + We create stored procedure with PARAMS_COUNT input parameters. + Then EXECUTE BLOCK is generated with call of this SP via EXECUTE STATEMENT which applies EXCESS modifier to all arguments. + Value of memory_info().rss is obtained (for appropriate server process), then run execute block MEASURES_COUNT times + and after this - again get memory_info().rss value. + Ratio between current and initial values of memory_info().rss must be less than MAX_RATIO. +NOTES: + [17.08.2024] pzotov + 1. Problem did exist in FB 4.x up to snapshot 4.0.0.2336. + Commit: https://github.com/FirebirdSQL/firebird/commit/4dfb30a45b767994c074bbfcbb8494b8ada19b33 (23-jan-2021, 15:26) + Before this commit ratio for SS was about 5..6 for SS and about 8..9 for CS. + Since 4.0.0.2341 memory consumption was reduced to ~1.6 ... 1.9 + 2. Database must be created with FW = ON otherwise ratio for all snapshots is about 1.5 (and this seems weird). + 3. Test duration is about 35s. + + Checked on 6.0.0.438, 5.0.2.1478, 4.0.6.3142; 4.0.0.2336, 4.0.0.2341. +""" + +import psutil +import pytest +from firebird.qa import * +import time + +########################### +### S E T T I N G S ### +########################### + +# How many input parameters must have procedure: +PARAMS_COUNT = 1000 + +# How many times we call procedures: +MEASURES_COUNT = 1000 + +# Maximal value for ratio between +# new and initial memory_info().rss values: +# +MAX_RATIO = 3 +############# + +db = db_factory(async_write = False) +act = python_act('db') + +#-------------------------------------------------------------------- + +def get_server_pid(con): + with con.cursor() as cur: + cur.execute('select mon$server_pid as p from mon$attachments where mon$attachment_id = current_connection') + fb_pid = int(cur.fetchone()[0]) + return fb_pid + +#-------------------------------------------------------------------- + +@pytest.mark.version('>=4.0.0') +def test_1(act: Action, capsys): + + with act.db.connect() as con: + + sp_ddl = """ + create or alter procedure sp_test( + """ + params_lst = '\n'.join( [ (',' if i else '') +f'p_{i} int' for i in range(PARAMS_COUNT) ] ) + sp_ddl = '\n'.join( ("create or alter procedure sp_test(", params_lst, ") returns(x int) as begin x = 1; suspend; end") ) + con.execute_immediate(sp_ddl) + con.commit() + + server_process = psutil.Process(get_server_pid(con)) + + params_lst = ','.join( [ f':p_{i}' for i in range(PARAMS_COUNT) ] ) + passed_args = ','.join( [ f'excess p_{i} := 1' for i in range(PARAMS_COUNT) ] ) + + srv_memo_rss_init = int(server_process.memory_info().rss / 1024) + srv_memo_vms_init = int(server_process.memory_info().vms / 1024) + + cur = con.cursor() + for k in range(MEASURES_COUNT): + + es_sql = f""" + execute block returns(x int) as + begin + execute statement ('select p.x * {k} from sp_test({params_lst}) p') ({passed_args}) + into x; + suspend; + end + """ + cur.execute(es_sql) + for r in cur: + pass + + srv_memo_rss_curr = int(server_process.memory_info().rss / 1024) + srv_memo_vms_curr = int(server_process.memory_info().vms / 1024) + + memo_ratio = srv_memo_rss_curr / srv_memo_rss_init + + SUCCESS_MSG = 'Ratio between memory values measured before and after loop: acceptable' + if memo_ratio < MAX_RATIO: + print(SUCCESS_MSG) + else: + print( 'Ratio: /* perf_issue_tag */ POOR: %s, more than threshold: %s' % ( '{:.2f}'.format(memo_ratio), '{:.2f}'.format(MAX_RATIO) ) ) + + act.expected_stdout = SUCCESS_MSG + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From 0a909b2c0e9d9f13a621710171db3a38da7cd924 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sun, 18 Aug 2024 20:12:50 +0300 Subject: [PATCH 013/128] Added/Updated tests\bugs\gh_2292_test.py: see notes --- tests/bugs/gh_2292_test.py | 57 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 tests/bugs/gh_2292_test.py diff --git a/tests/bugs/gh_2292_test.py b/tests/bugs/gh_2292_test.py new file mode 100644 index 00000000..5a132555 --- /dev/null +++ b/tests/bugs/gh_2292_test.py @@ -0,0 +1,57 @@ +#coding:utf-8 + +""" +ID: issue-2292 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/2292 +TITLE: Isql's extracted script is unusable with interdependent selectable procedures in FB 2.1 [CORE1862] +DESCRIPTION: + Test creates SP which has output parameter *and* SUSPEND clause. + Then we extract metadata and check whether this procedure header contains 'SUSPEND'. + On FB 2.0.7.13318 extracted metadata contains 'EXIT': + CREATE PROCEDURE SP_TEST RETURNS (O INTEGER) + AS + BEGIN EXIT; END ^ + + Although such code can be compiled, this SP could be called (and returned empty resultset) only in 2.0.7 and before. + Since 2.1 attempt to call such SP will raise: + Statement failed, SQLSTATE = 42000 + ... + -invalid request BLR at offset ... + -Procedure SP_TEST is not selectable (it does not contain a SUSPEND statement) +""" + +import re +import pytest +from firebird.qa import * + +init_sql = """ + set term ^ ; + create or alter procedure sp_test returns(out_value int) as + begin + out_value = 1; + suspend; + end + ^ + set term ;^ + commit; +""" +db = db_factory(init = init_sql) +act = python_act('db') + +@pytest.mark.version('>=3.0.0') +def test_1(act: Action, capsys): + + meta_sql = act.extract_meta() + EXPECTED_MSG = 'OK' + + p = re.compile(r'SP_TEST\s+RETURNS \(OUT_VALUE INTEGER\)\s+AS\s+BEGIN\s+SUSPEND;\s+END\s?\^', re.IGNORECASE) + + if p.search(meta_sql): + print(EXPECTED_MSG) + else: + print(f'Could not find pattern "{p.pattern}" in extracted metadata.') + print(meta_sql) + + act.expected_stdout = EXPECTED_MSG + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From 4ee56973b45e691a625d0c25ce5a50738e3e8ab5 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sun, 18 Aug 2024 22:06:35 +0300 Subject: [PATCH 014/128] Added/Updated tests\bugs\gh_8213_test.py: Checked on 5.0.2.1479. NB: 6.x not yet has fix, waiting for front-porting. --- tests/bugs/gh_8213_test.py | 281 +++++++++++++++++++++++++++++++++++++ 1 file changed, 281 insertions(+) create mode 100644 tests/bugs/gh_8213_test.py diff --git a/tests/bugs/gh_8213_test.py b/tests/bugs/gh_8213_test.py new file mode 100644 index 00000000..a0e4f190 --- /dev/null +++ b/tests/bugs/gh_8213_test.py @@ -0,0 +1,281 @@ +#coding:utf-8 + +""" +ID: issue-8213 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8213 +TITLE: WHEN NOT MATCHED BY SOURCE - does not work with a direct table as source +DESCRIPTION: +NOTES: + [18.08.2024] pzotov + Checked on 5.0.2.1479. + NB: 6.x not yet has fix, waiting for front-porting. +""" + +import pytest +from firebird.qa import * + +db = db_factory() + +test_script = """ + set list on; + recreate procedure sp_main as begin end; + recreate table test (id smallint); + recreate generator g; + recreate table test ( + id smallint primary key, + typ smallint, + cat smallint + ); + commit; + + set term ^ ; + create or alter trigger test_bi0 for test active before insert position 0 as + begin + new.id = coalesce(new.id, gen_id(g, 1)); + end + ^ + set term ; ^ + commit; + + insert into test(typ, cat) values(1, 10); + insert into test(typ, cat) values(1, 20); + insert into test(typ, cat) values(2, 10); + insert into test(typ, cat) values(2, 30); + commit; + + set term ^; + recreate procedure sp_main ( + a_insert_using_sp boolean, + a_delete_using_sp boolean, + a_source_typ smallint, + a_target_typ smallint + ) as + + declare procedure inner_sp_data_for_source_typ + returns ( + id smallint, + typ smallint, + cat smallint + ) as + begin + for select t.id, + t.typ, + t.cat + from test t + where t.typ = :a_source_typ + into :id, + :typ, + :cat + do + begin + suspend; + end + end + + begin + + if ( a_insert_using_sp or :a_delete_using_sp ) then + begin + if (a_insert_using_sp) then + merge into test t + using inner_sp_data_for_source_typ s + on t.typ = :a_target_typ and + t.cat = s.cat + when not matched by target then + insert (typ, cat) values (:a_target_typ, s.cat); + else + merge into test t + using test s + on t.typ = :a_target_typ and + t.cat = s.cat + when not matched by target then + insert (typ, cat) values (:a_target_typ, s.cat); + + if (a_delete_using_sp) then + merge into test t + using inner_sp_data_for_source_typ s on t.cat = s.cat + when not matched by source and t.typ = :a_target_typ then + delete; + else + merge into test t + using test s on t.cat = s.cat + when not matched by source and t.typ = :a_target_typ then + delete; + + end + else + begin + -- works as expected + merge into test t + using ( select t.id, + t.typ, + t.cat + from test t + where t.typ = :a_source_typ + ) s + on t.typ = :a_target_typ and + t.cat = s.cat + when not matched by target then + insert (typ, cat) values (:a_target_typ, s.cat); + + merge into test t + using ( select t.id, + t.typ, + t.cat + from test t + where t.typ = :a_source_typ + ) s + on t.cat = s.cat + when not matched by source and t.typ = :a_target_typ then + delete; + end + end + ^ + set term ;^ + commit; + + -- select * from test; + set count on; + + alter sequence g restart with 1000; + execute procedure sp_main(true, true, 1, 10); + select 'INS:SP, DEL:SP' msg, t.id, t.typ, t.cat from test t order by id; + rollback; + + alter sequence g restart with 1000; + execute procedure sp_main(true, false, 1, 10); + select 'INS:SP, DEL:TAB' msg, t.id, t.typ, t.cat from test t order by id; + rollback; + + alter sequence g restart with 1000; + execute procedure sp_main(false, true, 1, 10); + select 'INS:TAB, DEL:SP' msg, t.id, t.typ, t.cat from test t order by id; + rollback; + + alter sequence g restart with 1000; + execute procedure sp_main(false, false, 1, 10); + select 'INS:TAB, DEL:TAB' msg, t.id, t.typ, t.cat from test t order by id; + rollback; +""" + +act = isql_act('db', test_script) + +expected_stdout = """ + MSG INS:SP, DEL:SP + ID 1 + TYP 1 + CAT 10 + MSG INS:SP, DEL:SP + ID 2 + TYP 1 + CAT 20 + MSG INS:SP, DEL:SP + ID 3 + TYP 2 + CAT 10 + MSG INS:SP, DEL:SP + ID 4 + TYP 2 + CAT 30 + MSG INS:SP, DEL:SP + ID 1000 + TYP 10 + CAT 10 + MSG INS:SP, DEL:SP + ID 1001 + TYP 10 + CAT 20 + Records affected: 6 + + MSG INS:SP, DEL:TAB + ID 1 + TYP 1 + CAT 10 + MSG INS:SP, DEL:TAB + ID 2 + TYP 1 + CAT 20 + MSG INS:SP, DEL:TAB + ID 3 + TYP 2 + CAT 10 + MSG INS:SP, DEL:TAB + ID 4 + TYP 2 + CAT 30 + MSG INS:SP, DEL:TAB + ID 1000 + TYP 10 + CAT 10 + MSG INS:SP, DEL:TAB + ID 1001 + TYP 10 + CAT 20 + Records affected: 6 + + MSG INS:TAB, DEL:SP + ID 1 + TYP 1 + CAT 10 + MSG INS:TAB, DEL:SP + ID 2 + TYP 1 + CAT 20 + MSG INS:TAB, DEL:SP + ID 3 + TYP 2 + CAT 10 + MSG INS:TAB, DEL:SP + ID 4 + TYP 2 + CAT 30 + MSG INS:TAB, DEL:SP + ID 1000 + TYP 10 + CAT 10 + MSG INS:TAB, DEL:SP + ID 1001 + TYP 10 + CAT 20 + MSG INS:TAB, DEL:SP + ID 1002 + TYP 10 + CAT 10 + Records affected: 7 + + MSG INS:TAB, DEL:TAB + ID 1 + TYP 1 + CAT 10 + MSG INS:TAB, DEL:TAB + ID 2 + TYP 1 + CAT 20 + MSG INS:TAB, DEL:TAB + ID 3 + TYP 2 + CAT 10 + MSG INS:TAB, DEL:TAB + ID 4 + TYP 2 + CAT 30 + MSG INS:TAB, DEL:TAB + ID 1000 + TYP 10 + CAT 10 + MSG INS:TAB, DEL:TAB + ID 1001 + TYP 10 + CAT 20 + Records affected: 6 +""" + +@pytest.mark.version('>=5.0.2') +def test_1(act: Action): + + if act.is_version('>=6'): + pytest.skip('NOTE: 6.x not yet fixed, waiting for front-porting.') + + act.expected_stdout = expected_stdout + act.execute(combine_output = True) + assert act.clean_stdout == act.clean_expected_stdout From ee82da2fc76e02057ef291107c405c4d97e2787d Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sun, 18 Aug 2024 22:18:06 +0300 Subject: [PATCH 015/128] Added/Updated tests\bugs\core_6239_test.py: minor change: added comments --- tests/bugs/core_6239_test.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/bugs/core_6239_test.py b/tests/bugs/core_6239_test.py index 1b42fe80..39e436ef 100644 --- a/tests/bugs/core_6239_test.py +++ b/tests/bugs/core_6239_test.py @@ -2,11 +2,14 @@ """ ID: issue-6483 -ISSUE: 6483 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/6483 TITLE: Procedures and EXECUTE BLOCK without RETURNS should not be allowed to use SUSPEND DESCRIPTION: JIRA: CORE-6239 FBTEST: bugs.core_6239 +NOTES: + Fix was done by commit https://github.com/FirebirdSQL/firebird/commit/b2b5f9a87cea26a9f12fa231804dba9d0426d3fa + (can be checked by 4.0.0.1763+, date of build since 05-feb-2020). """ import pytest From 37b2159e667ca1220fc37066d19bda0e52fd9d75 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Tue, 20 Aug 2024 06:12:38 +0300 Subject: [PATCH 016/128] Added/Updated tests\bugs\gh_8213_test.py: Removed pytest.skip for FB 6.x. Checked on 6.0.0.438-d40d01b, 5.0.2.1479-47aa3b1 -- all fine --- tests/bugs/gh_8213_test.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/tests/bugs/gh_8213_test.py b/tests/bugs/gh_8213_test.py index a0e4f190..9dea50ed 100644 --- a/tests/bugs/gh_8213_test.py +++ b/tests/bugs/gh_8213_test.py @@ -6,9 +6,8 @@ ISSUE: https://github.com/FirebirdSQL/firebird/issues/8213 TITLE: WHEN NOT MATCHED BY SOURCE - does not work with a direct table as source DESCRIPTION: NOTES: - [18.08.2024] pzotov - Checked on 5.0.2.1479. - NB: 6.x not yet has fix, waiting for front-porting. + [20.08.2024] pzotov + Checked on 6.0.0.438-d40d01b, 5.0.2.1479-47aa3b1 """ import pytest @@ -272,10 +271,6 @@ expected_stdout = """ @pytest.mark.version('>=5.0.2') def test_1(act: Action): - - if act.is_version('>=6'): - pytest.skip('NOTE: 6.x not yet fixed, waiting for front-porting.') - act.expected_stdout = expected_stdout act.execute(combine_output = True) assert act.clean_stdout == act.clean_expected_stdout From ee0cb57280614a20648d208d1b175fa266adca7d Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Tue, 20 Aug 2024 16:57:44 +0300 Subject: [PATCH 017/128] Added/Updated tests\bugs\gh_8221_test.py: Checked on 6.0.0.438-d9f9b28, 5.0.2.1479-adfe97a, 4.0.6.3142-984ccb9 --- tests/bugs/gh_8221_test.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 tests/bugs/gh_8221_test.py diff --git a/tests/bugs/gh_8221_test.py b/tests/bugs/gh_8221_test.py new file mode 100644 index 00000000..b97e724d --- /dev/null +++ b/tests/bugs/gh_8221_test.py @@ -0,0 +1,38 @@ +#coding:utf-8 + +""" +ID: issue-8221 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8221 +TITLE: Crash when MAKE_DBKEY() is called with 0 or 1 arguments +DESCRIPTION: +NOTES: + [20.08.2024] pzotov + Confirmed crash on 6.0.0.438-d40d01b (dob: 20.08.2024 04:44). + Checked on 6.0.0.438-d9f9b28, 5.0.2.1479-adfe97a, 4.0.6.3142-984ccb9 +""" +import pytest +from firebird.qa import * + +db = db_factory() + +test_script = """ + set bail OFF; + select 1 from rdb$database where rdb$db_key = make_dbkey(); + select 1 from rdb$database where rdb$db_key = make_dbkey('RDB$DATABASE'); +""" + +act = isql_act('db', test_script, substitutions=[ ('[ \\t]+', ' ') ]) + +@pytest.mark.version('>=4.0.6') +def test_1(act: Action): + + expected_stdout = f""" + Statement failed, SQLSTATE = 39000 + function MAKE_DBKEY could not be matched + + Statement failed, SQLSTATE = 39000 + function MAKE_DBKEY could not be matched + """ + act.expected_stdout = expected_stdout + act.execute(combine_output = True) + assert act.clean_stdout == act.clean_expected_stdout From ad1485746ab78f44dca3e19bb0bdd004408b7a1d Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Wed, 21 Aug 2024 11:29:33 +0300 Subject: [PATCH 018/128] Added/Updated tests\bugs\gh_4954_test.py: Checked on 6.0.0.438, 5.0.2.1479, 4.0.6.3142, 3.0.12.33784. --- tests/bugs/gh_4954_test.py | 150 +++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 tests/bugs/gh_4954_test.py diff --git a/tests/bugs/gh_4954_test.py b/tests/bugs/gh_4954_test.py new file mode 100644 index 00000000..502ffdf5 --- /dev/null +++ b/tests/bugs/gh_4954_test.py @@ -0,0 +1,150 @@ +#coding:utf-8 + +""" +ID: issue-4954 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/4954 +TITLE: subselect losing the index when where clause includes coalesce() [CORE4640] +DESCRIPTION: +NOTES: + [21.08.2024] pzotov + Confirmed bug on 2.1.7.18553. No such problem on 2.5.927156. + Checked on 6.0.0.438, 5.0.2.1479, 4.0.6.3142, 3.0.12.33784. +""" +import pytest +from firebird.qa import * + +init_sql = """ + recreate table t1 ( + id int not null, + vc1 varchar(1) not null, + i1 int not null, + i2 int not null, + constraint t1_pk primary key (id) using descending index t1_pk, + constraint t1_uk1 unique (i1, i2, vc1) + ); + + recreate table t2 ( + id int not null, + vc1 varchar(1) not null, + i1 int not null, + i2 int not null, + constraint t2_pk primary key (id) using descending index t2_pk, + constraint t2_uk1 unique (i1, i2, vc1) + ); + + recreate table t3 ( + id int not null, + i1_1 int, + i1_2 int + ); + + create view v1 (ID, VC1, I1, I2) as + select t1.id, t1.vc1, t1.i1, t1.i2 + from t1 + union all + select t2.id, t2.vc1, t2.i1, t2.i2 + from t2; + commit; + + insert into t1 (id, vc1, i1, i2) values (9, 'a', 1009, 1000); + insert into t1 (id, vc1, i1, i2) values (8, 'a', 1008, 1000); + insert into t1 (id, vc1, i1, i2) values (7, 'a', 1007, 1000); + insert into t1 (id, vc1, i1, i2) values (6, 'a', 1006, 1000); + insert into t1 (id, vc1, i1, i2) values (5, 'a', 1005, 1000); + insert into t1 (id, vc1, i1, i2) values (4, 'a', 1004, 1000); + insert into t1 (id, vc1, i1, i2) values (3, 'a', 1003, 1000); + insert into t1 (id, vc1, i1, i2) values (2, 'a', 1002, 1000); + insert into t1 (id, vc1, i1, i2) values (1, 'a', 1001, 1000); + + + insert into t2 (id, vc1, i1, i2) values (19, 'a', 1019, 1000); + insert into t2 (id, vc1, i1, i2) values (18, 'a', 1018, 1000); + insert into t2 (id, vc1, i1, i2) values (17, 'a', 1017, 1000); + insert into t2 (id, vc1, i1, i2) values (16, 'a', 1016, 1000); + insert into t2 (id, vc1, i1, i2) values (15, 'a', 1015, 1000); + insert into t2 (id, vc1, i1, i2) values (14, 'a', 1014, 1000); + insert into t2 (id, vc1, i1, i2) values (13, 'a', 1013, 1000); + insert into t2 (id, vc1, i1, i2) values (12, 'a', 1012, 1000); + insert into t2 (id, vc1, i1, i2) values (11, 'a', 1011, 1000); + insert into t2 (id, vc1, i1, i2) values (10, 'a', 1010, 1000); + + + insert into t3 (id, i1_1, i1_2) values (100000, null, 1010); + insert into t3 (id, i1_1, i1_2) values (100001, 1012, null); + commit; + set statistics index t1_pk; + set statistics index t2_pk; + set statistics index t1_uk1; + set statistics index t2_uk1; + commit; +""" + +db = db_factory(init = init_sql) +act = python_act('db') + +#----------------------------------------------------------- + +def replace_leading(source, char="."): + stripped = source.lstrip() + return char * (len(source) - len(stripped)) + stripped + +#----------------------------------------------------------- + +@pytest.mark.version('>=3.0') +def test_1(act: Action, capsys): + + test_sql = """ + select t3.id, + (select first 1 v1.id + from v1 + where + v1.vc1 = 'A' + and v1.i2 = 1000 + and v1.i1 = coalesce(t3.i1_1, t3.i1_2) + ) + from t3 + """ + + with act.db.connect() as con: + cur = con.cursor() + ps = cur.prepare(test_sql) + print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) + + expected_plan_4x = """ + Select Expression + ....-> Singularity Check + ........-> First N Records + ............-> Filter + ................-> Union + ....................-> Filter + ........................-> Table "T1" as "V1 T1" Access By ID + ............................-> Bitmap + ................................-> Index "T1_UK1" Unique Scan + ....................-> Filter + ........................-> Table "T2" as "V1 T2" Access By ID + ............................-> Bitmap + ................................-> Index "T2_UK1" Unique Scan + Select Expression + ....-> Table "T3" Full Scan + """ + expected_plan_5x = """ + Sub-query + ....-> Singularity Check + ........-> First N Records + ............-> Filter + ................-> Filter + ....................-> Union + ........................-> Filter + ............................-> Table "T1" as "V1 T1" Access By ID + ................................-> Bitmap + ....................................-> Index "T1_UK1" Unique Scan + ........................-> Filter + ............................-> Table "T2" as "V1 T2" Access By ID + ................................-> Bitmap + ....................................-> Index "T2_UK1" Unique Scan + Select Expression + ....-> Table "T3" Full Scan + """ + act.expected_stdout = expected_plan_4x if act.is_version('<5') else expected_plan_5x + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From de5f3959e042c3b9391ac0956a888d2ea4435d9c Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Wed, 21 Aug 2024 13:58:34 +0300 Subject: [PATCH 019/128] Added alias for upcoming test --- files/qa-databases.conf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/files/qa-databases.conf b/files/qa-databases.conf index 5681f655..ab590f5a 100644 --- a/files/qa-databases.conf +++ b/files/qa-databases.conf @@ -269,6 +269,10 @@ tmp_fd0fa8a3_alias = $(dir_sampleDb)/qa/tmp_fd0fa8a3.fdb TempTableDirectory = <> } +tmp_gh_6416_alias = $(dir_sampleDb)/qa/tmp_gh_6416.fdb +{ + DataTypeCompatibility = 3.0 +} # Databases for replication tests: # From c7f75bf41d825f7281311c5ce81b40ea95a80635 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Wed, 21 Aug 2024 13:58:58 +0300 Subject: [PATCH 020/128] Added/Updated tests\bugs\gh_6416_test.py: Checked on 6.0.0.438, 5.0.2.1479, 4.0.6.3142. --- tests/bugs/gh_6416_test.py | 143 +++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 tests/bugs/gh_6416_test.py diff --git a/tests/bugs/gh_6416_test.py b/tests/bugs/gh_6416_test.py new file mode 100644 index 00000000..9b2ca65a --- /dev/null +++ b/tests/bugs/gh_6416_test.py @@ -0,0 +1,143 @@ +#coding:utf-8 + +""" +ID: issue-6416 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/6416 +TITLE: Engine cant determine datatype in SQL: Unknown SQL Data type (32752) [CORE6168] +DESCRIPTION: + Test creates table with columns belonging to "new datatypes" family: int128, decfloat and time[stamp] with time zone. + Also, one record is added into this table with values which are valid for numeric types in FB 4.x+ (time zone fields + can remain null or arbitrary). + This DB is them copied to another DB (using file-level call of shutil.copy2()). + Another DB filename must match to the specified in the databases.conf (alias defined by 'REQUIRED_ALIAS' variable). + Its alias has special value for DataTypeCompatibility parameter. Connection to this DB and query to a table with 'new datatypes' + must return SQLDA with *old* types which are known for FB versions prior 4.x. + + Then we repeat same query to 'initial' test DB and must get SQLDA with actual values for all new columns (known since FB 4.x). +NOTES: + [18.08.2022] pzotov + 1. One need to be sure that firebird.conf does NOT contain DatabaseAccess = None. + 2. Database file for REQUIRED_ALIAS must NOT exist in the QA_root/files/qa/ subdirectory: it will be created here. + Content of databases.conf must be taken from $QA_ROOT/files/qa-databases.conf (one need to replace + it before every test session). + Discussed with pcisar, letters since 30-may-2022 13:48, subject: + "new qa, core_4964_test.py: strange outcome when use... shutil.copy() // comparing to shutil.copy2()" + 3. Value of REQUIRED_ALIAS must be EXACTLY the same as alias specified in the pre-created databases.conf + (for LINUX this equality is case-sensitive, even when aliases are compared!) + + Checked on 6.0.0.438, 5.0.2.1479, 4.0.6.3142. +""" + +import re +from pathlib import Path +import shutil + +import pytest +from firebird.qa import * + +# Pre-defined alias for test DB in the QA_root/files/qa-databases.conf. +# This file (qa-databases.conf) must be copied manually to each testing +# FB home folder, with replacing databases.conf there: +# +REQUIRED_ALIAS = 'tmp_gh_6416_alias' + +init_sql = f''' + set bail on; + recreate table test( + f_sml smallint default -32768 + ,f_int int default -2147483648 + ,f_big bigint default -9223372036854775808 + ,f_128 int128 default -170141183460469231731687303715884105728 + ,f_num numeric(38) default -170141183460469231731687303715884105728 + ,f_dec decfloat default -9.999999999999999999999999999999999E+6144 + ,f_tz time with time zone default '01:02:03 Indian/Cocos' + ,f_tsz timestamp with time zone default '22.09.2023 01:02:03 Indian/Cocos' + ); + insert into test default values; + commit; +''' + +db = db_factory(init = init_sql) + +substitutions = [('^((?!(SQLSTATE|error|Floating-point overflow|sqltype)).)*$', ''), ('[ \t]+', ' ')] +act = python_act('db', substitutions = substitutions) + +@pytest.mark.version('>=4.0') +def test_1(act: Action, capsys): + + + # Scan line-by-line through databases.conf, find line starting with REQUIRED_ALIAS and extract name of file that + # must be created in the $(dir_sampleDb)/qa/ folder. This name will be used further as target database (tmp_db_for_3x_client). + # NOTE: we have to SKIP lines which are commented out, i.e. if they starts with '#': + p_required_alias_ptn = re.compile( '^(?!#)((^|\\s+)' + REQUIRED_ALIAS + ')\\s*=\\s*\\$\\(dir_sampleDb\\)/qa/', re.IGNORECASE ) + fname_in_dbconf = None + + with open(act.home_dir/'databases.conf', 'r') as f: + for line in f: + if p_required_alias_ptn.search(line): + # If databases.conf contains line like this: + # tmp_6416_alias = $(dir_sampleDb)/qa/tmp_gh_6416.fdb + # - then we extract filename: 'tmp_gh_6416.fdb' (see below): + fname_in_dbconf = Path(line.split('=')[1].strip()).name + break + + # if 'fname_in_dbconf' remains undefined here then propably REQUIRED_ALIAS not equals to specified in the databases.conf! + # + assert fname_in_dbconf + + # Full path + filename of database to which we will try to connect: + # + tmp_db_for_3x_client = Path( act.vars['sample_dir'], 'qa', fname_in_dbconf ) + shutil.copy2(act.db.db_path, tmp_db_for_3x_client) + + test_sql = f''' + set bail on; + set list on; + connect '{REQUIRED_ALIAS}' user {act.db.user}; + -- select mon$database_name from mon$database; + set sqlda_display on; + select * + from test; + ''' + + act.expected_stdout = f""" + 01: sqltype: 500 SHORT Nullable scale: 0 subtype: 0 len: 2 + 02: sqltype: 496 LONG Nullable scale: 0 subtype: 0 len: 4 + 03: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8 + 04: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8 + 05: sqltype: 580 INT64 Nullable scale: 0 subtype: 1 len: 8 + 06: sqltype: 480 DOUBLE Nullable scale: 0 subtype: 0 len: 8 + 07: sqltype: 560 TIME Nullable scale: 0 subtype: 0 len: 4 + 08: sqltype: 510 TIMESTAMP Nullable scale: 0 subtype: 0 len: 8 + Statement failed, SQLSTATE = 22003 + -SQL error code = -303 + -Floating-point overflow. The exponent of a floating-point operation is greater than the magnitude allowed. + """ + + act.isql(switches = ['-q'], input = test_sql, combine_output = True, credentials = False, connect_db = False) + assert act.clean_stdout == act.clean_expected_stdout + act.reset() + tmp_db_for_3x_client.unlink() + + #------------------------------------------------------------- + + test_sql = f''' + set bail on; + set list on; + set sqlda_display on; + select * + from test; + ''' + act.expected_stdout = """ + 01: sqltype: 500 SHORT Nullable scale: 0 subtype: 0 len: 2 + 02: sqltype: 496 LONG Nullable scale: 0 subtype: 0 len: 4 + 03: sqltype: 580 INT64 Nullable scale: 0 subtype: 0 len: 8 + 04: sqltype: 32752 INT128 Nullable scale: 0 subtype: 0 len: 16 + 05: sqltype: 32752 INT128 Nullable scale: 0 subtype: 1 len: 16 + 06: sqltype: 32762 DECFLOAT(34) Nullable scale: 0 subtype: 0 len: 16 + 07: sqltype: 32756 TIME WITH TIME ZONE Nullable scale: 0 subtype: 0 len: 8 + 08: sqltype: 32754 TIMESTAMP WITH TIME ZONE Nullable scale: 0 subtype: 0 len: 12 + """ + act.isql(switches = ['-q'], input = test_sql, combine_output = True) + assert act.clean_stdout == act.clean_expected_stdout + act.reset() From f5fc896942ed2b9b5f537e719634e7ad3409208c Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 22 Aug 2024 16:09:49 +0300 Subject: [PATCH 021/128] Added/Updated tests\bugs\gh_7092_test.py: changed ratio and limits - see notes. --- tests/bugs/gh_7092_test.py | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/tests/bugs/gh_7092_test.py b/tests/bugs/gh_7092_test.py index d89ee1ff..6e505e2b 100644 --- a/tests/bugs/gh_7092_test.py +++ b/tests/bugs/gh_7092_test.py @@ -13,15 +13,20 @@ DESCRIPTION: We do these measures times for each SP, and each result is added to the list which, in turn, is the source for median evaluation. Finally, we get ratio between minimal and maximal medians (see 'median_ratio') - On Windows 8.1 usually this ratio is about 7 (before fix it was more than 100). + This ratio is about: + * Windows: 0.6 ... 0.7 + * Linux: 0.5 ... 0.6 + Before fix it was more than 10. Test is considered as passed if median_ratio less than threshold . NOTES: + Number of iterations for loops differ: we have to perform 'sp_empty_loop' at least 1E6 times + in order to get valuable difference between CPU user time counters and use it as denomitator. + Procedure 'sp_ctime_loop' must be called for 10x times LESS than 'sp_empty_loop'. + Confirmed problem on: - 4.0.1.2699 (01-jan-2022): median ratio was 109 ... 110 (3.40 vs 0.03) - 5.0.0.362 (01-jan-2022): median ratio was 111 ... 113 (3.51 vs 0.03) + 5.0.0.362, 4.0.1.2699 (bith snapshots have date 01-jan-2022) Checked on 6.0.0.195, 5.0.0.1305, 4.0.5.3049. - Scope of median ratio values: 4.33 ... 7.00 """ import psutil @@ -43,12 +48,13 @@ def median(lst): N_MEASURES = 15 # How many iterations must be done: -N_COUNT_PER_MEASURE = 100000 +N_COUNT_TIME_LOOP = 100000 +N_COUNT_EMPTY_LOOP = 1000000 # Maximal value for ratio between maximal and minimal medians # -MAX_RATIO = 15 -############## +MAX_RATIO = 1.5 +############### init_script = \ f''' @@ -60,12 +66,12 @@ f''' begin while (n < a_limit) do begin - n = n + 1; d = current_time; + n = n + 1; end end ^ - create procedure sp_dummy_loop(a_limit int) + create procedure sp_empty_loop(a_limit int) as declare n int = 1; begin @@ -79,7 +85,7 @@ f''' ^ ''' -db = db_factory(init = init_script) +db = db_factory(init = init_script, charset = 'win1251') act = python_act('db') expected_stdout = """ @@ -96,24 +102,25 @@ def test_1(act: Action, capsys): sp_time = {} for i in range(0, N_MEASURES): - for sp_name in ('sp_ctime_loop', 'sp_dummy_loop'): + for sp_name in ('sp_ctime_loop', 'sp_empty_loop'): + n_count = N_COUNT_TIME_LOOP if sp_name == 'sp_ctime_loop' else N_COUNT_EMPTY_LOOP fb_info_init = psutil.Process(fb_pid).cpu_times() - cur.callproc( sp_name, (N_COUNT_PER_MEASURE,) ) + cur.callproc( sp_name, (n_count,) ) fb_info_curr = psutil.Process(fb_pid).cpu_times() sp_time[ sp_name, i ] = max(fb_info_curr.user - fb_info_init.user, 0.000001) sp_ctime_median = median([v for k,v in sp_time.items() if k[0] == 'sp_ctime_loop']) - sp_dummy_median = median([v for k,v in sp_time.items() if k[0] == 'sp_dummy_loop']) + sp_dummy_median = median([v for k,v in sp_time.items() if k[0] == 'sp_empty_loop']) #---------------------------------- median_ratio = sp_ctime_median / sp_dummy_median print( 'Medians ratio: ' + ('acceptable' if median_ratio <= MAX_RATIO else '/* perf_issue_tag */ POOR: %s, more than threshold: %s' % ( '{:9g}'.format(median_ratio), '{:9g}'.format(MAX_RATIO) ) ) ) if median_ratio > MAX_RATIO: - print('CPU times for each of {N_MEASURES} measures:') + print(f'CPU times for each of {N_MEASURES} measures:') for k,v in sp_time.items(): print(k,':::',v) - print(f'Median cpu time for {N_MEASURES} measures using loops for {N_COUNT_PER_MEASURE} iterations in each SP call:') + print(f'Median cpu time for {N_MEASURES} measures:') print('sp_ctime_median:',sp_ctime_median) print('sp_dummy_median:',sp_dummy_median) print('median_ratio:',median_ratio) From d3e21985ab3b3d79e6b7f15fc012c6c46257524b Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 22 Aug 2024 21:50:18 +0300 Subject: [PATCH 022/128] Added/Updated tests\bugs\core_4386_test.py: Reimplemented, see notes. --- tests/bugs/core_4386_test.py | 315 ++++++++++++++++++++++++++++------- 1 file changed, 258 insertions(+), 57 deletions(-) diff --git a/tests/bugs/core_4386_test.py b/tests/bugs/core_4386_test.py index ee5438df..943180c6 100644 --- a/tests/bugs/core_4386_test.py +++ b/tests/bugs/core_4386_test.py @@ -9,20 +9,32 @@ JIRA: CORE-4386 FBTEST: bugs.core_4386 NOTES: [22.11.2021] pcisar - This test requires READ_COMMITTED_NO_RECORD_VERSION transaction to work, which - requires ReadConsistency disabled in FB 4. However, it does not work as expected - because all drop commands pass without exception even with ReadConsistency disabled. - The same happens under 3.0.8 (no errors raised). + This test requires READ_COMMITTED_NO_RECORD_VERSION transaction to work, which + requires ReadConsistency disabled in FB 4. However, it does not work as expected + because all drop commands pass without exception even with ReadConsistency disabled. + The same happens under 3.0.8 (no errors raised). [17.09.2022] pzotov - 1. Test actually must work identical for *every* isolation mode of all possible set. - 2. One need to be very careful with object that attempts to make COMMIT after DROP statement: - if we use custom TPB, start transaction explicitly and 'bind' DDL cursor to this transaction - then we have to run commit *exactly* by this TRANSACTION rather then connection whoch owns it! - See 'tx2.commit()' in the code. If we replace it with 'con2.commit()' then Tx2 will be - *silently* rolled back (!!despite that we issued con.commit() !!) and we will not get any - error messages. I'm not sure whether this correct or no. + 1. Test actually must work identical for *every* isolation mode of all possible set. + 2. One need to be very careful with object that attempts to make COMMIT after DROP statement: + if we use custom TPB, start transaction explicitly and 'bind' DDL cursor to this transaction + then we have to run commit *exactly* by this TRANSACTION rather then connection whoch owns it! + See 'tx2.commit()' in the code. If we replace it with 'con2.commit()' then Tx2 will be + *silently* rolled back (!!despite that we issued con.commit() !!) and we will not get any + error messages. I'm not sure whether this correct or no. + Checked on 3.0.8.33535 (SS/CS), 4.0.1.2692 (SS/CS), 5.0.0.730 - Checked on 3.0.8.33535 (SS/CS), 4.0.1.2692 (SS/CS), 5.0.0.730 + [22.08.2024] pzotov + * Changed DDL because of SubQueryConversion config parameter appearance. + We have to AVOID usage of queries which have plan that can be changed when firebird.conf has + SubQueryConversion = true. In that case some index can be excluded from plan and thus + it can be dropped on first iteration of 'for x_isol in tx_isol_lst' loop. This causes unexpected + error 'index not found' for subsequent checks. + * Added check for error message when we try to drop standalone function. + * Assert moved out to the point after loop in order to show whole result in case of some error + (rather than only one message block for some particular x_isol). + * Excluded check of FB 3.x (this version no more changed). + + Checked on 6.0.0.442, 5.0.2.1479, 4.0.6.3142 """ import pytest @@ -46,17 +58,24 @@ ddl_script = """ create index test1_id on test1(id); commit; - create descending index test2_id_x_desc on test2(id,x); + create descending index test2_x on test2(x); commit; create or alter view v_test as select id,x from test1 where id between 15 and 30; commit; set term ^; + create or alter function fn_worker(a_x int) returns int as + declare v_id int; + begin + execute statement ('select max(b.id) from test2 b where b.x >= ?') (:a_x) into v_id; + return v_id; + end + ^ create or alter procedure sp_worker(a_id int) returns(x int) as begin for - execute statement ('select v.x from v_test v where v.id = ? and exists(select * from test2 b where b.id = v.id)') (:a_id) + execute statement ('select v.x from v_test v where v.id = ? and v.id >= fn_worker(v.x)') (:a_id) into x do suspend; @@ -84,48 +103,18 @@ ddl_script = """ commit; """ -expected_stdout = """ - lock conflict on no wait transaction - -unsuccessful metadata update - -object PROCEDURE "SP_TEST" is in use - (335544345, 335544351, 335544453) - - lock conflict on no wait transaction - -unsuccessful metadata update - -object PROCEDURE "SP_WORKER" is in use - (335544345, 335544351, 335544453) - - lock conflict on no wait transaction - -unsuccessful metadata update - -object VIEW "V_TEST" is in use - (335544345, 335544351, 335544453) - - lock conflict on no wait transaction - -unsuccessful metadata update - -object TABLE "TEST2" is in use - (335544345, 335544351, 335544453) - - lock conflict on no wait transaction - -unsuccessful metadata update - -object INDEX "TEST1_ID" is in use - (335544345, 335544351, 335544453) - - lock conflict on no wait transaction - -unsuccessful metadata update - -object INDEX "TEST2_ID_X_DESC" is in use - (335544345, 335544351, 335544453) -""" - -@pytest.mark.version('>=3.0.6') +@pytest.mark.version('>=4.0') def test_1(act: Action, capsys): act.isql(switches=[], input=ddl_script) - drop_commands = ['drop procedure sp_test', - 'drop procedure sp_worker', - 'drop view v_test', - 'drop table test2', - 'drop index test1_id', - 'drop index test2_id_x_desc'] + drop_commands = [ 'drop procedure sp_test', + 'drop procedure sp_worker', + 'drop function fn_worker', + 'drop view v_test', + 'drop table test2', + 'drop index test1_id', + 'drop index test2_x' + ] tx_isol_lst = [ Isolation.READ_COMMITTED_NO_RECORD_VERSION, Isolation.READ_COMMITTED_RECORD_VERSION, @@ -147,6 +136,7 @@ def test_1(act: Action, capsys): for cmd in drop_commands: with act.db.connect() as con2: custom_tpb = tpb(isolation = x_isol, lock_timeout=0) + print(x_isol.name, cmd) tx2 = con2.transaction_manager(custom_tpb) tx2.begin() cur2 = tx2.cursor() @@ -164,7 +154,218 @@ def test_1(act: Action, capsys): print(e.__str__()) print(e.gds_codes) - act.expected_stdout = expected_stdout - act.stdout = capsys.readouterr().out - assert act.clean_stdout == act.clean_expected_stdout - act.reset() + act.expected_stdout = f""" + READ_COMMITTED_NO_RECORD_VERSION drop procedure sp_test + lock conflict on no wait transaction + -unsuccessful metadata update + -object PROCEDURE "SP_TEST" is in use + (335544345, 335544351, 335544453) + + READ_COMMITTED_NO_RECORD_VERSION drop procedure sp_worker + lock conflict on no wait transaction + -unsuccessful metadata update + -object PROCEDURE "SP_WORKER" is in use + (335544345, 335544351, 335544453) + + READ_COMMITTED_NO_RECORD_VERSION drop function fn_worker + lock conflict on no wait transaction + -unsuccessful metadata update + -object FUNCTION "FN_WORKER" is in use + (335544345, 335544351, 335544453) + + READ_COMMITTED_NO_RECORD_VERSION drop view v_test + lock conflict on no wait transaction + -unsuccessful metadata update + -object VIEW "V_TEST" is in use + (335544345, 335544351, 335544453) + + READ_COMMITTED_NO_RECORD_VERSION drop table test2 + lock conflict on no wait transaction + -unsuccessful metadata update + -object TABLE "TEST2" is in use + (335544345, 335544351, 335544453) + + READ_COMMITTED_NO_RECORD_VERSION drop index test1_id + lock conflict on no wait transaction + -unsuccessful metadata update + -object INDEX "TEST1_ID" is in use + (335544345, 335544351, 335544453) + + READ_COMMITTED_NO_RECORD_VERSION drop index test2_x + lock conflict on no wait transaction + -unsuccessful metadata update + -object INDEX "TEST2_X" is in use + (335544345, 335544351, 335544453) + + READ_COMMITTED_RECORD_VERSION drop procedure sp_test + lock conflict on no wait transaction + -unsuccessful metadata update + -object PROCEDURE "SP_TEST" is in use + (335544345, 335544351, 335544453) + + READ_COMMITTED_RECORD_VERSION drop procedure sp_worker + lock conflict on no wait transaction + -unsuccessful metadata update + -object PROCEDURE "SP_WORKER" is in use + (335544345, 335544351, 335544453) + + READ_COMMITTED_RECORD_VERSION drop function fn_worker + lock conflict on no wait transaction + -unsuccessful metadata update + -object FUNCTION "FN_WORKER" is in use + (335544345, 335544351, 335544453) + + READ_COMMITTED_RECORD_VERSION drop view v_test + lock conflict on no wait transaction + -unsuccessful metadata update + -object VIEW "V_TEST" is in use + (335544345, 335544351, 335544453) + + READ_COMMITTED_RECORD_VERSION drop table test2 + lock conflict on no wait transaction + -unsuccessful metadata update + -object TABLE "TEST2" is in use + (335544345, 335544351, 335544453) + + READ_COMMITTED_RECORD_VERSION drop index test1_id + lock conflict on no wait transaction + -unsuccessful metadata update + -object INDEX "TEST1_ID" is in use + (335544345, 335544351, 335544453) + + READ_COMMITTED_RECORD_VERSION drop index test2_x + lock conflict on no wait transaction + -unsuccessful metadata update + -object INDEX "TEST2_X" is in use + (335544345, 335544351, 335544453) + + SNAPSHOT drop procedure sp_test + lock conflict on no wait transaction + -unsuccessful metadata update + -object PROCEDURE "SP_TEST" is in use + (335544345, 335544351, 335544453) + + SNAPSHOT drop procedure sp_worker + lock conflict on no wait transaction + -unsuccessful metadata update + -object PROCEDURE "SP_WORKER" is in use + (335544345, 335544351, 335544453) + + SNAPSHOT drop function fn_worker + lock conflict on no wait transaction + -unsuccessful metadata update + -object FUNCTION "FN_WORKER" is in use + (335544345, 335544351, 335544453) + + SNAPSHOT drop view v_test + lock conflict on no wait transaction + -unsuccessful metadata update + -object VIEW "V_TEST" is in use + (335544345, 335544351, 335544453) + + SNAPSHOT drop table test2 + lock conflict on no wait transaction + -unsuccessful metadata update + -object TABLE "TEST2" is in use + (335544345, 335544351, 335544453) + + SNAPSHOT drop index test1_id + lock conflict on no wait transaction + -unsuccessful metadata update + -object INDEX "TEST1_ID" is in use + (335544345, 335544351, 335544453) + + SNAPSHOT drop index test2_x + lock conflict on no wait transaction + -unsuccessful metadata update + -object INDEX "TEST2_X" is in use + (335544345, 335544351, 335544453) + + SERIALIZABLE drop procedure sp_test + lock conflict on no wait transaction + -unsuccessful metadata update + -object PROCEDURE "SP_TEST" is in use + (335544345, 335544351, 335544453) + + SERIALIZABLE drop procedure sp_worker + lock conflict on no wait transaction + -unsuccessful metadata update + -object PROCEDURE "SP_WORKER" is in use + (335544345, 335544351, 335544453) + + SERIALIZABLE drop function fn_worker + lock conflict on no wait transaction + -unsuccessful metadata update + -object FUNCTION "FN_WORKER" is in use + (335544345, 335544351, 335544453) + + SERIALIZABLE drop view v_test + lock conflict on no wait transaction + -unsuccessful metadata update + -object VIEW "V_TEST" is in use + (335544345, 335544351, 335544453) + + SERIALIZABLE drop table test2 + lock conflict on no wait transaction + -unsuccessful metadata update + -object TABLE "TEST2" is in use + (335544345, 335544351, 335544453) + + SERIALIZABLE drop index test1_id + lock conflict on no wait transaction + -unsuccessful metadata update + -object INDEX "TEST1_ID" is in use + (335544345, 335544351, 335544453) + + SERIALIZABLE drop index test2_x + lock conflict on no wait transaction + -unsuccessful metadata update + -object INDEX "TEST2_X" is in use + (335544345, 335544351, 335544453) + + READ_COMMITTED_READ_CONSISTENCY drop procedure sp_test + lock conflict on no wait transaction + -unsuccessful metadata update + -object PROCEDURE "SP_TEST" is in use + (335544345, 335544351, 335544453) + + READ_COMMITTED_READ_CONSISTENCY drop procedure sp_worker + lock conflict on no wait transaction + -unsuccessful metadata update + -object PROCEDURE "SP_WORKER" is in use + (335544345, 335544351, 335544453) + + READ_COMMITTED_READ_CONSISTENCY drop function fn_worker + lock conflict on no wait transaction + -unsuccessful metadata update + -object FUNCTION "FN_WORKER" is in use + (335544345, 335544351, 335544453) + + READ_COMMITTED_READ_CONSISTENCY drop view v_test + lock conflict on no wait transaction + -unsuccessful metadata update + -object VIEW "V_TEST" is in use + (335544345, 335544351, 335544453) + + READ_COMMITTED_READ_CONSISTENCY drop table test2 + lock conflict on no wait transaction + -unsuccessful metadata update + -object TABLE "TEST2" is in use + (335544345, 335544351, 335544453) + + READ_COMMITTED_READ_CONSISTENCY drop index test1_id + lock conflict on no wait transaction + -unsuccessful metadata update + -object INDEX "TEST1_ID" is in use + (335544345, 335544351, 335544453) + + READ_COMMITTED_READ_CONSISTENCY drop index test2_x + lock conflict on no wait transaction + -unsuccessful metadata update + -object INDEX "TEST2_X" is in use + (335544345, 335544351, 335544453) + """ + + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout + act.reset() From a53cc7ffadb5f2d44a327296a66330b399166714 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Fri, 23 Aug 2024 12:48:43 +0300 Subject: [PATCH 023/128] Added/Updated tests\bugs\core_1254_test.py: Reimplemented in order to have same results regardless on OptimizeForFirstRows = true / false --- tests/bugs/core_1254_test.py | 111 +++++++++++++++++++++++++---------- 1 file changed, 81 insertions(+), 30 deletions(-) diff --git a/tests/bugs/core_1254_test.py b/tests/bugs/core_1254_test.py index 3681445c..06533df9 100644 --- a/tests/bugs/core_1254_test.py +++ b/tests/bugs/core_1254_test.py @@ -2,52 +2,103 @@ """ ID: issue-1678 -ISSUE: 1678 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/1678 TITLE: Problem with DISTINCT and insensitive collations -DESCRIPTION: +DESCRIPTION: See https://github.com/FirebirdSQL/firebird/issues/2965 JIRA: CORE-1254 FBTEST: bugs.core_1254 +NOTES: + 1. Confirmed problem on 2.1.3.18185 + Both queries: 'select ... group by ...' and 'select distinct ...' issued six rows: + GROUP_ID QUESTION + ======== ============ + a 1 + a 2 + a 3 + A 1 + A 2 + A 3 + (instead of expected three rows with 'a' or 'A' in the 1st column). + The only correct result issued when index was used. + + 2. Values in 1st column can vary if OptimizeForFirstRows = true (FB 5.x+). + Because of this, we have to check only COUNT of letters in this column + that are unique being compared using case SENSITIVE collation. + In all cases (for queries and with/without index) this count must be 1. """ import pytest from firebird.qa import * -init_script = """CREATE TABLE TEST -(GROUP_ID VARCHAR(1) CHARACTER SET UTF8 COLLATE UNICODE_CI, -QUESTION INTEGER, -SCORE INTEGER); -COMMIT; -INSERT INTO TEST (GROUP_ID,QUESTION,SCORE) VALUES ('a',1,1); -INSERT INTO TEST (GROUP_ID,QUESTION,SCORE) VALUES ('a',2,1); -INSERT INTO TEST (GROUP_ID,QUESTION,SCORE) VALUES ('a',3,1); -INSERT INTO TEST (GROUP_ID,QUESTION,SCORE) VALUES ('A',1,1); -INSERT INTO TEST (GROUP_ID,QUESTION,SCORE) VALUES ('A',2,1); -INSERT INTO TEST (GROUP_ID,QUESTION,SCORE) VALUES ('A',3,1); -COMMIT; - +init_script = """ + create table test( + group_id varchar(1) character set utf8 collate unicode_ci, + question integer, + score integer + ); + commit; + insert into test (group_id,question,score) values ('a',1,11); + insert into test (group_id,question,score) values ('a',3,13); + insert into test (group_id,question,score) values ('A',1,14); + insert into test (group_id,question,score) values ('a',2,12); + insert into test (group_id,question,score) values ('A',2,15); + insert into test (group_id,question,score) values ('A',3,16); + commit; + -- See https://github.com/FirebirdSQL/firebird/issues/2965#issue-866882047 + -- GROUP BY will use an index on multi-byte or insensitive collation only + -- when this index is: 1) UNIQUE and 2) ASCENDING. + create UNIQUE index test_gr_que_score on test(group_id, question, score); + commit; """ + db = db_factory(charset='UTF8', init=init_script) -test_script = """SELECT GROUP_ID, QUESTION, SUM(SCORE) FROM TEST GROUP BY 1,2; -SELECT DISTINCT GROUP_ID, QUESTION FROM TEST;""" +test_script = """ + --set explain on; + --set plan on; + set list on; + alter index test_gr_que_score inactive; + commit; + + select count( + distinct cast( group_id as varchar(1) + -- Check count of unique values in 1st column using + -- case SENSITIVE collation: + -- ######################### + character set ascii + ) + ) as "case_SENSITIVE_distinct_gr_1" + from ( + select group_id, question from test group by 1,2 + ); + + select count( distinct cast(group_id as varchar(1) character set ascii)) as "case_SENSITIVE_distinct_gr_2" + from ( + select distinct group_id, question from test + ); + + alter index test_gr_que_score active; + commit; + + select count( distinct cast(group_id as varchar(1) character set ascii)) as "case_SENSITIVE_distinct_gr_3" + from ( + select group_id, question from test group by 1,2 + ); + + select count( distinct cast(group_id as varchar(1) character set ascii)) as "case_SENSITIVE_distinct_gr_4" + from ( + select distinct group_id, question from test + ); +""" act = isql_act('db', test_script) expected_stdout = """ -GROUP_ID QUESTION SUM -======== ============ ===================== -a 1 2 -a 2 2 -a 3 2 - - -GROUP_ID QUESTION -======== ============ -a 1 -a 2 -a 3 - + case_SENSITIVE_distinct_gr_1 1 + case_SENSITIVE_distinct_gr_2 1 + case_SENSITIVE_distinct_gr_3 1 + case_SENSITIVE_distinct_gr_4 1 """ @pytest.mark.version('>=3') From 01a2478ad27689580d6e1384362484c833858597 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Fri, 23 Aug 2024 15:01:07 +0300 Subject: [PATCH 024/128] Added/Updated tests\bugs\core_1292_test.py: Reimplemented because of fail if we change OptimizeForFirstRows = true config parameter. See notes. --- tests/bugs/core_1292_test.py | 142 ++++++++++++++++++++--------------- 1 file changed, 82 insertions(+), 60 deletions(-) diff --git a/tests/bugs/core_1292_test.py b/tests/bugs/core_1292_test.py index db9874a1..1384f6b4 100644 --- a/tests/bugs/core_1292_test.py +++ b/tests/bugs/core_1292_test.py @@ -7,56 +7,51 @@ TITLE: Can't create table using long username and UTF8 as attachment chars DESCRIPTION: JIRA: CORE-1292 FBTEST: bugs.core_1292 +NOTES: + [23.08.2024] pzotov + 1. Removed LIST() from initial query because it displays tokens in unpredictable order. + This can cause fail if we change OptimizeForFirstRows = true config parameter. + 2. Found oddities when try to use non-ascii user name and substitute it using f-notation: + at least REVOKE and GRANT commands reflect this user name in the trace as encoded + in cp1251 instead of utf8. This causes: + 335544321 : arithmetic exception, numeric overflow, or string truncation + 335544565 : Cannot transliterate character between character sets + To be investigated further. """ - +import locale import pytest from firebird.qa import * -db = db_factory(charset='UTF8') +db = db_factory(charset = 'utf8') -test_script = """ - set wng off; +act = python_act('db', substitutions = [ ('[ \t]+', ' '), ]) +tmp_user = user_factory('db', name='Nebuchadnezzar_The_Babylon_Lord', password='123', plugin = 'Srp') +#tmp_user = user_factory('db', name='"НавохудоносорВластелинВавилона2"', password='123', plugin = 'Srp') - -- Drop old account if it remains from prevoius run: - set term ^; - execute block as - begin - begin - execute statement 'drop user Nebuchadnezzar2_King_of_Babylon' with autonomous transaction; - when any do begin end - end - end^ - set term ;^ - commit; +@pytest.mark.version('>=3') +def test_1(act: Action, tmp_user: User, capsys): + test_sql = f""" + set bail on; + set list on; + set wng off; + connect '{act.db.dsn}' user {act.db.user} password '{act.db.password}'; + revoke all on all from {tmp_user.name}; + grant create table to {tmp_user.name}; + commit; - create user Nebuchadnezzar2_King_of_Babylon password 'guinness'; -- revoke admin role; - -- 1234567890123456789012345678901 - -- 1 2 3 - commit; - revoke all on all from Nebuchadnezzar2_King_of_Babylon; - set term ^; - execute block as - begin - if ( rdb$get_context('SYSTEM', 'ENGINE_VERSION') not starting with '2.5' ) then - begin - execute statement 'grant create table to Nebuchadnezzar2_King_of_Babylon'; - end - end - ^ - set term ;^ - commit; + connect '{act.db.dsn}' user {tmp_user.name} password '{tmp_user.password}'; - connect '$(DSN)' user 'Nebuchadnezzar2_King_of_Babylon' password 'guinness'; + select a.mon$user as who_am_i, c.rdb$character_set_name as my_connection_charset + from mon$attachments a + join rdb$character_sets c on a.mon$character_set_id = c.rdb$character_set_id + where a.mon$attachment_id = current_connection; - create table test(n int); - commit; + create table test(n int); + commit; - connect '$(DSN)' user 'SYSDBA' password 'masterkey'; + connect '{act.db.dsn}' user {act.db.user} password '{act.db.password}'; - set list on; - select usr_name, grantor, can_grant, tab_name,usr_type,obj_type, list(priv) priv_list - from ( select p.rdb$user usr_name ,p.rdb$grantor grantor @@ -66,31 +61,58 @@ test_script = """ ,p.rdb$object_type obj_type ,trim(p.rdb$privilege) priv from rdb$user_privileges p - where upper(trim(p.rdb$relation_name)) = upper('test') - order by priv - ) - group by usr_name, grantor, can_grant, tab_name,usr_type,obj_type; - commit; + where + upper(trim(p.rdb$relation_name)) = upper('test') + and p.rdb$user = _utf8 '{tmp_user.name}' collate unicode_ci + order by priv; + commit; + """ - drop user Nebuchadnezzar2_King_of_Babylon; - commit; -""" + expected_stdout = f""" + WHO_AM_I {tmp_user.name.upper()} + MY_CONNECTION_CHARSET UTF8 -act = isql_act('db', test_script, substitutions=[('PRIV_LIST.*', '')]) + USR_NAME {tmp_user.name.upper()} + GRANTOR {tmp_user.name.upper()} + CAN_GRANT 1 + TAB_NAME TEST + USR_TYPE 8 + OBJ_TYPE 0 + PRIV D -expected_stdout = """ - USR_NAME NEBUCHADNEZZAR2_KING_OF_BABYLON - GRANTOR NEBUCHADNEZZAR2_KING_OF_BABYLON - CAN_GRANT 1 - TAB_NAME TEST - USR_TYPE 8 - OBJ_TYPE 0 - D,I,R,S,U -""" + USR_NAME {tmp_user.name.upper()} + GRANTOR {tmp_user.name.upper()} + CAN_GRANT 1 + TAB_NAME TEST + USR_TYPE 8 + OBJ_TYPE 0 + PRIV I + + USR_NAME {tmp_user.name.upper()} + GRANTOR {tmp_user.name.upper()} + CAN_GRANT 1 + TAB_NAME TEST + USR_TYPE 8 + OBJ_TYPE 0 + PRIV R + + USR_NAME {tmp_user.name.upper()} + GRANTOR {tmp_user.name.upper()} + CAN_GRANT 1 + TAB_NAME TEST + USR_TYPE 8 + OBJ_TYPE 0 + PRIV S + + USR_NAME {tmp_user.name.upper()} + GRANTOR {tmp_user.name.upper()} + CAN_GRANT 1 + TAB_NAME TEST + USR_TYPE 8 + OBJ_TYPE 0 + PRIV U + """ -@pytest.mark.version('>=3') -def test_1(act: Action): act.expected_stdout = expected_stdout - act.execute() + act.isql(switches = ['-q'], input = test_sql, charset = 'utf8', connect_db=False, credentials = False, combine_output = True, io_enc = locale.getpreferredencoding()) assert act.clean_stdout == act.clean_expected_stdout - From 0417933393d61c8621ecb157f9a1ae861ddabb6f Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Fri, 23 Aug 2024 15:43:59 +0300 Subject: [PATCH 025/128] Added/Updated tests\bugs\core_1453_test.py: Reimplemented: we have to avoid to show result of LIST() call because unpredictable order of its tokens. This can cause fail if we change OptimizeForFirstRows = true config parameter. --- tests/bugs/core_1453_test.py | 52 ++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/tests/bugs/core_1453_test.py b/tests/bugs/core_1453_test.py index fb710faa..54f1a017 100644 --- a/tests/bugs/core_1453_test.py +++ b/tests/bugs/core_1453_test.py @@ -7,45 +7,45 @@ TITLE: Allow usage of functions in LIST delimiter parameter DESCRIPTION: JIRA: CORE-1443 FBTEST: bugs.core_1453 +NOTES: + [23.08.2024] pzotov + Reimplemented: we have to avoid to show result of LIST() call because unpredictable order of its tokens. + This can cause fail if we change OptimizeForFirstRows = true config parameter. + Instead, test apply char_len() to the result of list(<...>, ). """ import pytest from firebird.qa import * -init_script = """CREATE TABLE T1 (ID INTEGER, NAME CHAR(20)); -COMMIT; -INSERT INTO T1 (ID,NAME) VALUES (1,'ORANGE'); -INSERT INTO T1 (ID,NAME) VALUES (1,'APPLE'); -INSERT INTO T1 (ID,NAME) VALUES (1,'LEMON'); -INSERT INTO T1 (ID,NAME) VALUES (2,'ORANGE'); -INSERT INTO T1 (ID,NAME) VALUES (2,'APPLE'); -INSERT INTO T1 (ID,NAME) VALUES (2,'PEAR'); -COMMIT; +init_script = """ + create table t1 (id integer, name char(20)); + commit; + insert into t1 (id,name) values (1,'orange'); + insert into t1 (id,name) values (1,'apple'); + insert into t1 (id,name) values (1,'lemon'); + insert into t1 (id,name) values (2,'orange'); + insert into t1 (id,name) values (2,'apple'); + insert into t1 (id,name) values (2,'pear'); + commit; """ db = db_factory(init=init_script) -test_script = """select ID, LIST( trim(NAME), ASCII_CHAR(35) ) -from T1 -group by 1; +test_script = """ + set list on; + select id, char_length(list( trim(name), ascii_char(35) )) chr_len + from t1 + group by id + order by id; """ -act = isql_act('db', test_script) +act = isql_act('db', test_script, substitutions = [ ('[ \t]+', ' '), ]) expected_stdout = """ - ID LIST -============ ================= - 1 0:1 -============================================================================== -LIST: -ORANGE#LEMON#APPLE -============================================================================== - 2 0:2 -============================================================================== -LIST: -PEAR#ORANGE#APPLE -============================================================================== - + ID 1 + CHR_LEN 18 + ID 2 + CHR_LEN 17 """ @pytest.mark.version('>=2.5.0') From 9f45c1f71367b1de5ecc7a708f197ef9a5c61082 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Fri, 23 Aug 2024 16:10:30 +0300 Subject: [PATCH 026/128] Added/Updated tests\bugs\core_2922_test.py: added second column to 'order by' clause to force predicable output because of possible changing 'OptimizeForFirstRows' config parameter. --- tests/bugs/core_2922_test.py | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/tests/bugs/core_2922_test.py b/tests/bugs/core_2922_test.py index 5b1424ad..469d0cc1 100644 --- a/tests/bugs/core_2922_test.py +++ b/tests/bugs/core_2922_test.py @@ -41,24 +41,22 @@ test_script = """ join rdb$types rt on rd.rdb$depended_on_type = rt.rdb$type and rt.rdb$type_name containing upper('COLLATION') - order by 1; - + order by dep_name, dep_on + ; """ act = isql_act('db', test_script) expected_stdout = """ -DEP_NAME P1 -DEP_ON WIN1250 -DEP_ON_TYPE COLLATION - -DEP_NAME P1 -DEP_ON UTF8 -DEP_ON_TYPE COLLATION - -DEP_NAME P2 -DEP_ON WIN1250 -DEP_ON_TYPE COLLATION + DEP_NAME P1 + DEP_ON UTF8 + DEP_ON_TYPE COLLATION + DEP_NAME P1 + DEP_ON WIN1250 + DEP_ON_TYPE COLLATION + DEP_NAME P2 + DEP_ON WIN1250 + DEP_ON_TYPE COLLATION """ @pytest.mark.version('>=3.0') From 3626071f72fbc6c11e1a0562155a29e0a901f421 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Fri, 23 Aug 2024 22:56:18 +0300 Subject: [PATCH 027/128] Added/Updated tests\bugs\gh_8225_test.py: Checked on 5.0.2.1482-604555f. NOT: parameter 'SubQueryConversion' currently presents only in FB 5.x and _NOT_ in FB 6.x. --- tests/bugs/gh_8225_test.py | 110 +++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 tests/bugs/gh_8225_test.py diff --git a/tests/bugs/gh_8225_test.py b/tests/bugs/gh_8225_test.py new file mode 100644 index 00000000..e923eaee --- /dev/null +++ b/tests/bugs/gh_8225_test.py @@ -0,0 +1,110 @@ +#coding:utf-8 + +""" +ID: issue-8225 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8225 +TITLE: Problematic queries when SubQueryConversion = true +DESCRIPTION: +NOTES: + [23.08.2024] pzotov + 1. Explained plan output temporary disabled: there is question about missed(?) indentation after 'Refetch'. + Sent letter to dimitr, 23.08.2024 21:42. + 2. Parameter 'SubQueryConversion' currently presents only in FB 5.x and _NOT_ in FB 6.x. + Because of that, testing version are limited only for 5.0.2. FB 6.x currently is NOT tested. + + Confirmed bug on 5.0.2.1479-adfe97a. + Checked on 5.0.2.1482-604555f. +""" + +import pytest +from firebird.qa import * +from firebird.driver import driver_config, connect + +init_script = """ + create domain dm_emp_id smallint; + create domain dm_dep_id smallint; + create domain dm_name varchar(20); + + create table department ( + dept_no dm_dep_id not null + ,dept_name dm_name not null + ); + + create table employee ( + emp_no dm_emp_id not null + ,last_name dm_name not null + ,dept_no dm_dep_id not null + ,constraint emp_key primary key (emp_no) + ); + commit; + insert into department( dept_no, dept_name) values (1, 'd1'); + insert into department( dept_no, dept_name) values (2, 'd2'); + insert into department( dept_no, dept_name) values (3, 'd3'); + insert into employee( emp_no, last_name, dept_no) values (1, 'e1', 1); + insert into employee( emp_no, last_name, dept_no) values (2, 'e2', 2); + insert into employee( emp_no, last_name, dept_no) values (3, 'e3', 3); + insert into employee( emp_no, last_name, dept_no) values (4, 'e4', 1); + insert into employee( emp_no, last_name, dept_no) values (5, 'e5', 1); + insert into employee( emp_no, last_name, dept_no) values (6, 'e6', 1); + insert into employee( emp_no, last_name, dept_no) values (7, 'e7', 2); + insert into employee( emp_no, last_name, dept_no) values (8, 'e8', 3); + insert into employee( emp_no, last_name, dept_no) values (9, 'e9', 3); + commit; + + update department d set dept_no = -dept_no where exists(select * from employee e where e.dept_no = d.dept_no) rows 1; + insert into employee( emp_no, last_name, dept_no) values (12, 'e12', -(select max(dept_no)+1 from department) ); + commit; +""" + +db = db_factory(init=init_script) + +act = python_act('db') + +#----------------------------------------------------------- + +def replace_leading(source, char="."): + stripped = source.lstrip() + return char * (len(source) - len(stripped)) + stripped + +#----------------------------------------------------------- + +@pytest.mark.version('>=5.0.2,<6') +def test_1(act: Action, capsys): + + test_sql = """ + select d.dept_no, d.dept_name from department d + where exists(select * from employee e where e.dept_no = d.dept_no) + order by dept_no rows 1 + """ + + for sq_conv in ('true','false',): + srv_cfg = driver_config.register_server(name = f'srv_cfg_8225_{sq_conv}', config = '') + db_cfg_name = f'db_cfg_8225_{sq_conv}' + db_cfg_object = driver_config.register_database(name = db_cfg_name) + db_cfg_object.server.value = srv_cfg.name + db_cfg_object.database.value = str(act.db.db_path) + db_cfg_object.config.value = f""" + SubQueryConversion = {sq_conv} + """ + + with connect(db_cfg_name, user = act.db.user, password = act.db.password) as con: + cur = con.cursor() + cur.execute("select g.rdb$config_name, g.rdb$config_value from rdb$database r left join rdb$config g on g.rdb$config_name = 'SubQueryConversion'") + for r in cur: + print(r[0],r[1]) + + ps = cur.prepare(test_sql) + # temporary, until question with indentation will be solved by dimitr -- print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) + for r in cur.execute(ps): + print(r[0],r[1]) + con.rollback() + + act.expected_stdout = f""" + SubQueryConversion true + 2 d2 + SubQueryConversion false + 2 d2 + """ + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout + From a16a65ddfa2d7b5d4704eebbcd09283c7ce904af Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Mon, 26 Aug 2024 14:35:21 +0300 Subject: [PATCH 028/128] Added/Updated tests\bugs\gh_8231_test.py: Checked on 5.0.2.1485-274af35 -- all ok. --- tests/bugs/gh_8231_test.py | 98 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 tests/bugs/gh_8231_test.py diff --git a/tests/bugs/gh_8231_test.py b/tests/bugs/gh_8231_test.py new file mode 100644 index 00000000..3ac420cc --- /dev/null +++ b/tests/bugs/gh_8231_test.py @@ -0,0 +1,98 @@ +#coding:utf-8 + +""" +ID: issue-8231 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8231 +TITLE: SubQueryConversion = true --request size limit exceeded / Unsuccessful execution caused by an unavailable resource. unable to allocate memory from operating system +DESCRIPTION: +NOTES: + [26.08.2024] pzotov + Two tables must be joined by columns which has different charset or collates. + Confirmed bug on 5.0.2.1484-3cdfd38 (25.08.2024), got: + Statement failed, SQLSTATE = HY000 + request size limit exceeded + Checked on 5.0.2.1485-274af35 -- all ok. + + Thanks to dimitr for the advice on implementing the test. +""" + +import pytest +from firebird.qa import * +from firebird.driver import driver_config, connect + +init_script = """ + create table t1(fld varchar(10) character set win1252); + create table t2(fld varchar(10) character set utf8); + + insert into t1(fld) values('Ð'); + insert into t2(fld) values('Ð'); + commit; +""" + +db = db_factory(init=init_script) + +act = python_act('db') + +#----------------------------------------------------------- + +def replace_leading(source, char="."): + stripped = source.lstrip() + return char * (len(source) - len(stripped)) + stripped + +#----------------------------------------------------------- + +@pytest.mark.version('>=5.0.2,<6') +def test_1(act: Action, capsys): + + test_sql = """ + select 1 as x + from t1 + where exists (select 1 from t2 where t1.fld = t2.fld) + """ + + for sq_conv in ('true','false',): + srv_cfg = driver_config.register_server(name = f'srv_cfg_8231_{sq_conv}', config = '') + db_cfg_name = f'db_cfg_8231_{sq_conv}' + db_cfg_object = driver_config.register_database(name = db_cfg_name) + db_cfg_object.server.value = srv_cfg.name + db_cfg_object.database.value = str(act.db.db_path) + db_cfg_object.config.value = f""" + SubQueryConversion = {sq_conv} + """ + + with connect(db_cfg_name, user = act.db.user, password = act.db.password) as con: + cur = con.cursor() + cur.execute("select g.rdb$config_name, g.rdb$config_value from rdb$database r left join rdb$config g on g.rdb$config_name = 'SubQueryConversion'") + for r in cur: + print(r[0],r[1]) + + ps = cur.prepare(test_sql) + + # Print explained plan with padding eash line by dots in order to see indentations: + print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) + + # Print data: + for r in cur.execute(ps): + print(r[0]) + con.rollback() + + act.expected_stdout = f""" + SubQueryConversion true + Select Expression + ....-> Nested Loop Join (semi) + ........-> Table "T1" Full Scan + ........-> Filter + ............-> Table "T2" Full Scan + 1 + + SubQueryConversion false + Sub-query + ....-> Filter + ........-> Table "T2" Full Scan + Select Expression + ....-> Filter + ........-> Table "T1" Full Scan + 1 + """ + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From 99ceae14eaeb15dd89bd8a16ebb9ad6bfbfdb66d Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Mon, 26 Aug 2024 23:46:15 +0300 Subject: [PATCH 029/128] Added/Updated tests\bugs\core_5229_test.py: added comments about unable to fully turn off IPv6 on Windows. --- tests/bugs/core_5229_test.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/bugs/core_5229_test.py b/tests/bugs/core_5229_test.py index a3a69e44..4a3e48ce 100644 --- a/tests/bugs/core_5229_test.py +++ b/tests/bugs/core_5229_test.py @@ -20,6 +20,18 @@ NOTES: External Data Source provider 'inet6://[' not found ======== It was fixed in gh-8156. + 3. On Windows there is no way to make IPv6 'fully disabled': address '::1' remains active. + According to https://learn.microsoft.com/en-us/troubleshoot/windows-server/networking/configure-ipv6-in-windows + "You cannot completely disable IPv6 as IPv6 is used internally on the system for many TCPIP tasks. + For example, you will still be able to run ping ::1 after configuring this setting" + + We can turn off listening of '::1' by FB server if do following: + * run PowerShell and type there: Enable-NetAdapterBinding -Name "*" -ComponentID ms_tcpip6 + * chcp 65001, then: ipconfig /all | findstr /i /r /c:" IPv6.*(preferred)" + * save somewhere IPv6 address from previous command (e.g. 'fe80::f53c:9ecf:aad:4761%14') + * change in firebird.conf: RemoteBindAddress = fe80::f53c:9ecf:aad:4761 + But this requires RESTART of FB server thus cannot be used in QA. + Discussed with Vlad 13-jun-2024. [14.06.2024] pzotov Checked "on external 'inet6://[::1]/{act.db.db_path}'" after fixed GH-8156, builds: 3.0.12.33757, 4.0.5.3112, 5.0.1.1416, 6.0.0.374 From 75eb296c15f9fb52dc619f5e52467bbf45f0f6cf Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Tue, 27 Aug 2024 09:19:23 +0300 Subject: [PATCH 030/128] Added/Updated tests\bugs\gh_8223_test.py: Checked on 5.0.2.1483-0bf2de0 --- tests/bugs/gh_8223_test.py | 140 +++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 tests/bugs/gh_8223_test.py diff --git a/tests/bugs/gh_8223_test.py b/tests/bugs/gh_8223_test.py new file mode 100644 index 00000000..d5017dff --- /dev/null +++ b/tests/bugs/gh_8223_test.py @@ -0,0 +1,140 @@ +#coding:utf-8 + +""" +ID: issue-8223 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8223 +TITLE: SubQueryConversion = true: error "no current record for fetch operation" with complex joins +DESCRIPTION: +NOTES: + [27.08.2024] pzotov + 1. Confirmed bug on 5.0.1.1469-1d792e4 (Release (15.08.2024), got for SubQueryConversion=true: + no current record for fetch operation / gdscode = 335544348. + + 2. Parameter 'SubQueryConversion' currently presents only in FB 5.x and _NOT_ in FB 6.x. + Because of that, testing version are limited only for 5.0.2. FB 6.x currently is NOT tested. + 3. Custom driver config objects are created here, one with SubQueryConversion = true and second with false. + + Checked on 5.0.2.1483-0bf2de0 -- all ok. + Thanks to dimitr for the advice on implementing the test. +""" + +import pytest +from firebird.qa import * +from firebird.driver import driver_config, connect, DatabaseError + +init_script = """ + create table t1(id int); + create table t2(id int); + create table t3(id int); + create table t4(id int); + create table t5(id int); + + insert into t1(id) values(1); + insert into t2(id) values(1); + insert into t3(id) values(1); + insert into t4(id) values(1); + insert into t5(id) values(1); + commit; + + create view v as + select a.id as a_id, b.id as b_id, c.id as c_id + from t1 a + left join t2 b on a.id = b.id + left join t3 c on b.id = c.id; + commit; +""" + +db = db_factory(init=init_script) + +act = python_act('db') + +#----------------------------------------------------------- + +def replace_leading(source, char="."): + stripped = source.lstrip() + return char * (len(source) - len(stripped)) + stripped + +#----------------------------------------------------------- + +@pytest.mark.version('>=5.0.2,<6') +def test_1(act: Action, capsys): + + test_sql = """ + select v.a_id, v.b_id, v.c_id + from v + join t4 d on v.c_id = d.id + where exists ( + select 1 + from t5 e where e.id = d.id + ) + """ + + for sq_conv in ('true','false',): + srv_cfg = driver_config.register_server(name = f'srv_cfg_8223_{sq_conv}', config = '') + db_cfg_name = f'db_cfg_8223_{sq_conv}' + db_cfg_object = driver_config.register_database(name = db_cfg_name) + db_cfg_object.server.value = srv_cfg.name + db_cfg_object.database.value = str(act.db.db_path) + db_cfg_object.config.value = f""" + SubQueryConversion = {sq_conv} + """ + + with connect(db_cfg_name, user = act.db.user, password = act.db.password) as con: + try: + cur = con.cursor() + cur.execute("select g.rdb$config_name, g.rdb$config_value from rdb$database r left join rdb$config g on g.rdb$config_name = 'SubQueryConversion'") + for r in cur: + print(r[0],r[1]) + + ps = cur.prepare(test_sql) + + # Print explained plan with padding eash line by dots in order to see indentations: + print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) + + # Print data: + for r in cur.execute(ps): + print(r[0], r[1], r[2]) + except DatabaseError as e: + print(e.__str__()) + print(e.gds_codes) + + act.expected_stdout = f""" + SubQueryConversion true + Select Expression + ....-> Filter + ........-> Hash Join (semi) + ............-> Filter + ................-> Hash Join (inner) + ....................-> Nested Loop Join (outer) + ........................-> Nested Loop Join (outer) + ............................-> Table "T1" as "V A" Full Scan + ............................-> Filter + ................................-> Table "T2" as "V B" Full Scan + ........................-> Filter + ............................-> Table "T3" as "V C" Full Scan + ....................-> Record Buffer (record length: 25) + ........................-> Table "T4" as "D" Full Scan + ............-> Record Buffer (record length: 25) + ................-> Table "T5" as "E" Full Scan + 1 1 1 + SubQueryConversion false + Sub-query + ....-> Filter + ........-> Table "T5" as "E" Full Scan + Select Expression + ....-> Filter + ........-> Hash Join (inner) + ............-> Nested Loop Join (outer) + ................-> Nested Loop Join (outer) + ....................-> Table "T1" as "V A" Full Scan + ....................-> Filter + ........................-> Table "T2" as "V B" Full Scan + ................-> Filter + ....................-> Table "T3" as "V C" Full Scan + ............-> Record Buffer (record length: 25) + ................-> Filter + ....................-> Table "T4" as "D" Full Scan + 1 1 1 + """ + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From e06829557f8a3b50ed5d6229fceae8a7a67a2ace Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Wed, 28 Aug 2024 16:45:00 +0300 Subject: [PATCH 031/128] Added/Updated tests\bugs\gh_8233_test.py: Checked on 5.0.2.1487-6934878 -- all ok. --- tests/bugs/gh_8233_test.py | 117 +++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 tests/bugs/gh_8233_test.py diff --git a/tests/bugs/gh_8233_test.py b/tests/bugs/gh_8233_test.py new file mode 100644 index 00000000..035df828 --- /dev/null +++ b/tests/bugs/gh_8233_test.py @@ -0,0 +1,117 @@ +#coding:utf-8 + +""" +ID: issue-8233 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8233 +TITLE: SubQueryConversion = true --multiple rows in singleton select +DESCRIPTION: +NOTES: + [27.08.2024] pzotov + 1. Confirmed bug on 5.0.1.1485-274af35 (26.08.2024), got for SubQueryConversion=true: + "multiple rows in singleton select", gdscodes: (335544652, 335544842) + 2. Parameter 'SubQueryConversion' currently presents only in FB 5.x and _NOT_ in FB 6.x. + Because of that, testing version are limited only for 5.0.2. FB 6.x currently is NOT tested. + 3. Table 't1' must have more than one row for bug reproducing. Query must be enclosed in execute block. + 4. Custom driver config objects are created here, one with SubQueryConversion = true and second with false. + + Checked on 5.0.2.1487-6934878 -- all ok. + Thanks to dimitr for the advice on implementing the test. +""" + +import pytest +from firebird.qa import * +from firebird.driver import driver_config, connect, DatabaseError + +init_script = """ +create table t1(id int, fld int); +create table t2(id int, fld int); + +insert into t1(id, fld) values(1, 111); +insert into t1(id, fld) values(2, 222); +insert into t1(id, fld) values(3, 333); +insert into t2(id, fld) values(3, 999); +commit; +""" + +db = db_factory(init=init_script) + +act = python_act('db') + +#----------------------------------------------------------- + +def replace_leading(source, char="."): + stripped = source.lstrip() + return char * (len(source) - len(stripped)) + stripped + +#----------------------------------------------------------- + +@pytest.mark.version('>=5.0.2,<6') +def test_1(act: Action, capsys): + + test_sql = """ + execute block returns (res int) + as + begin + select first 1 id from t1 + where exists (select 1 from t2 where t1.id = t2.id) + order by t1.id + into :res; + suspend; + end + """ + + for sq_conv in ('true','false',): + srv_cfg = driver_config.register_server(name = f'srv_cfg_8233_{sq_conv}', config = '') + db_cfg_name = f'db_cfg_8233_{sq_conv}' + db_cfg_object = driver_config.register_database(name = db_cfg_name) + db_cfg_object.server.value = srv_cfg.name + db_cfg_object.database.value = str(act.db.db_path) + db_cfg_object.config.value = f""" + SubQueryConversion = {sq_conv} + """ + + with connect(db_cfg_name, user = act.db.user, password = act.db.password) as con: + try: + cur = con.cursor() + cur.execute("select g.rdb$config_name, g.rdb$config_value from rdb$database r left join rdb$config g on g.rdb$config_name = 'SubQueryConversion'") + for r in cur: + print(r[0],r[1]) + + ps = cur.prepare(test_sql) + + # Print explained plan with padding eash line by dots in order to see indentations: + print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) + + # Print data: + for r in cur.execute(ps): + print(r[0]) + except DatabaseError as e: + print(e.__str__()) + print(e.gds_codes) + + act.expected_stdout = f""" + SubQueryConversion true + Select Expression (line 5, column 12) + ....-> Singularity Check + ........-> First N Records + ............-> Filter + ................-> Hash Join (semi) + ....................-> Sort (record length: 28, key length: 8) + ........................-> Table "T1" Full Scan + ....................-> Record Buffer (record length: 25) + ........................-> Table "T2" Full Scan + 3 + SubQueryConversion false + Sub-query + ....-> Filter + ........-> Table "T2" Full Scan + Select Expression (line 5, column 12) + ....-> Singularity Check + ........-> First N Records + ............-> Sort (record length: 28, key length: 8) + ................-> Filter + ....................-> Table "T1" Full Scan + 3 + """ + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From 9f489646743686cd38c55b0dc77dd9016ca5c741 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 29 Aug 2024 21:21:49 +0300 Subject: [PATCH 032/128] Increased StatementTimeout. It seems that in some cases previous value was too small --- configs/fb40_all.conf | 2 +- configs/fb50_all.conf | 5 ++++- configs/fb60_all.conf | 4 +++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/configs/fb40_all.conf b/configs/fb40_all.conf index 103e7311..80ea8205 100644 --- a/configs/fb40_all.conf +++ b/configs/fb40_all.conf @@ -68,7 +68,7 @@ MaxIdentifierByteLength = 252 MaxIdentifierCharLength = 63 WireCryptPlugin = ChaCha, Arc4 -StatementTimeout = 300 +StatementTimeout = 600 ConnectionIdleTimeout = 0 ClearGTTAtRetaining = 0 diff --git a/configs/fb50_all.conf b/configs/fb50_all.conf index a811cdcd..850fcda1 100644 --- a/configs/fb50_all.conf +++ b/configs/fb50_all.conf @@ -70,7 +70,7 @@ MaxIdentifierByteLength = 252 MaxIdentifierCharLength = 63 WireCryptPlugin = ChaCha, Arc4 -StatementTimeout = 300 +StatementTimeout = 600 ConnectionIdleTimeout = 0 ClearGTTAtRetaining = 0 @@ -81,3 +81,6 @@ TipCacheBlockSize = 4M # Added 03-apr-2023: ParallelWorkers = 1 MaxParallelWorkers = 8 + +# SubQueryConversion = false +# OptimizeForFirstRows = false diff --git a/configs/fb60_all.conf b/configs/fb60_all.conf index ebb4196a..679b1edd 100644 --- a/configs/fb60_all.conf +++ b/configs/fb60_all.conf @@ -70,7 +70,7 @@ MaxIdentifierByteLength = 252 MaxIdentifierCharLength = 63 WireCryptPlugin = ChaCha, Arc4 -StatementTimeout = 300 +StatementTimeout = 600 ConnectionIdleTimeout = 0 ClearGTTAtRetaining = 0 @@ -81,3 +81,5 @@ TipCacheBlockSize = 4M # Added 03-apr-2023: ParallelWorkers = 1 MaxParallelWorkers = 8 + +#OptimizeForFirstRows = false From 92df06e66d2c5616e0a06e09c3fce8ac658cd41b Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sat, 31 Aug 2024 22:00:49 +0300 Subject: [PATCH 033/128] Added/Updated tests\functional\tabloid\test_657d86fe.py: Checked on 6.0.0.4444, 5.0.2.1487, 4.0.6.3142 --- tests/functional/tabloid/test_657d86fe.py | 72 +++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 tests/functional/tabloid/test_657d86fe.py diff --git a/tests/functional/tabloid/test_657d86fe.py b/tests/functional/tabloid/test_657d86fe.py new file mode 100644 index 00000000..1bf357a3 --- /dev/null +++ b/tests/functional/tabloid/test_657d86fe.py @@ -0,0 +1,72 @@ +#coding:utf-8 + +""" +ID: None +ISSUE: https://github.com/FirebirdSQL/firebird/commit/657d86fed65e647dc162980836d24a2e19c1342c +TITLE: RemoteAuxPort is per-database +DESCRIPTION: + Test checks ability to set value of free port in DPB for RemoteAuxPort parameter. + This is done two times with verifying that value is actually changed by querying to rdb$config. +NOTES: + [31.08.2024] pzotov + 1. No ticket has been created for this test. + 2. Custom driver-config object must be used for DPB. + + Checked on 6.0.0.4444, 5.0.2.1487, 4.0.6.3142 +""" + +import socket +from contextlib import closing +import pytest +from firebird.qa import * +from firebird.driver import driver_config, connect, DatabaseError + +db = db_factory() +act = python_act('db') + +#----------------------------------------------------------- + +def find_free_port(): + # AF_INET - constant represent the address (and protocol) families, used for the first argument to socket() + # A pair (host, port) is used for the AF_INET address family, where host is a string representing either a + # hostname in Internet domain notation like 'daring.cwi.nl' or an IPv4 address like '100.50.200.5', and port is an integer. + # SOCK_STREAM means that it is a TCP socket. + # SOCK_DGRAM means that it is a UDP socket. + with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s: + s.bind(('', 0)) + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + free_port = s.getsockname()[1] + return free_port + +#----------------------------------------------------------- + +@pytest.mark.version('>=4.0') +def test_1(act: Action, capsys): + + for iter in range(2): + free_aux_port = find_free_port() + srv_cfg = driver_config.register_server(name = f'srv_cfg_657d86fe_{iter}', config = '') + db_cfg_name = f'db_cfg_657d86fe_{iter}' + db_cfg_object = driver_config.register_database(name = db_cfg_name) + db_cfg_object.server.value = srv_cfg.name + db_cfg_object.database.value = str(act.db.db_path) + db_cfg_object.config.value = f""" + RemoteAuxPort = {free_aux_port} + """ + + with connect(db_cfg_name, user = act.db.user, password = act.db.password) as con: + try: + cur = con.cursor() + cur.execute("select g.rdb$config_name, g.rdb$config_value from rdb$database r left join rdb$config g on g.rdb$config_name = 'RemoteAuxPort'") + for r in cur: + print(iter, r[0], r[1]) + + except DatabaseError as e: + print(e.__str__()) + print(e.gds_codes) + + act.expected_stdout = f""" + {iter} RemoteAuxPort {free_aux_port} + """ + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From 207c9dacfb48e9e821cebd062a4fe7f359f9b88b Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sun, 1 Sep 2024 10:51:09 +0300 Subject: [PATCH 034/128] Added/Updated tests\bugs\gh_6282_test.py: On Linux argument of tzfile is shown with prefix, e.g. '/usr/share/zoneinfo/', so we have to remove it --- tests/bugs/gh_6282_test.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/tests/bugs/gh_6282_test.py b/tests/bugs/gh_6282_test.py index aa25b771..a38abf20 100644 --- a/tests/bugs/gh_6282_test.py +++ b/tests/bugs/gh_6282_test.py @@ -20,6 +20,13 @@ NOTES: or AttributeError: 'iUtil_v2' object has no attribute 'decode_timestamp_tz' + [01.09.2024] + On Linux argument of tzfile is shown with prefix ("/usr/share/zoneinfo/"), so we have to remove it: + : + Windows = tzfile('Indian/Cocos') + Linux = tzfile('/usr/share/zoneinfo/Indian/Cocos') + This is done by extracting '_timezone_' property of this instance. + Checked on 6.0.0.396, 5.0.1.1440, 4.0.5.3127 """ import pytest @@ -104,7 +111,7 @@ def test_1(act: Action, capsys): cur = con.cursor() cur.execute('select current_timestamp from rdb$database') for r in cur: - print(r[0].tzinfo) + print(r[0].tzinfo._timezone_) cur.close() # The value set through the DPB should survive an `alter session reset` @@ -114,11 +121,14 @@ def test_1(act: Action, capsys): cur = con.cursor() cur.execute('select current_timestamp from rdb$database') for r in cur: - print(r[0].tzinfo) - + # class 'dateutil.zoneinfo.tzfile' + tzfile_nfo = r[0].tzinfo # : Windows = tzfile('Indian/Cocos'); Linux = tzfile('/usr/share/zoneinfo/Indian/Cocos') + # tzfile_arg = tzfile_nfo._filename # : Windows = 'Indian/Cocos'; Linux = '/usr/share/zoneinfo/Indian/Cocos' + print(tzfile_nfo._timezone_) # Windows: 'Indian/Cocos'; Linux: 'Indian/Cocos' + act.expected_stdout = f""" - tzfile('{SELECTED_TIMEZONE}') - tzfile('{SELECTED_TIMEZONE}') + {SELECTED_TIMEZONE} + {SELECTED_TIMEZONE} """ act.stdout = capsys.readouterr().out assert act.clean_stdout == act.clean_expected_stdout From 0f8d782ff41eeb5ff1d4fedd42876ad01869cf37 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Mon, 2 Sep 2024 00:47:33 +0300 Subject: [PATCH 035/128] Added/Updated tests\functional\tabloid\test_3b372197.py: Checked on 6.0.0.446, 5.0.2.1487 --- tests/functional/tabloid/test_3b372197.py | 194 ++++++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 tests/functional/tabloid/test_3b372197.py diff --git a/tests/functional/tabloid/test_3b372197.py b/tests/functional/tabloid/test_3b372197.py new file mode 100644 index 00000000..2e4e7ae1 --- /dev/null +++ b/tests/functional/tabloid/test_3b372197.py @@ -0,0 +1,194 @@ +#coding:utf-8 + +""" +ID: None +ISSUE: https://github.com/FirebirdSQL/firebird/issues/6798 +TITLE: built-in functions UNICODE_CHAR and UNICODE_VAL +DESCRIPTION: + Test verifies ability to call UNICODE_CHAR/UNICODE_VAL for each code point + in Unicode ranges defined in https://jrgraphix.net/r/Unicode/, except following: + (0xD800, 0xDB7F), # High Surrogates + (0xDB80, 0xDBFF), # High Private Use Surrogates + (0xDC00, 0xDFFF), # Low Surrogates + Result of UNICODE_VAL(UNICODE_CHAR()) must be for all code points. + Commit in FB 5.x (14-may-2021): + https://github.com/FirebirdSQL/firebird/commit/3b372197e4bec60842a7ca974a07546858b6dd30 +NOTES: + [02.09.2024] pzotov + Test duration on Windows: about 205 seconds. + Checked on 6.0.0.446, 5.0.2.1487 +""" +import pytest +from firebird.qa import * + +init_sql = """ + set term ^; + create procedure sp_get_unicode_char(a_code_point int) returns(u char(1) character set utf8) + as + begin + u = unicode_char(a_code_point); + suspend; + end + ^ + create procedure sp_get_unicode_val(u char(1) character set utf8) returns(code_point int) + as + begin + code_point = unicode_val(u); + suspend; + end + ^ + set term ;^ + commit; +""" +db = db_factory(init = init_sql) +act = python_act('db', substitutions=[('[ \t]+', ' ')]) + +#------------------------------------------------ + +@pytest.mark.version('>=5.0.2') +def test_1(act: Action, capsys): + + # https://jrgraphix.net/r/Unicode/ + UNICODE_RANGES_MAP = { + (0x0020, 0x007F) : 'Basic Latin', + (0x00A0, 0x00FF) : 'Latin-1 Supplement', + (0x0100, 0x017F) : 'Latin Extended-A', + (0x0180, 0x024F) : 'Latin Extended-B', + (0x0400, 0x04FF) : 'Cyrillic', + (0x0500, 0x052F) : 'Cyrillic Supplementary', + (0x0300, 0x036F) : 'Combining Diacritical Marks', + (0x0250, 0x02AF) : 'IPA Extensions', + (0x0370, 0x03FF) : 'Greek and Coptic', + (0x0530, 0x058F) : 'Armenian', + (0x02B0, 0x02FF) : 'Spacing Modifier Letters', + (0x0590, 0x05FF) : 'Hebrew', + (0x0600, 0x06FF) : 'Arabic', + (0x0700, 0x074F) : 'Syriac', + (0x0780, 0x07BF) : 'Thaana', + (0x0900, 0x097F) : 'Devanagari', + (0x0980, 0x09FF) : 'Bengali', + (0x0A00, 0x0A7F) : 'Gurmukhi', + (0x0A80, 0x0AFF) : 'Gujarati', + (0x0B00, 0x0B7F) : 'Oriya', + (0x0B80, 0x0BFF) : 'Tamil', + (0x0C00, 0x0C7F) : 'Telugu', + (0x0C80, 0x0CFF) : 'Kannada', + (0x0D00, 0x0D7F) : 'Malayalam', + (0x0D80, 0x0DFF) : 'Sinhala', + (0x0E00, 0x0E7F) : 'Thai', + (0x0E80, 0x0EFF) : 'Lao', + (0x0F00, 0x0FFF) : 'Tibetan', + (0x1000, 0x109F) : 'Myanmar', + (0x10A0, 0x10FF) : 'Georgian', + (0x1100, 0x11FF) : 'Hangul Jamo', + (0x1200, 0x137F) : 'Ethiopic', + (0x13A0, 0x13FF) : 'Cherokee', + (0x1400, 0x167F) : 'Unified Canadian Aboriginal Syllabics', + (0x1680, 0x169F) : 'Ogham', + (0x16A0, 0x16FF) : 'Runic', + (0x1700, 0x171F) : 'Tagalog', + (0x1720, 0x173F) : 'Hanunoo', + (0x1740, 0x175F) : 'Buhid', + (0x1760, 0x177F) : 'Tagbanwa', + (0x1780, 0x17FF) : 'Khmer', + (0x1800, 0x18AF) : 'Mongolian', + (0x1900, 0x194F) : 'Limbu', + (0x1950, 0x197F) : 'Tai Le', + (0x19E0, 0x19FF) : 'Khmer Symbols', + (0x1D00, 0x1D7F) : 'Phonetic Extensions', + (0x1E00, 0x1EFF) : 'Latin Extended Additional', + (0x1F00, 0x1FFF) : 'Greek Extended', + (0x2000, 0x206F) : 'General Punctuation', + (0x2070, 0x209F) : 'Superscripts and Subscripts', + (0x20A0, 0x20CF) : 'Currency Symbols', + (0x20D0, 0x20FF) : 'Combining Diacritical Marks for Symbols', + (0x2100, 0x214F) : 'Letterlike Symbols', + (0x2150, 0x218F) : 'Number Forms', + (0x2190, 0x21FF) : 'Arrows', + (0x2200, 0x22FF) : 'Mathematical Operators', + (0x2300, 0x23FF) : 'Miscellaneous Technical', + (0x2400, 0x243F) : 'Control Pictures', + (0x2440, 0x245F) : 'Optical Character Recognition', + (0x2460, 0x24FF) : 'Enclosed Alphanumerics', + (0x2500, 0x257F) : 'Box Drawing', + (0x2580, 0x259F) : 'Block Elements', + (0x25A0, 0x25FF) : 'Geometric Shapes', + (0x2600, 0x26FF) : 'Miscellaneous Symbols', + (0x2700, 0x27BF) : 'Dingbats', + (0x27C0, 0x27EF) : 'Miscellaneous Mathematical Symbols-A', + (0x27F0, 0x27FF) : 'Supplemental Arrows-A', + (0x2800, 0x28FF) : 'Braille Patterns', + (0x2900, 0x297F) : 'Supplemental Arrows-B', + (0x2980, 0x29FF) : 'Miscellaneous Mathematical Symbols-B', + (0x2A00, 0x2AFF) : 'Supplemental Mathematical Operators', + (0x2B00, 0x2BFF) : 'Miscellaneous Symbols and Arrows', + (0x2E80, 0x2EFF) : 'CJK Radicals Supplement', + (0x2F00, 0x2FDF) : 'Kangxi Radicals', + (0x2FF0, 0x2FFF) : 'Ideographic Description Characters', + (0x3000, 0x303F) : 'CJK Symbols and Punctuation', + (0x3040, 0x309F) : 'Hiragana', + (0x30A0, 0x30FF) : 'Katakana', + (0x3100, 0x312F) : 'Bopomofo', + (0x3130, 0x318F) : 'Hangul Compatibility Jamo', + (0x3190, 0x319F) : 'Kanbun', + (0x31A0, 0x31BF) : 'Bopomofo Extended', + (0x31F0, 0x31FF) : 'Katakana Phonetic Extensions', + (0x3200, 0x32FF) : 'Enclosed CJK Letters and Months', + (0x3300, 0x33FF) : 'CJK Compatibility', + (0x3400, 0x4DBF) : 'CJK Unified Ideographs Extension A', + (0x4DC0, 0x4DFF) : 'Yijing Hexagram Symbols', + (0x4E00, 0x9FFF) : 'CJK Unified Ideographs', + (0xA000, 0xA48F) : 'Yi Syllables', + (0xA490, 0xA4CF) : 'Yi Radicals', + (0xAC00, 0xD7AF) : 'Hangul Syllables', + (0xE000, 0xF8FF) : 'Private Use Area', + (0xF900, 0xFAFF) : 'CJK Compatibility Ideographs', + (0xFB00, 0xFB4F) : 'Alphabetic Presentation Forms', + (0xFB50, 0xFDFF) : 'Arabic Presentation Forms-A', + (0xFE00, 0xFE0F) : 'Variation Selectors', + (0xFE20, 0xFE2F) : 'Combining Half Marks', + (0xFE30, 0xFE4F) : 'CJK Compatibility Forms', + (0xFE50, 0xFE6F) : 'Small Form Variants', + (0xFE70, 0xFEFF) : 'Arabic Presentation Forms-B', + (0xFF00, 0xFFEF) : 'Halfwidth and Fullwidth Forms', + (0xFFF0, 0xFFFF) : 'Specials', + (0x10000, 0x1007F) : 'Linear B Syllabary', + (0x10080, 0x100FF) : 'Linear B Ideograms', + (0x10100, 0x1013F) : 'Aegean Numbers', + (0x10300, 0x1032F) : 'Old Italic', + (0x10330, 0x1034F) : 'Gothic', + (0x10380, 0x1039F) : 'Ugaritic', + (0x10400, 0x1044F) : 'Deseret', + (0x10450, 0x1047F) : 'Shavian', + (0x10480, 0x104AF) : 'Osmanya', + (0x10800, 0x1083F) : 'Cypriot Syllabary', + (0x1D000, 0x1D0FF) : 'Byzantine Musical Symbols', + (0x1D100, 0x1D1FF) : 'Musical Symbols', + (0x1D300, 0x1D35F) : 'Tai Xuan Jing Symbols', + (0x1D400, 0x1D7FF) : 'Mathematical Alphanumeric Symbols', + (0x20000, 0x2A6DF) : 'CJK Unified Ideographs Extension B', + (0x2F800, 0x2FA1F) : 'CJK Compatibility Ideographs Supplement', + (0xE0000, 0xE007F) : 'Tags', + } + + mismatches = set() + with act.db.connect(charset = 'utf-8') as con: + cur = con.cursor() + for bound_points, range_name in UNICODE_RANGES_MAP.items(): + for code_point in range(bound_points[0],bound_points[1]): + cur.callproc( "sp_get_unicode_char", (code_point,) ) + unicode_chr = cur.fetchone()[0] + cur.callproc( "sp_get_unicode_val", (unicode_chr,) ) + checked_code_point = cur.fetchone()[0] + if checked_code_point == code_point: + pass + else: + mismatches.add( (range_name, code_point, unicode_chr, checked_code_point) ) + + print(len(mismatches)) + for s in mismatches: + print(s) + act.expected_stdout = '0' + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout + act.reset() From 97343f48138dc19d33a66071b19f8a90b8eb11fe Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Mon, 2 Sep 2024 11:22:00 +0300 Subject: [PATCH 036/128] Added/Updated tests\bugs\core_2650_test.py: Fully re-implemented, see notes. Checked on 6.0.0.447-901b4ce, 5.0.2.1487, 4.0.6.3142 --- tests/bugs/core_2650_test.py | 1113 ++++++++++++++++++++-------------- 1 file changed, 656 insertions(+), 457 deletions(-) diff --git a/tests/bugs/core_2650_test.py b/tests/bugs/core_2650_test.py index dfd57df7..2836dea3 100644 --- a/tests/bugs/core_2650_test.py +++ b/tests/bugs/core_2650_test.py @@ -5,26 +5,44 @@ ID: issue-3057 ISSUE: 3057 TITLE: Improve sorting performance when long VARCHARs are involved DESCRIPTION: - Test verifies trivial queries with persistent and computed columns, predicates, views, - expressions without reference to any column and datatypes which have no symmetrical - transformation from value to a key (decfloat, time-with-timezone and varchar with non-default collation). + Test verifies trivial queries with persistent and computed columns, predicates, views, + expressions without reference to any column and datatypes which have no symmetrical + transformation from value to a key (decfloat, time-with-timezone and varchar with non-default collation). - It is supposed that default value of InlineSortThreshold parameter is 1000. - No changes in the firebird.conf reuired. + It is supposed that default value of InlineSortThreshold parameter is 1000. + No changes in the firebird.conf reuired. - This test most probably will be added by some new examples later. - - Thanks to dimitr for lot of explanations (e-mail discussion was 28.12.2020). + This test most probably will be added by some new examples later. + Thanks to dimitr for lot of explanations (e-mail discussion was 28.12.2020). JIRA: CORE-2650 FBTEST: bugs.core_2650 +NOTES: + [02.09.2024] + 1. Test was fully re-implemented in order to have ability to see both query and its comment in case of mismatch. + The 'f'-notation is used in expected output with substitution query text and comments to it, e.g.: + {query_map[1000][0]} // output will be compared with: "select txt_short from test a01 order by id" + {query_map[1000][1]} // output will be compared with: "Must NOT use refetch because length of non-key column is less than threshold" + 2. Explained plans for FB 4.x and 5.x/6.x not equal. + Because of this, expected output is stored differently (fb4x_expected_out, fb5x_expected_out). + 3. Indentation between 'Refetch' and subsequent 'Sort' was removed (only 'master' was affected). + This change was caused by (or related to) profiler, discussed with Adriano. + See letters since 24-aug-2023, subj: + "Test for gh-7687: can't understand the output for trivial .sql (from the ticket)" + See also: + https://groups.google.com/g/firebird-devel/c/dWIgSIemys4/m/TzUWYwmVAQAJ (18-JUL-2023) + https://github.com/FirebirdSQL/firebird/issues/7687 (28-JUL-2023) + 4 Need to preserve indentation was explained by dimitr 28-aug-2024 12:57, subj: + 'Explained plan, "Refetch": should the indentation be after it at line with subsequent "-> Sort (record ...)" ?' + 5. Indentation was restored 01-sep-2024 by fix https://github.com/FirebirdSQL/firebird/issues/8235 + https://github.com/FirebirdSQL/firebird/commit/901b4ced9a3615929e0027d42ebb2392e943b205 + + Checked on 6.0.0.447-901b4ce, 5.0.2.1487, 4.0.6.3142 """ import pytest from firebird.qa import * -db = db_factory() - -test_script = """ +init_sql = """ set bail on; recreate view v_unioned as select 1 id from rdb$database; commit; @@ -42,133 +60,6 @@ test_script = """ ,computed_ts_left computed by( left(txt_short,10) ) ,computed_tb_left computed by( left(txt_broad,10) ) ); - commit; - - set plan on; - set explain on; - -- set echo on; - - --########################## p e r s i s t e n t c o l u m n s ################################## - - -- Must not use refetch because length of non-key column is less than default threshold: - select txt_short from test a01 order by id; - - -- Must USE refetch because length of non-key column is greater than default threshold: - select txt_broad from test a02 order by id; - - -- MUST use refethc regardless on length of column because 'ROWS ' presents (!): - select txt_short from test a03 order by id rows 1; - - - -- ########################## c o m p u t e d c o l u m n s ##################################### - - -- does NOT use refetch because computed column is based on txt_short which has length < threshold: - select id, computed_ts_dup from test order by id; - - -- must use refetch because computed column is based on txt_broad which has length >= threshold: - select id, computed_tb_dup from test order by id; - - -- ###################### p r e d i c a t e s, e x c e p t E X I S T S ######################## - - select id from test a04 where '' in (select txt_short from test x04 where txt_short = '' order by id) ; - - select id from test a05 where '' in (select txt_broad from test x05 where txt_broad = '' order by id) ; - - - select id from test a06 where '' not in (select txt_short from test x06 where txt_short>'' order by id) ; - - select id from test a07 where '' not in (select txt_broad from test x07 where txt_broad>'' order by id) ; - - - select id from test a08 where '' > all (select id from test x08 where txt_short>'' order by id) ; - - select id from test a09 where '' > all (select id from test x09 where txt_broad>'' order by id) ; - - - select id from test a10 where '' <> any (select id from test x10 where txt_short>'' order by id) ; - - select id from test a11 where '' <> any (select id from test x11 where txt_broad>'' order by id) ; - - -- ######################################## e x i s t s ########################################### - - -- Predicate "EXISTS" must turn on refetching regardless of record length, but only when "WHERE" has column which not present in "ORDER BY" - select id,txt_short from test a12 where exists(select 1 from test x12 where txt_short>'' order by id) ; -- MUST use refetch - - -- does NOT use refetch: "order by" list contains the single element: ID, and it is the same field that 'computed_id_dup' relies on. - select id,txt_short from test a13 where exists(select 1 from test x13 where computed_id_dup > 0 order by id) ; - - -- ### NB ### Must use refetch! See letter from dimitr 28.12.2020 14:49, reply for: - -- "select id,txt_short from test a14 where exists(select 1 from test x14 where computed_ts_dup > '' order by computed_ts_left);" - -- Sort procedure will get: - -- a KEY = result of evaluating 'computed_id_dup'; - -- a VAL = value of the field 'ID' which is base for computing 'computed_id_dup' - -- Thus sorter will have a field which not equals to a key, which leads to refetch. - select id,txt_short from test a14 where exists(select 1 from test x14 where computed_id_dup > 0 order by computed_id_dup ) ; - - -- does NOT use refetch: all persistent columns from "WHERE" expr (f01, f02) belongs to "order by" list: - select id,txt_short from test a15 where exists(select 1 from test x15 where f02>0 and f01>0 order by f01, f02); - - -- must use refetch: one of coulmns from "where" expr (id) does not belong to "order by" list: - select id,txt_short from test a16 where exists(select 1 from test x16 where id>0 and f01>0 order by f01, f02); - - -- must use refetch: computed column in "where" expr does not belong to "order by" list: - select id,txt_short from test a17 where exists(select 1 from test x17 where computed_id_dup > 0 order by f01); - - -- does NOT use refetch: computed column "computed_guid" does not rely on any other columns in the table: - select id,txt_short from test a18 where exists(select 1 from test x18 where computed_guid > '' order by f01); - - - -- must use refetch both in anchor and recursive parts: - with recursive - r as ( - select a19.id, a19.txt_short - from test a19 - where not exists(select * from test x where x.txt_short < a19.txt_short order by id) - UNION ALL - select i.id, i.txt_short - from test i - join r on i.id > r.id - and not exists( select * from test x where x.txt_short between r.txt_short and i.txt_short order by id ) - ) - select * from r; - commit; - - - -- ###################################### v i e w s ########################################### - - recreate view v_unioned as - select id, txt_broad from test - union all - select -1, 'qwerty' - from rdb$database rows 0; - - -- does NOT use refetch because view is based on UNION: - select txt_broad from v_unioned v01 order by id; - commit; - - -- ################################# e x p r e s s i o n s ##################################### - - -- must use refetch because expression is based on column which has length >= threshold - -- (even if final length of expression result is much less than threshold): - select left(txt_broad, 50) as txt from test a21 order by id; - - -- does NOT use refetch because expression is based on column which has length < threshold - -- (even if final length of expression result is much bigger than threshold): - select left( txt_short || txt_short, 2000) as txt from test a22 order by id; - commit; - - - -- ########### n o n - s y m m e t r i c a l k e y - v a l u e d a t a t y p e s ######### - - -- Following data types in common case have no ability to get column value from a key: - -- * International type text has a computed key - -- * Different decimal float values sometimes have same keys - -- * Date/time with time zones too. - -- Because of this, a field of any such datatype that is specified in "order by" list, must also be involved - -- in the non-key fields and sort will deal with such "concatenated" list. - -- If total length of such list not exceeds InlineSortThreshold then sort will be done without refetch. - -- Otherwise refetch will occur. - -- See src\\jrd\\opt.cpp, OPT_gen_sort() and explanation fro dimitr: letter 28.12.2020 16:44. recreate table test_ns_01( id decfloat @@ -180,13 +71,6 @@ test_script = """ ,txt_short varchar(982) ); - select * from test_ns_01 a23 order by id; -- must use refetch - - select * from test_ns_02 a24 order by id; -- must NOT use refetch - - commit; - - ------------------------------------------ recreate table test_ns_03( id time with time zone ,txt_short varchar(991) @@ -197,11 +81,6 @@ test_script = """ ,txt_short varchar(990) ); - select * from test_ns_03 order by id; -- must use refetch - - select * from test_ns_04 order by id; -- must NOT use refetch - ------------------------------------------ - recreate table test_ns_05( id varchar(1) character set utf8 collate unicode_ci_ai ,txt_short varchar(993) @@ -211,478 +90,798 @@ test_script = """ id varchar(1) character set utf8 collate unicode_ci_ai ,txt_short varchar(992) ); + commit; - select * from test_ns_05 order by id; -- must use refetch + recreate view v_unioned as + select id, txt_broad from test + union all + select -1, 'qwerty' + from rdb$database rows 0; + commit; +""" +db = db_factory(init = init_sql) - select * from test_ns_06 order by id; -- must NOT use refetch +query_map = { + ########################## p e r s i s t e n t c o l u m n s ################################## + + 1000 : ( 'select txt_short from test a01 order by id' , 'Must NOT use refetch because length of non-key column is less than threshold' ) + ,1010 : ( 'select txt_broad from test a02 order by id' , 'MUST use refetch because length of non-key column is greater than threshold' ) + ,1020 : ( 'select txt_short from test a03 order by id rows 1' , 'MUST use refetch regardless on length of column because ROWS presents' ) + + ########################## c o m p u t e d c o l u m n s ##################################### + + ,2000 : ( 'select id, computed_ts_dup from test order by id' , 'Must NOT use refetch because computed column is based on txt_short with length < threshold' ) + ,2010 : ( 'select id, computed_tb_dup from test order by id' , 'MUST use refetch because computed column is based on txt_broad which has length >= threshold' ) + + ###################### p r e d i c a t e s [N O T] I N, A L L, A N Y ######################## + + ,3000 : ( "select id from test a04 where '' in (select txt_short from test x04 where txt_short = '' order by id)" , '*** not [yet] commented ***' ) + ,3010 : ( "select id from test a05 where '' in (select txt_broad from test x05 where txt_broad = '' order by id)" , '*** not [yet] commented ***' ) + ,3020 : ( "select id from test a06 where '' not in (select txt_short from test x06 where txt_short>'' order by id)" , '*** not [yet] commented ***' ) + ,3030 : ( "select id from test a07 where '' not in (select txt_broad from test x07 where txt_broad>'' order by id)" , '*** not [yet] commented ***' ) + ,3040 : ( "select id from test a08 where '' > all (select id from test x08 where txt_short>'' order by id)" , '*** not [yet] commented ***' ) + ,3050 : ( "select id from test a09 where '' > all (select id from test x09 where txt_broad>'' order by id)" , '*** not [yet] commented ***' ) + ,3060 : ( "select id from test a10 where '' <> any (select id from test x10 where txt_short>'' order by id)" , '*** not [yet] commented ***' ) + ,3070 : ( "select id from test a11 where '' <> any (select id from test x11 where txt_broad>'' order by id)" , '*** not [yet] commented ***' ) + + ######################################## e x i s t s ########################################### + # Predicate "EXISTS" must turn on refetching regardless of record length + # but only when "WHERE" has column which not present in "ORDER BY" + + ,4000 : ( "select id,txt_short from test a12 where exists(select 1 from test x12 where txt_short>'' order by id)" + ,"MUST use refetch: column x12.txt_short not present in order by" + ) + ,4010 : ( "select id,txt_short from test a13 where exists(select 1 from test x13 where computed_id_dup > 0 order by id)" + ,"Must NOT use refetch: ORDER BY list contains the single element: ID, and it is base for x13.computed_id_dup column" + ) + ,4020 : ( "select id,txt_short from test a14 where exists(select 1 from test x14 where computed_id_dup > 0 order by computed_id_dup)" + ,""" + MUST use refetch! See letter from dimitr 28.12.2020 14:49 + Sort procedure will get: + a KEY = result of evaluating 'computed_id_dup'; + a VAL = value of the field 'ID' which is base for computing 'computed_id_dup' + Thus sorter will have a field which not equals to a key, which leads to refetch. + """ + ) + ,4030 : ( "select id,txt_short from test a15 where exists(select 1 from test x15 where f02>0 and f01>0 order by f01, f02)" + ,"Must NOT use refetch: all persistent columns from WHERE expression (f01, f02) belong to ORDER BY list" + ) + ,4040 : ( "select id,txt_short from test a16 where exists(select 1 from test x16 where id>0 and f01>0 order by f01, f02)" + ,"Must use refetch: one of columns from WHERE expr (id) does not belong to ORDER BY list" + ) + ,4050 : ( "select id,txt_short from test a17 where exists(select 1 from test x17 where computed_id_dup > 0 order by f01)" + ,"Must use refetch: computed column in WHERE expr does not belong to ORDER BY list" + ) + ,4060 : ( "select id,txt_short from test a18 where exists(select 1 from test x18 where computed_guid > '' order by f01)" + ,"Must NOT use refetch: computed column x18.computed_guid does is evaluated via GUID and does not refer to any columns" + ) + ,4070 : ( + """ + with recursive + r as ( + select a19.id, a19.txt_short + from test a19 + where not exists(select * from test x where x.txt_short < a19.txt_short order by id) + UNION ALL + select i.id, i.txt_short + from test i + join r on i.id > r.id + and not exists( select * from test x where x.txt_short between r.txt_short and i.txt_short order by id ) + ) + select * from r + """ + ,"MUST use refetch both in anchor and recursive parts" + ) + + ###################################### v i e w s ########################################### + + ,5000 : ( 'select txt_broad from v_unioned v01 order by id' , 'Must NOT use refetch because view DDL includes UNION' ) + + ################################# e x p r e s s i o n s ##################################### + + ,6000 : ( 'select left(txt_broad, 50) as txt from test a21 order by id' + ,""" + MUST use refetch because expression is based on column which has length >= threshold + (even if final length of expression result is much less than threshold) + """ + ) + ,6010 : ( 'select left( txt_short || txt_short, 2000) as txt from test a22 order by id' + ,""" + Must NOT use refetch because expression is based on column which has length < threshold + (even if final length of expression result is much bigger than threshold) + """ + ) + + ########### n o n - s y m m e t r i c a l k e y - v a l u e d a t a t y p e s ######### + + # Following data types in common case have no ability to get column value from a key: + # * International type text has a computed key + # * Different decimal float values sometimes have same keys + # * Date/time with time zones too. + # Because of this, a field of any such datatype that is specified in "order by" list, must also be involved + # in the non-key fields and sort will deal with such "concatenated" list. + # If total length of such list not exceeds InlineSortThreshold then sort will be done without refetch. + # Otherwise refetch will occur. + # See src/jrd/opt.cpp, OPT_gen_sort() and explanation from dimitr, letter 28.12.2020 16:44 + ,7000 : ( 'select * from test_ns_01 a23 order by id' , 'MUST use refetch' ) + ,7010 : ( 'select * from test_ns_02 a24 order by id' , 'Must NOT refetch' ) + ,7020 : ( 'select * from test_ns_03 order by id' , 'MUST use refetch' ) + ,7030 : ( 'select * from test_ns_04 order by id' , 'Must NOT use refetch' ) + ,7040 : ( 'select * from test_ns_05 order by id' , 'MUST use refetch' ) + ,7050 : ( 'select * from test_ns_06 order by id' , 'Must NOT use refetch' ) +} +test_script = """ + set plan on; + set explain on; """ -act = isql_act('db', test_script) +############################################################################### -fb4x_expected_out = """ +fb4x_expected_out = f""" + 1000 + {query_map[1000][0]} + {query_map[1000][1]} Select Expression - -> Sort (record length: 1036, key length: 8) - -> Table "TEST" as "A01" Full Scan + ....-> Sort (record length: 1036, key length: 8) + ........-> Table "TEST" as "A01" Full Scan + 1010 + {query_map[1010][0]} + {query_map[1010][1]} Select Expression - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Table "TEST" as "A02" Full Scan + ....-> Refetch + ........-> Sort (record length: 28, key length: 8) + ............-> Table "TEST" as "A02" Full Scan + 1020 + {query_map[1020][0]} + {query_map[1020][1]} Select Expression - -> First N Records - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Table "TEST" as "A03" Full Scan + ....-> First N Records + ........-> Refetch + ............-> Sort (record length: 28, key length: 8) + ................-> Table "TEST" as "A03" Full Scan + 2000 + {query_map[2000][0]} + {query_map[2000][1]} Select Expression - -> Sort (record length: 1036, key length: 8) - -> Table "TEST" Full Scan + ....-> Sort (record length: 1036, key length: 8) + ........-> Table "TEST" Full Scan + 2010 + {query_map[2010][0]} + {query_map[2010][1]} Select Expression - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Table "TEST" Full Scan + ....-> Refetch + ........-> Sort (record length: 28, key length: 8) + ............-> Table "TEST" Full Scan + 3000 + {query_map[3000][0]} + {query_map[3000][1]} Select Expression - -> Filter - -> Sort (record length: 1036, key length: 8) - -> Filter - -> Table "TEST" as "X04" Full Scan + ....-> Filter + ........-> Sort (record length: 1036, key length: 8) + ............-> Filter + ................-> Table "TEST" as "X04" Full Scan Select Expression - -> Filter - -> Table "TEST" as "A04" Full Scan + ....-> Filter + ........-> Table "TEST" as "A04" Full Scan + 3010 + {query_map[3010][0]} + {query_map[3010][1]} Select Expression - -> Filter - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Filter - -> Table "TEST" as "X05" Full Scan + ....-> Filter + ........-> Refetch + ............-> Sort (record length: 28, key length: 8) + ................-> Filter + ....................-> Table "TEST" as "X05" Full Scan Select Expression - -> Filter - -> Table "TEST" as "A05" Full Scan + ....-> Filter + ........-> Table "TEST" as "A05" Full Scan + 3020 + {query_map[3020][0]} + {query_map[3020][1]} Select Expression - -> Sort (record length: 1036, key length: 8) - -> Filter - -> Table "TEST" as "X06" Full Scan + ....-> Sort (record length: 1036, key length: 8) + ........-> Filter + ............-> Table "TEST" as "X06" Full Scan Select Expression - -> Sort (record length: 1036, key length: 8) - -> Filter - -> Table "TEST" as "X06" Full Scan + ....-> Sort (record length: 1036, key length: 8) + ........-> Filter + ............-> Table "TEST" as "X06" Full Scan Select Expression - -> Filter - -> Table "TEST" as "A06" Full Scan + ....-> Filter + ........-> Table "TEST" as "A06" Full Scan + 3030 + {query_map[3030][0]} + {query_map[3030][1]} Select Expression - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Filter - -> Table "TEST" as "X07" Full Scan + ....-> Refetch + ........-> Sort (record length: 28, key length: 8) + ............-> Filter + ................-> Table "TEST" as "X07" Full Scan Select Expression - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Filter - -> Table "TEST" as "X07" Full Scan + ....-> Refetch + ........-> Sort (record length: 28, key length: 8) + ............-> Filter + ................-> Table "TEST" as "X07" Full Scan Select Expression - -> Filter - -> Table "TEST" as "A07" Full Scan + ....-> Filter + ........-> Table "TEST" as "A07" Full Scan + 3040 + {query_map[3040][0]} + {query_map[3040][1]} Select Expression - -> Filter - -> Sort (record length: 1036, key length: 8) - -> Filter - -> Table "TEST" as "X08" Full Scan + ....-> Filter + ........-> Sort (record length: 1036, key length: 8) + ............-> Filter + ................-> Table "TEST" as "X08" Full Scan Select Expression - -> Filter - -> Table "TEST" as "A08" Full Scan + ....-> Filter + ........-> Table "TEST" as "A08" Full Scan + 3050 + {query_map[3050][0]} + {query_map[3050][1]} Select Expression - -> Filter - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Filter - -> Table "TEST" as "X09" Full Scan + ....-> Filter + ........-> Refetch + ............-> Sort (record length: 28, key length: 8) + ................-> Filter + ....................-> Table "TEST" as "X09" Full Scan Select Expression - -> Filter - -> Table "TEST" as "A09" Full Scan + ....-> Filter + ........-> Table "TEST" as "A09" Full Scan + 3060 + {query_map[3060][0]} + {query_map[3060][1]} Select Expression - -> Filter - -> Sort (record length: 1036, key length: 8) - -> Filter - -> Table "TEST" as "X10" Full Scan + ....-> Filter + ........-> Sort (record length: 1036, key length: 8) + ............-> Filter + ................-> Table "TEST" as "X10" Full Scan Select Expression - -> Filter - -> Table "TEST" as "A10" Full Scan + ....-> Filter + ........-> Table "TEST" as "A10" Full Scan + 3070 + {query_map[3070][0]} + {query_map[3070][1]} Select Expression - -> Filter - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Filter - -> Table "TEST" as "X11" Full Scan + ....-> Filter + ........-> Refetch + ............-> Sort (record length: 28, key length: 8) + ................-> Filter + ....................-> Table "TEST" as "X11" Full Scan Select Expression - -> Filter - -> Table "TEST" as "A11" Full Scan + ....-> Filter + ........-> Table "TEST" as "A11" Full Scan + 4000 + {query_map[4000][0]} + {query_map[4000][1]} Select Expression - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Filter - -> Table "TEST" as "X12" Full Scan + ....-> Refetch + ........-> Sort (record length: 28, key length: 8) + ............-> Filter + ................-> Table "TEST" as "X12" Full Scan Select Expression - -> Filter - -> Table "TEST" as "A12" Full Scan + ....-> Filter + ........-> Table "TEST" as "A12" Full Scan + 4010 + {query_map[4010][0]} + {query_map[4010][1]} Select Expression - -> Sort (record length: 28, key length: 8) - -> Filter - -> Table "TEST" as "X13" Full Scan + ....-> Sort (record length: 28, key length: 8) + ........-> Filter + ............-> Table "TEST" as "X13" Full Scan Select Expression - -> Filter - -> Table "TEST" as "A13" Full Scan + ....-> Filter + ........-> Table "TEST" as "A13" Full Scan + 4020 + {query_map[4020][0]} + {query_map[4020][1]} Select Expression - -> Refetch - -> Sort (record length: 36, key length: 12) - -> Filter - -> Table "TEST" as "X14" Full Scan + ....-> Refetch + ........-> Sort (record length: 36, key length: 12) + ............-> Filter + ................-> Table "TEST" as "X14" Full Scan Select Expression - -> Filter - -> Table "TEST" as "A14" Full Scan + ....-> Filter + ........-> Table "TEST" as "A14" Full Scan + 4030 + {query_map[4030][0]} + {query_map[4030][1]} Select Expression - -> Sort (record length: 36, key length: 16) - -> Filter - -> Table "TEST" as "X15" Full Scan + ....-> Sort (record length: 36, key length: 16) + ........-> Filter + ............-> Table "TEST" as "X15" Full Scan Select Expression - -> Filter - -> Table "TEST" as "A15" Full Scan + ....-> Filter + ........-> Table "TEST" as "A15" Full Scan + 4040 + {query_map[4040][0]} + {query_map[4040][1]} Select Expression - -> Refetch - -> Sort (record length: 36, key length: 16) - -> Filter - -> Table "TEST" as "X16" Full Scan + ....-> Refetch + ........-> Sort (record length: 36, key length: 16) + ............-> Filter + ................-> Table "TEST" as "X16" Full Scan Select Expression - -> Filter - -> Table "TEST" as "A16" Full Scan + ....-> Filter + ........-> Table "TEST" as "A16" Full Scan + 4050 + {query_map[4050][0]} + {query_map[4050][1]} Select Expression - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Filter - -> Table "TEST" as "X17" Full Scan + ....-> Refetch + ........-> Sort (record length: 28, key length: 8) + ............-> Filter + ................-> Table "TEST" as "X17" Full Scan Select Expression - -> Filter - -> Table "TEST" as "A17" Full Scan + ....-> Filter + ........-> Table "TEST" as "A17" Full Scan + 4060 + {query_map[4060][0]} + {query_map[4060][1]} Select Expression - -> Sort (record length: 28, key length: 8) - -> Filter - -> Table "TEST" as "X18" Full Scan + ....-> Sort (record length: 28, key length: 8) + ........-> Filter + ............-> Table "TEST" as "X18" Full Scan Select Expression - -> Filter - -> Table "TEST" as "A18" Full Scan + ....-> Filter + ........-> Table "TEST" as "A18" Full Scan + 4070 + {query_map[4070][0]} + {query_map[4070][1]} Select Expression - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Filter - -> Table "TEST" as "R X" Full Scan + ....-> Refetch + ........-> Sort (record length: 28, key length: 8) + ............-> Filter + ................-> Table "TEST" as "R X" Full Scan Select Expression - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Filter - -> Table "TEST" as "R X" Full Scan + ....-> Refetch + ........-> Sort (record length: 28, key length: 8) + ............-> Filter + ................-> Table "TEST" as "R X" Full Scan Select Expression - -> Recursion - -> Filter - -> Table "TEST" as "R A19" Full Scan - -> Filter - -> Table "TEST" as "R I" Full Scan + ....-> Recursion + ........-> Filter + ............-> Table "TEST" as "R A19" Full Scan + ........-> Filter + ............-> Table "TEST" as "R I" Full Scan + 5000 + {query_map[5000][0]} + {query_map[5000][1]} Select Expression - -> Sort (record length: 1052, key length: 8) - -> First N Records - -> Union - -> Table "TEST" as "V01 TEST" Full Scan - -> Table "RDB$DATABASE" as "V01 RDB$DATABASE" Full Scan + ....-> Sort (record length: 4044, key length: 8) + ........-> First N Records + ............-> Union + ................-> Table "TEST" as "V01 TEST" Full Scan + ................-> Table "RDB$DATABASE" as "V01 RDB$DATABASE" Full Scan + 6000 + {query_map[6000][0]} + {query_map[6000][1]} Select Expression - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Table "TEST" as "A21" Full Scan + ....-> Refetch + ........-> Sort (record length: 28, key length: 8) + ............-> Table "TEST" as "A21" Full Scan + 6010 + {query_map[6010][0]} + {query_map[6010][1]} Select Expression - -> Sort (record length: 1036, key length: 8) - -> Table "TEST" as "A22" Full Scan + ....-> Sort (record length: 1036, key length: 8) + ........-> Table "TEST" as "A22" Full Scan + 7000 + {query_map[7000][0]} + {query_map[7000][1]} Select Expression - -> Refetch - -> Sort (record length: 44, key length: 24) - -> Table "TEST_NS_01" as "A23" Full Scan + ....-> Refetch + ........-> Sort (record length: 44, key length: 24) + ............-> Table "TEST_NS_01" as "A23" Full Scan + 7010 + {query_map[7010][0]} + {query_map[7010][1]} Select Expression - -> Sort (record length: 1052, key length: 24) - -> Table "TEST_NS_02" as "A24" Full Scan + ....-> Sort (record length: 1052, key length: 24) + ........-> Table "TEST_NS_02" as "A24" Full Scan + 7020 + {query_map[7020][0]} + {query_map[7020][1]} Select Expression - -> Refetch - -> Sort (record length: 36, key length: 12) - -> Table "TEST_NS_03" Full Scan + ....-> Refetch + ........-> Sort (record length: 36, key length: 12) + ............-> Table "TEST_NS_03" Full Scan + 7030 + {query_map[7030][0]} + {query_map[7030][1]} Select Expression - -> Sort (record length: 1036, key length: 12) - -> Table "TEST_NS_04" Full Scan + ....-> Sort (record length: 1036, key length: 12) + ........-> Table "TEST_NS_04" Full Scan + 7040 + {query_map[7040][0]} + {query_map[7040][1]} Select Expression - -> Refetch - -> Sort (record length: 36, key length: 12) - -> Table "TEST_NS_05" Full Scan + ....-> Refetch + ........-> Sort (record length: 36, key length: 12) + ............-> Table "TEST_NS_05" Full Scan + 7050 + {query_map[7050][0]} + {query_map[7050][1]} Select Expression - -> Sort (record length: 1036, key length: 12) - -> Table "TEST_NS_06" Full Scan - + ....-> Sort (record length: 1036, key length: 12) + ........-> Table "TEST_NS_06" Full Scan """ -fb5x_expected_out = """ - Select Expression - -> Sort (record length: 1036, key length: 8) - -> Table "TEST" as "A01" Full Scan +############################################################################### +fb5x_expected_out = f""" + 1000 + {query_map[1000][0]} + {query_map[1000][1]} Select Expression - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Table "TEST" as "A02" Full Scan + ....-> Sort (record length: 1036, key length: 8) + ........-> Table "TEST" as "A01" Full Scan + 1010 + {query_map[1010][0]} + {query_map[1010][1]} Select Expression - -> First N Records - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Table "TEST" as "A03" Full Scan + ....-> Refetch + ........-> Sort (record length: 28, key length: 8) + ............-> Table "TEST" as "A02" Full Scan + 1020 + {query_map[1020][0]} + {query_map[1020][1]} Select Expression - -> Sort (record length: 1036, key length: 8) - -> Table "TEST" Full Scan + ....-> First N Records + ........-> Refetch + ............-> Sort (record length: 28, key length: 8) + ................-> Table "TEST" as "A03" Full Scan + 2000 + {query_map[2000][0]} + {query_map[2000][1]} Select Expression - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Table "TEST" Full Scan + ....-> Sort (record length: 1036, key length: 8) + ........-> Table "TEST" Full Scan + 2010 + {query_map[2010][0]} + {query_map[2010][1]} + Select Expression + ....-> Refetch + ........-> Sort (record length: 28, key length: 8) + ............-> Table "TEST" Full Scan + + 3000 + {query_map[3000][0]} + {query_map[3000][1]} Sub-query (invariant) - -> Filter - -> Sort (record length: 1036, key length: 8) - -> Filter - -> Table "TEST" as "X04" Full Scan + ....-> Filter + ........-> Sort (record length: 1036, key length: 8) + ............-> Filter + ................-> Table "TEST" as "X04" Full Scan Select Expression - -> Filter (preliminary) - -> Table "TEST" as "A04" Full Scan + ....-> Filter (preliminary) + ........-> Table "TEST" as "A04" Full Scan + 3010 + {query_map[3010][0]} + {query_map[3010][1]} Sub-query (invariant) - -> Filter - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Filter - -> Table "TEST" as "X05" Full Scan + ....-> Filter + ........-> Refetch + ............-> Sort (record length: 28, key length: 8) + ................-> Filter + ....................-> Table "TEST" as "X05" Full Scan Select Expression - -> Filter (preliminary) - -> Table "TEST" as "A05" Full Scan + ....-> Filter (preliminary) + ........-> Table "TEST" as "A05" Full Scan + 3020 + {query_map[3020][0]} + {query_map[3020][1]} Select Expression - -> Sort (record length: 1036, key length: 8) - -> Filter - -> Table "TEST" as "X06" Full Scan + ....-> Sort (record length: 1036, key length: 8) + ........-> Filter + ............-> Table "TEST" as "X06" Full Scan Select Expression - -> Sort (record length: 1036, key length: 8) - -> Filter - -> Table "TEST" as "X06" Full Scan + ....-> Sort (record length: 1036, key length: 8) + ........-> Filter + ............-> Table "TEST" as "X06" Full Scan Select Expression - -> Filter (preliminary) - -> Table "TEST" as "A06" Full Scan + ....-> Filter (preliminary) + ........-> Table "TEST" as "A06" Full Scan + 3030 + {query_map[3030][0]} + {query_map[3030][1]} Select Expression - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Filter - -> Table "TEST" as "X07" Full Scan + ....-> Refetch + ........-> Sort (record length: 28, key length: 8) + ............-> Filter + ................-> Table "TEST" as "X07" Full Scan Select Expression - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Filter - -> Table "TEST" as "X07" Full Scan + ....-> Refetch + ........-> Sort (record length: 28, key length: 8) + ............-> Filter + ................-> Table "TEST" as "X07" Full Scan Select Expression - -> Filter (preliminary) - -> Table "TEST" as "A07" Full Scan + ....-> Filter (preliminary) + ........-> Table "TEST" as "A07" Full Scan + 3040 + {query_map[3040][0]} + {query_map[3040][1]} Sub-query (invariant) - -> Filter - -> Sort (record length: 1036, key length: 8) - -> Filter - -> Table "TEST" as "X08" Full Scan + ....-> Filter + ........-> Sort (record length: 1036, key length: 8) + ............-> Filter + ................-> Table "TEST" as "X08" Full Scan Select Expression - -> Filter (preliminary) - -> Table "TEST" as "A08" Full Scan + ....-> Filter (preliminary) + ........-> Table "TEST" as "A08" Full Scan + 3050 + {query_map[3050][0]} + {query_map[3050][1]} Sub-query (invariant) - -> Filter - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Filter - -> Table "TEST" as "X09" Full Scan + ....-> Filter + ........-> Refetch + ............-> Sort (record length: 28, key length: 8) + ................-> Filter + ....................-> Table "TEST" as "X09" Full Scan Select Expression - -> Filter (preliminary) - -> Table "TEST" as "A09" Full Scan + ....-> Filter (preliminary) + ........-> Table "TEST" as "A09" Full Scan + 3060 + {query_map[3060][0]} + {query_map[3060][1]} Sub-query (invariant) - -> Filter - -> Sort (record length: 1036, key length: 8) - -> Filter - -> Table "TEST" as "X10" Full Scan + ....-> Filter + ........-> Sort (record length: 1036, key length: 8) + ............-> Filter + ................-> Table "TEST" as "X10" Full Scan Select Expression - -> Filter (preliminary) - -> Table "TEST" as "A10" Full Scan + ....-> Filter (preliminary) + ........-> Table "TEST" as "A10" Full Scan + 3070 + {query_map[3070][0]} + {query_map[3070][1]} Sub-query (invariant) - -> Filter - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Filter - -> Table "TEST" as "X11" Full Scan + ....-> Filter + ........-> Refetch + ............-> Sort (record length: 28, key length: 8) + ................-> Filter + ....................-> Table "TEST" as "X11" Full Scan Select Expression - -> Filter (preliminary) - -> Table "TEST" as "A11" Full Scan + ....-> Filter (preliminary) + ........-> Table "TEST" as "A11" Full Scan + 4000 + {query_map[4000][0]} + {query_map[4000][1]} Sub-query (invariant) - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Filter - -> Table "TEST" as "X12" Full Scan + ....-> Refetch + ........-> Sort (record length: 28, key length: 8) + ............-> Filter + ................-> Table "TEST" as "X12" Full Scan Select Expression - -> Filter (preliminary) - -> Table "TEST" as "A12" Full Scan + ....-> Filter (preliminary) + ........-> Table "TEST" as "A12" Full Scan + 4010 + {query_map[4010][0]} + {query_map[4010][1]} Sub-query (invariant) - -> Sort (record length: 28, key length: 8) - -> Filter - -> Table "TEST" as "X13" Full Scan + ....-> Sort (record length: 28, key length: 8) + ........-> Filter + ............-> Table "TEST" as "X13" Full Scan Select Expression - -> Filter (preliminary) - -> Table "TEST" as "A13" Full Scan + ....-> Filter (preliminary) + ........-> Table "TEST" as "A13" Full Scan + 4020 + {query_map[4020][0]} + {query_map[4020][1]} Sub-query (invariant) - -> Refetch - -> Sort (record length: 36, key length: 12) - -> Filter - -> Table "TEST" as "X14" Full Scan + ....-> Refetch + ........-> Sort (record length: 36, key length: 12) + ............-> Filter + ................-> Table "TEST" as "X14" Full Scan Select Expression - -> Filter (preliminary) - -> Table "TEST" as "A14" Full Scan + ....-> Filter (preliminary) + ........-> Table "TEST" as "A14" Full Scan + 4030 + {query_map[4030][0]} + {query_map[4030][1]} Sub-query (invariant) - -> Sort (record length: 36, key length: 16) - -> Filter - -> Table "TEST" as "X15" Full Scan + ....-> Sort (record length: 36, key length: 16) + ........-> Filter + ............-> Table "TEST" as "X15" Full Scan Select Expression - -> Filter (preliminary) - -> Table "TEST" as "A15" Full Scan + ....-> Filter (preliminary) + ........-> Table "TEST" as "A15" Full Scan + 4040 + {query_map[4040][0]} + {query_map[4040][1]} Sub-query (invariant) - -> Refetch - -> Sort (record length: 36, key length: 16) - -> Filter - -> Table "TEST" as "X16" Full Scan + ....-> Refetch + ........-> Sort (record length: 36, key length: 16) + ............-> Filter + ................-> Table "TEST" as "X16" Full Scan Select Expression - -> Filter (preliminary) - -> Table "TEST" as "A16" Full Scan + ....-> Filter (preliminary) + ........-> Table "TEST" as "A16" Full Scan + 4050 + {query_map[4050][0]} + {query_map[4050][1]} Sub-query (invariant) - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Filter - -> Table "TEST" as "X17" Full Scan + ....-> Refetch + ........-> Sort (record length: 28, key length: 8) + ............-> Filter + ................-> Table "TEST" as "X17" Full Scan Select Expression - -> Filter (preliminary) - -> Table "TEST" as "A17" Full Scan + ....-> Filter (preliminary) + ........-> Table "TEST" as "A17" Full Scan + 4060 + {query_map[4060][0]} + {query_map[4060][1]} Sub-query (invariant) - -> Sort (record length: 28, key length: 8) - -> Filter - -> Table "TEST" as "X18" Full Scan + ....-> Sort (record length: 28, key length: 8) + ........-> Filter + ............-> Table "TEST" as "X18" Full Scan Select Expression - -> Filter (preliminary) - -> Table "TEST" as "A18" Full Scan + ....-> Filter (preliminary) + ........-> Table "TEST" as "A18" Full Scan + 4070 + {query_map[4070][0]} + {query_map[4070][1]} Sub-query - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Filter - -> Table "TEST" as "R X" Full Scan + ....-> Refetch + ........-> Sort (record length: 28, key length: 8) + ............-> Filter + ................-> Table "TEST" as "R X" Full Scan Sub-query - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Filter - -> Table "TEST" as "R X" Full Scan + ....-> Refetch + ........-> Sort (record length: 28, key length: 8) + ............-> Filter + ................-> Table "TEST" as "R X" Full Scan Select Expression - -> Recursion - -> Filter - -> Table "TEST" as "R A19" Full Scan - -> Filter - -> Table "TEST" as "R I" Full Scan + ....-> Recursion + ........-> Filter + ............-> Table "TEST" as "R A19" Full Scan + ........-> Filter + ............-> Table "TEST" as "R I" Full Scan + 5000 + {query_map[5000][0]} + {query_map[5000][1]} Select Expression - -> Sort (record length: 1052, key length: 8) - -> First N Records - -> Union - -> Table "TEST" as "V01 TEST" Full Scan - -> Table "RDB$DATABASE" as "V01 RDB$DATABASE" Full Scan + ....-> Sort (record length: 4044, key length: 8) + ........-> First N Records + ............-> Union + ................-> Table "TEST" as "V01 TEST" Full Scan + ................-> Table "RDB$DATABASE" as "V01 RDB$DATABASE" Full Scan + 6000 + {query_map[6000][0]} + {query_map[6000][1]} Select Expression - -> Refetch - -> Sort (record length: 28, key length: 8) - -> Table "TEST" as "A21" Full Scan + ....-> Refetch + ........-> Sort (record length: 28, key length: 8) + ............-> Table "TEST" as "A21" Full Scan + 6010 + {query_map[6010][0]} + {query_map[6010][1]} Select Expression - -> Sort (record length: 1036, key length: 8) - -> Table "TEST" as "A22" Full Scan + ....-> Sort (record length: 1036, key length: 8) + ........-> Table "TEST" as "A22" Full Scan + 7000 + {query_map[7000][0]} + {query_map[7000][1]} Select Expression - -> Refetch - -> Sort (record length: 44, key length: 24) - -> Table "TEST_NS_01" as "A23" Full Scan + ....-> Refetch + ........-> Sort (record length: 44, key length: 24) + ............-> Table "TEST_NS_01" as "A23" Full Scan + 7010 + {query_map[7010][0]} + {query_map[7010][1]} Select Expression - -> Sort (record length: 1052, key length: 24) - -> Table "TEST_NS_02" as "A24" Full Scan + ....-> Sort (record length: 1052, key length: 24) + ........-> Table "TEST_NS_02" as "A24" Full Scan + 7020 + {query_map[7020][0]} + {query_map[7020][1]} Select Expression - -> Refetch - -> Sort (record length: 36, key length: 12) - -> Table "TEST_NS_03" Full Scan + ....-> Refetch + ........-> Sort (record length: 36, key length: 12) + ............-> Table "TEST_NS_03" Full Scan + 7030 + {query_map[7030][0]} + {query_map[7030][1]} Select Expression - -> Sort (record length: 1036, key length: 12) - -> Table "TEST_NS_04" Full Scan + ....-> Sort (record length: 1036, key length: 12) + ........-> Table "TEST_NS_04" Full Scan + 7040 + {query_map[7040][0]} + {query_map[7040][1]} Select Expression - -> Refetch - -> Sort (record length: 36, key length: 12) - -> Table "TEST_NS_05" Full Scan + ....-> Refetch + ........-> Sort (record length: 36, key length: 12) + ............-> Table "TEST_NS_05" Full Scan + 7050 + {query_map[7050][0]} + {query_map[7050][1]} Select Expression - -> Sort (record length: 1036, key length: 12) - -> Table "TEST_NS_06" Full Scan + ....-> Sort (record length: 1036, key length: 12) + ........-> Table "TEST_NS_06" Full Scan """ +act = python_act('db') + +#----------------------------------------------------------- + +def replace_leading(source, char="."): + stripped = source.lstrip() + return char * (len(source) - len(stripped)) + stripped + +#----------------------------------------------------------- + @pytest.mark.version('>=4.0') -def test_1(act: Action): - act.expected_stdout = fb4x_expected_out if act.is_version('<5') else fb5x_expected_out - act.execute() - assert act.clean_stdout == act.clean_expected_stdout +def test_1(act: Action, capsys): + with act.db.connect() as con: + cur = con.cursor() + for q_idx, q_tuple in query_map.items(): + test_sql, qry_comment = q_tuple[:2] + ps = cur.prepare(test_sql) + print(q_idx) + print(test_sql) + print(qry_comment) + print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) + ps.free() + act.expected_stdout = fb4x_expected_out if act.is_version('<5') else fb5x_expected_out + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From 3aa1d699839e7e6296febf6347b7c57d69df9015 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Mon, 2 Sep 2024 23:05:26 +0300 Subject: [PATCH 037/128] Added/Updated tests\bugs\gh_4314_test.py: Checked on 6.0.0.438, 5.0.2.1479, 4.0.6.3142, 3.0.12.33784. --- tests/bugs/gh_4314_test.py | 122 +++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 tests/bugs/gh_4314_test.py diff --git a/tests/bugs/gh_4314_test.py b/tests/bugs/gh_4314_test.py new file mode 100644 index 00000000..581c3be1 --- /dev/null +++ b/tests/bugs/gh_4314_test.py @@ -0,0 +1,122 @@ +#coding:utf-8 + +""" +ID: issue-4314 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/4314 +TITLE: Sub-optimal predicate checking while selecting from a view [CORE3981] +DESCRIPTION: +NOTES: + [20.08.2024] pzotov + Checked on 6.0.0.438, 5.0.2.1479, 4.0.6.3142, 3.0.12.33784. +""" +import locale +import re + +import pytest +from firebird.qa import * + +init_sql = """ + recreate table rr( + rel_name varchar(63) + ,id int + ,fid int + ); + + recreate table rf( + rel_name varchar(63) + ,fid int + ,fnm varchar(63) + ); + insert into rr + select a.rdb$relation_name, a.rdb$relation_id, a.rdb$field_id + from rdb$relations a + ; + insert into rf select f.rdb$relation_name, f.rdb$field_id, f.rdb$field_name + from rdb$relation_fields f + ; + commit; + + alter table rr add constraint rr_rel_name_unq unique (rel_name); + create index rr_id on rr (id); + + alter table rf add constraint rf_fnm_rel_name_unq unique(fnm, rel_name); + create index rf_rel_name on rf(rel_name); + + recreate view v as + select r.rel_name, abs(r.id) as id + from rr r + left + join rf on r.rel_name = rf.rel_name and r.fid = rf.fid + where r.id < 128; + + set statistics index rr_rel_name_unq; + set statistics index rr_id; + set statistics index rf_fnm_rel_name_unq; + set statistics index rf_rel_name; + commit; +""" + +db = db_factory(init = init_sql) +act = python_act('db') + +#----------------------------------------------------------- + +def replace_leading(source, char="."): + stripped = source.lstrip() + return char * (len(source) - len(stripped)) + stripped + +#----------------------------------------------------------- + +@pytest.mark.version('>=3.0') +def test_1(act: Action, capsys): + + query_from_view = """ + select /* trace_tag: VIEW */ v.rel_name as v_rel_name, v.id as v_id from v + where id = 0 + """ + query_from_dt = """ + select /* trace_tag: DERIVED TABLE */ d.rel_name as d_rel_name, d.id as d_id + from ( + select r.rel_name, abs(r.id) as id + from rr r + left + join rf on r.rel_name = rf.rel_name and r.fid = rf.fid + where r.id < 128 + ) d + where d.id = 0 + """ + + with act.db.connect() as con: + cur = con.cursor() + for test_sql in (query_from_view, query_from_dt): + ps = cur.prepare(test_sql) + print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) + + expected_stdout = """ + Select Expression + ....-> Filter + ........-> Nested Loop Join (outer) + ............-> Filter + ................-> Table "RR" as "V R" Access By ID + ....................-> Bitmap + ........................-> Index "RR_ID" Range Scan (upper bound: 1/1) + ............-> Filter + ................-> Table "RF" as "V RF" Access By ID + ....................-> Bitmap + ........................-> Index "RF_REL_NAME" Range Scan (full match) + + Select Expression + ....-> Filter + ........-> Nested Loop Join (outer) + ............-> Filter + ................-> Table "RR" as "D R" Access By ID + ....................-> Bitmap + ........................-> Index "RR_ID" Range Scan (upper bound: 1/1) + ............-> Filter + ................-> Table "RF" as "D RF" Access By ID + ....................-> Bitmap + ........................-> Index "RF_REL_NAME" Range Scan (full match) + """ + act.expected_stdout = expected_stdout + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From 02a8cf7ffc787bbc3490d1661e148c3a0faf7ba8 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Tue, 3 Sep 2024 09:14:24 +0300 Subject: [PATCH 038/128] Added/Updated tests\bugs\gh_8225_test.py: Uncomment display of explained plan --- tests/bugs/gh_8225_test.py | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/tests/bugs/gh_8225_test.py b/tests/bugs/gh_8225_test.py index e923eaee..47eeeab7 100644 --- a/tests/bugs/gh_8225_test.py +++ b/tests/bugs/gh_8225_test.py @@ -6,11 +6,9 @@ ISSUE: https://github.com/FirebirdSQL/firebird/issues/8225 TITLE: Problematic queries when SubQueryConversion = true DESCRIPTION: NOTES: - [23.08.2024] pzotov - 1. Explained plan output temporary disabled: there is question about missed(?) indentation after 'Refetch'. - Sent letter to dimitr, 23.08.2024 21:42. - 2. Parameter 'SubQueryConversion' currently presents only in FB 5.x and _NOT_ in FB 6.x. - Because of that, testing version are limited only for 5.0.2. FB 6.x currently is NOT tested. + [03.09.2024] pzotov + Parameter 'SubQueryConversion' currently presents only in FB 5.x and _NOT_ in FB 6.x. + Because of that, testing version are limited only for 5.0.2. FB 6.x currently is NOT tested. Confirmed bug on 5.0.2.1479-adfe97a. Checked on 5.0.2.1482-604555f. @@ -94,15 +92,36 @@ def test_1(act: Action, capsys): print(r[0],r[1]) ps = cur.prepare(test_sql) - # temporary, until question with indentation will be solved by dimitr -- print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) + print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) for r in cur.execute(ps): print(r[0],r[1]) con.rollback() act.expected_stdout = f""" SubQueryConversion true + + Select Expression + ....-> First N Records + ........-> Filter + ............-> Hash Join (semi) + ................-> Refetch + ....................-> Sort (record length: 28, key length: 8) + ........................-> Table "DEPARTMENT" as "D" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Table "EMPLOYEE" as "E" Full Scan 2 d2 + SubQueryConversion false + + Sub-query + ....-> Filter + ........-> Table "EMPLOYEE" as "E" Full Scan + Select Expression + ....-> First N Records + ........-> Refetch + ............-> Sort (record length: 28, key length: 8) + ................-> Filter + ....................-> Table "DEPARTMENT" as "D" Full Scan 2 d2 """ act.stdout = capsys.readouterr().out From fbb6793e768b7df76ab9676d236185323c8d3dd3 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Tue, 3 Sep 2024 21:19:09 +0300 Subject: [PATCH 039/128] Added/Updated tests\bugs\gh_7128_test.py: Checked on 6.0.0.447, 5.0.2.1487, 4.0.6.3142; 3.0.13.33793 raises 'firebird.driver.types.DatabaseError: Invalid resultset interface' --- tests/bugs/gh_7128_test.py | 87 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 tests/bugs/gh_7128_test.py diff --git a/tests/bugs/gh_7128_test.py b/tests/bugs/gh_7128_test.py new file mode 100644 index 00000000..a49263ad --- /dev/null +++ b/tests/bugs/gh_7128_test.py @@ -0,0 +1,87 @@ +#coding:utf-8 +""" +ID: issue-7128 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/7128 +TITLE: Incorrect error message with isc_sql_interprete() +DESCRIPTION: +NOTES: + [28.03.2024] pzotov + Bug caused crash of FB up to 5.0.0.890 (10-jan-2023). + Since 5.0.0.905 (11-jan-2023) following error raises: + Invalid resultset interface + -901 + 335545049 + + [03.09.2024] pzotov + 1. Warning is issued: + $PYTHON_HOME/Lib/site-packages/firebird/driver/interfaces.py:710: FirebirdWarning: Invalid resultset interface + self._check() + It was decided to suppress warning by using 'warnings' package. + + 2. Result for snapshots with date = 09-feb-2022: + 3.0.9.33560: + Exception ignored in: + Traceback (most recent call last): + File "$PYTHON_HOME/Lib/site-packages/firebird/driver/core.py", line 3047, in __del__ + File "$PYTHON_HOME/Lib/site-packages/firebird/driver/core.py", line 3788, in close + File "$PYTHON_HOME/Lib/site-packages/firebird/driver/core.py", line 3655, in _clear + File "$PYTHON_HOME/Lib/site-packages/firebird/driver/interfaces.py", line 709, in close + OSError: exception: access violation writing 0x0000000000000024 + 4.0.1.2175: passed. + 5.0.0.393: crashed, + > raise self.__report(DatabaseError, self.status.get_errors()) + E firebird.driver.types.DatabaseError: Error writing data to the connection. + E -send_packet/send + 3. Version 3.0.13.33793 raises: + > raise self.__report(DatabaseError, self.status.get_errors()) + E firebird.driver.types.DatabaseError: Invalid resultset interface + (and this exceprion is not catched for some reason). + + Checked on 6.0.0.447, 5.0.2.1487, 4.0.6.3142 +""" + +import pytest +from firebird.qa import * +from firebird.driver import tpb, Isolation, TraLockResolution, TraAccessMode, DatabaseError, FirebirdWarning +import time +import warnings + +db = db_factory() +act = python_act('db') + +@pytest.mark.version('>=4.0') +def test_1(act: Action, capsys): + + tpb_isol_set = (Isolation.SERIALIZABLE, Isolation.SNAPSHOT, Isolation.READ_COMMITTED_READ_CONSISTENCY, Isolation.READ_COMMITTED_RECORD_VERSION, Isolation.READ_COMMITTED_NO_RECORD_VERSION) + + with act.db.connect() as con: + for x_isol in tpb_isol_set: + custom_tpb = tpb(isolation = x_isol, lock_timeout = 0) + tx = con.transaction_manager(custom_tpb) + cur = tx.cursor() + tx.begin() + with warnings.catch_warnings(): + warnings.filterwarnings('ignore') + try: + print(x_isol.name) + cur.execute('select 0 from rdb$types rows 2') + cur.fetchone() + tx._cursors = [] + tx.commit() + cur.fetchone() + except DatabaseError as e: + print(e.__str__()) + print(e.sqlcode) + for g in e.gds_codes: + print(g) + finally: + cur.close() + + act.expected_stdout = f""" + {x_isol.name} + Invalid resultset interface + -901 + 335545049 + """ + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From e8ccc02275f615f6a3e4e0d6fba84b930975a573 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Wed, 4 Sep 2024 11:59:41 +0300 Subject: [PATCH 040/128] Added/Updated tests\bugs\core_4301_test.py: Added 'using plugin Srp' into 'CREATE USER' statements, in order to check 'COMMENT ON USER' with non-ascii text. --- tests/bugs/core_4301_test.py | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/tests/bugs/core_4301_test.py b/tests/bugs/core_4301_test.py index da3c1d07..fb5c45a7 100644 --- a/tests/bugs/core_4301_test.py +++ b/tests/bugs/core_4301_test.py @@ -7,6 +7,9 @@ TITLE: Non-ASCII data in SEC$USERS is not read correctly DESCRIPTION: JIRA: CORE-4301 FBTEST: bugs.core_4301 +NOTES: + [04.09.2024] pzotov + Added 'using plugin Srp' into 'CREATE USER' statements, in order to check 'COMMENT ON USER' with non-ascii text. """ import pytest @@ -20,29 +23,43 @@ user_a = user_factory('db', name='u30a', password='u30a', do_not_create=True) user_b = user_factory('db', name='u30b', password='u30b', do_not_create=True) test_script = """ - -- Note: this test differs from ticket: instead of add COMMENTS to users - -- it only defines their `firstname` attribute, because sec$users.sec$description - -- can be displayed only when plugin UserManager = Srp. -- Field `firstname` is defined as: -- VARCHAR(32) CHARACTER SET UNICODE_FSS COLLATE UNICODE_FSS -- we can put in it max 16 non-ascii characters - create or alter user u30a password 'u30a' firstname 'Полиграф Шариков'; - create or alter user u30b password 'u30b' firstname 'Léopold Frédéric'; + create or alter user u30a password 'u30a' firstname 'Полиграф Шариков' using plugin Srp; + create or alter user u30b password 'u30b' firstname 'Léopold Frédéric' using plugin Srp; commit; + comment on user u30a is 'это кто-то из наших'; + comment on user u30b is 'é alguém do Brasil'; + commit; + /* + show domain rdb$user; + show domain SEC$NAME_PART; + show table sec$users; + */ set list on; - select u.sec$user_name, u.sec$first_name + select + -- 3.x: CHAR(31) CHARACTER SET UNICODE_FSS Nullable + -- 4.x, 5.x: (RDB$USER) CHAR(63) Nullable + -- FB 6.x: (RDB$USER) CHAR(63) CHARACTER SET UTF8 Nullable + u.sec$user_name + ,u.sec$first_name -- (SEC$NAME_PART) VARCHAR(32) Nullable + ,u.sec$description as descr_blob_id -- (RDB$DESCRIPTION) BLOB segment 80, subtype TEXT Nullable from sec$users u where upper(u.sec$user_name) in (upper('u30a'), upper('u30b')); commit; """ -act = isql_act('db', test_script) +act = isql_act('db', test_script, substitutions = [ ('DESCR_BLOB_ID.*',''),('[ \t]+',' ') ] ) expected_stdout = """ SEC$USER_NAME U30A SEC$FIRST_NAME Полиграф Шариков + это кто-то из наших + SEC$USER_NAME U30B SEC$FIRST_NAME Léopold Frédéric + é alguém do Brasil """ @pytest.mark.version('>=3.0') From 21b75e0a2609101ccd03eff141e303c46cddb0e2 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Wed, 4 Sep 2024 12:30:37 +0300 Subject: [PATCH 041/128] Added/Updated tests\bugs\gh_0731_test.py: Checked on all recent 3.x ... 6.x --- tests/bugs/gh_0731_test.py | 97 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 tests/bugs/gh_0731_test.py diff --git a/tests/bugs/gh_0731_test.py b/tests/bugs/gh_0731_test.py new file mode 100644 index 00000000..4b81db95 --- /dev/null +++ b/tests/bugs/gh_0731_test.py @@ -0,0 +1,97 @@ +#coding:utf-8 + +""" +ID: issue-731 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/731 +TITLE: coalesce fails with data type varchar and a non ascii value [CORE388] +DESCRIPTION: +NOTES: + [04.09.2024] pzotov + The issue seems to be fixed long ago. + Old FB versions can not be checked on current firebird QA. + Checked on all recent 3.x ... 6.x -- all fine. +""" + +import pytest +from firebird.qa import * + +init_sql = """ + recreate table trans_table + ( + tcode smallint + not null, + code smallint + not null, + name varchar(10), + constraint trans_table_primarykey primary key + (tcode, code) + ); + + recreate table class1 + ( + class_name varchar(10) + not null, + class_num smallint + not null, + teacher_id integer, + constraint pk_class1 primary key (class_name, class_num) + ); + + recreate table class2 + ( + class_name varchar(10) + not null, + class_num smallint + not null, + teacher_id integer, + constraint pk_class2 primary key (class_name, class_num) + ); + + set term ^; + create trigger class1_bi for class1 active before insert position 0 as + declare name varchar(10); + begin + select name from trans_table c where c.tcode=2 and c.code=new.class_name + into :name; + new.class_name = case when :name is null then new.class_name else :name end; + -- new.class_name = coalesce(:name, new.class_name); + end + ^ + + create trigger class2_bi for class2 active before insert position 0 as + declare name varchar(10); + begin + select name from trans_table c where c.tcode=2 and c.code=new.class_name + into :name; + -- new.class_name = case when :name is null then new.class_name else :name end; + new.class_name = coalesce(:name, new.class_name); + end + ^ + set term ;^ + commit; +""" +db = db_factory(init = init_sql, charset='win1252') + +test_script = """ + set bail on; + set list on; + insert into trans_table(tcode, code, name) values (2, 1, 'à'); + -- passed + insert into class1(class_name, class_num, teacher_id) values (1, 1, null); + -- failed + insert into class2(class_name, class_num, teacher_id) values (1, 1, null); + select 'Passed' as msg from rdb$database; +""" + +act = isql_act('db', test_script, substitutions = [ ('[ \t]+',' ') ]) + +expected_stdout = """ + MSG Passed +""" + +@pytest.mark.version('>=3.0') +def test_1(act: Action): + act.expected_stdout = expected_stdout + act.execute(charset = 'win1252') + assert act.clean_stdout == act.clean_expected_stdout + From 75230e41813be6ea5122324fbdd97110d74cec93 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Wed, 4 Sep 2024 12:43:07 +0300 Subject: [PATCH 042/128] Added/Updated tests\bugs\core_0986_test.py: minor changes: removed not working comments --- tests/bugs/core_0986_test.py | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/tests/bugs/core_0986_test.py b/tests/bugs/core_0986_test.py index 0402b37d..77ed12ce 100644 --- a/tests/bugs/core_0986_test.py +++ b/tests/bugs/core_0986_test.py @@ -23,18 +23,18 @@ act = python_act('db', substitutions=[('in file .*', 'in file XXX')]) expected_stdout_a = """create collation "Циферки" for utf8 from unicode case insensitive 'NUMERIC-SORT=1';""" expected_stderr_a_40 = """ -Statement failed, SQLSTATE = 22018 -arithmetic exception, numeric overflow, or string truncation --Cannot transliterate character between character sets -After line 4 in file non_ascii_ddl.sql + Statement failed, SQLSTATE = 22018 + arithmetic exception, numeric overflow, or string truncation + -Cannot transliterate character between character sets + After line 4 in file non_ascii_ddl.sql """ expected_stderr_a_30 = """ -Statement failed, SQLSTATE = 22000 -unsuccessful metadata update --CREATE COLLATION Циферки failed --Malformed string -After line 4 in file non_ascii_ddl.sql + Statement failed, SQLSTATE = 22000 + unsuccessful metadata update + -CREATE COLLATION Циферки failed + -Malformed string + After line 4 in file non_ascii_ddl.sql """ non_ascii_ddl=''' @@ -171,8 +171,6 @@ non_ascii_ddl=''' '; -------------------------------------------------- commit; - --/* - --TEMPLY COMMENTED UNTIL CORE-5221 IS OPEN: set echo on; show collation; show domain; @@ -183,25 +181,28 @@ non_ascii_ddl=''' show view; show procedure; show role; - --*/ set list on; set echo off; select 'Metadata created OK.' as msg from rdb$database; ''' -tmp_file = temp_file('non_ascii_ddl.sql') +tmp_file = temp_file('tmp_0986_non_ascii_ddl.sql') @pytest.mark.version('>=3.0') def test_1(act: Action, tmp_file: Path): tmp_file.write_bytes(non_ascii_ddl.encode('cp1251')) + # run without specifying charset + ################################ act.expected_stdout = expected_stdout_a act.expected_stderr = expected_stderr_a_40 if act.is_version('>=4.0') else expected_stderr_a_30 act.isql(switches=['-q'], input_file=tmp_file, charset=None, io_enc='cp1251') assert (act.clean_stdout == act.clean_expected_stdout and act.clean_stderr == act.clean_expected_stderr) - # run with charset + + # run _with_ charset + #################### act.reset() act.isql(switches=['-q'], input_file=tmp_file, charset='win1251', io_enc='cp1251') assert act.clean_stdout.endswith('Metadata created OK.') From f61d3d5a9b1a56e4f0a006be6dbc0ebf3e5c1203 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Wed, 4 Sep 2024 15:21:25 +0300 Subject: [PATCH 043/128] Added/Updated tests\bugs\gh_8241_test.py: Checked on 6.0.0.450-8591572, 5.0.2.1493-eb720e8. --- tests/bugs/gh_8241_test.py | 54 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 tests/bugs/gh_8241_test.py diff --git a/tests/bugs/gh_8241_test.py b/tests/bugs/gh_8241_test.py new file mode 100644 index 00000000..4d54cdcb --- /dev/null +++ b/tests/bugs/gh_8241_test.py @@ -0,0 +1,54 @@ +#coding:utf-8 +""" +ID: issue-8241 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8241 +TITLE: gbak may lose NULLs in restore +DESCRIPTION: +NOTES: + Restore must use gbak utility, target DB must be prefixed by 'localhost:'. + + Confirmed bug on 6.0.0.447, 5.0.2.1487 + Checked on 6.0.0.450-8591572, 5.0.2.1493-eb720e8. +""" + +import pytest +from firebird.qa import * +from pathlib import Path +import time + +init_sql = """ + create table t ("TABLE" integer); + insert into t values (null); + insert into t values (null); + commit; +""" +db = db_factory(init = init_sql) +act = python_act('db') + +tmp_fbk = temp_file('tmp_8241.fbk') +tmp_res = temp_file('tmp_8241.fdb') + +@pytest.mark.version('>=5.0.2') +def test_1(act: Action, tmp_fbk: Path, tmp_res: Path, capsys): + + with act.connect_server() as srv: + srv.database.set_sql_dialect(database=act.db.db_path, dialect=1) + + act.gbak(switches=['-b', act.db.db_path, str(tmp_fbk)]) + act.gbak(switches=['-rep', str(tmp_fbk), f'localhost:{act.db.db_path}']) + + # NOTE! THIS PREVENTS FROM REPRODUCING BUG: + # DO NOT USE >>> act.gbak(switches=['-se', 'localhost:service_mgr', '-rep', str(tmp_fbk), act.db.db_path]) + + with act.db.connect() as con: + cur = con.cursor() + cur.execute('select "TABLE" from t') + for r in cur: + print(r[0]) + + act.expected_stdout = f""" + None + None + """ + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From 39e0c356d18ebcc85aa72f258604add35b77fcce Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Wed, 4 Sep 2024 16:45:16 +0300 Subject: [PATCH 044/128] Added/Updated tests\bugs\core_0986_test.py: minor changes --- tests/bugs/core_0986_test.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/tests/bugs/core_0986_test.py b/tests/bugs/core_0986_test.py index 77ed12ce..f13595fd 100644 --- a/tests/bugs/core_0986_test.py +++ b/tests/bugs/core_0986_test.py @@ -2,7 +2,7 @@ """ ID: issue-1393 -ISSUE: 1393 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/1393 TITLE: Non-ASCII quoted identifiers are not converted to metadata (UNICODE_FSS) charset DESCRIPTION: JIRA: CORE-986 @@ -62,8 +62,7 @@ non_ascii_ddl=''' create role "манагер"; create role "начсклд"; - -- TEMPLY COMMENTED UNTIL CORE-5209 IS OPEN: - -- ISQL -X ignores connection charset for text of EXCEPTION message (restoring it in initial charset when exception was created) + -- enabled since CORE-5209 was fixed: recreate exception "Невзлет" 'Запись обломалась, ваши не пляшут. Но не стесняйтесь и обязательно заходите еще, мы всегда рады видеть вас. До скорой встречи, товарищ!'; commit; @@ -206,5 +205,3 @@ def test_1(act: Action, tmp_file: Path): act.reset() act.isql(switches=['-q'], input_file=tmp_file, charset='win1251', io_enc='cp1251') assert act.clean_stdout.endswith('Metadata created OK.') - - From b70f0174883d9c5593905ecfab1c9feb20f58bc7 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Wed, 4 Sep 2024 20:04:56 +0300 Subject: [PATCH 045/128] Add marker 'intl' for tests which deal with non-ascii characters --- pytest.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/pytest.ini b/pytest.ini index 90668c59..9da79511 100644 --- a/pytest.ini +++ b/pytest.ini @@ -3,6 +3,7 @@ console_output_style = count # testpaths = tests # addopts = --server local --install-terminal markers = + intl: mark a test as dealing with non-ascii characters scroll_cur: mark a test as dealing with scrollable cursor es_eds: mark a test as dealing with ES/EDS mechanism trace: mark a test as dealing with trace From fb31b6c73926949948fabd6b514ed917499ddf77 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Wed, 4 Sep 2024 20:06:13 +0300 Subject: [PATCH 046/128] Added/Updated tests\functional\intl\test_non_ascii_firebird_and_trace_utf8.py: Checked 6.0.0.450, 5.0.2.1493, 4.0.6.3142 (on Windows). --- .../test_non_ascii_firebird_and_trace_utf8.py | 178 ++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 tests/functional/intl/test_non_ascii_firebird_and_trace_utf8.py diff --git a/tests/functional/intl/test_non_ascii_firebird_and_trace_utf8.py b/tests/functional/intl/test_non_ascii_firebird_and_trace_utf8.py new file mode 100644 index 00000000..42f46800 --- /dev/null +++ b/tests/functional/intl/test_non_ascii_firebird_and_trace_utf8.py @@ -0,0 +1,178 @@ +#coding:utf-8 + +""" +ID: functional.intl.test_non_ascii_firebird_and_trace_utf8.py +TITLE: Check ability to obtain non-ascii content from firebird.log and trace when use ON DISCONNECT trigger and exception with non-ascii names, charset = UTF8. +DESCRIPTION: + We can make engine to put something in firebird.log by creating ON DISCONNECT trigger which raises exception. + (see https://github.com/FirebirdSQL/firebird/issues/4282). + In order this trigger not fired when we just create DB, aux user ('TMP_WORKER') is created and trigger will fire only for him. + Before making connection as user 'TMP_WORKER', we: + * get content of firebird.log + * launch trace + After tmp_worker completes its work (running ISQL with single command: 'quit'), we get again content of + firebird.log and trace for further parsing. + + Finally, we check that: + * trace contains messages about raised exception (with message) and failed trigger (with call stack); + * difference in firebird.log contains messages similar to trace +NOTES: + [04.09.2024] pzotov + Test makes connections to DB using charset = 'utf8' and uses io_enc = 'utf-8' when obtaining content of firebird.log and trace. + Checked 6.0.0.450, 5.0.2.1493, 4.0.6.3142 (on Windows). +""" + +import pytest +from firebird.qa import * +import re +import locale +from pathlib import Path +from difflib import unified_diff +import time + +tmp_worker = user_factory('db', name='tmp_worker', password='123') +#tmp_sql = temp_file('tmp_non_ascii.sql') + +db = db_factory(charset = 'utf8') +substitutions = [ ('.* FAILED EXECUTE_TRIGGER_FINISH', 'FAILED EXECUTE_TRIGGER_FINISH'), + ('.* ERROR AT purge_attachment', 'ERROR AT purge_attachment'), + ('(,)?\\s+line(:)?\\s+\\d+(,)?\\s+col(:)?\\s+\\d+', '') + ] + +act = python_act('db', substitutions = substitutions) + +@pytest.mark.trace +@pytest.mark.version('>=4.0') +def test_1(act: Action, tmp_worker: User, capsys): + + init_sql = f""" + set list on; + set bail on; + create exception "paramètre non trouvé" q'#Paramètre "@1" a une valeur incorrecte ou n'a pas été trouvé dans#'; + set term ^; + ^ + create trigger "gâchette de déconnexion" on disconnect as + begin + if ( current_user != '{act.db.user}' ) then + begin + exception "paramètre non trouvé" using ('fréquence fermée'); + end + end + ^ + set term ;^ + commit; + """ + + #tmp_sql.write_bytes( bytes(init_sql.encode('utf-8')) ) + #act.isql(switches=['-q'], input_file = tmp_sql, combine_output = True, charset = 'utf8', io_enc = 'utf-8') + + act.expected_stdout = '' + act.isql(switches=['-q'], input = init_sql, combine_output = True, charset = 'utf8', io_enc = 'utf-8') + assert act.clean_stdout == act.clean_expected_stdout + act.reset() + + # ---------------------------------------------------------------------------------------------- + with act.connect_server(encoding = 'utf-8') as srv: + srv.info.get_log() + fb_log_init = srv.readlines() + # ---------------------------------------------------------------------------------------------- + + trace_cfg_items = [ + 'log_connections = true', + 'log_transactions = true', + 'time_threshold = 0', + 'log_errors = true', + 'log_statement_finish = true', + 'log_trigger_finish = true', + 'max_sql_length = 32768', + ] + + with act.trace(db_events = trace_cfg_items, encoding='utf-8'): + test_sql = f""" + set names utf8; + connect '{act.db.dsn}' user {tmp_worker.name} password '{tmp_worker.password}'; + quit; + """ + act.isql(switches = ['-q'], input = test_sql, connect_db=False, credentials = False, combine_output = True, io_enc = 'utf-8') + assert act.clean_stdout == act.clean_expected_stdout + act.reset() + + # ---------------------------------------------------------------------------------------------- + + allowed_patterns = \ + ( + re.escape(') FAILED EXECUTE_TRIGGER_FINISH') + ,re.escape(') ERROR AT purge_attachment') + ,re.escape('335544382 :') # name of exception: paramètre non trouvé (without quotes) + ,re.escape('335545016 :') # message of exception: Paramètre "fréquence fermée" a une valeur incorrecte ou n'a pas été trouvé dans + ,re.escape('335544842 : At trigger') + ) + allowed_patterns = [ re.compile(p, re.IGNORECASE) for p in allowed_patterns ] + + # Example of trace: + # 2024-09-04T18:57:20.7950 (2184:00000000016B23C0) ERROR AT purge_attachment + # ... + # 335544517 : exception 1 + # 335544382 : paramètre non trouvé + # 335545016 : Paramètre "fréquence fermée" a une valeur incorrecte ou n'a pas été trouvé dans + # 335544842 : At trigger 'gâchette de déconnexion' line: 5, col: 17 + + for line in act.trace_log: + #print(line) + if line.strip(): + if act.match_any(line.strip(), allowed_patterns): + print(line.strip()) + + expected_trace_log = """ + FAILED EXECUTE_TRIGGER_FINISH + ERROR AT purge_attachment + 335544382 : paramètre non trouvé + 335545016 : Paramètre "fréquence fermée" a une valeur incorrecte ou n'a pas été trouvé dans + 335544842 : At trigger 'gâchette de déconnexion' + """ + act.expected_stdout = expected_trace_log + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout + act.reset() + + # ---------------------------------------------------------------------------------------------- + + with act.connect_server(encoding = 'utf-8') as srv: + srv.info.get_log() + fb_log_curr = srv.readlines() + srv.wait() + + # Example of firebird.log: + # + # Error at disconnect: + # exception 1 + # paramètre non trouvé + # Paramètre "fréquence fermée" a une valeur incorrecte ou n'a pas été trouvé dans + # At trigger 'gâchette de déconnexion' + + fb_log_diff_patterns = \ + ( + 'Error at disconnect' + ,'exception' + ,'paramètre non trouvé' + ,'Paramètre "fréquence fermée"' + ,'At trigger' + ) + fb_log_diff_patterns = [ re.compile(p, re.IGNORECASE) for p in fb_log_diff_patterns ] + + for line in unified_diff(fb_log_init, fb_log_curr): + if line.startswith('+'): + if act.match_any(line[1:].strip(), fb_log_diff_patterns): + print(line[1:].strip()) + + expected_log_diff = """ + Error at disconnect: + exception 1 + paramètre non trouvé + Paramètre "fréquence fermée" a une valeur incorrecte ou n'a pas été trouvé dans + At trigger 'gâchette de déconnexion' + """ + + act.expected_stdout = expected_log_diff + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From 17d8f371044b31eaeadd3238b871b29b753e1768 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 5 Sep 2024 10:07:37 +0300 Subject: [PATCH 047/128] Added/Updated tests\bugs\gh_0731_test.py: ISQL must work with charset = utf8. Otherwise 'Expected end of statement, encountered EOF' will raise on Linux. --- tests/bugs/gh_0731_test.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/bugs/gh_0731_test.py b/tests/bugs/gh_0731_test.py index 4b81db95..6fdb0a94 100644 --- a/tests/bugs/gh_0731_test.py +++ b/tests/bugs/gh_0731_test.py @@ -9,6 +9,8 @@ NOTES: [04.09.2024] pzotov The issue seems to be fixed long ago. Old FB versions can not be checked on current firebird QA. + ISQL must work with charset = utf8. Otherwise 'Expected end of statement, encountered EOF' will raise on Linux. + Checked on all recent 3.x ... 6.x -- all fine. """ @@ -92,6 +94,6 @@ expected_stdout = """ @pytest.mark.version('>=3.0') def test_1(act: Action): act.expected_stdout = expected_stdout - act.execute(charset = 'win1252') + act.execute(charset = 'utf8') assert act.clean_stdout == act.clean_expected_stdout From 1a3a9e0db701d3e8b765ba19c90493f60a48dbdb Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 5 Sep 2024 12:28:07 +0300 Subject: [PATCH 048/128] Added/Updated tests\bugs\gh_8219_test.py: Confirmed problem on snapshotrs before 20-aug-2024 -- see notes. Test can be used only for ServerMode = Super or SuperClassic --- tests/bugs/gh_8219_test.py | 145 +++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 tests/bugs/gh_8219_test.py diff --git a/tests/bugs/gh_8219_test.py b/tests/bugs/gh_8219_test.py new file mode 100644 index 00000000..0e248de0 --- /dev/null +++ b/tests/bugs/gh_8219_test.py @@ -0,0 +1,145 @@ +#coding:utf-8 + +""" +ID: issue-8219 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8219 +TITLE: Database creation in 3.0.12, 4.0.5 and 5.0.1 slower than in previous releases +DESCRIPTION: + We can estimate perfomance by comparison of time that is spent to create DB vs result of some crypt function. + Function crypt_hash( using SHA512) has been selected for that because of notable CPU consumation. + Stored procedured SP_GEN_HASH is created for evaluation of crypt hash, it will run loop for N_HASH_EVALUATE_COUNT times. + Duration for each measure is difference between psutil.Process(fb_pid).cpu_times() counters. + We do times call of SP and create_database(), with adding results to map. + Finally, we get ratio between medians of these measures (see 'median_ratio') + + Test is considered as passed if median_ratio less than threshold . +NOTES: + [05.09.2024] pzotov. + 1. Confirmed problem on snapshotrs before 20-aug-2024. + Medians ratio on Windows: + 1. Before fix: + 6.0.0.423: 0.39; 6.0.0.436: 0.39; 6.0.0.437: 0.35; + 5.0.1.1464: 0.42; 5.0.1.1469: 0.39; 5.0.1.1479: 0.35 + 4.0.5.3136: 0.42; 4.0.6.3142: 0.39 + 2. After fix ratio reduced to ~0.25: + 6.0.0.438: 0.21; 6.0.0.442: 0.21; 6.0.0.438: 0.21; 6.0.0.442: 0.21; 6.0.0.450: 0.24 + 5.0.2.1481: 0.25; 5.0.2.1482: 0.21; 5.0.2.1493: 0.22 + 4.0.6.3144: 0.25; 4.0.6.3149: 0.29 + + Medians ratio on Windows: + 1. Before fix: + 6.0.0.397-c734c96: 0.48; 6.0.0.438-088b529: 0.49 + 2. After fix ratio reduced to ~0.25: + 6.0.0.441-75042b5: 0.23 + 5.0.2.1481-fc71044: 0.24 + 4.0.6.3144-5a3b718: 0.27 + 2. Test DB must NOT have charset = utf8, otherwise 'implementation limit exceeded' will raise; win1251 was selected for work. + 3. Test can be used only for ServerMode = Super or SuperClassic + (because in CS a new process is made and we have no value of cpu_times() *before* DB creation). +""" +import os +import psutil +import pytest +from firebird.qa import * +from firebird.driver import driver_config, create_database, NetProtocol +from pathlib import Path + +#-------------------------------------------------------------------- +def median(lst): + n = len(lst) + s = sorted(lst) + return (sum(s[n//2-1:n//2+1])/2.0, s[n//2])[n % 2] if n else None +#-------------------------------------------------------------------- + +########################### +### S E T T I N G S ### +########################### + +# How many times we create databases +N_MEASURES = 31 + +# How many iterations must be done for hash evaluation: +N_HASH_EVALUATE_COUNT = 3000 + +# Maximal value for ratio between maximal and minimal medians +# +############################################# +MAX_RATIO = 0.30 if os.name == 'nt' else 0.33 +############################################# + +init_script = \ +f''' + set term ^; + create or alter procedure sp_gen_hash (n_cnt int) as + declare v_hash varbinary(64); + declare s varchar(32765); + begin + s = lpad('', 32765, uuid_to_char(gen_uuid())); + while (n_cnt > 0) do + begin + v_hash = crypt_hash(s using SHA512); + n_cnt = n_cnt - 1; + end + end + ^ + commit + ^ +''' + +db = db_factory(init = init_script, charset = 'win1251') +act = python_act('db') +tmp_fdb = temp_file('tmp_gh_8219.tmp') + +expected_stdout = """ + Medians ratio: acceptable +""" + +@pytest.mark.version('>=4.0.5') +def test_1(act: Action, tmp_fdb: Path, capsys): + + if act.vars['server-arch'].lower() == 'classic': + pytest.skip('Can be used only for SS / SC.') + + srv_cfg = driver_config.register_server(name = 'test_srv_gh_8219', config = '') + + db_cfg_name = 'tmp_8219' + db_cfg_object = driver_config.register_database(name = db_cfg_name) + db_cfg_object.server.value = srv_cfg.name + db_cfg_object.protocol.value = NetProtocol.INET + db_cfg_object.database.value = str(tmp_fdb) + + with act.db.connect() as con: + cur=con.cursor() + cur.execute('select mon$server_pid as p from mon$attachments where mon$attachment_id = current_connection') + fb_pid = int(cur.fetchone()[0]) + + times_map = {} + for i in range(0, N_MEASURES): + fb_info_init = psutil.Process(fb_pid).cpu_times() + cur.callproc( 'sp_gen_hash', (N_HASH_EVALUATE_COUNT,) ) + fb_info_curr = psutil.Process(fb_pid).cpu_times() + times_map[ 'hash_eval', i ] = max(fb_info_curr.user - fb_info_init.user, 0.000001) + + fb_info_init = psutil.Process(fb_pid).cpu_times() + with create_database(db_cfg_name, user = act.db.user, password = act.db.password, overwrite = True) as dbc: + pass + fb_info_curr = psutil.Process(fb_pid).cpu_times() + times_map[ 'db_create', i ] = max(fb_info_curr.user - fb_info_init.user, 0.000001) + + + sp_gen_hash_median = median([v for k,v in times_map.items() if k[0] == 'hash_eval']) + sp_db_create_median = median([v for k,v in times_map.items() if k[0] == 'db_create']) + + median_ratio = sp_db_create_median / sp_gen_hash_median + + print( 'Medians ratio: ' + ('acceptable' if median_ratio <= MAX_RATIO else '/* perf_issue_tag */ POOR: %s, more than threshold: %s' % ( '{:9g}'.format(median_ratio), '{:9g}'.format(MAX_RATIO) ) ) ) + if median_ratio > MAX_RATIO: + print(f'CPU times for each of {N_MEASURES} measures:') + for sp_name in ('hash_eval', 'db_create', ): + print(f'{sp_name=}:') + for p in [v for k,v in times_map.items() if k[0] == sp_name]: + print(p) + + act.expected_stdout = expected_stdout + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From 9afb73b053d7d11eeaf5e33c7cd8fc86f31af88c Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 12 Sep 2024 11:57:26 +0300 Subject: [PATCH 049/128] Added/Updated tests\bugs\core_2051_test.py: Removed execution plan from expected output. Requested by dimitr. --- tests/bugs/core_2051_test.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/bugs/core_2051_test.py b/tests/bugs/core_2051_test.py index 50321f39..9a4bfcf1 100644 --- a/tests/bugs/core_2051_test.py +++ b/tests/bugs/core_2051_test.py @@ -7,6 +7,10 @@ TITLE: Don't work subquery in COALESCE DESCRIPTION: JIRA: CORE-2051 FBTEST: bugs.core_2051 +NOTES: + [12.09.2024] pzotov + Removed execution plan from expected output. + Requested by dimitr, letters with subj 'core_2051_test', since 11.09.2024 17:16. """ import pytest @@ -28,16 +32,13 @@ test_script = """ insert into test2 values(2); commit; - set plan on; set list on; select coalesce((select t2.id from test2 t2 where t2.id = t1.id), 0) id2 from test1 t1 order by t1.id; """ -act = isql_act('db', test_script) +act = isql_act('db', test_script, substitutions = [ ('[ \t]+',' ') ]) expected_stdout = """ - PLAN (T2 INDEX (TEST2_PK)) - PLAN (T1 ORDER TEST1_PK) ID2 1 ID2 2 ID2 0 @@ -46,6 +47,6 @@ expected_stdout = """ @pytest.mark.version('>=3') def test_1(act: Action): act.expected_stdout = expected_stdout - act.execute() + act.execute(combine_output = True) assert act.clean_stdout == act.clean_expected_stdout From 1e08690886b6f814a3894af1c6da2ac5bb570b49 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 12 Sep 2024 12:31:24 +0300 Subject: [PATCH 050/128] Added/Updated tests\bugs\core_5118_test.py: Replaced test query so that it does not use index navigation ('plan order') but still checks indexed access. Requested by dimitr, letters with subj 'core_5118_test', since 11.09.2024 17:26. Checked on 6.0.0.452, 5.0.2.1493, 4.0.5.3136, 3.0.13.33789 --- tests/bugs/core_5118_test.py | 55 +++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/tests/bugs/core_5118_test.py b/tests/bugs/core_5118_test.py index baff0af6..d23cd9de 100644 --- a/tests/bugs/core_5118_test.py +++ b/tests/bugs/core_5118_test.py @@ -7,6 +7,17 @@ TITLE: Indices on computed fields are broken after restore (all keys are N DESCRIPTION: JIRA: CORE-5118 FBTEST: bugs.core_5118 +NOTES: + [12.09.2024] pzotov + Replaced test query so that it does not use index navigation ('plan order') but still checks indexed access. + Three separate queries with 'PLAN ... INDEX' are used instead of one with 'where IN '. + This is because of optimizer changed in 5.x and issues plan with only *one* occurrence of 'INDEX' for such cases. + See: https://github.com/FirebirdSQL/firebird/pull/7707 - "Better processing and optimization if IN ". + Commit: https://github.com/FirebirdSQL/firebird/commit/0493422c9f729e27be0112ab60f77e753fabcb5b, 04-sep-2023. + + Requested by dimitr, letters with subj 'core_5118_test', since 11.09.2024 17:26. + + Checked on 6.0.0.452, 5.0.2.1493, 4.0.5.3136, 3.0.13.33789 """ import pytest @@ -32,40 +43,40 @@ init_script = """ commit; """ -db = db_factory(init=init_script) +db = db_factory(init = init_script) -act = python_act('db') +act = python_act('db', substitutions = [ ('[ \t]+',' ') ]) expected_stdout = """ - PLAN (TEST ORDER TEST_CONCAT_TEXT) + PLAN (TEST INDEX (TEST_CONCAT_TEXT)) + CONCAT_TEXT nom1 prenom1 + Records affected: 1 - ID 1 - X nom1 - Y prenom1 - CONCAT_TEXT nom1 prenom1 + PLAN (TEST INDEX (TEST_CONCAT_TEXT)) + CONCAT_TEXT nom2 prenom2 + Records affected: 1 - ID 2 - X nom2 - Y prenom2 - CONCAT_TEXT nom2 prenom2 + PLAN (TEST INDEX (TEST_CONCAT_TEXT)) + CONCAT_TEXT nom3 prenom3 + Records affected: 1 +""" - ID 3 - X nom3 - Y prenom3 - CONCAT_TEXT nom3 prenom3 - - Records affected: 3 +test_sql = """ + set list on; + set plan on; + set count on; + select concat_text from test where concat_text = 'nom1 prenom1'; + select concat_text from test where concat_text = 'nom2 prenom2'; + select concat_text from test where concat_text = 'nom3 prenom3'; """ @pytest.mark.version('>=3.0') def test_1(act: Action): with act.connect_server() as srv: backup = BytesIO() - srv.database.local_backup(database=act.db.db_path, backup_stream=backup) + srv.database.local_backup(database = act.db.db_path, backup_stream = backup) backup.seek(0) - srv.database.local_restore(database=act.db.db_path, backup_stream=backup, - flags=SrvRestoreFlag.REPLACE) + srv.database.local_restore(database = act.db.db_path, backup_stream=backup, flags = SrvRestoreFlag.REPLACE) act.expected_stdout = expected_stdout - act.isql(switches=['-q'], - input='set list on; set plan on; set count on; select * from test order by concat_text;') + act.isql(switches=['-q'], input = test_sql, combine_output = True) assert act.clean_stdout == act.clean_expected_stdout From 92e0fd027b7bff38de17f5d21453f010e2f2bd7d Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 12 Sep 2024 21:04:46 +0300 Subject: [PATCH 051/128] Added/Updated tests\bugs\core_5118_test.py: dummy change in order to force subsequent QA run for all FB versions. --- tests/bugs/core_5118_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/bugs/core_5118_test.py b/tests/bugs/core_5118_test.py index d23cd9de..9931b9cd 100644 --- a/tests/bugs/core_5118_test.py +++ b/tests/bugs/core_5118_test.py @@ -17,7 +17,7 @@ NOTES: Requested by dimitr, letters with subj 'core_5118_test', since 11.09.2024 17:26. - Checked on 6.0.0.452, 5.0.2.1493, 4.0.5.3136, 3.0.13.33789 + Checked on 6.0.0.452, 5.0.2.1493, 4.0.5.3136, 3.0.13.33789. """ import pytest From 140ba94f6c1104175880b06877c67cf0a3d2db56 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Fri, 13 Sep 2024 22:09:28 +0300 Subject: [PATCH 052/128] Added/Updated tests\functional\tabloid\test_883200d1.py: Checked on 6.0.0.457 - all OK. --- tests/functional/tabloid/test_883200d1.py | 58 +++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 tests/functional/tabloid/test_883200d1.py diff --git a/tests/functional/tabloid/test_883200d1.py b/tests/functional/tabloid/test_883200d1.py new file mode 100644 index 00000000..8d6c01a0 --- /dev/null +++ b/tests/functional/tabloid/test_883200d1.py @@ -0,0 +1,58 @@ +#coding:utf-8 + +""" +ID: None +ISSUE: https://github.com/FirebirdSQL/firebird/commit/883200d1927f74baadc7eb14293d1a9fb4e517ce +TITLE: Do not re-prepare statements when execute DDL in ISQL +DESCRIPTION: +NOTES: + Confirmed duplicated PREPARE_STATEMENT in 6.0.0.454 + Checked on 6.0.0.457 - all OK. +""" + +import re +import time + +import pytest +from firebird.qa import * + +db = db_factory() + +act = python_act('db', substitutions=[('[ \t]+', ' ')]) + +expected_stdout = """ +""" + +@pytest.mark.trace +@pytest.mark.version('>=6.0') +def test_1(act: Action, capsys): + + trace_cfg_items = [ + 'time_threshold = 0', + 'log_statement_prepare = true', + 'log_initfini = false', + 'log_errors = true', + ] + + DDL_STTM = 'recreate table test(id int)' + with act.trace(db_events = trace_cfg_items, encoding='utf-8'): + act.isql(switches = ['-q'], input = DDL_STTM + ';', combine_output = True) + assert act.clean_stdout == act.clean_expected_stdout + act.reset() + + allowed_patterns = ( re.escape(DDL_STTM),) + allowed_patterns = [ re.compile(p, re.IGNORECASE) for p in allowed_patterns ] + + for line in act.trace_log: + if line.strip(): + if act.match_any(line.strip(), allowed_patterns): + print(line.strip()) + + + expected_trace_log = f""" + {DDL_STTM} + """ + act.expected_stdout = expected_trace_log + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout + act.reset() From b604f005ea2ddbb7bc1158bd1083371327c38e8c Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sat, 14 Sep 2024 13:46:05 +0300 Subject: [PATCH 053/128] Added/Updated tests\bugs\gh_8252_test.py: Checked on 5.0.2.1499-5fa4ae6. --- tests/bugs/gh_8252_test.py | 91 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 tests/bugs/gh_8252_test.py diff --git a/tests/bugs/gh_8252_test.py b/tests/bugs/gh_8252_test.py new file mode 100644 index 00000000..9f939e1f --- /dev/null +++ b/tests/bugs/gh_8252_test.py @@ -0,0 +1,91 @@ +#coding:utf-8 + +""" +ID: issue-8252 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8252 +TITLE: Incorrect subquery unnesting with complex dependencies (SubQueryConversion = true) +DESCRIPTION: +NOTES: + [14.09.2024] pzotov + 1. Parameter 'SubQueryConversion' currently presents only in FB 5.x and _NOT_ in FB 6.x. + Because of that, testing version are limited only for 5.0.2. FB 6.x currently is NOT tested. + 2. Custom driver config object is created here for using 'SubQueryConversion = true'. + + Confirmed bug on 5.0.2.1497. + Checked on 5.0.2.1499-5fa4ae6. +""" + +import pytest +from firebird.qa import * +from firebird.driver import driver_config, connect, NetProtocol + +db = db_factory() + +act = python_act('db', substitutions = [ ('[ \t]+',' ') ]) + +test_sql = """ + select /* TRACE_ME */ first 5 1 x + from sales s + where exists ( + select 1 from customer c + where + s.cust_no = c.cust_no + and ( s.cust_no = c.cust_no + or + s.cust_no = c.cust_no + ) + ); +""" + +#----------------------------------------------------------- + +def replace_leading(source, char="."): + stripped = source.lstrip() + return char * (len(source) - len(stripped)) + stripped + +#----------------------------------------------------------- + +@pytest.mark.version('>=5.0.2,<6') +def test_1(act: Action, capsys): + + srv_cfg = driver_config.register_server(name = 'test_srv_gh_8252', config = '') + db_cfg_name = f'db_cfg_8252' + db_cfg_object = driver_config.register_database(name = db_cfg_name) + db_cfg_object.server.value = srv_cfg.name + db_cfg_object.database.value = 'employee' + db_cfg_object.config.value = f""" + SubQueryConversion = true + """ + + with connect(db_cfg_name, user = act.db.user, password = act.db.password) as con: + cur = con.cursor() + cur.execute("select g.rdb$config_name, g.rdb$config_value from rdb$database r left join rdb$config g on g.rdb$config_name = 'SubQueryConversion'") + for r in cur: + print(r[0],r[1]) + + ps = cur.prepare(test_sql) + print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) + for r in cur.execute(ps): + print(r[0]) + con.rollback() + + + act.expected_stdout = """ + SubQueryConversion true + Sub-query + ....-> Filter + ........-> Table "CUSTOMER" as "C" Access By ID + ............-> Bitmap + ................-> Index "RDB$PRIMARY22" Unique Scan + Select Expression + ....-> First N Records + ........-> Filter + ............-> Table "SALES" as "S" Full Scan + 1 + 1 + 1 + 1 + 1 + """ + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From ca83a1bfa6c6972c7545f3f68b90a89c818c4d61 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sun, 15 Sep 2024 12:29:43 +0300 Subject: [PATCH 054/128] Added/Updated tests\bugs\gh_5589_test.py: Checked on 6.0.0.457, 5.0.2.1499 --- tests/bugs/gh_5589_test.py | 58 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 tests/bugs/gh_5589_test.py diff --git a/tests/bugs/gh_5589_test.py b/tests/bugs/gh_5589_test.py new file mode 100644 index 00000000..0ff18e81 --- /dev/null +++ b/tests/bugs/gh_5589_test.py @@ -0,0 +1,58 @@ +#coding:utf-8 + +""" +ID: issue-5589 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/5589 +TITLE: Support full SQL standard character string literal syntax [CORE5312] +DESCRIPTION: +JIRA: CORE-5312 +NOTES: + [15.09.2024] pzotov + Commit (13.05.2021): + https://github.com/FirebirdSQL/firebird/commit/8a7927aac4fef3740e54b7941146b6d044b864b1 + + Checked on 6.0.0.457, 5.0.2.1499 +""" + +import pytest +from firebird.qa import * + +db = db_factory() + +test_script = """ + set blob all; + set list on; + select 'ab' 'cd' 'ef' as good_chr_01 from rdb$database; + select 'ab'/*comment*/ 'cd' /**/ 'ef' as good_chr_02 from rdb$database; + select 'ab'/* foo + bar */'cd' + '' + /* + */ + + 'ef' as good_chr_03 from rdb$database; + + select 'ab' -- foo + 'cd' -- bar + 'ef' as good_chr_04 from rdb$database; + + select'ab' + 'cd' + 'ef' as good_chr_05 from rdb$database; +""" + +act = isql_act('db', test_script, substitutions=[('[ \t]+', ' ')]) + +expected_stdout = """ + GOOD_CHR_01 abcdef + GOOD_CHR_02 abcdef + GOOD_CHR_03 abcdef + GOOD_CHR_04 abcdef + GOOD_CHR_05 abcdef +""" + +@pytest.mark.version('>=5.0') +def test_1(act: Action): + act.expected_stdout = expected_stdout + act.execute(combine_output = True) + assert act.clean_stdout == act.clean_expected_stdout From aee78b8b69d6d728f2e6acab000e4aac526c3369 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sun, 15 Sep 2024 12:30:15 +0300 Subject: [PATCH 055/128] Added/Updated tests\bugs\gh_5588_test.py: Minor change: fixed typo. --- tests/bugs/gh_5588_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/bugs/gh_5588_test.py b/tests/bugs/gh_5588_test.py index 2e998242..d7fa1b7e 100644 --- a/tests/bugs/gh_5588_test.py +++ b/tests/bugs/gh_5588_test.py @@ -2,8 +2,8 @@ """ ID: issue-5588 -ISSUE: 5588 -TITLE: upport full SQL standard binary string literal syntax +ISSUE: https://github.com/FirebirdSQL/firebird/issues/5588 +TITLE: Support full SQL standard binary string literal syntax [CORE5311] DESCRIPTION: JIRA: CORE-5311 FBTEST: bugs.gh_5588 From 6fced132bb525a90a812cb935a620aec6c631001 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Mon, 16 Sep 2024 16:18:32 +0300 Subject: [PATCH 056/128] Added .zip that is needed for upcoming test --- files/gh_8115.zip | Bin 0 -> 4130 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 files/gh_8115.zip diff --git a/files/gh_8115.zip b/files/gh_8115.zip new file mode 100644 index 0000000000000000000000000000000000000000..9a549d65118994de0428168f1e62330d3dca6b2c GIT binary patch literal 4130 zcmV+-5Z&)kO9KQH000080IGd3Szt%41cna)002$^01E&B0B2}lI59CbE@onDq*!Th z+CUKX+QueLlipRUeu;YD<**I(o55~t6-UV*=*6%zbSG)W$i zlw#(;2uelE#6ffb$tFr!ak)HH(jd8*!Hf*VXxu3>@;S&-h#5JbhnOP&$QooR@w4cF zMbE_PHy|dNkR>0dzXUNF_sCiXvgo{Pp`m3Vi@~pDQH2uP@yu!q|C$ZQ z^qq@j2TTXMQSp2bcbUKi8HtW12AkUs`HnUCbwYH5e7;RS-zU$wuzi~v(soD?U6LV13R1{! zvt|eQY`83L!m@zL3+8@{%zewU{qX#k!2GA*`eH{}G7fFNsX0OvX=J)?c&n7X)-P%<6d6Dpbao$G7Rx2TglvM8CKpb;O!O| zGaQRJV#U~4;=&^?qzD)Cc*#VTWx@l(?kx@04F;p^7gliMhB%1_M~teD+pJcdSJ4?$ z2kvw@bo$h8j$xOwBx*MZLi`}UrcuQo9PxxFEzvF9ojkeI7_JsP zQ47kSv$M06Mu#x88B9z9qZ#z5S1HQtIP6ttc%>{Hoe81h=1~6rl&ty(1tXy6*?*{C zBib)PQ?H1OdI#3iB9wYVK;Q+YK-ps|l)WX11?EbbP$P|Hi%c;^Dqh2R{l(MGL93Jg1>SoGOSx&LW+wO3t;#wMlmhRGCxHx3QD`%wc5X^S;h&2a*zdqofZ&{ zc%tcaBwN7$fpU!Y|K}@l$xpV~U?=WVuRWsX zSZ4~#65|bqBc50rT>=&B7+e0S|_ z$I!TyGxq)vS;BW$5XkoeE7hnsT`O9-+V6}`rt_uWVC?Dv2ghtv2;Wqvu}KcKjJ
s+~7FGnX~ zdpsEpjt_I4;Yo)YW9+6OHugpHDFRnN2&Z->0#6~90m*XSuPlnnpwl94>Xche>s6~e z_)dj0wn@SgS`Oiqg+o!Y{f+`SFCH`1uNr2BVQf1v)*rPGs58cvxZsMh2ji*7mIb#Eu1eAi&$y`7Qv9FO{J9AGa>hAHc#}X~zsdfh&Ka!skgqA=!7vC*=dV=HiS#-sP&rQqq ze7??geKk4|uWpNa4ehmJmFek&m9}RSO(vfJagSP za5_3=2Hl$M=H^nk0^tUP<_iP$902NtP7oBGx&vsr*=!taX>F~ltvA=IoAtN#>Nd<& z>s##uP1|eiH?}vI(~fE@=qp-Kf46IPy1M5Z`t23|cdOJgbYFLcS>_s`N&vgoZN00% z2OwnaQKaKaKyG>5hU1NLnXlCNkewjMqDkB#QHBk*;Ni(=$2Ek@&u`;Uxgop@VH@yz zBEu}(cX-P(I`|YSyk+;UL@?%jhsW!K>)=`7G8gvs4osuM>v`AUac6o0KB1(39j}~X58krB4e@>Ou{t!|m zh2&v?A4=NvxJZKLj6S1-fEGbl40~x{lYJV3VT zs1z=Y8x1E>L_{1fuwM$bk)YxjV_#H4Z6>He_~0#tt0y>VXDkKVieRso=nQu99iN^- zrGC^7G(0YlNcJaHNY(^C@Is!oj0#pz1-^3%5lHmv>D><8x@+maC4p3aOt<0TS2;Z^ zJ5VXdvdj|DM6wpJS=V=aFt@qJLlnmG@lM{^THIp6;^DkJb6%3gc`cC?LKaw9C?ru97UU~Pl&_(D2U*F6 zl456Lfh>sUxfq6nA>HQQbI$zdod5I8%x}&#b9Y>y_i=jHwvNtlq7KpSyCS28f0;60 z=tCn@kxw6n%);e6cTvmV!{%RsL%?hU=iUIEMzACPbPHKBr096vO?NPds2h%yi8POs zVZ>1`nl~@{(z@t#;{cw+U%|u6(eEqAxU!P1(Q=CG?ntZ3=&Px^6~YraW$=OZoaU*;iSH(9!1@i{83UwnnW7cQsgTf6DdIdpCI{pa>< zlL$7{-Z-d6M?h^II42UMEaeBWAEU%7Fe+MMK_y!Od&!d-l|Tz$t16uuJ5Jlx+l-O_aEQ0xhvnyZ7IFQYBfSCi97^XA^KRLk~0~Tku~J8 z@w>D0DwSGvpCR_f09F^k#iGEYuSw9LwW=w`r_9f~?$PEK4d;u>zA`p;V|E@>4wy@T z-eUlaLPAhhfx^;PVY0UD=iu_MSo$53 zIM#z5$9jUPzjaD7`S5zztv!9_G(F_lewKdezV6c7*&DL(jypW@U58U*WdHBF)hExK zx=b^#3zxQ^I(O>z=k7S7(S(5`TSt+N+Wr9D4I?oVNjHepxV$Z6Rl5iL6#==GlW=*S zgsYr{58`ajSR_Qu0x+8bKKlx}_+Ych2ECdB6`NBpdm%yOssMXh?RDuvI~97QHGM8! z_wwc|9{=jM@y`oBfKeuJR%bwTJ-EnzvZ^v>#3aR(quhv3&D+aP!ax`WU@R9w7w+7u z4?xm8?GiFbhzXch5?T5FZ(+;K^zTqi&*@4NV~F4Bn2sfMdZs!^6mFJ5TwRHAkcG?a zJ*f32QHj4<$C1*1z~cGNdq|UbDq-W$fZL=~txBNS|{) z@kt+$J|ula`k3?y=~KtQ)EjQUw!5Fin;(w)S;E-8jh}djmFj-(ntptV-0000^000XBBme*a z00000AOHXW00000XJ}tIF)=kRW@2j!03ZMW0000102lyrp0G(a2-^X2p0G(a2-^XU gZKp{#2-^WrO9ci10000100979000254*&oF0QaKLIRF3v literal 0 HcmV?d00001 From e2e9a2b12c4595713df835de299b522658872932 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Mon, 16 Sep 2024 16:19:02 +0300 Subject: [PATCH 057/128] Added/Updated tests\bugs\gh_8115_test.py: Checked on 6.0.0.457, 5.0.2.1499. NOTE: plans differ in FB 5.x vs 6.x --- tests/bugs/gh_8115_test.py | 99 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 tests/bugs/gh_8115_test.py diff --git a/tests/bugs/gh_8115_test.py b/tests/bugs/gh_8115_test.py new file mode 100644 index 00000000..99b68e96 --- /dev/null +++ b/tests/bugs/gh_8115_test.py @@ -0,0 +1,99 @@ +#coding:utf-8 + +""" +ID: issue-8115 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8115 +TITLE: Avoid reading/hashing the inner stream(s) if the leader stream is empty +DESCRIPTION: + Original title: "FB 5.0.0.1306 - unexpected results using LEFT JOIN with When " +NOTES: + [16.09.2024] pzotov + Confirmed bug in 5.0.1.1369-8c31082 (17.03.2024) + Bug was fixed in 5.0.1.1369-bbd35ab (20.03.2024) + Commit: + https://github.com/FirebirdSQL/firebird/commit/bbd35ab07c129e9735f081fcd29172a8187aa8ab + Avoid reading/hashing the inner stream(s) if the leader stream is empty + + Checked on 6.0.0.457, 5.0.2.1499 +""" +import zipfile +from pathlib import Path +import locale +import re + +from firebird.driver import DatabaseError +import pytest +from firebird.qa import * + +db = db_factory() + +substitutions = [('INDEX_\\d+', 'INDEX_nn'),] + +act = python_act('db', substitutions = substitutions) +tmp_fbk = temp_file('gh_8115.tmp.fbk') + +#----------------------------------------------------------- + +def replace_leading(source, char="."): + stripped = source.lstrip() + return char * (len(source) - len(stripped)) + stripped + +#----------------------------------------------------------- + +@pytest.mark.version('>=5.0.1') +def test_1(act: Action, tmp_fbk: Path, capsys): + zipped_fbk_file = zipfile.Path(act.files_dir / 'gh_8115.zip', at = 'gh_8115.fbk') + tmp_fbk.write_bytes(zipped_fbk_file.read_bytes()) + + act.gbak(switches = ['-rep', str(tmp_fbk), act.db.db_path], combine_output = True, io_enc = locale.getpreferredencoding()) + print(act.stdout) # must be empty + + test_sql = """ + select aa.id, ab.CNP_USER, ab.ID_USER + from sal_inperioada2('7DC51501-0DF2-45BE-93E5-382A541505DE', '15.05.2024') aa + left join user_cnp(aa.cnp, '15.05.2024') ab on ab.CNP_USER = aa.cnp + where ab.ID_USER = '04B23787-2C7F-451A-A12C-309F79D6F13A' + """ + + with act.db.connect() as con: + cur = con.cursor() + ps = cur.prepare(test_sql) + print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) + + try: + cur.execute(ps) + for r in cur: + for p in r: + print(p) + except DatabaseError as e: + print(e.__str__()) + print(e.gds_codes) + + expected_stdout_5x = """ + Select Expression + ....-> Nested Loop Join (inner) + ........-> Procedure "SAL_INPERIOADA2" as "AA" Scan + ........-> Filter + ............-> Filter + ................-> Procedure "USER_CNP" as "AB" Scan + + 000DD4E1-B4D0-4D6E-9D9F-DE9A7D0D6492 + E574F734-CECB-4A8F-B9BE-FAF51BC61FAD + 04B23787-2C7F-451A-A12C-309F79D6F13A + """ + + expected_stdout_6x = """ + Select Expression + ....-> Filter + ........-> Nested Loop Join (inner) + ............-> Procedure "SAL_INPERIOADA2" as "AA" Scan + ............-> Filter + ................-> Procedure "USER_CNP" as "AB" Scan + 000DD4E1-B4D0-4D6E-9D9F-DE9A7D0D6492 + E574F734-CECB-4A8F-B9BE-FAF51BC61FAD + 04B23787-2C7F-451A-A12C-309F79D6F13A + """ + + act.expected_stdout = expected_stdout_5x if act.is_version('<6') else expected_stdout_6x + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From e466c9de751368416ffce2b72357ee0bbd4c25b2 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Tue, 17 Sep 2024 00:15:08 +0300 Subject: [PATCH 058/128] Added/Updated tests\bugs\gh_7846_test.py: Checked on 6.0.0.457; 5.0.2.1499; 4.0.5.3136. --- tests/bugs/gh_7846_test.py | 190 +++++++++++++++++++++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 tests/bugs/gh_7846_test.py diff --git a/tests/bugs/gh_7846_test.py b/tests/bugs/gh_7846_test.py new file mode 100644 index 00000000..1e7273f6 --- /dev/null +++ b/tests/bugs/gh_7846_test.py @@ -0,0 +1,190 @@ +#coding:utf-8 + +""" +ID: issue-7846 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/7846 +TITLE: FB4 can't backup/restore int128-array +DESCRIPTION: + Test checks ability to make b/r of DB with table that has array-based columns of following types: + smallint; integer; bigint; int128; double. +NOTES: + [16.09.2024] pzotov + 1. Confirmed problem with b/r for INT128 on 4.0.4.3021 (dob: 17-nov-2023). + Got after restore: [Decimal('0'), Decimal('0')] (although no errors were during insert origin data). + Expected values: [Decimal('170141183460469231731687303715884105727'), Decimal('-170141183460469231731687303715884105728')]. + Confirmed fix on 4.0.4.3022 (dob: 19-nov-2023). + 2. Fix for #8100 ("The isc_array_lookup_bounds function returns invalid values...") required in order + this test can pass on FB 5.x and 6.x. + See commits (07-may-2024): + * 5.x: https://github.com/FirebirdSQL/firebird/commit/26ca064202169c0558359fc9ab06b70e827466f0 + * 6.x: https://github.com/FirebirdSQL/firebird/commit/17b007d14f8ccc6cfba0d63a3b2f21622ced20d0 + FB 4.x was not affected by that bug. + 3. INT128 type requires as argument only INTEGER values (from scope -2**127 ... +2**127-1) but NOT decimals. + Rather, NUMERIC / DECIMAL columns allows only Decimal instances. + (letter from Alex, 20.08.2024 16:11, subj: "gh-6544 ("Error writing an array of NUMERIC(24,6)" ) <...>" + 4. DECFLOAT type had a problem in firebird-driver, fixed in v 1.10.5 (26-JUL-2024) + 5. Some features must be implemented in engine and/or in firebird-driver for proper support of NUMERIC datatype + which have big values and use int128 as underlying storage. + Discussed with pcisar, see subj "firebird-driver and its support for FB datatypes", letters since 21-jul-2024. + See also: https://github.com/FirebirdSQL/firebird/issues/6544#issuecomment-2294778138 + + Checked on 6.0.0.457; 5.0.2.1499; 4.0.5.3136. +""" + +import pytest +from firebird.qa import * +from io import BytesIO +from firebird.driver import SrvRestoreFlag, DatabaseError, InterfaceError +from decimal import Decimal +import traceback +import time + +init_script = """ + recreate table test_arr( + id int generated by default as identity constraint test_pk primary key + ,v_smallint smallint[2] + ,v_integer int[2] + ,v_bigint bigint[2] + ,v_int128 int128[2] + ,v_double double precision[2] + ,v_decfloat decfloat[2] + ); +""" +db = db_factory(init = init_script) + +act = python_act('db') + +#-------------------------------------- +def try_insert(con, cur, fld, data): + print(f'\nTrying to add array in {fld}') + try: + print(f'Data: {data}') + with cur.prepare(f"insert into test_arr({fld}) values (?)") as ps: + for x in data: + cur.execute(ps, (x,)) + + cur.execute(f'select {fld} from test_arr order by id desc rows 1') + for r in cur: + for x in r[0]: + print(x, type(x)) + + con.commit() + print('Success.') + #except (ValueError, InterfaceError, DatabaseError) as e: + except Exception as e: + for x in traceback.format_exc().split('\n'): + print(' ',x) +#-------------------------------------- + +@pytest.mark.version('>=4.0.5') +def test_1(act: Action, capsys): + with act.db.connect() as con: + cur = con.cursor() + + # ------------ smallint ------------- + data = [ [32767, -32768] ] + try_insert(con, cur, 'v_smallint', data) + + # ------------ int ------------- + data = [ [2147483647, -2147483648] ] + try_insert(con, cur, 'v_integer', data) + + # ------------ bigint ------------- + data = [ [9223372036854775807, -9223372036854775808] ] + try_insert(con, cur, 'v_bigint', data) + + # ------------ int128 ------------- + # sqltype: 32752 INT128 Nullable scale: 0 subtype: 0 len: 16 + # ValueError: Incorrect ARRAY field value. + # !! WRONG!! >>> data = [ [Decimal('170141183460469231731687303715884105727'), Decimal('-170141183460469231731687303715884105728')] ] + # Only INTEGERS must be specified as arguments: + data = [ [170141183460469231731687303715884105727, -170141183460469231731687303715884105728] ] + try_insert(con, cur, 'v_int128', data) + + # ------------ double ------------- + data = [ [-2.2250738585072014e-308, 1.7976931348623158e+308] ] + try_insert(con, cur, 'v_double', data) + + + # ------------ decfloat ------------- + # ValueError: Incorrect ARRAY field value. + # data = [ [Decimal('-1.0E-6143'), Decimal('9.999999999999999999999999999999999E6144')] ] + # data = [ [-1.0E-6143, 9.999999999999999999999999999999999E6144] ] + data = [ [Decimal('-9.999999999999999999999999999999999E+6144'), Decimal('9.999999999999999999999999999999999E+6144')] ] + try_insert(con, cur, 'v_decfloat', data) + + + backup = BytesIO() + with act.connect_server() as srv: + srv.database.local_backup(database=act.db.db_path, backup_stream=backup) + backup.seek(0) + srv.database.local_restore(backup_stream=backup, database=act.db.db_path, flags = SrvRestoreFlag.REPLACE) + + with act.db.connect() as con: + cur = con.cursor() + for fld_name in ('v_smallint','v_integer','v_bigint','v_int128','v_double', 'v_decfloat'): + cur.execute(f'select {fld_name} from test_arr') + for r in cur: + # type(r): + if any(r): + print(f'Result after restore for column {fld_name}:') + for p in r: + print(p) + + act.expected_stdout = """ + Trying to add array in v_smallint + Data: [[32767, -32768]] + 32767 + -32768 + Success. + + Trying to add array in v_integer + Data: [[2147483647, -2147483648]] + 2147483647 + -2147483648 + Success. + + Trying to add array in v_bigint + Data: [[9223372036854775807, -9223372036854775808]] + 9223372036854775807 + -9223372036854775808 + Success. + + Trying to add array in v_int128 + Data: [[170141183460469231731687303715884105727, -170141183460469231731687303715884105728]] + 170141183460469231731687303715884105727 + -170141183460469231731687303715884105728 + Success. + + Trying to add array in v_double + Data: [[-2.2250738585072014e-308, 1.7976931348623157e+308]] + -2.2250738585072014e-308 + 1.7976931348623157e+308 + Success. + + Trying to add array in v_decfloat + Data: [[Decimal('-9.999999999999999999999999999999999E+6144'), Decimal('9.999999999999999999999999999999999E+6144')]] + -9.999999999999999999999999999999999E+6144 + 9.999999999999999999999999999999999E+6144 + Success. + + Result after restore for column v_smallint: + [32767, -32768] + + Result after restore for column v_integer: + [2147483647, -2147483648] + + Result after restore for column v_bigint: + [9223372036854775807, -9223372036854775808] + + Result after restore for column v_int128: + [Decimal('170141183460469231731687303715884105727'), Decimal('-170141183460469231731687303715884105728')] + + Result after restore for column v_double: + [-2.2250738585072014e-308, 1.7976931348623157e+308] + + Result after restore for column v_decfloat: + [Decimal('-9.999999999999999999999999999999999E+6144'), Decimal('9.999999999999999999999999999999999E+6144')] + """ + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From c6c322001b37952d267cc2efb31d87257b63adc0 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Mon, 23 Sep 2024 00:08:10 +0300 Subject: [PATCH 059/128] Added/Updated tests\bugs\core_0986_test.py: dummy change in order to force all FB versions to be checked by subsequent QA run --- tests/bugs/core_0986_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/bugs/core_0986_test.py b/tests/bugs/core_0986_test.py index f13595fd..5aed18ef 100644 --- a/tests/bugs/core_0986_test.py +++ b/tests/bugs/core_0986_test.py @@ -9,7 +9,7 @@ JIRA: CORE-986 FBTEST: bugs.core_0986 NOTES: [25.11.2023] pzotov - Writing code requires more care since 6.0.0.150: ISQL does not allow specifying duplicate delimiters without any statements between them (two semicolon, two carets etc). + Writing code requires more care since 6.0.0.150: ISQL does not allow specifying duplicate delimiters without any statements between them (two semicolon, two carets etc) """ import pytest From a3cbdc9ece04231ea403de6be79963d6be013243 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Mon, 23 Sep 2024 12:14:48 +0300 Subject: [PATCH 060/128] Added pre-defined alias required for bugs/gh_8253_test.py --- files/qa-databases.conf | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/files/qa-databases.conf b/files/qa-databases.conf index ab590f5a..cf6c7d58 100644 --- a/files/qa-databases.conf +++ b/files/qa-databases.conf @@ -274,6 +274,13 @@ tmp_gh_6416_alias = $(dir_sampleDb)/qa/tmp_gh_6416.fdb DataTypeCompatibility = 3.0 } +# https://github.com/FirebirdSQL/firebird/issues/8253 +tmp_gh_8253_alias = $(dir_sampleDb)/qa/tmp_gh_8253.fdb +{ + SecurityDatabase = tmp_gh_8253_alias +} + + # Databases for replication tests: # db_main_alias = $(dir_sampleDb)/qa_replication/db_main.fdb From cb6ed4b2ebe0346294eb09e42544003088fba324 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Mon, 23 Sep 2024 12:15:12 +0300 Subject: [PATCH 061/128] Added/Updated tests\bugs\gh_8253_test.py: Checked on 6.0.0.466, 5.0.2.1513, 4.0.6.3156 --- tests/bugs/gh_8253_test.py | 112 +++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 tests/bugs/gh_8253_test.py diff --git a/tests/bugs/gh_8253_test.py b/tests/bugs/gh_8253_test.py new file mode 100644 index 00000000..95725df2 --- /dev/null +++ b/tests/bugs/gh_8253_test.py @@ -0,0 +1,112 @@ +#coding:utf-8 + +""" +ID: issue-8253 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8253 +TITLE: Incorrect handling of non-ASCII object names in CREATE MAPPING statement +DESCRIPTION: + Test uses pre-created databases.conf which has alias (see variable REQUIRED_ALIAS) and SecurityDatabase in its details + which points to that alias, thus making such database be self-security. + Database file for that alias must NOT exist in the QA_root/files/qa/ subdirectory: it will be created here. + Self-security database allows us to create GLOBAL mapping without worrying about how it will be removed on test finish. +NOTES: + [23.09.2024] pzotov + 1. One need to be sure that firebird.conf does NOT contain DatabaseAccess = None. + 2. Value of REQUIRED_ALIAS must be EXACTLY the same as alias specified in the pre-created databases.conf + (for LINUX this equality is case-sensitive, even when aliases are compared!) + 3. Content of databases.conf must be taken from $QA_ROOT/files/qa-databases.conf (one need to replace it before every test session). + Discussed with pcisar, letters since 30-may-2022 13:48, subject: + "new qa, core_4964_test.py: strange outcome when use... shutil.copy() // comparing to shutil.copy2()" + 4. Confirmed bug on 6.0.0.461, data from rdb$auth_mapping.rdb$map_from: + * is displayed as '???...???' for global mapping; + * is mojibake for local mapping when group name is enclosed in double quotes. + + Checked on 6.0.0.466, 5.0.2.1513, 4.0.6.3156 +""" + +import re +from pathlib import Path + +import pytest +from firebird.qa import * + +REQUIRED_ALIAS = 'tmp_gh_8062_alias' + +db = db_factory() + +act = python_act('db', substitutions=[('[ \t]+', ' ')]) + +tmp_sql = temp_file('tmp_8253_non_ascii_ddl.sql') +tmp_log = temp_file('tmp_8253_non_ascii_ddl.log') + +@pytest.mark.intl +@pytest.mark.version('>=4.0.6') +def test_1(act: Action, tmp_sql: Path, tmp_log: Path, capsys): + + # Scan line-by-line through databases.conf, find line starting with REQUIRED_ALIAS and extract name of file that + # must be created in the $(dir_sampleDb)/qa/ folder. This name will be used further as target database (tmp_fdb). + # NOTE: we have to SKIP lines which are commented out, i.e. if they starts with '#': + p_required_alias_ptn = re.compile( '^(?!#)((^|\\s+)' + REQUIRED_ALIAS + ')\\s*=\\s*\\$\\(dir_sampleDb\\)/qa/', re.IGNORECASE ) + fname_in_dbconf = None + + with open(act.home_dir/'databases.conf', 'r') as f: + for line in f: + if p_required_alias_ptn.search(line): + # If databases.conf contains line like this: + # tmp_8253_alias = $(dir_sampleDb)/qa/tmp_qa_8253.fdb + # - then we extract filename: 'tmp_qa_8253.fdb' (see below): + fname_in_dbconf = Path(line.split('=')[1].strip()).name + break + + # if 'fname_in_dbconf' remains undefined here then propably REQUIRED_ALIAS not equals to specified in the databases.conf! + # + assert fname_in_dbconf + + dba_pswd = 'alterkey' + g_name = 'лондонский симфонический оркестр' + r_name = 'настройщик роялей' + non_ascii_ddl = f''' + set list on; + create database '{REQUIRED_ALIAS}' user {act.db.user}; + create user {act.db.user} password '{dba_pswd}'; + commit; + connect 'localhost:{REQUIRED_ALIAS}' user {act.db.user} password '{dba_pswd}'; + select mon$sec_database from mon$database; -- must be: 'Self' + create role "{r_name}"; + commit; + create mapping "локальная_апостроф" using any plugin from group '{g_name}' to role "{r_name}"; + create mapping "локальная_кавычки" using any plugin from group "{g_name}" to role "{r_name}"; + create global mapping "глобальная_апостроф" using any plugin from group '{g_name}' to role "{r_name}"; + create global mapping "глобальная_кавычки" using any plugin from group "{g_name}" to role "{r_name}"; + commit; + set count on; + select rdb$map_name,rdb$map_from,rdb$map_to from rdb$auth_mapping order by rdb$map_name; + commit; + ''' + + tmp_sql.write_bytes(non_ascii_ddl.encode('cp866')) + act.isql(switches=['-q'], input_file=tmp_sql, credentials = False, connect_db = False, combine_output = True, charset='dos866', io_enc = 'cp866') + tmp_log.write_bytes(act.clean_stdout.encode('utf-8')) + with open(tmp_log, 'r', encoding = 'utf-8', errors = 'backslashreplace') as f: + for line in f: + print(line) + + act.expected_stdout = f""" + MON$SEC_DATABASE Self + RDB$MAP_NAME глобальная_апостроф + RDB$MAP_FROM {g_name} + RDB$MAP_TO {r_name} + RDB$MAP_NAME глобальная_кавычки + RDB$MAP_FROM {g_name} + RDB$MAP_TO {r_name} + RDB$MAP_NAME локальная_апостроф + RDB$MAP_FROM {g_name} + RDB$MAP_TO {r_name} + RDB$MAP_NAME локальная_кавычки + RDB$MAP_FROM {g_name} + RDB$MAP_TO {r_name} + Records affected: 4 + """ + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout + From 6c67c080a416aed872c269fe7a65d65aaf5d84b8 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Mon, 23 Sep 2024 18:07:17 +0300 Subject: [PATCH 062/128] Added/Updated tests\bugs\gh_8255_test.py: Checked on 6.0.0.466, 5.0.2.1513, 4.0.6.3156 --- tests/bugs/gh_8255_test.py | 54 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 tests/bugs/gh_8255_test.py diff --git a/tests/bugs/gh_8255_test.py b/tests/bugs/gh_8255_test.py new file mode 100644 index 00000000..d779589e --- /dev/null +++ b/tests/bugs/gh_8255_test.py @@ -0,0 +1,54 @@ +#coding:utf-8 + +""" +ID: issue-8255 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8255 +TITLE: Catch possible stack overflow when preparing and compiling user statements +DESCRIPTION: + Test generates SQL like 'select 1+1+1....+1 from rdb$database' and tries to execte it. + Exception 'SQLSTATE = HY001 / Stack overflow' must raise instead of crash (that was before fix). + Commits: + * 4.x: https://github.com/FirebirdSQL/firebird/commit/04c586d4ea4bafb50818bcf7f46188afc67ab1c5 (20-sep-2024) + * 5.x: https://github.com/FirebirdSQL/firebird/commit/f0670f90cc7d1fc93db22336fd43abc6d348e31e (18-sep-2024) + * 6.x: https://github.com/FirebirdSQL/firebird/commit/6b445c0dc53f1c5778258bd673c0b61f6dd93a69 (20-sep-2024) +NOTES: + [23.09.2024] pzotov + Initially query containing 15'000 terms in "+1+1...+1" expression used to check. + This query causes 'stack overflow' only in FB 5.x and 6.x. + But in FB 4.0.6.3156 it successfully COMPLETES calculation and issues result. + For FB 4.x this 'threshold' is 16'287 (last number of terms where FB can evaluate result w/o 'stack overflow'). + Because of this, it was decided to increase number of terms to 50'000. + + Checked on 6.0.0.466, 5.0.2.1513, 4.0.6.3156 +""" + +from pathlib import Path + +import pytest +from firebird.qa import * + +db = db_factory() +act = python_act('db', substitutions=[('[ \t]+', ' '), ('After line \\d+.*', '')]) + +tmp_sql = temp_file('tmp_8255_non_ascii_ddl.sql') + +@pytest.mark.version('>=4.0.6') +def test_1(act: Action, tmp_sql: Path, capsys): + + long_expr = '\n'.join( ( + 'select' + ,'+'.join( ('1') * 100000 ) + ,'from rdb$database;' + ) + ) + + tmp_sql.write_bytes(long_expr.encode('utf-8')) + + act.isql(switches=['-q'], input_file=tmp_sql, combine_output = True, charset='win1251') + + act.expected_stdout = f""" + Statement failed, SQLSTATE = HY001 + Stack overflow. The resource requirements of the runtime stack have exceeded the memory available to it. + """ + assert act.clean_stdout == act.clean_expected_stdout + From bdb69722a784a902ff13ea96dd9daa6b2ef0d737 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Mon, 23 Sep 2024 18:12:26 +0300 Subject: [PATCH 063/128] Added/Updated tests\bugs\gh_8255_test.py: added skipif(platform.system() = 'Windows' according to ticket note about IFDEF WIN_NT. --- tests/bugs/gh_8255_test.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/bugs/gh_8255_test.py b/tests/bugs/gh_8255_test.py index d779589e..bcba0f9e 100644 --- a/tests/bugs/gh_8255_test.py +++ b/tests/bugs/gh_8255_test.py @@ -32,6 +32,7 @@ act = python_act('db', substitutions=[('[ \t]+', ' '), ('After line \\d+.*', '') tmp_sql = temp_file('tmp_8255_non_ascii_ddl.sql') +@pytest.mark.skipif(platform.system() != 'Windows', reason='See ticket note.') @pytest.mark.version('>=4.0.6') def test_1(act: Action, tmp_sql: Path, capsys): From ede28525bd57e9f196745620711a6e9332270fcf Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Mon, 23 Sep 2024 21:48:58 +0300 Subject: [PATCH 064/128] Added/Updated tests\bugs\gh_8255_test.py: fixed forgotten import --- tests/bugs/gh_8255_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/bugs/gh_8255_test.py b/tests/bugs/gh_8255_test.py index bcba0f9e..78e553e3 100644 --- a/tests/bugs/gh_8255_test.py +++ b/tests/bugs/gh_8255_test.py @@ -23,7 +23,7 @@ NOTES: """ from pathlib import Path - +import platform import pytest from firebird.qa import * From 25530f80bb708717ce9a6e28b4d46c375c03bca1 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Mon, 23 Sep 2024 23:59:10 +0300 Subject: [PATCH 065/128] Added/Updated tests\bugs\gh_7904_test.py: Changed substitutions: one need to suppress '(keys: N, total key length: M)' in FB 6.x after commit c50b0aa6 ('Add key info to the hash join plan output'). --- tests/bugs/gh_7904_test.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/tests/bugs/gh_7904_test.py b/tests/bugs/gh_7904_test.py index 274f0666..77cd52fc 100644 --- a/tests/bugs/gh_7904_test.py +++ b/tests/bugs/gh_7904_test.py @@ -8,6 +8,14 @@ DESCRIPTION: NOTES: Confirmed problem on 5.0.0.1291 (for UMOWA_ROWS = 700K number of fetches = 6059386, elapsed time = 9.609s) Checked on 5.0.0.1303, 6.0.0.180 (for UMOWA_ROWS = 700K number of fetches = 270208, elapsed time = 0.741s) + + [24.09.2024] pzotov + Changed substitutions: one need to suppress '(keys: N, total key length: M)' in FB 6.x (and ONLY there), + otherwise actual and expected output become differ. + Commit: https://github.com/FirebirdSQL/firebird/commit/c50b0aa652014ce3610a1890017c9dd436388c43 + ("Add key info to the hash join plan output", 23.09.2024 18:26) + Discussed with dimitr. + Checked on 6.0.0.467-cc183f5, 5.0.2.1513 """ import pytest @@ -16,6 +24,7 @@ from firebird.qa import * UMOWA_ROWS = 7000 ROZL_MULTIPLIER = 10 + init_sql = f""" set bail on; @@ -178,9 +187,20 @@ init_sql = f""" commit; """ +#----------------------------------------------------------- db = db_factory(init = init_sql) +substitutions = \ + [ + ( r'\(record length: \d+, key length: \d+\)', '' ) # (record length: 132, key length: 16) + ,( r'\(keys: \d+, total key length: \d+\)', '' ) # (keys: 1, total key length: 2) + ] + +act = python_act('db', substitutions = substitutions) + +#----------------------------------------------------------- + query_lst = [ # Query from https://github.com/FirebirdSQL/firebird/issues/7904: """ @@ -207,9 +227,6 @@ query_lst = [ """, ] -substitutions = [ ('record length: \\d+.*', 'record length'), ('key length: \\d+.*', 'key length') ] -act = python_act('db', substitutions = substitutions) - #--------------------------------------------------------- def replace_leading(source, char="."): stripped = source.lstrip() From 9d34fda5313ff92b248c9fcd3fb66041a347d767 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Tue, 24 Sep 2024 00:01:37 +0300 Subject: [PATCH 066/128] Added/Updated tests\functional\arno\optimizer\test_opt_inner_join_05.py: Changed substitutions: one need to suppress '(keys: N, total key length: M)' in FB 6.x after commit c50b0aa6 ('Add key info to the hash join plan output'). --- .../arno/optimizer/test_opt_inner_join_05.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/tests/functional/arno/optimizer/test_opt_inner_join_05.py b/tests/functional/arno/optimizer/test_opt_inner_join_05.py index f08ea254..4abba726 100644 --- a/tests/functional/arno/optimizer/test_opt_inner_join_05.py +++ b/tests/functional/arno/optimizer/test_opt_inner_join_05.py @@ -13,6 +13,14 @@ NOTES: https://github.com/FirebirdSQL/firebird/commit/ae427762d5a3e740b69c7239acb9e2383bc9ca83 // FB 5.x ("More realistic cardinality adjustments for unmatchable booleans, this should also fix #7904: FB5 bad plan for query") Letter from dimitr, 15.12.2023 10:05. + + [24.09.2024] pzotov + Changed substitutions: one need to suppress '(keys: N, total key length: M)' in FB 6.x (and ONLY there), + otherwise actual and expected output become differ. + Commit: https://github.com/FirebirdSQL/firebird/commit/c50b0aa652014ce3610a1890017c9dd436388c43 + ("Add key info to the hash join plan output", 23.09.2024 18:26) + Discussed with dimitr. + Checked on 6.0.0.467-cc183f5, 5.0.2.1513 """ import pytest @@ -308,7 +316,12 @@ init_script = """ db = db_factory(init=init_script) -substitutions = [('record length:\\s+\\d+', 'record length'), ('key length:\\s+\\d+', 'key length') ] +substitutions = \ + [ + ( r'\(record length: \d+, key length: \d+\)', '' ) # (record length: 132, key length: 16) + ,( r'\(keys: \d+, total key length: \d+\)', '' ) # (keys: 1, total key length: 2) + ] + act = python_act('db', substitutions = substitutions) #---------------------------------------------------------- From 7f28961f1b98144402aee8359b194b595870ade4 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Tue, 24 Sep 2024 07:43:42 +0300 Subject: [PATCH 067/128] Added/Updated tests\bugs\gh_8253_test.py: minor change: wrong alias name was in use, changed to correct. --- tests/bugs/gh_8253_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/bugs/gh_8253_test.py b/tests/bugs/gh_8253_test.py index 95725df2..c184c34f 100644 --- a/tests/bugs/gh_8253_test.py +++ b/tests/bugs/gh_8253_test.py @@ -30,7 +30,7 @@ from pathlib import Path import pytest from firebird.qa import * -REQUIRED_ALIAS = 'tmp_gh_8062_alias' +REQUIRED_ALIAS = 'tmp_gh_8253_alias' db = db_factory() From a60b8c72cb88a756dd253d033fc02254807c84ff Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Wed, 25 Sep 2024 00:09:52 +0300 Subject: [PATCH 068/128] Added/Updated tests\functional\tabloid\test_cc183f59.py: Checked on 6.0.0.467. See notes about MERGE JOIN selecting. --- tests/functional/tabloid/test_cc183f59.py | 102 ++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 tests/functional/tabloid/test_cc183f59.py diff --git a/tests/functional/tabloid/test_cc183f59.py b/tests/functional/tabloid/test_cc183f59.py new file mode 100644 index 00000000..c6a537d1 --- /dev/null +++ b/tests/functional/tabloid/test_cc183f59.py @@ -0,0 +1,102 @@ +#coding:utf-8 + +""" +ID: None +ISSUE: https://github.com/FirebirdSQL/firebird/commit/cc183f599ee09233d6da294893f651de0ab76136 +TITLE: Add key info to the merge join plan output +DESCRIPTION: +NOTES: + MERGE JOIN will be chosen by optimizer when several conditions are met: + * data sources are joined by INNER join; + * data sources are ORDERED, BUT *NOT* via GROUP BY (because optimizer tends to think about grouped data + that its cardinality *much* less than cardinality of source and it causes to decide using hash join instead). + This was explained by dimitr privately, letter: 24-sep-2024 16:30. + * number of conflicts in the hash table must be above 1009 * 1000 = 1009000. + Experimental shows that minimal threshold for switching from HJ to MJ is 1009883 rows. + This value must NOT depend on machine but can have limited dependency on page_size + (see letter from dimitr, 24-sep-2024 19:09). + * No ticket has been created for this test. + + Checked on 6.0.0.467. +""" + +import re +import time + +import pytest +from firebird.qa import * + +init_sql = """ + create table test1(id int not null); + create table test2(id int not null, pid int not null); + + set stat on; + set echo on; + set term ^; + execute block as + declare n_cnt int = 1009883; -- OK, plan MERGE JOIN + -- declare n_cnt int = 1009882; -- plan HJ + declare i int = 0; + begin + while (i < n_cnt) do + begin + insert into test1(id) values(:i); + i = i + 1; + end + end + ^ + set term ;^ + insert into test2(id, pid) select row_number()over(), id from test1; + commit; +""" +db = db_factory(init = init_sql, page_size = 8192) + +substitutions = [ ('[ \t]+', ' ') + ,('keys: \\d+, total key length: \\d+', 'keys, total key length') + ,('record length: \\d+, key length: \\d+', 'record length, key length') + ] + +act = python_act('db', substitutions = substitutions) + + +#----------------------------------------------------------- + +def replace_leading(source, char="."): + stripped = source.lstrip() + return char * (len(source) - len(stripped)) + stripped + +#----------------------------------------------------------- + +@pytest.mark.version('>=6.0') +def test_1(act: Action, capsys): + + test_sql = """ + select a.id, b.pid + from ( + select id from test1 order by id + ) a + join + ( + select pid from test2 b order by pid + ) b + on a.id = b.pid + """ + + with act.db.connect() as con: + cur = con.cursor() + ps = cur.prepare(test_sql) + print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) + + act.expected_stdout = """ + Select Expression + ....-> Filter + ........-> Merge Join (inner) (keys: 1, total key length: 8) + ............-> Sort (record length: 28, key length: 8) + ................-> Sort (record length: 28, key length: 8) + ....................-> Table "TEST1" as "A TEST1" Full Scan + ............-> Sort (record length: 28, key length: 8) + ................-> Sort (record length: 28, key length: 8) + ....................-> Table "TEST2" as "B B" Full Scan + """ + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From b9c0379c0db23048b2beaa44a3251f6b5b379f07 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Wed, 25 Sep 2024 09:35:57 +0300 Subject: [PATCH 069/128] Added/Updated tests\bugs\gh_8250_test.py: Checked on 6.0.0.467. NOTE: test currently has min_version=6.0, see notes. --- tests/bugs/gh_8250_test.py | 132 +++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 tests/bugs/gh_8250_test.py diff --git a/tests/bugs/gh_8250_test.py b/tests/bugs/gh_8250_test.py new file mode 100644 index 00000000..121a3e6d --- /dev/null +++ b/tests/bugs/gh_8250_test.py @@ -0,0 +1,132 @@ +#coding:utf-8 + +""" +ID: 8250 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8250 +TITLE: Bad performance on simple two joins query on tables with composed index +DESCRIPTION: +NOTES: + [25.09.2024] pzotov + 0. Tables in explained plans are specified in the same order for snapshots before and after fix. + Difference can be seen only in added "keys: " clause. + This clause currently exists only in FB 6.x, commit: + https://github.com/FirebirdSQL/firebird/commit/c50b0aa652014ce3610a1890017c9dd436388c43 + Because of this, test min_version = 6.0. + 1. Improvement can be checked by parsing of explained plan if its top-level hash join looks like + "Hash Join (inner) (keys: N, total key length: ...)" and value of is NOT LESS THAN some + minimal threshold defined by variable MIN_REQUIRED_KEYS_IN_TOP_LEVEL_HJ. + As explained by dimitr, for this test such value must be 5 (letter 24.09.2024 07:22). + 2. Tables must have indices (defined by PK and FK constraints) for explained plan to show 'keys: N' + with N > 1. Otherwise top-level HJ line will be 'keys: 1' and query will run as slow as it was + specified in the ticket. The reason is that in case of missed indices optimizer uses other criteria + for estimation of cost and plan will remain ineffective (at least for current FB 6.x). + Explained by dimitr, letter 24.09.2024 12:29. + + Confirmed problem on 6.0.0.461. + Checked on 6.0.0.467. +""" + +import re +import time + +import pytest +from firebird.qa import * + +MIN_REQUIRED_KEYS_IN_TOP_LEVEL_HJ = 5 +ROWS_LIMIT_FOR_CHILD_TABLES = 5000 + +init_sql = f""" + create table test1(id1 int not null, id2 int not null, name varchar(30) not null); + create table test2(id1 int not null, id2 int not null, code30 varchar(36) not null, descr varchar(36)); + create table test3(id1 int not null, id2 int not null, code30 varchar(36) not null, code15 varchar(15) not null, price double precision); + + set term ^; + execute block as + declare n_cnt int = {ROWS_LIMIT_FOR_CHILD_TABLES}; + declare i int; + declare v_code30 type of column test2.code30; + begin + insert into test1(id1, id2, name) select 1, i, left(uuid_to_char(gen_uuid()), 30) from (select row_number()over()-1 i from rdb$types rows 16); + i = 0; + while (i < n_cnt) do + begin + v_code30 = lpad('', 36, uuid_to_char(gen_uuid())); + insert into test2(id1, id2, code30, descr) values( 1, mod(:i, 4), :v_code30, :v_code30); + insert into test3(id1, id2, code30, code15, price) values( 1, mod(:i, 4) , :v_code30, left(uuid_to_char(gen_uuid()), 15), round(1000)); + i = i + 1; + end + + end + ^ + set term ;^ + commit; + set echo on; + alter table test1 add constraint t1_pk primary key(id1,id2); + alter table test2 add constraint t2_pk primary key(id1,id2,code30); + alter table test3 add constraint t3_pk primary key(id1,id2,code30,code15); +""" +db = db_factory(init = init_sql, page_size = 8192) + +substitutions = [ ('[ \t]+', ' ') + ,('keys: \\d+, total key length: \\d+', 'keys, total key length') + ,('record length: \\d+', 'record length') + ] + +act = python_act('db', substitutions = substitutions) + + +#----------------------------------------------------------- + +def replace_leading(source, char="."): + stripped = source.lstrip() + return char * (len(source) - len(stripped)) + stripped + +#----------------------------------------------------------- + +@pytest.mark.version('>=6.0') +def test_1(act: Action, capsys): + + test_sql = """ + select 1 x + from test2 t2 + join test3 t3 on t3.id1 = t2.id1 and t3.id2 = t2.id2 and t3.code30 = t2.code30 + join test1 t1 on t1.id1 = t2.id1 and t1.id2 = t2.id2 + """ + + # 'Hash Join (inner) (keys: 3, total key length: 38)' + p_hj_keys = re.compile(r'Hash Join \(inner\) \(keys: \d+', re.IGNORECASE) + top_level_keys_found = -1 + with act.db.connect() as con: + cur = con.cursor() + ps = cur.prepare(test_sql) + print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) + for s in ps.detailed_plan.split('\n'): + if (pm := p_hj_keys.search(s)): + top_level_keys_found = max(top_level_keys_found, int(pm.group().split()[-1])) + break + + max_keys_msg = 'Top-level hash join keys: ' + expected_keys = '' + if top_level_keys_found >= MIN_REQUIRED_KEYS_IN_TOP_LEVEL_HJ: + max_keys_msg += 'EXPECTED' + expected_keys = max_keys_msg + else: + max_keys_msg += f'UNEXPECTED, {" too low: "+str(top_level_keys_found)+" - less than "+str(MIN_REQUIRED_KEYS_IN_TOP_LEVEL_HJ) if top_level_keys_found > 0 else "NOT FOUND"}' + + print(max_keys_msg) + + act.expected_stdout = f""" + Select Expression + ....-> Filter + ........-> Hash Join (inner) (keys, total key length) + ............-> Hash Join (inner) (keys, total key length) + ................-> Table "TEST3" as "T3" Full Scan + ................-> Record Buffer (record length) + ....................-> Table "TEST1" as "T1" Full Scan + ............-> Record Buffer (record length) + ................-> Table "TEST2" as "T2" Full Scan + {expected_keys} + """ + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout + act.reset() From 44dd2cdb348ba77d4ad5e8e868bc65815af0191e Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 26 Sep 2024 10:47:01 +0300 Subject: [PATCH 070/128] Added/Updated tests\functional\tabloid\test_aae2ae32.py: Checked on 5.0.2.1516-92316F0 -- all ok: two hash joins instead of subquery. --- tests/functional/tabloid/test_aae2ae32.py | 143 ++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 tests/functional/tabloid/test_aae2ae32.py diff --git a/tests/functional/tabloid/test_aae2ae32.py b/tests/functional/tabloid/test_aae2ae32.py new file mode 100644 index 00000000..1fed532d --- /dev/null +++ b/tests/functional/tabloid/test_aae2ae32.py @@ -0,0 +1,143 @@ +#coding:utf-8 + +""" +ID: issue-8252 +ISSUE: https://github.com/FirebirdSQL/firebird/commit/aae2ae3291855f51ff587d0da055aed270137e8f +TITLE: Better fix for #8252: incorrect subquery unnesting with complex dependencies, it re-allows converting nested IN/EXISTS into multiple semi-join +DESCRIPTION: + Test verifies additional commit related to https://github.com/FirebirdSQL/firebird/issues/8252 + Example #1 from https://github.com/FirebirdSQL/firebird/issues/8265 is used for check + (suggested by dimitr, letter 25.09.2024 13:33) +NOTES: + [26.09.2024] pzotov + 1. No ticket has been created for this test. + 2. Confirmed problem on 5.0.2.1516-fe6ba50 (23.09.2024), got for SubQueryConversion = true plan with subquery: + # Sub-query + # -> Filter + # -> Filter + # -> Hash Join (semi) + # ... and ... + # Select Expression + # -> Aggregate + # -> Filter + # -> Table "TEST1" as "A" Full Scan + 3. Parameter 'SubQueryConversion' currently presents only in FB 5.x and _NOT_ in FB 6.x. + Because of that, testing version are limited only for 5.0.2. FB 6.x currently is NOT tested. + 4. Custom driver config objects are created here, one with SubQueryConversion = true and second with false. + + Checked on 5.0.2.1516-92316F0 -- all ok: two hash joins instead of subquery. + Thanks to dimitr for the advice on implementing the test. +""" + +import pytest +from firebird.qa import * +from firebird.driver import driver_config, connect, DatabaseError + +init_script = """ + create table test1(id int not null); + create table test2(id int not null, pid int not null); + create table test3(id int not null, pid int not null, name varchar(30) not null); + commit; + + insert into test1(id) select row_number()over()-1 from rdb$types rows 10; + insert into test2(id, pid) select row_number()over()-1, mod(row_number()over()-1, 10) from rdb$types rows 100; + insert into test3(id, pid, name) select row_number()over()-1, mod(row_number()over()-1, 100), 'QWEABCRTY' from rdb$types, rdb$types rows 1000; + commit; + + -- alter table test1 add constraint test1_pk primary key(id); + -- alter table test2 add constraint test2_pk primary key(id); + -- alter table test3 add constraint test3_pk primary key(id); + -- alter table test2 add constraint test2_fk foreign key(pid) references test1; + -- alter table test3 add constraint test3_fk foreign key(pid) references test2; +""" + +db = db_factory(init=init_script) + +act = python_act('db', substitutions = [('record length: \\d+', 'record length')]) + +#----------------------------------------------------------- + +def replace_leading(source, char="."): + stripped = source.lstrip() + return char * (len(source) - len(stripped)) + stripped + +#----------------------------------------------------------- + +@pytest.mark.version('>=5.0.2,<6') +def test_1(act: Action, capsys): + + test_sql = """ + select count(*) from test1 a + where + a.id in ( + select b.pid from test2 b + where + b.id in ( + select c.pid from test3 c + where name like '%ABC%' + ) + ); + """ + + for sq_conv in ('true','false',): + srv_cfg = driver_config.register_server(name = f'srv_cfg_aae2ae32_{sq_conv}', config = '') + db_cfg_name = f'db_cfg_aae2ae32_{sq_conv}' + db_cfg_object = driver_config.register_database(name = db_cfg_name) + db_cfg_object.server.value = srv_cfg.name + db_cfg_object.database.value = str(act.db.db_path) + db_cfg_object.config.value = f""" + SubQueryConversion = {sq_conv} + """ + + with connect(db_cfg_name, user = act.db.user, password = act.db.password) as con: + try: + cur = con.cursor() + cur.execute("select g.rdb$config_name, g.rdb$config_value from rdb$database r left join rdb$config g on g.rdb$config_name = 'SubQueryConversion'") + for r in cur: + print(r[0],r[1]) + + ps = cur.prepare(test_sql) + + # Print explained plan with padding eash line by dots in order to see indentations: + print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) + + # Print data: + for r in cur.execute(ps): + print(r[0]) + except DatabaseError as e: + print(e.__str__()) + print(e.gds_codes) + + act.expected_stdout = f""" + SubQueryConversion true + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Hash Join (semi) + ................-> Table "TEST1" as "A" Full Scan + ................-> Record Buffer (record length: 82111) + ....................-> Filter + ........................-> Hash Join (semi) + ............................-> Table "TEST2" as "B" Full Scan + ............................-> Record Buffer (record length: 57111) + ................................-> Filter + ....................................-> Table "TEST3" as "C" Full Scan + 10 + + SubQueryConversion false + Sub-query + ....-> Filter + ........-> Filter + ............-> Table "TEST3" as "C" Full Scan + Sub-query + ....-> Filter + ........-> Filter + ............-> Table "TEST2" as "B" Full Scan + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Table "TEST1" as "A" Full Scan + 10 + """ + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From 3fd31597085b3009f44709bddaca69c974cde9e9 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 26 Sep 2024 10:48:49 +0300 Subject: [PATCH 071/128] Added/Updated tests\bugs\gh_8233_test.py: minor change - fixed typo --- tests/bugs/gh_8233_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/bugs/gh_8233_test.py b/tests/bugs/gh_8233_test.py index 035df828..31ca0735 100644 --- a/tests/bugs/gh_8233_test.py +++ b/tests/bugs/gh_8233_test.py @@ -3,7 +3,7 @@ """ ID: issue-8233 ISSUE: https://github.com/FirebirdSQL/firebird/issues/8233 -TITLE: SubQueryConversion = true --multiple rows in singleton select +TITLE: SubQueryConversion = true - multiple rows in singleton select DESCRIPTION: NOTES: [27.08.2024] pzotov From a3ba2b7669e3125adaebf15f487c64f02ff5f091 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 26 Sep 2024 10:50:19 +0300 Subject: [PATCH 072/128] Added/Updated tests\bugs\gh_8252_test.py: added comment about additional test for this issue: tests/functional/tabloid/test_aae2ae32.py --- tests/bugs/gh_8252_test.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/bugs/gh_8252_test.py b/tests/bugs/gh_8252_test.py index 9f939e1f..2fa5afbf 100644 --- a/tests/bugs/gh_8252_test.py +++ b/tests/bugs/gh_8252_test.py @@ -10,6 +10,7 @@ NOTES: 1. Parameter 'SubQueryConversion' currently presents only in FB 5.x and _NOT_ in FB 6.x. Because of that, testing version are limited only for 5.0.2. FB 6.x currently is NOT tested. 2. Custom driver config object is created here for using 'SubQueryConversion = true'. + 3. Additional test was made for this issue: tests/functional/tabloid/test_aae2ae32.py Confirmed bug on 5.0.2.1497. Checked on 5.0.2.1499-5fa4ae6. From 05df68c160a73fc5a99d324fd68e239ef05fbe62 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 26 Sep 2024 11:28:54 +0300 Subject: [PATCH 073/128] Added/Updated tests\bugs\gh_8265_test.py: Checked on 5.0.2.1516-92316F0 (intermediate snapshot 25.09.2024) --- tests/bugs/gh_8265_test.py | 270 +++++++++++++++++++++++++++++++++++++ 1 file changed, 270 insertions(+) create mode 100644 tests/bugs/gh_8265_test.py diff --git a/tests/bugs/gh_8265_test.py b/tests/bugs/gh_8265_test.py new file mode 100644 index 00000000..679239d7 --- /dev/null +++ b/tests/bugs/gh_8265_test.py @@ -0,0 +1,270 @@ +#coding:utf-8 + +""" +ID: issue-8265 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8265 +TITLE: Nested IN/EXISTS subqueries should not be converted into semi-joins if the outer context is a sub-query which wasn't unnested +DESCRIPTION: +NOTES: + [26.09.2024] pzotov + 0. ::: NB ::: This test probably will be reimplemented later, see note by dimitr in the ticket: + "In the future this heuristics should be replaced with a cost-based approach between hash and nested loop semi-join" + 1. Parameter 'SubQueryConversion' currently presents only in FB 5.x and _NOT_ in FB 6.x. + Because of that, testing version are limited only for 5.0.2. FB 6.x currently is NOT tested. + 2. Custom driver config objects are created here, one with SubQueryConversion = true and second with false. + 3. First example of this test is also used in tests/functional/tabloid/test_aae2ae32.py + + Confirmed problem on 5.0.2.1516-fe6ba50 (23.09.2024). + Checked on 5.0.2.1516-92316F0 (25.09.2024). +""" + +import pytest +from firebird.qa import * +from firebird.driver import driver_config, connect, DatabaseError + +init_script = """ + create table test1(id int not null); + create table test2(id int not null, pid int not null); + create table test3(id int not null, pid int not null, name varchar(30) not null); + commit; + + insert into test1(id) select row_number()over()-1 from rdb$types rows 10; + insert into test2(id, pid) select row_number()over()-1, mod(row_number()over()-1, 10) from rdb$types rows 100; + insert into test3(id, pid, name) select row_number()over()-1, mod(row_number()over()-1, 100), 'QWEABCRTY' from rdb$types, rdb$types rows 1000; + commit; +""" + +db = db_factory(init=init_script) + +act = python_act('db', substitutions = [('record length: \\d+', 'record length')]) + +#----------------------------------------------------------- + +def replace_leading(source, char="."): + stripped = source.lstrip() + return char * (len(source) - len(stripped)) + stripped + +#----------------------------------------------------------- + +@pytest.mark.version('>=5.0.2,<6') +def test_1(act: Action, capsys): + + test_query_lst = [ + """ + -- Example 1: both sub-queries can (and should) be unnested. + select count(*) from test1 q1_a + where + q1_a.id in ( + select q1_b.pid from test2 q1_b + where + q1_b.id in ( + select q1_c.pid from test3 q1_c + where q1_c.name like '%ABC%' + ) + ) + """, + """ + -- Example 2: inner sub-query cannot be unnested due to OR condition present, but the outer sub-query can + select count(*) from test1 q2_a + where + q2_a.id in ( + select q2_b.pid from test2 q2_b + where + 1=1 or q2_b.id in ( + select q2_c.pid from test3 q2_c + where q2_c.name like '%ABC%' + ) + ) + """, + """ + -- Example-3: outer sub-query cannot be unnested due to OR condition present, so the inner sub-query should NOT be unnested too. + select count(*) from test1 q3_a + where + 1=1 or q3_a.id in ( + select q3_b.pid from test2 q3_b + where q3_b.id in ( + select id from test3 q3_c + where q3_c.name like '%ABC%' + ) + ) + """, + """ + -- Example-4: both sub-queries can NOT be unnested due to OR conditions present. + select count(*) from test1 q4_a + where + 1=1 or q4_a.id in ( + select id from test2 q4_b + where + 1=1 or q4_b.id in ( + select id from test3 q4_c + where q4_c.name like '%ABC%' + ) + ) + """ + ] + + + for sq_conv in ('true','false',): + srv_cfg = driver_config.register_server(name = f'srv_cfg_aae2ae32_{sq_conv}', config = '') + db_cfg_name = f'db_cfg_aae2ae32_{sq_conv}' + db_cfg_object = driver_config.register_database(name = db_cfg_name) + db_cfg_object.server.value = srv_cfg.name + db_cfg_object.database.value = str(act.db.db_path) + db_cfg_object.config.value = f""" + SubQueryConversion = {sq_conv} + """ + + with connect(db_cfg_name, user = act.db.user, password = act.db.password) as con: + for idx, test_sql in enumerate(test_query_lst): + try: + cur = con.cursor() + cur.execute("select g.rdb$config_name, g.rdb$config_value from rdb$database r left join rdb$config g on g.rdb$config_name = 'SubQueryConversion'") + for r in cur: + print(r[0],r[1]) + + ps = cur.prepare(test_sql) + + print(f'\nExample {idx+1}') + # Print explained plan with padding eash line by dots in order to see indentations: + print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) + + # Print data: + for r in cur.execute(ps): + print(r[0]) + except DatabaseError as e: + print(e.__str__()) + print(e.gds_codes) + + act.expected_stdout = f""" + SubQueryConversion true + Example 1 + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Hash Join (semi) + ................-> Table "TEST1" as "Q1_A" Full Scan + ................-> Record Buffer (record length) + ....................-> Filter + ........................-> Hash Join (semi) + ............................-> Table "TEST2" as "Q1_B" Full Scan + ............................-> Record Buffer (record length) + ................................-> Filter + ....................................-> Table "TEST3" as "Q1_C" Full Scan + 10 + + SubQueryConversion true + Example 2 + Sub-query + ....-> Filter + ........-> Filter + ............-> Table "TEST3" as "Q2_C" Full Scan + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Hash Join (semi) + ................-> Table "TEST1" as "Q2_A" Full Scan + ................-> Record Buffer (record length) + ....................-> Filter + ........................-> Table "TEST2" as "Q2_B" Full Scan + 10 + + SubQueryConversion true + Example 3 + Sub-query + ....-> Filter + ........-> Filter + ............-> Table "TEST3" as "Q3_C" Full Scan + Sub-query + ....-> Filter + ........-> Filter + ............-> Table "TEST2" as "Q3_B" Full Scan + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Table "TEST1" as "Q3_A" Full Scan + 10 + + SubQueryConversion true + Example 4 + Sub-query + ....-> Filter + ........-> Filter + ............-> Table "TEST3" as "Q4_C" Full Scan + Sub-query + ....-> Filter + ........-> Filter + ............-> Table "TEST2" as "Q4_B" Full Scan + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Table "TEST1" as "Q4_A" Full Scan + 10 + + + SubQueryConversion false + Example 1 + Sub-query + ....-> Filter + ........-> Filter + ............-> Table "TEST3" as "Q1_C" Full Scan + Sub-query + ....-> Filter + ........-> Filter + ............-> Table "TEST2" as "Q1_B" Full Scan + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Table "TEST1" as "Q1_A" Full Scan + 10 + + SubQueryConversion false + Example 2 + Sub-query + ....-> Filter + ........-> Filter + ............-> Table "TEST3" as "Q2_C" Full Scan + Sub-query + ....-> Filter + ........-> Filter + ............-> Table "TEST2" as "Q2_B" Full Scan + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Table "TEST1" as "Q2_A" Full Scan + 10 + + SubQueryConversion false + Example 3 + Sub-query + ....-> Filter + ........-> Filter + ............-> Table "TEST3" as "Q3_C" Full Scan + Sub-query + ....-> Filter + ........-> Filter + ............-> Table "TEST2" as "Q3_B" Full Scan + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Table "TEST1" as "Q3_A" Full Scan + 10 + + SubQueryConversion false + Example 4 + Sub-query + ....-> Filter + ........-> Filter + ............-> Table "TEST3" as "Q4_C" Full Scan + Sub-query + ....-> Filter + ........-> Filter + ............-> Table "TEST2" as "Q4_B" Full Scan + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Table "TEST1" as "Q4_A" Full Scan + 10 + + """ + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From 89e3f717f8d7ffed2e0357953247b4df9d7ee700 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 26 Sep 2024 11:31:15 +0300 Subject: [PATCH 074/128] Added/Updated tests\bugs\gh_8265_test.py: added comment --- tests/bugs/gh_8265_test.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/bugs/gh_8265_test.py b/tests/bugs/gh_8265_test.py index 679239d7..7b1f4979 100644 --- a/tests/bugs/gh_8265_test.py +++ b/tests/bugs/gh_8265_test.py @@ -9,6 +9,7 @@ NOTES: [26.09.2024] pzotov 0. ::: NB ::: This test probably will be reimplemented later, see note by dimitr in the ticket: "In the future this heuristics should be replaced with a cost-based approach between hash and nested loop semi-join" + (https://github.com/FirebirdSQL/firebird/issues/8265#issue-2546991823) 1. Parameter 'SubQueryConversion' currently presents only in FB 5.x and _NOT_ in FB 6.x. Because of that, testing version are limited only for 5.0.2. FB 6.x currently is NOT tested. 2. Custom driver config objects are created here, one with SubQueryConversion = true and second with false. From ebc90eff4812f0ca06ebefc94d03cfc4eef3f0a8 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Fri, 27 Sep 2024 08:46:23 +0300 Subject: [PATCH 075/128] Added/Updated tests\bugs\gh_8265_test.py: fixed wrong value of argument for 'driver_config.register_server()' call that caused another test fail with 'Server ... already registered' --- tests/bugs/gh_8265_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/bugs/gh_8265_test.py b/tests/bugs/gh_8265_test.py index 7b1f4979..891e0d76 100644 --- a/tests/bugs/gh_8265_test.py +++ b/tests/bugs/gh_8265_test.py @@ -106,8 +106,8 @@ def test_1(act: Action, capsys): for sq_conv in ('true','false',): - srv_cfg = driver_config.register_server(name = f'srv_cfg_aae2ae32_{sq_conv}', config = '') - db_cfg_name = f'db_cfg_aae2ae32_{sq_conv}' + srv_cfg = driver_config.register_server(name = f'srv_cfg_8265_{sq_conv}', config = '') + db_cfg_name = f'db_cfg_8265_{sq_conv}' db_cfg_object = driver_config.register_database(name = db_cfg_name) db_cfg_object.server.value = srv_cfg.name db_cfg_object.database.value = str(act.db.db_path) From dbcd5e8067df26e6efeb4a371e88f1e042c9ff33 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sat, 28 Sep 2024 17:11:28 +0300 Subject: [PATCH 076/128] Increased ParallelWorkers: it must be greater than 1 because of tests/gh_8263_test.py - see notes there --- configs/fb50_all.conf | 4 ++-- configs/fb60_all.conf | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/configs/fb50_all.conf b/configs/fb50_all.conf index 850fcda1..fa264e6b 100644 --- a/configs/fb50_all.conf +++ b/configs/fb50_all.conf @@ -78,8 +78,8 @@ ClientBatchBuffer = 131072 SnapshotsMemSize = 64K TipCacheBlockSize = 4M -# Added 03-apr-2023: -ParallelWorkers = 1 +# ParallelWorkers must be GREATER than 1 since 28.09.2024, see bugs/gh_8263_test.py +ParallelWorkers = 2 MaxParallelWorkers = 8 # SubQueryConversion = false diff --git a/configs/fb60_all.conf b/configs/fb60_all.conf index 679b1edd..4519f757 100644 --- a/configs/fb60_all.conf +++ b/configs/fb60_all.conf @@ -78,8 +78,8 @@ ClientBatchBuffer = 131072 SnapshotsMemSize = 64K TipCacheBlockSize = 4M -# Added 03-apr-2023: -ParallelWorkers = 1 +# ParallelWorkers must be GREATER than 1 since 28.09.2024, see bugs/gh_8263_test.py +ParallelWorkers = 2 MaxParallelWorkers = 8 #OptimizeForFirstRows = false From f9366e45561b914c737b71b78b57c84e035d867a Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sat, 28 Sep 2024 17:19:19 +0300 Subject: [PATCH 077/128] Added/Updated tests\bugs\gh_8263_test.py: Checked on 6.0.0.474, 5.0.2.1519. SEE NOTES. --- tests/bugs/gh_8263_test.py | 145 +++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 tests/bugs/gh_8263_test.py diff --git a/tests/bugs/gh_8263_test.py b/tests/bugs/gh_8263_test.py new file mode 100644 index 00000000..df739190 --- /dev/null +++ b/tests/bugs/gh_8263_test.py @@ -0,0 +1,145 @@ +#coding:utf-8 + +""" +ID: issue-8263 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8263 +TITLE: gbak on Classic with ParallelWorkers > 1 doesn't restore indices, giving a cryptic error message +DESCRIPTION: + Following conditions must be met to reproduce ticket issue: + * firebird.conf contains ParallelWorkers > 1 and MaxParallelWorkers >= ParallelWorkers; + * test database has a table with indexed column and number of POINTER PAGES more than 1. + Test creates table with PK-column (type = int) and wide text column ('data_filler') of len = . + We add records into this table and make backup of this table. + Set ROWS_COUNT = 50'000 and DATA_FILLER_WID = 1'000 leads to allocating 5 pointer pages for test table + (database must be created with page_size = 8192). + + Then we run restore WITHOUT '-par' switch and without verbosing. + Before fix this issued error described in the ticket and index remained inactive. + After fix this restore must complete silently (w/o any output). + Finally, we run query that must use PK index and compare its explained plan with expected which must contain + 'Index "..." Full Scan' line. +NOTES: + [28.09.2024] pzotov + ::: NB ::: + This test forced to change prototypes of firebird.conf for 5.x and 6.x, see in $QA_HOME/firebird-qa/configs/ + files 'fb50_all.conf' and 'fb60_all.conf': they now contain ParallelWorkers > 1. + This change may affect on entire QA run result! Some other tests may need to be adjusted after this. + + Thanks to Vlad for suggestions about this test implementation. + + Confirmed bug on 6.0.0.471, 5.0.2.1516 + Checked on 6.0.0.474, 5.0.2.1519 -- all Ok. +""" +import locale +from pathlib import Path +import time + +import pytest +from firebird.qa import * +from firebird.driver import driver_config, connect, DatabaseError, SrvRestoreFlag + +tmp_fbk = temp_file('tmp_gh_8263.fbk') +tmp_fdb = temp_file('tmp_gh_8263_restored.tmp') + +######################### +### S E T T I N G S ### +######################### +ROWS_COUNT = 50000 +DATA_FILLER_WID = 1000 + +init_script = f""" + create table test( + id int generated by default as identity -- constraint pk_wares primary key using index test_pk + ,data_filler varchar({DATA_FILLER_WID}) + ); + commit; + + set term ^; + execute block as + declare n int = {ROWS_COUNT}; + begin + while (n>0) do + begin + insert into test(data_filler) values( lpad('', {DATA_FILLER_WID}, uuid_to_char(gen_uuid())) ); + n = n - 1; + end + end + ^ + set term ;^ + commit; + create index test_id on test(id); + commit; +""" + +db = db_factory(init = init_script, page_size = 8192) + +act = python_act('db') + +#----------------------------------------------------------- + +def replace_leading(source, char="."): + stripped = source.lstrip() + return char * (len(source) - len(stripped)) + stripped + +#----------------------------------------------------------- + +@pytest.mark.version('>=5.0') +def test_1(act: Action, tmp_fbk: Path, tmp_fdb: Path, capsys): + + if act.vars['server-arch'].lower() != 'classic': + pytest.skip('Only Classic was affected.') + + #srv_cfg = driver_config.register_server(name = f'srv_cfg_8263', config = '') + #db_cfg_name = f'db_cfg_8263' + #db_cfg_object = driver_config.register_database(name = db_cfg_name) + #db_cfg_object.server.value = srv_cfg.name + #db_cfg_object.database.value = str(act.db.db_path) + ## db_cfg_object.parallel_workers.value = 3 + + with act.db.connect() as con: # connect(db_cfg_name, user = act.db.user, password = act.db.password) as con: + chk_sql = """ + select + max(iif(rdb$config_name = 'ServerMode', rdb$config_value, null)) as srv_mode + ,cast(max(iif(rdb$config_name = 'ParallelWorkers', rdb$config_value, null)) as int) as par_workers + ,cast(max(iif(rdb$config_name = 'MaxParallelWorkers', rdb$config_value, null)) as int) as max_workers + from rdb$config + """ + cur = con.cursor() + cur.execute(chk_sql) + srv_mode, par_workers, max_workers = cur.fetchone() + assert srv_mode == 'Classic', f'Not applicable ServerMode: {srv_mode}' + assert par_workers > 1, f'ParallelWorkers = {par_workers} must be greater than 1 for this test' + assert max_workers > par_workers, f'MaxParallelWorkers = {maxworkers} must be greater than ParallelWorkers = {par_workers}' + + act.gfix(switches=['-shutdown','single', '-force', '0', act.db.dsn]) + print(act.stdout) # must be empty + + act.gbak(switches=['-b', act.db.dsn, str(tmp_fbk)], combine_output = True, io_enc = locale.getpreferredencoding()) + print(act.stdout) # must be empty + + # BEFORE fix following restore failed with: + # gbak:cannot commit index TEST_ID + # gbak: ERROR:invalid database handle (no active connection) + # gbak: ERROR:Database is not online due to failure to activate one or more indices. + # gbak: ERROR: Run gfix -online to bring database online without active indices. + # + act.gbak(switches=['-rep', str(tmp_fbk), str(tmp_fdb)], combine_output = True, io_enc = locale.getpreferredencoding()) + print(act.stdout) # must be empty! + + ############################################################### + + with connect(str(tmp_fdb), user = act.db.user, password = act.db.password) as con: + chk_sql = 'select 1 from test order by id' + cur = con.cursor() + ps = cur.prepare(chk_sql) + # Print explained plan with padding eash line by dots in order to see indentations: + print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) + + act.expected_stdout = f""" + Select Expression + ....-> Table "TEST" Access By ID + ........-> Index "TEST_ID" Full Scan + """ + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout + \ No newline at end of file From c4e2af9b2c4fc52ba214a0a5c24919a447c444ad Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sun, 29 Sep 2024 01:40:30 +0300 Subject: [PATCH 078/128] Added .zip that is needed for upcoming test bugs/gh_7398_test.py --- files/gh_7398.zip | Bin 0 -> 188626 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 files/gh_7398.zip diff --git a/files/gh_7398.zip b/files/gh_7398.zip new file mode 100644 index 0000000000000000000000000000000000000000..f367ca151e72e1bf7f1bb86dc045ffc7b4f2b957 GIT binary patch literal 188626 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%0DNLqhf(I`Ir0>?jM9@U<1N0W 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

!tD5{v*NED|whC?s-}s2C2r-MVlOARx zPXK+*M<=~J+(}+v^uX1^6*m(VIQ%fLSSp0QELPp5feQD$iqx-Ia_bH>->QEZ_Ovxb zfI-SbPos`8bqf`oCd&Ne8JB#TgxE6pN-uGzBc_DWvWrp3+DoaA7$P3__iRn$Z{UyZ z@W?mK0~&X#_y2wz{c1SBN!TJ;sM_+1g;nd zMl_^X3wPOEc~RUqD}RYS`_l3nQfLo zZP}XU=Gq&$gpWw4{Db#}W_LL|Hir%JET3jMP!%|eNKqBl_EI%x8 z)@Z`2*!<>QDMd4m2;-R?P2p=a4k+7u#tqvXGuH_p>okO~)@Q5vFFi4Z-)9Y({pqw4 zMcuu4aAEuWSh>X!w4_=3_<`^0>>L0(Ngq-d^U${^Lds7{jA zw^N#`g1_|&?h|-yR*Lbb>({q$-PM<_te=xM*IdFsjee-zPI)Qxhnc5$*Gkl(I`MK& zVCtqk^|x$hiv&W~botS;66z+Zn7#7!sdMG~kYQYZ8TD9>c|M`BOcr3XI5+V-X6)50 z;FaccYQhJZE1!FjH)Aym)lQoju(wQ`ffbKgJK`MHj%JO%@@R=T-TA==t1V+h-|2-_ ztMci zS_|#~o(FsTvl$I;&q-hxnf!%PNss_#d~LAEZf zdtml$%FZd94-!;9?Pd2*=c~0@Y1fGu{ns0;-K0wgWDRKF7l!=PV zER)mUIj&>LK|sAhHks0c&mJr1Y!)Pj1G^PZCP~k$63Nm7bfD4{P-vaEb<`8Bu|dZg zfb{kdz%iZe+2n4%{K$BG)X?tIL%U_6>ITQgwU4Lp;!2?~sqbC8xce(|A@H7Jqx`L=_8MRB;#1k8XOMGSaf`s1_tudcNO znL=K>mUaUaSI{;+Dsb|PnvEJgi$w{1^FC%~-`3-5^pNbesUd}3Jfx6QfH%ZS&=~M> zxk!<4{;fPHssw2{h-?^$%g@?nN1F@+_P)jIqWG^@%&)x+xQ}}Aj-{jjPnFuQ8kvf| zizREj0I6Xsb$iyLjnAd+D|e_++T{BBZ(%$BCu{Z(7XKva$OjB)H;MuLucyKz?>QJ{ zPJNl9-X&Sq!kHVo{Gu(C4-_OmJSY#UtfmK0Mxj3Ms|&~HQ9=7a@RDX{;ElUQ{wrU_ z?<*5gA+?W>a;tibQIbPH6kIdT&kfKXe*jy=#J*c}#laVDe`GxPrK1(-IVM}|rf2x0 zHDeQ-Fo=3E1BebbJwvy#aSt8S^xx;92B9tP2oiCyH2Zh<=ghX#-cTgQ^MpIL=UwEn zsJ3y~UZ=lZVQT2bJ;h2qZ)};r`?07nx(^~-V_snM%hRx6jI=jm z!M^17re1``yJR+f;QSyRdr2`KF=&SeI(>dS6E>235x3#k(fe5*vQFC`W|fCimh(vG z(d5+hdWY{=xvg4!`?uLxCD0DUfY>rWH&qe2Qtq7GJZLU5c1*(Fom!i_UDVp0TA1k# ztP3?_e0=e6zWQ7|&SU#z_~Y%udw&LlVdJ0CdNgnC_{>&z7hZLL39U~Rhz_fr8dqfW zpF941;mq)TBJ9lb6T{GI1^2O&2QK4xB~QAtMrwV{IUkQ^ko(!Z^R7T`vCfxC$vsFV z4yWp~U4m-+8>m|&&D5qU!0quUH_#U0cA`Cg@H&}6#malsZlB}$2#m6PscEd__ks#L z5uu!>dz)B$#;GevQ-bcTx)FM}?hL-(HRSEd$0yqSEU|xB-7YHbeAjUD`O!z3*eC-A z=Ehf#C1w%Jy;WVg)BiSo@m=xX%L-=Ze#ZQ`x(W=*31i)LGNHFg{5JRW>Beg&)V{sV zzg^l(79v3x#395%S2jf&wkRS#1D93gI|eH>_b%jC9!P|cu>yaCbEj= z`97er6-mnQy5(DW$G7WYf?fIWyv`#Dh7;h)6~g5Z_`q4R|PBa-Mh74$n-H#MOwNU-5q=^Dz*6C9?aes zta{#Of=3&5m2Yt{#wPvp@Y&w9@|Mgg5B<1o+}f!6sYs`!>+{4VDmd?DlY|O!?Wyz; zM*r+E1z7)WnZV^62v0elx{L;wnM693#tFMKQEI)Fo$=(y{iQ<_HS#An>bj!35=sxQ zjGN=Tk{{+5Kxo2=erQeoePLYN6qtopid=(u4j@9rb$$=rEcB`x(O#S6 z9l{p1y3G#`Ha_}AQ(eGZ!Eu6;3u=PK^J@rNOQ_Wi?!BWKvKW-|>uN3HPwatjpd}0+ z@KsFx{_|lxGWoXWiqu)q%MO}fzu$ULCG!?|KHYb^GDV%tB1rr75Xz+DRW%5=NV;8h zh&t??L7_apP90VY46mYZ=o=`hT@H#xTYU*`cCj4>x3OiQCU5M8P^o&zF6EZezUGVl zmUpgscLj0(U9gjcz-VIrUj~)fr1A@>`6FoHVn`@adlZqkwU%DHeX?@*Q|bj&CFkeI zFM3-h9EHOk3=PUT2`i-#p%xmNTYWyd6XC#Q9*nitI-~*P(K$5s%$_HfO$TRYNp**q z)N@Yel!Kk`hbu|MKTWpN`tc*?)BEqN_qjJi-vQ&lr)e9$UIdqn`FTwv-lT95Exs1~ ztgSwzs(C6wJ^tz2u661^58}wJmBy{iZ@h?hy~qEgEer2`X3Xy#Q=okzA*hyPq(SAN z8Np{dhEREa8dze#0$Vqsza6+jpgaCmi?)P{U0ZYgI_=Q6%wVquF>E+3j3OG_E_@6` zJV&%bVV+jJmZ)w|HE&NP0g zDqdO6y73l8sRjnxFW*`(xWm&tfeOE^uvvj6)2O5v)T@Oop1R>CsZ=zgL@gvOW0IKx z`=_iRj8)7+IlpA?=PYAd+KFf*0gb(6teDt2JVoB&|@IgaJ( zDBd7NoArM17&C2U{{{T<)MXV2FjLQiK6fBp7vGg~bEEnE*GwgiZ*}LIZN4XL;hCO8 zsIDv`FnaV)8{$#)sO=YuT=S;~RcNoz0HZW&TySwqudLJe$*sZhh9sY>*QBky(FQCY@9@r-5xq@H?0z$o=cg-MSvcm@B| zqApkZbq`9?okV3q{M~Y5%3bq$It=7Ws&CHh=|rOC26l|xDTA#MDS9#dSn^LgC~wK* z_uT2Q-pm99uju0)N6~SF)U!?a1hY3)V5qrXV+hpjRE?q}a8Mml)z0WKkRfRy`;o{lH2C#*Q!06S^tZrA3;I}!^JhDkix!W$&)vKq)bt7{BI zXoDSIJ`()eh_-0~bM}!Kg7dD)#N? zvU$pIrn|lWm$Gk%$#~&;Yl4^K!u}i8MSu4aVugW9E`G&a2BG>S=oGBuN!hgZ{Uzbm zo5z}$j~LT_w5^Ib+%=7NLfG^)GJq^so8 zmhQ0f;auZ{R8oij$i!XdDS7X@QlAx1L@%(r z9I9V5-dZbe*i5v1%31JWv%v-G9dONDTB0IW`2i5?d}cvnq`Fbw?QQX( z0<=|*j);K=Om6pdZeGdUrQDZrqZv;%WG`fs98d2<49ITP#6GGw(rj!kyz>g(ee+mU zHgk@XXn~F_{_+HErKAat^<44r>AcwZKKEx)8#u=Km*?D{{aa0}4r5DUIssizJ0h`W zlT$Yl%$VjpoBC6Zv8^bh6-vnIuLbzbLq^l3Z1;V77=mA*{|rbY0HV>ybHQYg_p^Ha z(;F^dP%qQ|W)nfFX=|k*taGA{-;QBy`cyEZYy`5MVlf7Kn0EZ9q*S! z0W5?ow#v!>czHIejC+pL5wsp6RhtQ*G7++ZTMr5FLotT zZ>Q=VpHBXB>%SLcvog8K&c;)sGUW5VbNh^&UC@8u2jZ`mWO-{E-8qH*F?bHY<*1RV zaXr#=FrAv08q0v!p>5?xrf&Su7=7FVjq4$m26{|GiiL?3M8&qRPi@#8RkyA_I>VkNUZGnF)h|-N_cO{MziQTKmx!j@>yNd56 z8Qqn3#}%_LcX;+XQvUOFz>1g&@qi)ynsC7BciN4B;TcHDwu`**j~5~$oe5s8p@G~M ziEyP5Xp7)d{Pz2&5czZ-_iE^qy~q*PJptY%G&e}9WG1kHv)Y>HZO1Ir2+!NA*qjG7nhFQaC+Mw44|uTClRNFa*m6-)63W6bo`O0aUY1W-^WBi%;SQctyE})3r5Q zFT(f&FY`dJ`&!lhvbSDcsS<)cGyC4h8sGS%!T|uhW6uofG+5aJBzLIg>B**@FEH^} z@V~~&hrI!`4JW4q3}p0m@AA7;cU>0{Tab8hriDLPre^&)m_E?w$fsZCEPkYMa>O+m z%w3WTIDH@cUL#R4(4UW-?+~}tpY#kblK`)qdao$L`+#T;tjfLU=Mx3yjQ#v zW}U$C*Hn*a1d_u|Wz98~&!Zn{b9^bP(O2kFH$({EcyINfERJ(d-j6amvh|idN6OeI zn~C)yOlb=zzKUgDIsVMC;LMArYvBv0mW-d1g^4KS_g(z&iNWMQaS*AwpSiOSsVZ_; z?f{cn3;OLsYMH#poawhNkAy(j?XY%>PRK0aUoO6{P0D~|^u5A-3E39&Fj*9{kB?oK zhyF9BG``>EphTv$w2&f-hh5bDS|YX^?4QQCK%3zOfL+C%HwI~eABN!-EUw!4u=FX$ z2Q0FWtaVxc{mOHfNbjU$^;?rGO22X23FO6;_9#+r=TLm8!Y{7P{B0?9vbYhMA--ez zu2PRx>dj=7sNgEImS-AIB>9)qYLtNq9}f8aa)pO4Qw7U?!U0!x`-fbN2wm7jIUruT z3GVZCM}_~MX-tXpmMEPQq=>6K1%YahH_|Ylsjuta^d>-hL@w;+Y@-aW*FZi z+ng$tzSY0(i12n7w%B`mTNIv zAIr=~T7EFo(=y+NTE;!QX!5(FR((es#a39;WhRVB8D9zsEXoa{Q_)%xXO+>1<(w}QOFr6>qCZ?&8 z=G2xkCDp&E7tSH`zf!TkYUfSL(3(hLwHPow;C)WdE725?DX1|Ui=C{pa;;m=kqPdKY&y9UM6Vbball;0xVHR-fPS z-}x|C-^v)@R&_c!FW*<>R%U39Bm|2*O1qZd8gN9ztNPCmc--R5$wT3pa1n0SX? zc|5N9$N3}IB<`$1jgD`;YiR>CpK5%->Y%B#mO%0#AZ2wq1Ct6hlw zbcOUZ`+5S z)yx*v;gTLQvORu3QGzAXG{5BJ_0t=xkZsEw$t{oO)`6^)tTOuy^-;X5fi;Q13Z5`w zLBC9{A?!Tb+VlqFXO6)`tHjd>WM9M^fh%G3m$Ez!V#e~VOk1=E>|-XZ1759|7(dsn zi}NYoO5#z+Mr4G2ri6lInrdx59ES$IShnMi(vf@g4<+Iz^Hu#0)kk;meC|R)g1M3x zRbbS}W!{CR+t|poI;{rU3I_HjX*@0<{wIX@isQE@lyHh#OtXS{=6!eQ3ZKgniKXh- zA3zKh8(M?Y>Rb2W4%$4i6-(yDp^oBaz>f8jn~n?kx|dDyP)I_jsg3fEG!LK zBEYsXUF}f44bkh`7ZXx` zQ^oHwZ3v9DBBC6^=VTE=ErRo2>a^R>&t(uD>Vnn`SHxOOz_bV1_1O?wHpMXhjSuj) zM;UsJ`X?cqgVZWU)18L~Ps=ECI=9l2EwK1idNod^d&EEVY679D==YZw zl|`lfMKx~?iNc&~9lO4Ah>gU=C*8_WUgYV}>n>`nSX{WPh~;buKOL5fqbfQSuO5A} zxmF^>6Pqj=^9A+S-loe1CZ&LtYEf>wLa)M(dBE~Q6)UYGcr;^$5=ngTTzv-S1!D*6 zH>5QeNIf4?TG|5kfUH&uvF+axx6i|Ewdi&w2sw&->96mgL~6L=pV-DcJF+$%-8>3c zA}U03B3T8a&_?vHFtnd}OG;d8ZW1ZUa(AnG?zttZVIPqxc(vgcONWD(r~Pw7UL% zKxfKZ!rm&c9Rl}8&aUy=Z$jLrmpt^!jW1sOSUX4jYDWY#o=&-?l@u3qv~ErZfc2dE zbQK!{)K1pZ8f?@>4E{`IPCykvt5px~?yurCyG)#B{)_WK3CbHKO zZN}AvNB1{MGH_-5Y3I@r?c5g5&uMMAngQ>&abdxoGyzI! zNAxc#xbLqfqD|x|J&n>&U-DZwK=PBz*^GHQVr!m0 zB3tU}68QL{rD~7%ZXuxTWax}#-(erpg;B3-RN^*IOC5}^7kl<*dI<$Gzs|&gr!M2 zBm#%g5L@ zrk&A}^{i%U5cTGinM>yu`kjlh9-aRihv$(mJrDKeOUXhr^!u`|H0EpCOfeu-7a!YynxHRO6--sBJ_n74Y59O@wB! zw@q3>Fj}{P0+locT=M{LJd*}t^0bM4JzliVos6-J^Jt#*bh>nxzyi6|98C0nuBLM@ zC}tIx5#b^=`+XH08~h7aW^iuXmDJk%@a+yDnL{GFMHBheY^0}hx}I78!{a}O^?D-` zw+R!MIvSYTIMOhVdqSgI`1(~5J~pmL-O}m^xnr2n-I&$Qkf$aBK;BQiWE8ztFx?o3 zlXYhfE-1`@6N$xMLi5tRuJS}oD6`xYCTtXF3 zuJ~11#jFZHOEI*YsxMXKC02Y2dBHY{_^G(@Vj<9TB2lgyg{cr((_(sw>!=h#)ruP< z9@UNCxkm*|Zqr)p89Rt^iMi=PtjcVf?9;|~B_%hNYgs^4uKhWPn96koBqz_^V4gNV zJxLj8<+qFMn@}DK4kzy!E~XC^q}&E_-a7s(4m7gs>!_JLIv+gi|E27EWc60)>Z7+h z%HA@NiRPF8pRB}D0O z9WSHHAMX}BXrv8%6W6M)E#Akh3s+r7NfRE&m!dVmc|hqHh02@P#Vsh0`P%0N>}fg! zJ}u&AcVphkKO=x>PxMrn0Sih*Pm{^;h{mWfr$1wcyrO5io1q7$2*%ZLldPf3Dr)Ic zlM_6#bo}g$%=A=pKQ7A*HhiPDVUwk0pxrh_$hHWE9Z6eQv;X3xw$m9%y?da;S0UC> z7tC)~6rQgEH>C`lqB*b8>0xJ9WASm$&3nYX#mHq@(I^9srn%q{>?`mz8E3@io)fCtTuDkb_i123bBJlNBWFFTx?y9amfw&#h2re76F++wA zbM403$q6Ez8&0PvjSDD5B;|^yhHR(58b_TQ5);3(hAj8bt3=iBh**8kk;_JX zoOpKng#mCl#G&Ewr53ok}J3F7_^Dts0+vOPacU%?aE zP@{be&{uLf-*nLP+w!`H^7RX>>Jx(%s9!uB+gKS=(Db4Y{He$m|GV58yVlB+Vs=<#$s>|`!?q#>|WtSkSuu*F9 zd}^KmV1-hh`EdI((Pj%rai-}$QQ}#_zD~GvH4RTaMXps^m&*fkQ5jg*$1d;mQ zF=j$xM`A6y1IRl2PQD&TLO2aC8_B{9^mWQID)QUH++YH8r-s4d*4VIct}UH!sNTij z84wG*J;1(#60zRxpYlQ##PGpVBmc>Y3Ty?tvst@&DAmYL86vm)#k<_G>M~p$RT+*- zH4Z!YMa_)o&rplBVY?P5axVW0JcCD5a`c@<|i4iK9pQ9UaDkZF@L1sB)jlcxR?%B0uz0e^?*A`eiB9$DRZ zm%tNySXQ0Ba3gtt+*#qlw5GWzt&UcoDx(*T$~I z%pkSCZpLY#tm0zCD2>I9fW3dNY!(u60`8GYwAPme(|>fFZomsI?N`>)4LJHfM;Wm7 zO^@2*>+LAhn_0s6k+XA@$60|Cx2E$Kb9O_3M~B~5&$*FncEd{se7R#DNHfMpXiKH3 z_!e);y?YTgTn{!bbUtBE__2mp#{rRxJ?yB(nx!^SX7<;S&{69aRX+B;v}HvXhjWGa ztr(~Eg9>WZh49>87XoI=&9pFY(bF4#*5H_E$e+)@BW5`y3t;!p7hMAF`RJ57;=e}< z-{mgJvTxO)w&~uw=TfG1bE$Tb3+5!!Y3hS|*(p~x=O@Q4x?kYpJ?9Rqt6IHyJH9&T z96uT(K0G_Isj$nKmU)rXdG14e*2a7r?FH+KpkU_suSNHGMZtc8nb#=uW_yPr5n;$q%qsCXynyt)4mR5wYD5SBH8=fQa*3-zrm)B! zq$4AKJ8M+=abpeNy-yx=T)Z92Ve1Cog_aB28wS&>|FzoqR|-^du%ES86)ansLzG^q zZFz8a2xOXzKTmug%!d8*c#gRQrT+D;L7Rv>tfAy`?9B|!Qd$|&Y$G>+my(|2#1jLJ z*}5Yr;GzQRXgIYU8ZP8cuaDYiFb6_-pWF(+TJ5=tR-Q;A?ARp#x~+y%U6N{%V5kt7 zqSLL%Fjufl(YbI|-{~sf+{_PWRK)s5A9vH3Nm)UYInJ6w zKX#e_$mI3P3;ufA7I?YP?+WA_$~1de)Um_RF_YTeyr-x!KAqhH(_y&sPoWuO$|A9* zTLFo!lc1=Pia^`C3YNyYJ3x(=ZqVf_%WWvjrSunu_$|Jh=EY*y6c*<`uyN}f%LMLg z!(?k>%P2O;{)g>1y`)LRZ94gXYQM_Ry{yjbwu2G=-u>JT8zHB6AS@Y%zY;cf(dA6g z@R(=c9Ftv8i}d9iu2h31`+;&LU{-PC7yd>uB`xR38_np|-)mX5(#OJQg^X>UsW+Wa zZ|q&P>0EgI+{sIe4_jN@+bL8mQnsR)G+BVHSrZgP7j_AtrtAc=o)!$ z!gd4vhYpH@`5#6lR)d&S>nN9~b`PeSxgKhR z@cTLT@tz;G-xV93Y)6*o7>cIy2;Nu{Jb4RLNkMKmbMV8=)IzS#_kYOPx95G8kl(OD zqth( z4G;U~0oMVg)~IuR=1Ge%M^5VZrh%G50+hbq-Cj>HpnI> zDpg{PRg)`29mcex!&I6bO;W63Xa6|MkiV+lp{e>+kNiWcmN2H$aF-cWH zdX~!PCf5FYSW;Zeh>#ya4;q&1F`X@OIvNsW7$l5>`C#P(}*?y ztUuhR>JTaGV?HZ;rnY5biec`^t(PNwqE66X#e2N5edxG4{A8@vvfhN&)-P)QxR)fv z@?f>WLjt{pwvLLy?hqw==%EEX739;!Fi$-Q0`p2a(+XOa-hpKozIUarkcFE&vontU zUmTrvTvPw|$6>&z0VAYi!00Xsi4o$EZX~5XG)Q+zjUL@FIs_3xMN(QqVxWW|N=QoA z$lt!d{c-OeclWV99`~{Ld7pD$&vQ;<_3wa7LIBy_Wj>rGFP=qD`u>Xm-SpS1?6tZl z)4YSQ^`hn|^(`!bB4#&o^_sf9WoJ5n#>B?rih+XWu(~-R?E8B)nCOR1)pxC}%m>{! zUW}WWFWQ_2Afcv#)mW90@uR$ey<2xqN?PO;b~xmHzu! z9#sSX%jm4t3AKRmwD}`&s%mC>A*mzSv%+ip+U!FPpDLs>XYol(Q0T{CCNkxuVegF*}({{Wa|A~KsZP2 z3wk3)4^DPp&8DZ#o1=z`BivWduAB$+NLTU7JK?44wiKw0b^%WE6TA-_px`>ZKam%PK^Uz69T-~nyx z7#R_3GKg0q&RpB9EWG}NbpggXvHGGjURZ+2mnoXKyVb zpkpl((ZSOxmEKGo#=$my1MEIgISrK8hpMl5YL8 z&quG*IFq&uA-pf=@k=T69q?3I`Od*jE5G81{{weBt`|ax7{^IO9_c+1R+9gEcMW6N z%~@ZzN0o0^&ePtP;%Yql#7I~HRu+?PkX`!j=OYfcethYGP2Z{Nwljhx&AW8i{<@OJ zIJa_>kwF63kLS|_ExnTJj-Nit7-u6o#$mUDEn5_Hxm2~aDuPFaD)7ncw98E)GGG=y z8L*jINS7sA*f%n&Lj_j|m0{S2%gFTz>p$A}eFm9!C>!A4DQjXeio#hkw4e@}E+++s z9D$H;-D-3g^h6m|%YWzv?mQ3XFCtrmV|}1X;f)Z*DGY7IBn{Gz4L38e-*7W*-F9GRo|DQ7{lt? zMdz1*Ynq9l)%pY3-i}z z$Mf9i`WY~FZGxa)I{O}j58cl+3&$R1k$#;Y%Dj5G#%uqHOJmB(jZ!7pBYgios^e}D zbw6`zW=4hV&v#F8zK`ZcZ0&poxK;(X!5n&%%qUT`>Mjc0ED2Zf39-2T?Jb!+f95sH zpm%aHvIm!Mey~>zp3ZASeNcA|1chcBBsBKBiOkM6J+Ql=k#Jk5AF|gkHv+>2PdfR> z&JFTNzMfh)dbE43CrZJS=xlB=sJrNfiUpc9{+KGVOTK1B3L`pP*~+R_&7^1nxT#+F zO864Yc&6x|%oMjz-7uZD^)rI+G-%<9z<0e&P@fBd@yNZjIL)d^=V_Lwy319m)rWsv z#1W{-7m7r6V^q_+=wb9B37lRtk`I{HA{l9ANE3S|M+MuM+tgJNo+#H5JZbX5rwxh8 zR``2dQhKX#ypelN5ZdsY4;?A&R|nGR96jipRpj+LA2-&?P$aq%p1 zXwOr>z{=}Moy)z#dUT6Ycdyph%%(+_V{s%~;A}kjlaL>t_YcI0lk8oZJNbV3TQ@^l z+^MF^G9->nP}K@0#vz~8Jfnfjf24y$g-Z4OV?#8^B=3GAJEY}r>Qx=J9A&{HKdo4` zTBKsx>bW-IAf{NUo<;5%p@;Mop1MkkNre|*r1#g zjbzhw+YV7UZCzxU#4O|m>b`Z&U+B;Gp^^XHijk+>$&I9KJEK7p?5+w}Ka0M07w5|q zbd$wRH2c&?;A#D;j;=F8>0*}7SNx%Mo`45 zdMx?5o%80uZfK3_9liNKb_xL>1mq^Hbhy24Hb*1&S&tF7Q+-u4CkXoR#ju6MAt~!q z(dfx_G*~^0$Hn%n2|yC4>4>@f7V<~U3UQu4N@n+_3J=X%MW`_+MMPn64|Nq9=k|x$ zZm2uHL+#m5?M!qLQnHd|76ea$E1i&nn)k7!Phr%%?V5D86tg^X1h8W9X)wft`u4O12*as6xyj6A<#N-6hyAMmbG^Ze+4}S?kF0249 zoD0u9`L4CSI;N8KTX)pV@sSAWAmX7ZNXi)I0b2-AqG24@Bxe@(ydmMC=G)73)E(1c zX%_J~tRHm2U}7308Z$ZpgtTn2a(Sa6e6-#BzsOOndhY=UEBKbdh_JjBMna1MJ}A6w z(It$qdPflWXDW=w1OMi4^Y$EOcL{m&q@qQcJ{c=g%|CC7igl}git&r7a&x58;f`70 z$9ze&#ICrF*Y2H!b5zxdSSfCfJSLvd(4cey!th!2CYS!2%pikwT)1D`37KSR_6H1T z17R-+97bmiLpbQ(2ct7c4QW@?x-*sP*}P%`Nf6zc&97S)4rNO_P2%+oR|yU~)NqU_ zJ<7i(OTnGK(;&wh*g=Dk&%+~NN043Wmc0rPD+}iKDf;^=f!*XIS;Womt0p6LYCIq7 zo%#V$#P)`ZJT%Or@W)J7NjG00i^O5^te4p8fi80ggCFhxJKOPxr2zSkT?=-mACswc zjs3{F5KBvtT7dA$hX0dwh8YgCT`4!S5=!PEW=^6q+2B5 z$=@=ewmi1ZLFw2oT`u+7cgn0tvtQ{x5e(2|eXE2{G-Se5+?AZ@)EMCM|XMa@vF!^&@G1!?rgCkoP z7uP#l@YIQJVkBYOA;eMfxc1oJ3Svusm-09fo6g-PSZD`j?(JZi!r+0YDB?A>mVu=C znO9<17sM}s7oxxa_k$hD62g~HEoVARYsCyuK<3t?+{nYg2T-&2x{w11ItElIH`a1G zVs|-KZ;ZFTEGl9jb{oCvhLmiKFm0R=n>^nCX>0bqG#~R9?Sp5_17mJn%tA7q@UTmN zZIpp*0B3&FA?#Q&dnX~Ruy1D2_Q_2k%0!TA-&($&B^h6#Vvwv~k`p_|bmi)CSwXHW za0fqdq8zBdz{&f_cIPLAx}`9)9?Bzg=Of2+_uL>hQ)7ExO1c~)#LxbOE&j%ZN1DDY$bl50JdZkrLjr86sjoVb+Yre ztyO?_?02rWvt-Z^;|HU#PQ9m%AnwQGOb9(N51(Q)_Beta6h>mFsJXD}sI399jeG#q zrYnoX@5$1m=v7XC#;^JF86{pGCU_d*aZF*Sk)(dlRyhxfi`0iv4_cfued5BAQhWDy zJ`LCPz0|DOhqWdQzKL**gZ;+V3IJ!$)~%+QiEe6kz#T6JX^2%sWjBrUf}*(7?yL_x z`IzeHyz1;%9uv%^lSxPgBrE%T(i$qjX4PvaHVhP|9bh5#+o@5tl+I&+PP#Q86XO^1 z$M^JA+k&J~0b{;&OOIi+rIh@3ZD4qtt|Q z_Lkd7=92E}jOnlqDjNX`+*V`z3^x2QYLaB>rWR1YB?q2J6gO>jM&z#48-T5FhBgmH z`x`TU613e#Xv!$Wf`9#O?n78 z=@W=;0g~f;2QD`Rj>djwbK-AALb%96jDkKqV6V*rBZ85C>A{_TZd@vDkx=QTqe0yU7ZV?gL=i&(#Pz=w! zP%tHhUzHZcIx<4@B0kYmYbr5hr8QqI__jwEVg(h!2O9LZlid6QFDImUP5i#EVKx*S%NUw*h;TYH<74?J-zSHQ2Qf9!O5gj zw7q#Fm5`<^h*gT@^5zC)vCJM%$s?JQl}uaYPq#}qd8rZ)72X+Kvcle~^W z;FVIypFZ}sCgElCYT6Fv3B!Bn%H^ZII%R0YMl)xgXm|&zZX+Lnk)(a&67YNe3{MI%{{I2%Z>UIWxjVEG? zy{+Viuy-Nqo$olE_qQrFp0dX*%X5EzD7Y`6R#=B;Y-YBShi}~9{~ZLAJggS) zW^aOdeQ0zz@`aJqZB=h+EoKeN!i?1O) zF*?TAEIgUY%qy5IKfjl__1my85OAmP=Lq=35&T5`5f6ci>?mPcNTzDjLov_F`x|O4 z382e7#f4)`)sa8V3plVm5??=i5X}gEG8s9R=!TqwMJWE8QpP=x$_!rH*RiR6ltO4l zfLCY)cjgp%c)Qe%sU9bVJ(?MNA7$1Jy7^NWIC=7@njCv^vDY3`gEa5? z-e+DVMqg>PPr)1RhBRtXI+HtutpuIlA1n&P*6rLbE`K%9AmR!hKC@Dn!kh_qV%?g4 ze_PYApK$CT;!dVm-BJ%(z>W>lZdQl146X{44(@70{uMvuTX`b=CL{mwNKWIsRO3Nf zLToPhcVUgc!br@E-|RRT-18;KmA{fOThf9;tSFCTy#^sKeq0dJeIZj3{H%T9K}c1* zD-hv?a~>DI63T(2@5o&iC6*DR%EuV9F%!yWTLhd@G`@a_ssZP~pJ^WOcK6%xC{05? zn_~0LAC&<+9!FB2p96Oqw1>V7Jq}6>7Dsp>AD(nO0{`-k{c-je6xOkD$`ZeS+_)HAzdWG{)x2C0P=zMI1;^> z&7#{U6TFx&JG7ZP(ZWQp+{BK&+as!yk7UAQ^+{RaEVcxLl)1{+M4X9zknq?H8ha#p ztE#m$f>ZDzkl9ui`=P2C#NmZ3#2dl#OtMS){X`&k>{te;Oek&!XFgdmv-0P#XqmED zBb>pREF~8$XLzZoLTs7{O&Ea-!Gi$B4?siw-<`g}9-}B%4vO4i4&dnfS_!Q*upRQf z?UaFhJ^Pw=awL!Y!fHD6F3*DekoV_HTCjJxZ1xBpZhfK9FC6+hovt7f?W5IZ&K_Pi z8Q|cVe}~^jiSRYvhuM4{h=aF&FL7ORE`5R-Zfdf9X~&fsDD!6+u-Tsw`Vo`9j1?SA zjUBV$K>^;Jyl@Nd!eRoTH)j>{qn4IhQob@;eCCp49yWHKNbU}nR=GYrvwct%d*!_l zsk~_#GiR$rzd8^Y-O*yW;UYqg^|$t|3(mP-Yk~|shVrZ_o~0_kcRdX7EC{G0%+~3H z9)CE#D5EH3a@MM1rY&UI z8(Hk*Rxzi)n>!VV+U-|=)|IQ=fdld+i;)RA;e*j@v$ObnBa@NX+J)Y=$MToJj8Z`f zsi+R`@RY}54#3edyD2(}wBiD-np}y)OHm?7V}-0F@hOd|U-4l;IFDFAwXeig0j|pK9qe$4-!6<+#7FI^ZZOGt8L$?8K?T7Qh;boFdoL^dD%jd*ZIVYwh z2x9nf)jC_LYKJ&t;ml9VJV1W-l1fkFz{#61`W`sCa8?jNuPnFZH`ASQ1u~eaq3$3i zb!O%Wmn)!tk7wXq@o*a;7j?(l{N!3a*oFXa8$WNmo+xo)V%rAfFF=Ui>O?&odv^*)|L-qITEnI1~)kM8BqS47>V zZO7ac*wOLi*fQ6v;|Uv*9b5`$mo14vGu#aNY}M~UZ1PIa^@8$S6%)>0JVf9ck1}bL zGcxdA`^zQV2;(!v$n2f+c>fsRcYx>%Txkxz!0x{qq{f4g;2*kJ!no?(_B8`p<|r3i zX9fE{QQHq&-7z`u zDUB+8*b;P3{EaVdg!f_Hv$AL^L3I-Hfu!eYr!@TW0Ru%~oHEUeY+DH!%?lbuGDwo( zU&E+(rMmy=wvAr2@t`7z$d;-u7-H#U*r=_4)1bT6fB7>}U~_tncG*4GJ+vXe*t4b~ zTxXz$Ha$tAa-K+*lN3QVT*CfSMU{$a6X5&XT@EDd#)vpMSmXX#lNd7#cx<2}B|pof0E*%v?6rKFdEC`x7}v-hk7>^zV%w5h|V zAFpQcA1Y7ELb-Oqqi}8n;mtZx`NY!`8facURcwjxt296R*~Oo?>?|4qWP4+f-Kgi( zAaF*HiUokg9?c)~RM4Y8F`}zE!ha`%NV{J5W#&K>zh#T}p$^J*c{$SZxWim<>4!en zz~nykRT0GA7RhVyT!fpaXas562%#1fL>F=^hahbb26D2w#2Xdqb)K;$l_^lIY zu>shBEny_wX-_i_y9=Ru=>m`M1n-WLSR_~0q+)B(!rzZY|6_n!HBi%mn+_X1IwsMHXGwU_I#{)z@$H z0jbnOyvPtxrp|eX=^XAZF4uVMLQhzsXkfKH`tMs2taqe%ZBJUx#|XXNrWj^p`R(hX zNn4^4tya0Jj%)m)<61+`$cgz+DsYtR*Uti^P2Q+$;|@?Kg z-TwMm;o5@;JG=9FZ(uL8o^en%DLh*P^FGMRYN2Aq0T8QTc+pT8$=)Prs7V0l9q;|U zB8ENXY#vJVjV2Z%R)v62$xQ)0?CL8#(e_Lxbe&ETF_DQb7*D;VyU zab1Tr9n04It@>r`iXh;=cn)_QL__gnN>*suWR@_&&6|WWit?velKod8soqnfH6_%4 z^i^q}d9-T@Y{?ur*NQdSyMe!+MT#PbQf_+}8J(LxIK8C1$dm$NWCLyYdbv?T==0?0 zzzGscgbu;nrpC4Z*I^|>yXH59*vLyH$q9|C4K>of_GDC>u4r@y%q8niuyvzY^sso7 zn{@)SGgZoeA*F5j=+h=*$(@ISiP8KChZ)NId=%~hB2g-hh8V6!bONqfRn8Q$_AG;<0*}@qQ|9lT2gMj3 z<2s{(P1MWZ+4(76*%ff#%6)B&iZPL{pJ}ZuiGt>U_%n z*WkY$I?5sr-<_WK6=#Yi7aBJQ5F1|2#yVl?mqy6=Vhll4NdJpC>N(&!oRDUgDw{$Hh$+qcdf=ASIU{j+{J; z{pu*CCw79#dBIOV`_w&By;G2vnlFE>cYP@L;3VGZy;oA3ES8vhl)5EBR<7_5Z#^81 zlw1b65Ffm&5c`AgN!n#+pYnK3_N6gV z5qp52$lL_V9sDC$HGpL$K3UlNMNw|({z;UZY)7U#FN_o~QKp)$rIP`=p8fVBNEme; zNx?jjlCn-nHT-$xzU$y4p=$;2Ft-%Sq|qlLb$kEScBo8Zi|(1X zvf}+3j}nIVxb4Je8Omf#g!3w3d1BD4hL6m!@X6#ekF2AQXS1n8e-BJouyB)$JK0@D z5DOPYme>yK+o{k!2FSiRhN_GTZfutSV02OQ_8pFq2B{5>@vIp=im^qsHYp5H! zAmk78btZ`pa8yx|E%bn2FY6l>9TBc;%ZoDy*DbJ=K@@zDl7%YDPV?K#|2}aSH_W~& zWf$&)pkJZADrR5373q1qedb$JbQBe`To@weB6R!)P>9cKr+r|T*j(w1;?ezUoF5R1DzGIA?6@37yzlKye!lkV5ZBoL5>2BU!HBzaBK4%Z# z3X@0zw?p-RET_4Hn>)p1a>8k&8$g!UJbAm+zn`q>l4a_A6_d1yIU|P2a>P_Ioov}* zS5i<$FgWDsR?`y?&Vo#a(mmBibr%seq}hQSw^>4~k-GOfu> z*pd);7UJesqx(ujw^Nn6j_qbz=`tUL(pW>x*LNj~fkzU_$9q){JM(0HLH({7DoeP> z-nhh{`tsoOK#keqtDbMsq8=Oeu7l4OW&qOCY1wKVgCM|s8I#*vJIn(QGlRbv0t z-de>t+pv?{=JefJ8Rwab4^<2v$ifNSFoW0@gbs5FZ1 zaG@lGw2|t6203%kB*+Yt!q1kw(QoQ;&)42nt;+I)&{l!O7n1P6l@>yu*7taqwSLeG(92*04>Auz_=F*c$<(Hba?1K2&rtL4C8zPFRnDwh; z8n;?$;<&yqwHue!6Zj@UfGw-Nc)_}bGnY6&+w4h>eGDHZte>zT_^mN1S#R?rI}`J@ z6xQE6kH37M!Hek{`Igeew$1fRjsoGUGa?^eq=rE24neHGMbkfv@k`--^97Q^{T>5G ziWXXq@{1y_8Qwe7Bikz#Uy74ue*FGvWt1Xz23iJ4;l`v?0yp$bgEZ>ZT(E+vpZJHF z4Nol=U`8d?+>@)NkaPx>jeu)$57Xc=FCSDyW4`6ViNZ9r<#-cY-Kpm3WY6LA1p7xD zw;$A`hu(qd9tkj0lqdCyeVt33OtZMN;BKFZc}3@ZGhBSr|B^s!U;8U_!=T&F)8-+7 z(IXv-G?tjE!~4WFe}8r>8syPR@20gKD&C)xOwIn&I{ilfy0`v>)^U|t5VIsU!go!P zUsHU7(y^?$vq=BTsA6Rm6a~zLJxcmI`1vWU;t19qWF=(X)f?J_uV*#)OBlkg*kjQ( z+0n7ptZB~eUB?I|rErhOn}aa?xFR;T0;zy=I?3VmyGz&rNOW#fLb2Q#zWc!=ntQEv zyShT6w&&o1uMTJCSl~u*kaiS62FtoHzBzmgd(zETb~N5qn08m z2>E#9&TMZU2S)%$K_8pD0DNEucTCpTm*cf4p#}pQJURyVZvc)Mq2Q9qmv3m0Utiv2 zb3p!gZ&M<JxAaF5YgwiJuy z{(h(RYokIEej$NDA2Oj_8y|8y0(bd&2t zzqqlS3s|`{QM!pGIZ5nGYf5%pwL{ZC%mh^5vUp0CnmrS^pLaTumydo>ds=3UB59=w zd`8fa^!P}a59j-wqG#~Gi?e{UrbpL==3Qb&-j^WPI; zUUBRs#Mq99t=1HKH-64PfH}uxldE+Cs8;VC%~A;aw~G}L2Sl+Czg_?MP|ogCkhL&UhJ0nPn*sUNqmIhN0XgB3-_J&% z=Bavd_|*f+z5?SAI0_A9#67pis@q>`pEH_e;n{(6cbL%vtx3r^u8g&eovSd zHP$NIA6k&kk>0!lai4BHf>g+2DIjs?*%>Usdh%^v=8q|+f|E{xCF||VQMTzKqspvv z=gl~N8{?pDnWDxG-KzH!Dlo~bd%0o-%pNy*MiE z6&;Y3C!>bPGECl3x?oczq5}k%8$MD9(E;~Thx|V;Zvh+=qM=l_@$WwYrsrTgW5w~6 zifMA@FM&V(A>Lof^x|%$>%Nieb9M0uYhj!B7?*7&2Yw$K^N+@H223WMX9@o}=v;|PH|5ncbz4&a;FEu?h{1fhXzE|aCRpC zfmGk5dycok5O+QdO`E+-#O+L9*Xy^TzaTqbApglHw3iyfe-aJrRg4iS z9D37b1G410p#hI7V)6@*dqcktz@xz5u_1tLxM3YM$Rv;8(XP6J1yn`k1PfO zElTu=1%e9tx|a}s`UTTE2=?e z@miR=wAk4f!87nuXLi8Ze$epXC1AJOMFtkLfOyp`4Z~v`cB#V~6o@%WglEx!Cza1# z<@k<30Zqzi#EIjvpsh#f+m`f3mvsC2;qOnP&Ar>VSxV)JjS5Vqi7Zcl15p88nN3Pt z-B{_bhqU$>oeEo_FZ3or6M_ux|GYTzr-y#4U+o|OJ0C^T`qD>gc)5F2tcSxSIVZ~# zrcWv#mXE>w1vg>yXmLdrp?Vq+k2y8pYHO3ussU4 ze_9YJJ%+0{hmA&v!)rWO_ObxGHRZK1mC>Nypw1rWU#1g@@2(uy%#|Zv4~#a4Sf;WRm_F2uLQfF%UPbi zSi1wQt>x5Pzzjz;Wt|0y_h<}SVqejJHSFk8zM)OzCj+dIDo z^oJC6v#dTRKW?h>MXx5&F>eD>MWwehDt<)b^V3cb9MB5$vbD@Y<8o--_(0 z=QN?-cocd?g?iqEwpbV|sn=wpUckUe0Xr3aB(6*){FkuRYh_FIS2>>}mRiVErh5^> zgjC88ra_7<(`vMCVCHyuJg`21@7$xhGwl{;_YVuUJRo}{-yCXH8B-i{ew#5&?|6WA^J$|Ph*o|(p%q$Hs!($01CFGP%0^VW_noSfXmo ztfAOsQ605(yxRHu!V}-Sj`~5!4YPwkNBDfz^UEp~+c|8&tiu`e4Ir6RKH60d00#?W ziiy5XmTTDc-Y3u}gED7W0z*kiryT~RY9q&G&cx?)!u23ozSFg{rLURz<7!e$o(%vB zlVTLDyzK5y0*m6Y@5Wr#C2q&_z4Zwzzm@*U8eES4xFXu zN5qo>G4Hyzp5Tm!D)Ka9dn&ojJgA3@#yATzhv8c@{h@FUECC!7dxBydk~WD}zCa4> zFrYmL@UQAHohq}jug@VQ+K4M!l(o4mQyrUAnC^n*Oel|bz6OgV{4vAfBXC&|(8cMA zbcyoPqP3Q#>`!d%Z)~fA4S;H5mTOwuzV}T018hJh-R+_t?kE8tG7-Mxhg*{4UFH8K7?%&qS^aCxDDT%-rd! zOq%RF_VsT7N#TP2tLe@tji)DGEu=>+8@`Mq)DIKBHBsD7CFqQr6qBxo`OvYXNf~kD z+ot6u_}Pt%@rL}TI@}LO6~pIC(G6`6!g^2qq<(l%h*Oiz{>ig|4m^u!z!g`U zv5cViWvB$)5j;;#H=U2CI;D}&)xD#U4>PJ5e^!{OX{d^JHf#1SvneFk7P4b3(he*q z7b?UF{|VV&*?}+7{}6)Mf|xRxuvAyPwnkK)GW`HrcE@g|tel-8_JuqfacfYAPKW1M z?$A%-fh*}bAa=W})r#tHK{ghNKN3eMizjRnCkZgAy~2i*W)tY4Ioj5;<1hwjXg~R# zI!^y!=@c<_=SP5L?7x4u47e0?b|q_%uV8EHK?TW6kYG;vP5*Xm3SoW!fklswH<(#k zh1{ES1FH{{?5GPKw$lS7*S<`1y0EOR0}9O?w%g?Zk{WIJO(80$713H_-sMiQ!Jg)e z9W02eN(X2-oBUn}#Wc->Q+I93dUtL^WIoCfhgRPB%PgW^R;!tmqFjWULX#+e|1iWCZQ;k3!T#%rEi$caF{U zsQTEq=mm4(ncUGSg%9AmxPZoI=v-(cCCrRFD`R=>=cQdst)y!|iF)fny0DpUl zL;YJJ;OGUBuJn(1fpaSPv=2j&T-b9Pm>u!kOMV1QP+76I>qZ#)uHeu@%TngRi+g1X z;<6rA-@;>EIlto}atfGBQmVhH4{$)He8Y6m6I;A<8R2() z5`-jzneoW`Io{t7A!02BcpqZJ3E#X|7OZLG$7{)7EMD+?FGC9Mwv5|+R7ZC?A5uxL zL9=oHA)k807U<3V*LO{3?z^7n@QmDX?`9&G*1`?7^Uw*_Clq~|O@i&`!?H5LcZ6!x z0n9yGd?1*^OCpJgMnyPK44jJ;p>fEfU%SeJ`x(!b4e`znHh66>nV|O7{Nl%CYhQCd z1V+pFw92;JR1;DmI8Cp_qX#oO{c#gHFEQM92gem*?XhjE(e%DC4*z1LyZt2fn7BB@ zEuUfAPGAkJbj0rQW0=CRM`tQiU3w3t#d!2W=i*?!8B&!-M0;L?i_+-aPUO~olFo^n z7L!L`Lsk*sQk+aK=HjmNuslmb#u5G7bZ7_( zZndU{{<|+aC+SMk=>|ZR?#aL}*~eIa=TuCg-u}PUGl(C=?myo;D%$~qIofEFxkYRr z9i7_b*UI~cemZgm`=bC3%co~0xOS0F>6`_Ek<5RRcUCL1Mh^yg9gtewHw?r-AWKH$ z)~&E(VryOOhCG*E+UZ#t#S-9sYRIH%bauq z>b$MwE7ui!1R?B^-E(GDHb46JJKKIpz)4y?(su|O)Y9c{OdsE~!n4s=U#b5@$$7gq z{QNd|^L}n^msp+@sT|VMy<5Acp~7|FL7zB=v-s1H0b=9c;Jg9;#&s$?V<~R+tYG7X zSG%c1CV6_uZ0{?`nEu~%rrL}in4u47yZ5PSUeTBEa#&U3X5_de?|jHw2mT6SRV$O4 zmL^uANx!^UW6EdGwKxC9bJ@@%**ikxh}4qYp#$gr2XI-vhW=utspIUQOHK@Yn&0sZ zg?GL-bo(KQIguNKrR=ahZ3;0->1#Jf;{d9ja}U}-uf^exm0G)s_NY;{PRd&-@DEQ0 z3tKdJ>-__HdQgu}&>&uIGD}ypYwFgW9n!_%liYNhT~*D({1Z9GJ%KdbnD$KrxCKLm z_o*Tn7#miV2EXP-y@g-D+7r>!4b#p(7bU`by}yea`#WEo8Bc}W7Dkk*Xf4fDf$L!J zSoxbLTfYF-uY0B1qQ3ud>)lRrD#a1O|DahzRiBwkx?$DS_>kf;2+2P8gNBQLB7qlA zD1))o$s#!0y zbXZ3wwN`ZwC$Kh%%+Bd=x@to1on^F|7t*V6`c%Y`)>xr?gai$( z`Mqu*t$ucXR0o8+Og*qyFCJ!?yzK3rI<$PU7U%)HsmfR5Nt?oCD!03%rIq_ly(;2v ze65~4AZ@!=ZO*c)>%=iJWx)znB zP;uCslH+^*QF-jYurh%!Sd@J)tf%wkeU#kCCOd&uixg~r?LuLeg$HJQ>!fuU_cD6v zSWd)fqMlk+Vd^b#H(uaHpnHpQ$a1mw5jQw(8z0?7r0DG>G>zQ&iLXLC#r7;hODjd@E(tmhw@>8g-qo_`x*MZS8bHhpwfT7F;)9d@aE%{nV;i2fYw&z{w#&t<^x6lzK8c2Yrq5+p8wz@BQY<%#55gO>3+&cvM z>|1sLqeA_P6v6%EK{9&!#`;%x4osC&BlgT0{8Yu!hiO{PJ7j3fbN?~oUwCi!Z8VY1 zK9^ubYH!LFVbGUM{N%+pe|4 zs~wQ!+DBbBX-W<=67Qc|>FXb-cog|MA#vQvLTi^H^9HDvBXFqXGTSsWI@9735h4x$ zTW|BPWeE0Y^pkfGquvu8$DnZsCmy+D<)eyPAddf2+aRUls0Htn7cvY__qmCRgcuy? zx5O>CTG(J}iDR~3tF*UNSesa5p-Yf7DvqzHxT|0InX+RWFS^;_rQfO94f!AFT5fl3 z;YHtLh1)J)=kXJA7(f5mY3_&H)D`*Pl=$n{(86hwTQ9KrtGDvZxOJT3`JYi_D!0?E zGsB(pmPL5G$ywvGKG8?^+fMA_Zh$6@h*sE{>7%%SXrl0pss8_XHmOh=>u=7~wI+e1 z3bqMqJxJDua1Q&n0V^O2`Awr!3|7tQd+aV*0_YtSRDd3Ep_SNCYKs2}YE+ zMEnl`zMUn)=|m6B8nCd=z;VtrsRdo$F= z#Yl*YBuV0Eo`AR{M*NyGg9y%GichNeAsn|)hv*?QHrq2m^Oal(t+@>s@gn4H1M^z4 zCOfl^(*xaHV#!OEW(p^;)bM1s208FgsFJx5H!|EW@b21cJ81qhXl*h?Q4~Q#&2}$V zyXP>kh|=$pIP6pNK!V7hv=_90QvEYV{G;l3L7f4)r2AHG#?-Zai zM9umX#abIznkD@C3MNKn5O^YE)%v?>&3jJp>$5^Q^n?ak_u}Yt=i4Z5N`K>UCxHG3 zNEx*;sgEE zu1<2b!qO_s4#Ws`1q?jAg_Oh@5)j>V*)xTsKQ9>BnE{4%iHL#~7EcoGO~00Ftn)wq z@TMM?RlTwj6>IfJAaEF~(_HpOenE@CY6dTwYMX`@d6q4RB|jjI6ehPRoHBE+bh^q{P6(vi)B&Io|j3>+y_34l!`q&KF$jFol%+30IPN3wpXa~yN-?4@S znHW3p18+B)JMB?v!Q1yL!}0L4gGQ$E62@3v=}?J(Y?u)7&=1Mcv67*>VpKVOj_;=` zigH&>rRJWujz>9@l&Job>;%}oaedU_xp9v&!+oIGr_)Ee<++)ozwGw^a~GWzzhrd zF7_qK>OWTIe#8DSI(T}bTwz~NW6Ue|_B}pXLm|F7WDAdT+`<+KFsOV4_I*C!ORTr5M>+*!3qPA8(6GkF7|@F7U1JgjDF?t!sn+ z>xzk!I@Famceqy-VPw->7de(X3`7D(KqDIlw?hPJnPAT%?Ov8JMGHggD$m@WckKiyd(CjvCNb05ER6Z>J9gweY0&9$>`Bqk}zC< zjcxn)-5yrC9a328qiC&LJToq%CKROdsNY{>uCEAx7w|CMKjN54-0&+-6ocPd^ab@C zZLeClK1T$C{ry@I#vssGce+h2&xNc>ur{8QWmVV-zk{$Z#`IU6} z(@{E$AnHNLnqgjl8Kl~g!hhN2^H-r?@Oe362h+FM6y-_Bb46Tojbp&QlbiywBR!H!5p9HJpDwY(TOcC>mFk@BEMFf6$QkTdsx?xW(stsBWREf7QKu^Wh)d zgL$oIff{Prxsmd(kElbEe7H7@zQ_fO|V&Y7CN;^@U6Tb$lo_^Gl@ zz*)$la}%ZB#D?!=JaN0NfK8-q!-y#U_EBSx4=+UIX^$ul7pGv+6gQz5v`*ie zg&325N6+;Y` zC2pEy-@kI=3NC1_aCaX0hm}?UYahmS3&F6kSXD?_WzZ;tZ}o32Y+J{BEs7&IFQ35G zp|>A@aLla2?%CIq`wIP0XGb&xO04K5dt97k0iI~uN> z+;|aA#3d{kF$dlKOCJ^cDdH)OLph%aV0*X*weq7zl^2DKdo&N-XN zaP)XvxxG1h7@^WA<)I!1_^um%HCA^fP1{^<^3x?u?TYPdRy{~ z2YCJt0`{E_%kvkz)1pv)oF4>~m11)t{P-Yk%5NFKXO%{3ZXUHNf8fTQTlg{R=gT2n zqdXOksz-`Gxb|O$v`S@wG@mJ%Ob{neoQofK`?K{BEyBj=1m}_`K)XY>|BtCtWYhuW&ac@U2NN)y(mo_;OsU7BEp4eP7+MkBrTF4 z3G01Xm@!ems}!6dHA$iR3WWvD`cZyLiUHY(p8AaxZj5qloSVTtJ=0Iy+P2P_NFSHw zU;RNM#!-lYvaNg#5~?R)NP6!>Ue9A;iDK_ihR`i-O?W!ZRiVBM35j%h1nZjM(YyTZ zdpNdectb<{V`!9tko$T6-D!Wp_uUUG5s{Xz+z!y(yLIj#C$dE*d<&UkLClnfvMM5b z!kXQGQ{Q69*v*vt6*60KB>ys}_)4JonK-#ZA~ju6!oV62wL{51gfAsND_|3;{qVPx z>i0-q8XgCr#4$6Xm8;Y#vF9l@@0-5P#n?nXIr^|YNyc!&ngEO+T{%yd(fN5hQ;Xy9t5w{?tFKs}-4m9^HH|FN(gmbI#tFbQ#D^w?O?Fvh2{ z5Sy%X)DF+ze)#AO_p`L{aABPcn4^ZlNzaSdZ)zuGdcDBRGT^LGg|y81aKL2IriV;! zMi{?h;aC`{LeH<}4`9+t$l(^`Us93fk2q}}`>ni~Yu=kc(*An*pEz=wZa0<31u|#~ zDE~TxS@6fT$0uIJgOQW>$jP39wVeiSU;9N`}o37aZI*q)eY_5e>oQ! z(Yk`tI3K@8>H|)Oo%RA&u_&kUF)ig>no1UR185eb22-h@ekZ1mUw#16 z3yS|H$;OpCT;@Y$j{A-748D5fQ?K2RdB2;4MvqG3dDLaolz$|f)a#w=CXu3kx6V@g zH!FT*T{{adVy?tiTqfob_(Pn*!E{OjM!<7neyc7ZbA zN*N!?#;?6i?g81$4|ARcl58~()F#Ns7ysQ?%Al+iN+T99a6?m&tiKRPYKpX*>xTYk zuDzH%G7_rapf(7s`L6}W{~jQJ#@1>9CWfSk z%aas4x=|Uv&dDd#ml`QnK34YK1xKp!Wk&D=;t47E)>%R3ZeDo6RPX3p zUe}CfFaNBT+R7bQ2uH<^5v7KNnToNMX_{DZawW`Qrxt-RS@Y6TFjL{XdO7I+3aa1g z4jUTXfY{&Snzk2Q>~;2(I-{@lwg*24F~Pdp`aASgA&WLDhjo?Q`m}Em#u3{s-h^@b zzLzWI&kL4!9HI7Zcb|zZ?`*ZgIxXO(W!-Dxi@0W`^7yh9h%aT`DZMM7xq!%kTArBT z!x@Q4MYG7O!x>{b8jgd;9zhu7%H->EG;JBp%+=H^J2Q!t_~V@L{2J{OvZZm*pk-}s ztArcm8=))_Vz_suhp@pK*Bf^&Q9g#BezgDxRZc7Li@=@{HVo}-Juj;G#W5ik|Mgpr zD;g`)StbienhjwU&MfpRMS{vt#H(ScU) z;nxxTUitib9a8AdT1GOVT?z|Se^}-#>!inP<*vQz&gE9}0YH=7^ zY&tg_B}S~h6h5mTmc&&LP;`6^qjz3d=aK}a@`acmT#bcZ$kKq7#zK?nCbE$W;%^GS z^${#5OJdoiLFz9RoOk|{kK#(J9p~R`ZR>fgDq_pTImw`<_m0ky>&Za2VmnTyxG2dy z{YakCuKe` zc%zwNs+;?D11vp6A|j*k-TVCXyW)MPRI+7@tne356_?a%9Bj&{Q4xbLa~%93!y)QT zXku`IUt~`I{0Y9s*83Z8n*OxOD9_KhxiHbK`lFrE6~F5kXOV>&@Nexk6$0WYuwH7I zGKx3lG)A^vifw{+z<4X-^~-dzNz?nwe%HrCLhJcL;4M6Z+$W9gpb^iTFjA$+2`26=JxCl>9cYJNXT_D5Q%cV|t0qMFK`~ z$?McGDJ=1KwR=3cT)I#WR|g7R`3ix?>>eb%T9Q&*11RR6YCq18MAIC}`%i8fLA|RB z-{uTL1%&Uha2?m--7Gm5^3r^DlAw#9c{-rH8kEIrg2}#;nti-t&(No#%l-{0bo5a? zWp?u$WWBtsVNQa43C#w#(IqUFS93mT+#A@uZm&4jz9j(`Xew;+#`b7;2j$__2wP%! z_d;urRL>VC%+9Cbk-xI9)lKlqbRIOmyfC=m=pY81RH`jca9k{*w{r8#XZTI;@JAv0 z6$UIhwbM(oALSraNu`IlhIIde`xy-LUe@~Qv&qLnNzWROLkmt|OCk?00&NsN9D%N%uD>pnK_8OPSRw_f> z_y?t&CH#Qhrc^soo>*&oV}KB}G%&=M%qwTPSR~(0Wff&5#5nPc-tRysatF+HR*}d6z#N zt**{n*g22f;nTN^`utbh00;fjx$wz|tMLwDT?~thgb(Gia7eLtyJSQeG8*ACb-S}J zTP$!fa;mT;d0a(5h?BTm-6R&{kAkqLrTWp1SP{ZXpDrBZlOP{{Q*voq7J#b-24Xwp z;2rn%1Yk;esf%%cwWaEZ#7^kXK3ZmCE_5#uzgoM`0GoNcUg7z65j;ETSoXVTzB*$v zATe?J?0i;Wgk87ZPu#ThZ`oYR6g49z2aG(Pf4R?sFB^topXnBV{rr*6cN^3456&pB z;lhcQGqvMqpJ8~%o7l8sI0~isd9r&_(%PN&i-gQr@z@p5lWf`WofapWf6`CkbtPh( zx3(Wf$OL1t)?a^O2hUhVmz^>wzBk0-iKaAvrG!JBw`VR>fXIG#)V~xp${G6ESQxLH zh((sfO80rTkuWo?hVsezJ@Rec;={0k;L_*dApFqHQ_jdr$|^Rdjeqx~_tb`ac6i3W z7d=BjL$^Bc79Lt8(pGH6P6EkJZD;>TBJP6ew-2KWx-}W~rs^LU>C`iC3$!ax*-}BT z4)_wQmYu7Ef7kBR_z~Efp_r%7oZz}t+-OZb-2{X` ztj)-MI*|C=cj$IzxmSf`L>RCF(pcXQ@T|jO?)Mo37!LTS;(vO~dQmUyHOY4v+PIJW z3>&f*sYd*-Bccwf;t(fwx7y-JK2gdWo+xO2qMME;^z(-A!>2Q(Y9ybhf9*{KZ8*0S zFuQP35T2^h^!I+$ys1$j9r!M1kg`_yAk z(HYH(td^j`;S=IPR!K>6+k@s%)wgk0m>0&w3n z>qCE6RNLnKXAp(yxs?$Q1Zl@#8>w-VcgG1^mE-6!U*A+%(9~xm)INOdXMcvPK@r@U zolbgB*OZ2M^x}Y966JEOmOv78p)>F zST^R~iRhkn7MM=D>P-9mwZiE!dHpJ?n3QK_v+cYC&p1HHvK`TC7hR!*>-}xrce}T3 z%Ujh1b+ydpNjpw?Hx&qmNqr7c+Qh9);5dIjyAp|{8Qs8A@j8i0M6H&2*8(CyhaCP1 z3FQI7cK^37J6d0As&Ec^FRf@hpzxo1-M{7rp$gwx@rz#k-W$Qkbz`oGHGxQzO=#2=c&OAAr8Im$Ar?FYh%Ws$vAR#u zB!iZ}#g0Z%;6ZA$e3S-q8t{5D!q}|4xR{uuqlE0dxQLt%Eul+)J%srG8DZd2b8In2;p3&w~w;AQCCK*Ytg3xG!67cX`a3` z_g2uW{{k?awq)GRg~}3im0#GHelrE?D}G^Z-2SFoI2HeH`}b(VUkzC<-j5MD#s7VD zZzIPVkRtKPHG;bFnDKZLWvQQhWZyprP&uBzuPG+m5CoZnk5b_8nh|pZz!n$Sa8j^v z7X&_bCl3G^1nw^g(8E@Ms-tny7o`h0CE{Kd37NsaUwqE}7}%C-s2KVlrv$SB+3=^Z z7aL;mHU9eO;~;(s#@Xs&(~*~Xs6v=bcv7GE4^x`rOvr!vTtm|3yp>0=?p* z=Y2)=|5n8r_VKmlzbz?u3yC?ugT}Cf4uu-tAYeCB(>g9Qj`sJ= z3dQzmoHVyhQI^R2xpzOVOd&IVROHr;r{<4FR8nAk$dGa?ui6t>4JGO9pxEQft{1(* zwfl+URKqz<8p=aJP_*;#3-?%%w(}gv?GLaNeUXS4-7z+i=1<37&0_#jsI6Dmk2Lk` z_#4D~IuoysZ)EzbNEgmEWWSWCxmfeoXChtxN$A)1Z5E-4)$WI*Vl8l!xG!ym4;ft^ z!6ezHOx+pdosM9c@3huCJR78>Uw`wz`~@fEJZkA!=^>xi(|3uQmxV-}O1xUB7x=+Q zU5X?jsJ5l*CBbSSSS~|RJ!=-#gS$s0lL@K6HNkxg4cwlCt=0YAiN-yLfRVWRw<<}T zSPtUXsPDk@;GOl^yB9!!*3FPvy*huqdkB5Sizv+C-+8>{lL6>%;z}#H*qf^<7-;Da zR?>vDA@bQTyS_K)sTs4Gh>Q>}LbntS_@7abr@g~^dhZfVXs`k;ok`vgHU%bTjvmjc z;Y#5=diac5MMuIQJN#ID@abJhVkR#Gv6rO_0B6j=)FhXl{YZTgWm${?N%8YdN zpl%i@23{WhBv3jJ@1(~24>wetaKBhk3aN)MbF7d=T8^{(RuB|>cL&un(wIP3iCse7 z9cEiyi09j~b&F*TPMit@1u^I|yPMW*KDARC%DWuSy-?c_pzOJ_%T zOzJSyNy$swSyK!+hRQ_o@3LQ+MxhV-9A|kHh`cu zsjJyga8!dQ<=Q92=9v$8-u7IE7)O zEW?5&gKNYLg*QaQSoXEjwkDn{!R4!HXrjbxO7OkcJl(>g1S4~0Om?qIFx;a@xRVUu zzcj?NBR9`2y{|ItMBTcNjJmcuxba5E9L1t(9b@%SUHJunoS(ER?{!B?Xq7xR_)CQ{ z!xrR^eu!QBHsw=j@}Ksy)&qTE=({3Z|8#_cYE%dvo;P;gk$Jo;QOFzDo84K&n;m#e zco(BNzjYywXm6+4{87Pm5r>U?vZUCJv8sNIiG=do;S@xE|78>Rtg)b=<-KpJ*DWyN z9sK)2^2^o^Z_o>fzU38h9Sp5UMLTs4Cp)4uM!ZOYPrJWIT_yIQiWsql^p7lwDX6W5>+m=1xzdS*s zK!A9A(B$6yS%~th#`~lFMV6Zy#UJ0pdKiQZ)5VIdCIx>sSs#*N9oV)r{r+BF6T%$8 zs;9*&z}8&*>gVw~j$V&zMiOy~#jSYoy>r5qt`UhIYehwF1>-SX!=F|}kNSm?Eh8I; z*1tB95@EP|(Gwj7oMu$BMsy;X24?!gKYBCd(~C3IXNR?@^`kuX-Iozn^j}gU8eZuI z;mvnQzrKE#;TB~W&d!}4gPUaEk)&4wSDO8z`sTH2fz~I@uu-}jIDRok5nCxA%`DA9 zlWZ-qMuz^p8?j8(FTT9@-#hkF`nEJBBtZ+p_^8NN77BndT<_^LkBf-?BI7`#oJz(g z#!6FnmTrsqrT-Z(7;`u7<0k3sgg{GO{uAK`lNonvm<`v?z_Ip2vGb3TP;e#oqfCV= zDoAA>BQApXe7PcS3Z$> zO44|EdQ|&VUVo;;cQ*sET{9Pq2;r^9;LCQ2R`P{!iYl>wP`&T}hFEBu<0bx_L+TVy zEN{=eB>Qf>HZwf-=^@-hR^5jJvCP68^99ozMe7uP@X=q$DXm>sG)erY^Fj*Fb`!YxibB6;t)}TtRU_v@ zEVsXf%l*fLKcn)}i-r)$SBh-w^)iBglGDLDJq++L3MxbOupLU1b%C@6F34w_5R9*! zxRAwl_s5YT-ctQ~qJr?-<}y_!USgMJ3%g65x|k#yf1e!hsAhc3b-v2NA_nsXF`0ej z@x%C9_1t#X`&t{<2nvnuo5WPXm948C6G;s@`mY+=;$!dk+9TAPg78S93A?%;w?l^7@Zl@8dO6bLJ^?$SBt`f{|$PROTqCYQ}ajO8G zA#(Fe)6&H?6H)X4Uv0mJfzR#QX?6RMv_-^Hz*L1y$~5Hzm9*hgmT2xy-KPXn`m{=i zXzt?j0px3wJVZ8`(<7f^^XArSVx?-!^f)>yk070td))?PuD)+pF@WgaEsboR6Bex9ofWI*n`!2NoZk=8p%@w9p2u;Si{*}G$< z_GOC<@AP;755%|4ugaNb6vNpQYsEL0CdJ>s8P0j7qFtsl_6$^xuMyQvkVuzi?nKA#KIfzRm->`IU zm)k;Z(=M}*gb(4ESJZVz@Rcc&6Syg7=AWI1Nb6LW`pAq8C)_%$1pnipsJA-GMUfUS zO5HdNYfeB8jXY?ulIE62*9W4}ws4|~)c8QBGUcQ)OP6BX>KG8v95t^u;#2{-Ltkd| zYSUcc=nX0LRl7k?es{mdp|yfkdxsk_tC9X2z^FK9B3QXybrd9AkMOAVIj8k(71BAOCX+wu1(qcTP%X& zo0Ed2*RH$VXK=Q9e|Ls^Uqc|4^Q%R!pZ2^~e@Y?g^S9{dOMZ^_5Pb3!edppo75U=R zo=(0UsO0CnC!6$79&u#u`+S#0vSv0`d&;nI%L%MK$LrA+hv?tCzEcETe~W*IM2jh>#OIT7-bjav0^U^WLBOUVo0S^A(`k0m+H$)i?<*~UG( zp{|^5=$FP(PJIngiJ6v42PaBf1Z-^V8z3VG39tC<-3A_}dK-_IqBGDa(?0C=9F!Q_ z&t?;?$%v`GHS;x2n1Z$#jC4v~vXB|aRP9|0edrTacVQ9nGpI9S#^~sl@=1V8(kWiS zxg7g^d$ap`Yt+ww@jfM>=8GXlVnZV885=8oPSO|%aZ87c?(VC6G7JK;?u*o5N5e$P z4w6NKwjaYYyV|CP$h>aQ^(m7ft2PcvvFL+0|xwhqDS6pdFz`k63z+-qqm1-7e`J z9WE0Dci|tOrf%TJNvg{MEy9v3+}K3Wpz!5>;2{rGY3?X!n?whR>;2qm5x`!PY=sv1 z(!6|*9+?R`wd1=?fYa1tmN%3pP~3tsyi0Ka=h&Fu`DnixRgNZOsbMaB<_g{|i;`63 zoGn6BG9G1q&clefnvIANM&l|+2F6G`oq9vNCF?W6;~7h`fMx7FY_eVf$KQeSJVs{4 z+Z`Pod;4}4gBU^^>-pZOw*A8`lhoI+QX$0WHBq;WKj_AZ-(yI7rm*{GL=!xhl+hgOX zRZ;06+$3Bc5pU}X-(M*<@IqeOVW=75m)wltG|-?Rdi?IzIR9o|trLc+52uF&IZDQ1 z>s$k_td)MB62kRrgbqasrBpiOLzCgmFt*`bTPgZVHgywP$TDwedSrCex7fL4vNQ@% zz_OqtMD*d8x76sD0k5cGz0Q+*X7FNU=3yaAN<-UsqDX16-5z7Be*Yx706y$nhXb%SB>Ly4s^_=2}hTEQ>H0;*$JH9=hr89#ulg?6#Y6IeTxcCWKo z@kP4nKF`RY#3W0o?0)3@a(!V%>XM)RD54Qp`r#{%h-SPbhTma@N8CdtnZLS2Z}A#) z_T?Dp(Ur4DrK-b`tvdt)8s?{=y2^Foq?KaH9OqLw-5VnJukh)EZg_!=+5*Z@WBMQx zJ^E`OX|0O+H6w9-Q$o*d{OVp$OBPmFS)%MNXH&-y{aY8&_EbllBe*6}#`avRaO&VqK+x#g4gh{sRe905$~@cpQ82Ux)sNuL!kqo zz~JME$pUlDg1EeBgbVl?t^?FQ)*JB$g3P|}a@vqYUKNfdp&2ph36N5Ii0HR3AWDe# z!)RZ8NG*1CaSOvG_P$vf*=ZcH{>}|jYg#o=NUi^?))6X;WJd<1WC(M-;MsE2SY(Fn zRumc54MANw+Sz9mqA*S>Hg5%*Ai#Ie6zv3(u~EEz3l~1t?oKx{-@)rn7k@!)(AU7T zJ18gAmW8k$J-#=PPzE5EF9T@Jt|NKZub3Ie38-?}gX zuZijPZWfAoFPjlQd^aSLDZruqr%6Aq^klmWJP6H*22(2%kD?JUl{7_MNS?ilf%_YI ztUaPvejn8;TuGbDpFEIrEbBP}sv14emc76`weYW#R;OL^@&hMAXY6@3kWFer}1@%oAaeFV1m^55s!t@&KUr=Gk+x z2S{7-MS)ftmE~GG{C+K^`+$qM4au=5h3YioIfK~;R0ez|mvJ-IJUb$ITp8|^zIV(T z%7G;lcsWv?N8!f-po^d)EZ#Y=U$l|B_PmH4wq%80#5#*CaTFTB?v}O!rfL?)Jv`_? z61|z&4kqb@G5&!rguCi2KhfeRB%lC2ku!t)!WN%&*Is+kO=#h!r^ zX2bP1tYsd}c8;?Tkh#vz>)?!?!ti4!_7L=cs|MM%gW%<#j>xa2>-JR#g# zNhyyNIX|dQ_UVUy-Du~Tenep;uhp4^>PbBuS*&mPrJ-F_*R`inkH@*Btz+4}C;&Bc zdmASh=gQ0IM_T+j@5E~9X8&D;yb*axSH5| zB$-!#7_h=*(olhd`dmhQr{s(MCFbi=8Yt-H{g5AW{cORQlGvamT&a9NjFO1C=Wb6m z*ct}_^$3NuZF(9nmDz?a3_7?>tBLZZl>82pB*?|%FL*5wd+awCAre*f#J|c~Kgzm% zUT?TsXU*q|vGqSmP2AB3*0}*h4EH~1M~Zh}rUY_{L8rYIsKw`lbja=1MW8z`i7}3? zVm<+iP>0rI@y5x?=kN@9y2}8RLS4~c810ZWa^cEO6SxF_q}8{0KwNY+Vpl4?&}27v z^FO|L;mnv=ttdN&#&UAjUKbh|x~aHeg=!(Oa1YCz$&N>cAVZbO1&z;_s}|wSXaa z=Y)zygH$r9$4&jc!+S0pahtQBEqKWrq&q;CbzxT7%lmvXBA zP?n|H9=MH>C$yUxN0g=Q5=gDk<1=yKC&RqaBaIA2Yj^MKcJZSvRkS4x_tdQ}Dk8V| zIgV(nLi#&I^QK^<&_r{fk;9@5+E8o1Q@j3$k3DVR9(6F%N_>pft~|VU;Yp_cVXl4sjlvgA16+K)(tj-OW!Po0+(&?9yfBs6u?`r+9 zjDrtuBC)bXRQRYePE+B(cc-n_ctu`OtF0{RKfKUmI#vy^>3LZTGa&e3PjoQ=mFo?V zCIX|GU^6xyoBAKy784@t_r3@`oiCFdYaMQz`nQ*aM*_U|XOoju?X~@HVit19u>K~n zO0oaV<2&du$VsoGg3mAKe`gu>AQD?Gl;gfq2FFI^~g@ajC(YJvLvef}exu)Sww&Y%(l zJ*&x}rzzeDfM}<(XxCgs2D!VsR3di>+m@m%Ru@M;yS4Z$r(USOTMi&Rx@~-3k=>>J!TUBLZo@=h$(TP%jp=&_jf0%}1VQISYBagJ zk>(v;oBt>(`G8pwo5JJED)5J_`zY^Dk;%g1r`Gl-<>7W>Ak~y9fQhJDazy}(bY?}u zdT&NN1)+M=k3Q<+Fmu$tGng-+tK^v;q7FCntrW?O+^`|szTv36UWDjBxHL63M7o(q zW(+LtyP)ai^K;47R)JtXi|Ku>fWnTG>-`rp>QSrLUJp38HKGFVV}7o42HrfwUq0k} zZ;sM%npWqxAv1Oj|3EzW>?!&Yg~_KDVs;e}r?;Ry8D!8tnu@xT#Y(UUbN311geEqR z6yt|--A0=*85&p+YE}H|v?Lga0l_qim%{7d{zjoRc@+p_5*2|y80K$D*Ic_f5jC!U z?6om2Ge_3fumzhs0Piy0Zwl|F zflUeMjwc1H+odXK77bcmK(z!Cj+ zEF{;=8M5~5IFd#f=39s#|Fk4)t`)d*WxsFSjDoPqGeaD`*$Um9pR-?!N)(PwX$%Bj zJ%KE?x7oHsZ2jtV9tt4ex=t5g5if222&Qi%q zYtWkw1fvmN(vy{z<_M4B!HgvrN9jG#k4CM3A|qd*bw_W6h#_RlzXmqq9l39XTYV-| z9_ly>R|P)CrS9)b@B}Eqi9BY=Z#{KyR>A{7__-N8bbP~jxw_d7bF-9j{#oNwwB0hs zU>o;mRrEgGlaMRLv+cycU)Du{NSTq6WYmF&EVBCf!r3#5XpZWy{UIl2=T+R%{xo1! zQzLZ_4b$=5i78+5l9jZ{a3u?}$+Fu6dI_W_gI(#G1encMfw#jZKXw`mb$uRe-|!Q- zG#}de_DdlJ602Lg(ts({eBeDbin;p*I+6u8N+iu7U;I4uOQ?mPtctDBzPGFtQem`X z(*Ra1BhpLkjZ)xJ8MIS{+l=wg7ubU2h=66D-s01HH3`LnMrOSUz zWo2-yADw6Y^b@Q3!dqQ=uhV%7Mg*Q1y9Stef9VOAhMSP`iOvw<>IuDi_k(yR2CUY2 z!LcU~Hccd#>AH*}sAO-mE!ZVuGUN_jdVCycNmuM$C-OXo=2Mq{WUhF_B&}yxfJ-RZ zr|s=$#q{VxKDMO;U)&f`09BML9nsjakW=&d=Ce8r=1AH+z35+I3B?j^Micfsf8Je- z$_J$w-ek&X1TMLSaPVIvT3#cF&c&zk6745OTiJjm>~(GXM|_~huhY-18~Gq=V_t92 zA@weRVbk}jR~>B|m2rHYx5r3i>Rd<-mTdmW`~p4u=Zu4+M?DBnq`16N<8!;mSsP^u z>1kI;S`!AyBOYhye28CVSqs~IfMiHq#XdkTsEHm_d_df}T>j07w*{qvX3jHI@WukbDnJhLtUgL(WwCDEDAY>?X7k316QYY=MDl@rwG_r$So zP|hX0WKjyQ&7k1IJu-(vALKYqiUz>PYv)-Ph|T5;n!~T7fr)Gd1wT89T*NB!RwYC> zSHuxq!yWoVAtCR9_!AZ0Jpl<7BCtpNfeD^kVT0&-#XVLGf9>iS;1;NLxDk&N80g0& zrEThwbA^35ks_crIas$7aubXC{Lg7D^SHBY*lKx>#56H!j)qobNg~a!!ba2fxuO&} zE47{HQPq&8AfRV$<`UhU;$yqT<)`^@;*G1*e;?vgZ`=L*8M=S}#ReZEL|uB(%LpD0 zy*s}?w7<_`nUAb|o!caZtQW=W6&U_t{$n0fXS^HJ#eqpQz)XEg&7nj-JMNVN0vxlm zXe{g@O)a6i3Qzx2&y37MI-vocS2xu=!6PWO-Budz89(^`{_$F;# z6?*u_a&nEhlCK)4SQ=0XO4!dmh+G`Zy%cf?&ekWKtbaDpZf1?AhuaV>ucedDXQ&k| zcb2QWkbEM%#9e!j_?X$i!zTWq)1`_N&yYX*DcbbPV1LOH-b1#E&*yAL(YW04_r=>h z5S1i!p8(z+w5`>p2!O8i_Bup6LH4*EeA%xZ3j3Bng_nd0`+zh}7cEEVDBwT_;*oT~ zo`2lAkxCZ6UjuVmRb=&7Ep3Vt9)H_8gE=pTO3_!F<@4L)gbsFk&@hv>`282?xxW1k za(lGI=wp8pG!yL8UX+8bM~T4Yutz{JH1+DLsq0-z`kh4|p=%{?>7N@gsQSJrlUaSU z{oc*hI(z5bh)gc9;g!$vau{6q~b}{B&Gmfw74^SH;@=VcU)?=s>k{ z+2+u$0tlRJ^TYj~kiYY#WrfIl3xFTQp7ppIarEQBMBE_iGxeXN#d~*yf*^g$XtL!n zFpsOL2|njv!L9Od6*Kd16K6(k_QG+Zvj?A}#ce9SL#sOpo+VvqDg31Ut%B+{HEDEP z{xL$Zyf$FHF0$XFAzla5@CNemW><_kiPYL73tOO-B+HjwalJE4Y-zcFqiIhU;13v| zBcq&Ad(PIO++msjIuO4|{3ZXatx2Tt61d%-N4V9GI2<#C++mhQ*8T(+4=y)hXZKh^ zQb8YyFMkwlqRQbkX{<#ieWguk0Udbxm6y}@y=Hm5?C;vRl?TYy*JLCv3dO6r5@GF> zUE-|_ZIsM-FwTNsJBfJ40v6(?j6FlCga}k$d|(ik1$0N=7sQB2`dznk?8=#?-mYI}ox@eCb2ZH6D=j!*93vi?5~ z^ld_<^F9pKgz`q=HB2=PiJ=`Tcd%Ys!ahz}XP!5@Ic$aa(b3djsuMV@? zX8cRw1f(z#0lU}xH%;25iN^o-Lpr4)*d@HHs?BF#Tz-75t|E0g0#*^n@)NZ08*Si4 zZBt?s8E|bKxw%z4f46dZL^;(`fEDCn*TuU(6UQuf+n^Exz-V-}8;o1^h4XAqTurd4 z;>cJIZXI=mTQWCRk|{S^Zto}yUi(_DkB^Nvn{@2e?XzG1>0T%SauI$*F9IYaUhNOK z7Nxj4q-Hx}bh=Cw{crZhNZ{7AKEPw#L1{PW8EOKyA(BL6?)^9eN7^XzU*<{DrM*EC zA-21LpDUQ$m@3=spP0@!PdMA0`Xtl-7YLAs^2_P$5=dk=d-?GpM3eKkQ+-~NJ9uwz zud^9QU{<76dK$xE3t!sXqXowH_C#k-h#x$RAg4SR*cek){4-^Fqrmlm2Ki6BEpeRu zf&SK0ioSRBvR}2B!ACv|?>R-|PaNO(axL7_s!AbMK13Xx48z~|*GAgSbpvVL7H?~$ zPc~I&{>yeyXS*Hum!H1RS*Tmt3R~F78tf-11Gt9Hlxm-{nZf-}|gw z#J}P)8CBhFGqLYnT-dB}{D4XTr2XkIV=o!sG^K>%NRbhS57Rt#q^m>-zV`zUMCTch zTA6eOs@4%FE2njy{iTO4Y58GTP9hb=C(1<3mQPP!;rhqJ;_mbbmwB?(f68e(iPu7K zurx)2Mb|?F)x8x%(m=@2HY?-d5W#km2@l1~TSk}%5&1X>AKP!NO;m4(dE^J^m_J-E z=g9l^NWyyKWLplVzOg2V&0H({Qct*)dX_w1eW7mWCZB=ff_E=%N@iU}Mt}biGg5#s z?hGv7G zj1-;|+Zo7N)rQj7@PDQ-z1&x+d%1Q<7)|0!j15Y(qqP990WujYl_bLHfzDXj+cJh*XM1)0z4 z-f@NVC^OIdvEZI$VeWiO7q}!ApjfLQ9m@_gI9=*;Oj|#+YH8aZOqRx6lQPdhA2<0i zsDCglOTEzoW*ww0J1%d^K(lig4euyTNEMQcWbU!y4O0u^`QC=oNbd2Pe?tk(A{+@+ ze5;E4G&MPw4P=SdavTcuMhOGF>bL3LD^S`{=zG@OYT zTlhgyzVvqhsLtvr^F-dZ0W;?9gJQ&td#{3kKMCruGsU3kMOBUm=!_!~r7lO6F0k-^oNZJINMg z7V727Z@X06B4*A~z0Gsp32an^7uw78OE6;4C6ANFYcQ^V+2AJ1BI`+!T(K{hFOhaK zhPJ2|(Fe_;ahqPAAx@d!NWCUcOV*h2&H|kGTB^F)MTjqcCpm?UcyY!FmypjA$DA&G z;kk>sq{ML(UP|Vnx~$^{OWZDyeqWrHVSN_nX(3i+h#?UP(R`ZBP1xJBKB#f+kcB_= z@Z<4pI3JWO;z_^wjrOo87+yoEIYb z43Ic4-gX@hP$NDH-gF;&AYvo)eh)I12}F{fd@PB{kdF{$ ztk2+UYmmHHKPvj9{Dz7lz;7rSC+#=%Q1LnRYT4(AmXe8efrQ^si$lyH`5t?k7mGo% zw919!6a7mz{jI<@RB!CBzxy4%oB#Skb+r;q-Omz_Zjfy`6|#1Q14BYkuZb*H|TKqQS7 zFBTwC;q3u`Y5~<^3&JxVUfG6rPBP%rCxci|QjG_s29wOP1~HgvpY(dVjkmNxJleE( zm_ejf4br!miOdOds>)hRpS-+lKW!<^`PQPp&ETkJ6=Z#pvQ@=QVCvm z2fNFNLwG6WpX-l5cdds*01d>sNpEq#d!WJCc>RORg+M5T^AShan|FLTP6YDpU+RP- zN>!1DNFbg=sETr^5)bBQf9|M3pe{Vj;!3SR-ElRpiI;FcLx-xuee5L95bscrNaFet zb7zo>5gmO|yb}yU%aaX(j_iDIL@1bbG(9a}VmmNMPRn;iOXPLWKUay9M!fxJz`)!~ z=zM^mSnReTL3cpDrjepA;xlwaC6)#v!MtiF2q1=dbJP2`mINZrq-;kk zy>IX}3^XL1eEsDHG+Lal@`v^q&w9U3K*-<8EEJ^b^S_f+D5wtLeJ75BSDSj& z&VKYqu!@k#OHKalZ4q}6E$mlNZ&GR2hO z;-UXOAycZB#6+Ai$$U&4t6QrsPytO6OYt9$cqPqrcyY`~h_fcJm~jdlBoCY}8#pH_ z@ge+U@h#4s9OCfFJ5>E|h+`=I{ra{0MbQ!`lKTDnsry9H3P8f{EI;%-#Nm~9 ze5}}P`b;r*V~bRk1vCy&x>Uwx#8YTIP7`INo%Ml25>}8lu789&!ywXQ=Pe--%fKBV zQF7@?N>dqxP%KMR0aaNA@k17 zg%31_$j0D#hk(YSrMPqx(Acp&`JK5U+26-O&Wo#_ve|g`3u6mVEj|Ogi@jYJ^(YF6 z=f80K0TRdC&jpk@5CNgpPY)%1ynQxue@%C#wkCc(Ql4-AugfC+8tM>bR!592b1$PW z-Zu(J81H^?Z7oozD2Q0JREZU5FX8!Q5GQ=vaecz?>2^7wYMcz|42%s1$s#B{#jg_= z?K=^F&pElSUg=-y_1s<`PDq~D?6qkS_-zC*`DBl47dh_;%=$9Rb5P&ZK8 zqw4>Gc!=f$P>VZWEn4Csnhij&5KoGB8vkeBFuLZy4RcfeIdW;|Ee&G-Nug%^xlg&D z4U(0)U+~8h&}ea9fKl9U5okEfPt}^T=+o#zc{MUA`W?DZG2Uaw(4sCe0HI0CM`>(C zrevA$3eDRY_dlmZzCv5oVoJu31)2N)Oqw>-mWFQE{x@%6}935N?gf(~6SI5GsWt+eZ3qdK;9|DobRT~DeMlXt|0Rj;uA-ckAe8FGr zdJ@b|bzR6qa66(kT z>J|^40;s!4?42IFWRQE>>{I@HW3<48r;Au0Z94R@nxRcv%^01jO+sjufCFK9{UN z4mhcI1sbNMbmNR3%3`hBh}-<^8|q`>w-Fh7j;p1Lqt#zPs5ml+60a#FOT4x!Y-WQ{ zaiksB^5OR=dJVFr(!TbB;+X`T8DvYPvG}jS`^QB;pjx}7Amm|8(smdmRU9*K?b-1h z>J<-(0ut^w-?|P92o*;@nEgO;T0bBhaPrR${`Y#q1xNZ!0}aJ**YT@8O9xCWznBVHt!8B8MgjtdjShe%ci$yn#li$3+lhUBk{K9RpB zZ>cT{a}-c-d={*P8qXlPe82R{20&zN&xfF&_iG>&LJY(iFgrXE1JGa`eEYRq4uHr9 zl@HR8NCoRIwLqhZi{%`flyiZGfzlO+Z+X58@GZ|fK4z>5cxL3WG`UHb`3Z9&{q)mDhgahgkc^`-lGKl?@L%awBTg<6! z6@$1A(!s>2C-e6JiDV^Bn@6K~np0m3v+RRsOqAEIO&j03zm4RBZ+l1vg$RS`uMBpB8-*j!y3(t{Q}X zIUOghVSe;$D}it)5Mezzgs)THr+x-A9r1xUL*T;5AO=waH?E`&(G(sKp7a}Nn8#V* z1o-FQN9QKc(-9R}A2IvryX!K}we#~t&;02+tsNH@TEG4w6DK@5`W-mg4^ zaT~f)OIDweu+boO6SNu(fk84}={|y*3}WY|ebPJktpe(fW9{yu@}EI6aPeucs0}1` z?k~l!6G_2W^5A5ky2uPzwA3s7u70*oonTOqQHtgLl`ZcpWty2*^Ecw-4B~N|4Yn5d zzx2QvAjJKAZbwUlE!)t2#cNeTdQsk0Kxn#hs6qmf*ewI73njFMP-`5XLWuh>1P@Wq z>(Yi^*O%p6#4{Nr1N28_UmC<^DKm2cvE{NpvE`(X3lPeBA?N^!==7(NKMj(x!rvEt zstHFhk}?^@Wtoo?mu1?LF7o4IRUJqa`MJMxRN$!&bw89uSY7d|HM@8OZ{|g)13M`RHkl;sy+$F=Itpm-{ERp|`YmLj#{* zgE&=k2qi)e>CzSmga%0^!stcEQ6eOt(~q9-y!1Sf@MHX?XbJtf&@=$mgw4q+ zaFfqDeGO6tiU-l~8KgWJTa)aK^3EXT$@o^$Cp;OmA;6O{9|AlX^9jb6G5wt02tVSr zZ;Pll5VhEn_l8^YX5OecB_z_p+7BN55S{J+I%vb04M4YqQg3z<{?xU21$SOj|!*{ zNPP=~fu2e2X?_9Hr9slz^|o&(pk{m(emtT9nrAC5I95=j8HD;nW|IaID)l?K2MprD zmi9>>7W<>MGe{m5Kifh1`RPDHyZMb91%Y}*gl5t48h3a)PWAYDe%VzrK-`x(gmyFU zcpu}W2UA|Et>uqIacPixu-)egr+|jY5D_cpfJTdN-cIx~24P!DA#Gdwx%hP=yW)rL z`T<1Z#C&CrE$qjhII#^~t>0o5jxB@OQaQw>nnL<5R^voANWR7Ti;g2WhK?&B)&Cv< zQdj5QMz)lx(1Gf4Qk#AKvIlC!9)4pN1JD=OR-0+GpJ%Orh>{PpF71b^Ljy51$9{gq zJ2WV2BNhV?zr$Li9fAJVAXTyC^}k*P59^Sk7fE<&kj^U4JIo-RRi1!BgK&_}`^51q z!*_tlDJN2~0+CZLN>B(9E7Mxdtw?h}&pS3qqC%)=PX+3Tw{C~`8i<@tIm964P*=Ql ztA0HJ;ZBzSx@vr>d{um|N0=4dt^`yQ=}i5U2SP)Vf37!{@!lmQ*dRP8(w6k~RQ2~d z(16ea@^mtYH=isi4AhKOg_FIDR@or+=9_22zt)p}^DVfhXLxaFIEEHp%Aa!%jSi&8 zNxu17Lj^PzP`V1niBIPbN5*O1*|Z-2Yot(v*ivarT0`<<0SOJs@6^0ENM3XUD2xr_ zqD%Xvm5y&>@G^*cx_L{O&QeGx=zF^uOi@pFrRRy@F$krj@)!i7@>bR-U3tr^$N)8k zcOEXG21$Kl-Q&lBMq}=DpLB`+7jd~VNO}{wGtnT>n8I`CPk*Y3+t4c7T=zOr)&|L( za_l4wOzxpQt269tneR6G|cNHTs~7PC$c{DbQ;`n~}d}uNWk2K0GnAJw<+N zL#ygz^#zaU1>#uETj~^{Yy~8a)pu|UHb^R-KO4C;X82HgYqz@n#Ri0~D~Bp1gHJ!# z73VL1cO>L*rd^B2n1XcJ?<>TN7$n1fN40r9GT^Ktq%uOs99W z_$VB3M=_w`7@Dwv2>Z>4U<}U7q)!Ns`8Z*NOOG8bIeC8Tejp^Lq$MpmJy0Bl^;jsH z`8w2K1}Pua8*oB4h=O=hrwG&+OHSXp!v#=3j}iUrbV0nQ{3rw(6h)AT_%cY!U>_qq z8bm?7^j^^cK93TRZjda9caHnU1C1V=J%0XEi#^}i>Z0ptRestWf?H0uA?;4BUWnj+ zgJ`xr$?Wgy#W3+Gf^OiSA*D6La zWDvhU?bH7o0%{fKkgipX#?~OAgy?LoxQMCr4AGT}$0C)rLCQ1zRX-hpcrWGM=Dno5 zoxPXb-w7RXb z0#UXu?^9L8ZTfBj>WL+Q>j+vjNajNueWO2{0;W*BdJlTb?Bas1ZYpu4Ak2 zaiBhf0$IY%#%<^qJ;5&*5EGoVq`jD5z^B$A4vh43S}pR0%UnR+aculSM0guSx)m9D z4J6Wvjp6GFs1}d-OsBcM%%QrNy8>c@^TBLzJ|z$tdGo>4I*$?0#rfwb3{MiG%vcKP zRq(y*c7ZCwI_2^*P#1zx`nhh5VHy%Hau}WB5Bus1YX_eajVZ^Op4DEg-dc@dGwUFJ7WB3}W%-ebS59j1u=<2*lz|TGESm z?k&-<7^D{OoyD&c>+*ME=XG*TRUKXSIJzy_{%jDHEfRb#K)jD5;qm$p~4aWNe6{N{RdoX%+Q6lG$GqBved?cl`fw9-n`? z+<6=*cOHj8(o}?g-u>q0KA`S6?Cx^zbAyPPjs3zQa0Znzob#{ppOrp=@=BjTd8JRF zywWESgCt%*K-~zeaiAwqH6F=#$z*R3<0KPc0^u~94?#UG;t7P)Y!2m>K7nwWO$JkW zC3UpMv~}V{Ug;BvN}t)c$T*u%9KN^d#Gy1iLT2Oy5_w&odvT;3(?_KaKtsI#atI|) z4pri$=Y=d~HN`!J?wl=La`Q=#uJE;68$M+N^+zc8~QKy zgf9l+@p6>hMh2m|`%NSRHH6$bH%KW4NSs;UkJNyh|9~V#7y-@(;ZdGL+_X8QQ-pCM z8KhH$6&)83tap6~fU5sJ1o)Ka5I*Iy8~{)~PLn)P3_(Mf42sY7#n7Au)F0mgpBJCw zft3&DpzsARS{jOn;B60TY(oboHQ5LtG>G+-L#(G1(hv5}3DPh~KG?tJ`Dl<_Pp=m( zRaq)&pL+Opv5FU{#>o^{3;`4syZW<2t3Y8R|-UeZalm{VDUwnT*UAWx( zLILVc%j^S*y>eLriM`?q)gd6USAHl4Q-uADRX~G4dYp9ng$Ig7C-%w*1tgM{+=1oH zAh}oW_Avk&UEIL#W7LKYON0=-U=3m;J)^C9RJd6L+i2C)&+&uMSUFWr?8s6S4c@RTPM0~&~}o?{EK~ngi3};}2r0_r0l|20oQX!?&J&LcWK}t*XQSs|yIjmK4 z9Uu^Lm`o8o|C3rT`70J5gRs`6EomRb&H@tasfTD$gIG@~q}S8OynhU0J>?x|J*ALZ zPo1shcQN-uL!_1!>q@npIgb;%;=t<9GAYsru&fRW-FzDsKZ9rszX8#(*dsBLi z1BoT~#h+5&{6LtR^FCqq%cplZEqVzQi!-hEKezoZaEaaqKjH#nkW4~2Rwp8sL8#}$ zgdPy+=7nGgL_SX;^8r;YXH8J!33G};DxYU-u=xEovE?{W3?k$s{rw{7gG{vccQo$V zmvou89|~w7_VnL;e;&vNDJlG0e~17z*>8G?bOwsy0wM!NHbi8gNLQp58GdnhUZAn! zwLS6VZuWL)+&Ika$B~^oV`r(n)ljDhh<9rV5DMHJ>IxGWwPrMXq7&Wm><$&pU~Eqy zX>M-~@U6n&E`K~W_w-vjB)3+ygyB8;oK(2CCj7hCeIjnTXa*B~)*;(Ty&E2#c8Hzy z%D->G^>+Mml#V}vX1vut!!y-dkrnwrA-=G4mks`0jExlz3c{FBdl;lkJ9)kvpbDK9 z&LaldQ1@RnW1#kMB^ppy41K~2)F4~5wc(Y6bL&IT&frirF6s4(D;t4oscjah9$ylN zxM&L08($I~^l8+04`KVi62xJ;2msV+n>J|4^{qe^Onh;cWgtsc#Pv9iOr8(ah}YUL{?rHRi>Iu^ttmkL zR-P!Z5f+~l7wKwKdU`2?%4$Q3(FI=`aNJBXxPdV1s(T22{d|JN6{bn#8H+EwV;EW;oC5~Q$f)s#JyEwqJwl05K(+X=c-2$i0oCKj;;#kN3#41pkx@^3Q6V5v z*yGlsCE?NddHeNdgv&~suOFD3Mx4g>d$7oTpdhVPd9Q$wa&oA`5=bChCw({F5*P@I ztupoh*>uyy7u_|kTLYRlzUa<&9R|>JoT_P`rsv#AkCYkWO?R`q`T)%sUvy);JrQUo z)^6tXy=lV<6CMOiOx#&CWQbb2kTbe+dAaP;r7|CvU2HQ4nm_LNGX=CjJeV)IXbrR=mtERY zE57XB7;zxl?Ux-DQimD59x2Dh{K(VtP(4wM1 zmAkV6E%tx}mzHM0`G7>F+t9CD{nEzcSELER}Q>EFGUu4;1TZnfQE~qL68q z<$Q{>U;-@{pHFWTzixTXr?lfMa6ZM+9zZKHE$O~nDITZS+}I7Ya(q5LT)YfdVOrA9 zts1YV;|pjt&ZpQ<0cds3r?lg1a6Y9=WzG0}y0VzNwc?K7Q9x@mn6Z5eXdTX{w54@9 zpVC#Z9uu4{-}Tw%DYOAlIs_ZWLvUl!(nkNMPaAU#!Vru+U@r&JwRCRa;VEfeu4}lJnjsVX-vl` z`Xthr{@@Y@5V3Z7pKAYSoa&5I+EOp?wiIf_MWMSe%^4(foqpp9c!2t2OW;SmwhWTh zV17aCVvwo^)0(uHmS&t6dCsrR%IU~Z{QjHoRyXlEG+KN|{p=MNfQI7%_yCV3gQO2e z!v$6#p$q!981FGfvg%^y#)<`_&kAVl_*woG>N$fbTo`PFsR^n!NSJ0?L&Y;H*UbN44Hl)TD+L7nmSb~aj2gQQ{RM3k-u5#}K;N+6Mc<(i^TDDH%%#31VC{}R0U z5Sk5=s;wUis16i|BLfLvy|et80@NRe@m^yJDJKSF9d{p25Tm|24&^v5`S-W3bs>+I zn(-2N)L(@_L-8)S!PVD5qp=Ipi5q54;u_FEqsQJ0o$i=nzYgow%YokAqdjS93=zdw zKx4ANQ)sMsfnVjp2|!~rEpfOp&^RoC_@xRoZoI%xa4`sIJl1Y-?m~FyLjyIAOlX2XpFpb>HGfETC!P)qP5Fc1;@( z<}seR0cbjwO8oW$nx54i`?>+m5TDFX7K1rsynMebAfeqor?@RV6MYWGSsqz0kdP3J_bc6Tjqi@D>IdDM}V8`HOn zgFr!UFuQA;ATgzX4v47W9IC_~3eEHVWOk@4{@fJQ88JvcP{-NJqlz5DyC8>pVrY!w zb2XrJobW)(hk&Tyds&lnE~SguyKD6G@lzJ`Hm2q);<9n||WycYuZ%r(`fy zI*`^x6x=b$%j(}2xOFe)*-#xCJq#IY&HA!yw;dWIel{=Z*&BhzjG^Tobmu6C#)_ep zHuOY34vj6ORJ4%>kr+fKUk4f&C|$nevFOqfA0I1i3QfRzN*CRPvAy?MzwCe}qNQ|# zCypNA9Sgqvr@eR94T_h8AjpKO32ZX5lqC=^XYu3(;zgvsrE4kv!Pr@bN>oH~TsPkC zzJ0pBXLomZ>)IkB76zz@*kFK&4Js<)2OGOPu*DX;ySux)bI;E2st3>i=;!;}nc2B> zXU?2Fs$8#uTBM^45*S0YV`*_l2zL=uLm7?z%AYJ6E}*V(8F$baP&zl04L1L~|7(^f zXX(Ug0T$oU+2SOEx2#4`sHO;~l}1!Ts!97lOj5JQoKhkYju9MDn&5oON74BYL}#RW zhkn$-M2-XyjwSJLIgnHkuOS>qdKl!p%>Rp(h3e=1jPqWSRwnomV708Q2x{yhNuC&b?4tewY7U@=v^xV4yOE6vy{*P>Zv3IS+T6s2-d7f26Wr&YcOYm-4zZ}l15fkCn;)q}->7l`W4IW$GK zDJ(VNq#8va)Mx^kMiYoMn$RgWe;jPu_8gH$eWHdS)1*inM31AB6H26E8wC+E%{w$A zlWg*LwM=slEjW=z4Fj1*HzF$<-BFx`fyVi4bu$zBGOMoDQgs9*vTUB{psD%vleaug za%_N1D~}Bjq?+_kP0tq}dkFz?n--N9fRJmFDV~WbRs{EGP3TMXOGOhpfTr>rf`-@= za;P4+^bQ-MLF^1^OLBAQPcryx5F;XZxI}aSu|ece8z>!6=l?)#6#4(}igK2&C3Xw- z|Fu%?A(D<5#FmkdnoT2z*f(;B%TQokq{^y61pcKh>D}Y|lB61FD!c0hYO9jI1ZZjz z%RtU6gQQY!_8R%)4N^+EIbWm*h(YWj>Azzek;X+Jv5mZ0YN`XVjpU1ICUN~KX%v8F zW~rp>X%=3v{&)J8bQMR8LEMt^FOyr64#=8hr5kk!VaGuT$2o+*LJl=hJZne_$Nf6- z1qMk4-MdAe18VWL=qb>}v#^Q*b>d{zpOnoBXjJ6!aou%Aik{-p1T+>yYdB~!AmL?Y zkP?pjlb5O#Ks})JwM@ZlNhfnW)=p1b!h?V&;`{rX18HutKir~>pV#7>`IFW2dMaPd zx6uBtSh;WWqsH#9QgDT(S+4ZdR{XiG&xP+$}r> z>5#V1ai1_q=6C*}?2i{7!=1^ORm9D!EP%=+QjQJEG zG3HZ%#F$Qj78)OSV?t=myX*0}B@iVYatNVOdM*M@{O8KlLgTF;3_ak0rXu-c?DqhK zC0Dpy0!<@|47#NvgvNR2<%BZ`p;0Ao1)4q<^}a6NUqA?rc}p|0tE4kNQ+&SsUeb;{ z>2_^FDABC-2nl6%}At~-v34C3F(l?2pEYX<{~V*0bX z?u2r4RR;-w)2|Vz3{sZX{zP%G02%{ITjG4m=cy+Y(^c^Lf?GNzgo3mZ;_YI80je{m zxR?hJskg+x18T-j`IA*XCW}qx2Cg7I@NaP2GDtc$)g9D`g{ePGurNX{@b9WhQH#&( z*RF=}XUHKe3OU4=nL|ypwgwm8XDvAAJRmFzc}p#k2?06ZAX%t!Vu#`-XOJw^xZo+& zGciaNYFyDlT_8PhZBh8BWDW$HOk8!iUmGMX3U8NWKR~_MQQ|!}CM*g$G#-C+cb3Q_ zpoy@%{%A>g2sC9ZsD4`+dX`$>$)FNK29?#%f$F0CtAkj+GA-7^S682uw7f62lG`g{ zgl}%uU}LIwuSI{a6&c~GRyh3+jeV|$&&Rl!%Sl0Dln-QbwzA~!^w?QsM|=uW zGX;c+Shl16-tH-}zd%#sI21?R15JhFP!RhDK_y1H9JGyiF&fb(;y#4CsLKh)wxdVF zB|V!vuISQ+3^bE)xv%a_3vKVdYYFjX=Mdj^4)JxTkovys{l#AT)h5Xp8Fw+)a@_R{ za-X<_+Cb@$I{yjjxQnS=cU=)M;#xvmr)NMb>wb0(p{&axZs7U2r(p9)XMlo(IW!Sp zj@}?81y5Ek-$30Mn%O~PKGriAVJEUz*rU^f&Tcx#Yl(TvThbM~svUEMU-W1G0h4KvR1AILTB>t^>F)FtJX9|7Kq!XtmU15k zAYpSlx2Obw+L$-Gx+7jaaox$sgs3A^g#Zar=UX>V<>51VZqfr6}7+(ALkJaTMdtc)lBgge`}d3)eK#j#W8jPn{kp6tZjmcGc6U3QpvC zH-5eZ&ylLtWFSz>{*k5SOt7}pbGfYgv$`F#EBrl>3JlT)c(QmH#7C31q(7P`+?dc2 z(`He*=0wxp|r-e*C6EKyd?~!DWv75!Lm2`0|>b(YYDkY=JEm( z^6)*bJ0TChI1D)16i66Kr*mTxDx&2a)CJQ2P8&);MLTAYG?b1xNT`TDbltI35=b8b zA62z*mwH4W0q^2rXb@_Yv?YB6yinX)ff}OXXep!x#1%8|ZY0ga1|-xdkCv)r2BAjD zF3<}tnW#}5#C;`)aGJ;=969naHN~M@iP(!?q&JMZgKD_{CJ>&Td3S6WDJ0MM{^Te#L3oeGO7)e1A23`V3MV#_Hd5Ju-+5Bbx## zGxn!+kdPUFMX)qTd3N?Edc%zss25+4zOKB!7M(UZTO5QFa0U?sl6S{aNg*u`9*a0= z5aOULqXL9DsB$tJgxMk3qVW_rNG_F`93+;?(lg`YY>-+i@8c#*9|lpNshJtbPPwSESBTBR9WyGm4(ut?k|-V z{W^pTkBr+uaUrsDf#CiojblrF=GTvgYQjOA$Zdn93idwN65G9~1_i`bA{!G|37Lo- zh^vIqBLEQ|C@Q1_iS2%B2aN*hfom1)L#4D9(3l7mcM#is))L!&`dajM|MtpNafqG0 z^s6BZQ8`p+-_wv@DwJCXYQ`4XUrMYz&Up!xvn{@b5v!-EI8s|(Q( zyWmd%;v?-(I#isjOFtun*E4Or(-}cgqmXb|Oc0@Fqjrh)20 z*;zR`F1`+XVh*W2kud>r9afRY3$5q+Qba9QVZQ^RFWnyvvl*{G$s`**5t%&**Fjrg zkj%T#E*~aPJ^q}Y8G6es4kRMBzI5F+SepdoUglMTo7rNTo6uhjj%wZ_6n%Ut`uy45FFl`;N;e0(UsyaaAWBV zHkz}gun5FCE?mkNsksRj2s0d?ix72jErr4uPoD=vijf*TWCp1AJ;wd0ahmz9tOpiW$<;s@8A*c2WmjL{(Zy?;sqD}$uu z{v^&51|hlUlgalkYgGVoSVY8*4^rrtCInNA|oBq4S4hh7jpTE0a zTIUC7iuilFwOrGH#^Vp6U9Lnx6Y(citIP@uAK;`O1?j-GF3AZDBFrF%xPj%}aRUoh z0Y(#pWaQe6t~(;vGDuepa@}=+l7SPsmQI0=T$^w$5xJI3feu~!+O@>W%*I4=(!3=i zR`V$!bS;MnT?=Y?nWSw5ack*-bllpWMe+xl8vA1WJpoM<+ZXpO5-HHM*cbI;(s64` ztvNJ|0!<%7YdUBKptL(Oljid@6GxPWbY{|TDtGpI`uZGuhvJt8$>6r%*b5Ef980?s z2QW2nAUMSGW=7JQcR-{h6q_@UNFg<)>rNbEOFC#2NDo{eVjtj^V~{j4x61Vfh(j!Y zad;!-P*3D^s${UG?n=B79E3MQ25D~u2O;m|P&2(U0FA`oc(-_01GVB8JXeuafVW4)DYO3B}a!U&?hY^XbmMsCwK%+ph zixZGYZ1oW;S%c(O(3y_h*#@bt;7vD|C@qt@luC?#d$>C-3?x#bK3k1x>5bfSk`VW! z6w*eO*UNVR)QA`6^koqMHREsde%BJJieyY$Sy4<*GXilx60u1@c*Z8(={j%^mgqI0 zu5eYw5!WErQ`(Z=FYa|?5=YA=t|g9^?A_`0R4M9~-q^1v4b_Cb1dl3%q?~fEYbjQI z^%phOF^E`AcbAetK&+;G*sb(R4%8-yEiQHrBv#Y?B}FOFXj~HLT{k9HQ#Nq?@zbf) zRRy0U(W61ECYe4Os7Fis^{UlW>rYrsvs zbMTxCuzb$lSNGq^pL65Y?RVqxO~-RpfnyP#t9m^@@|@ePXrDw(lO^MyB2Cm}2sxN^ z6BA(*{ROM%Q%3bO>iuO7{s~~JYHRSo`mh%Pw?-izS((WYD)H#$IBR@(d{L=YmUbm*!@QzojyJeX74nJAX90!2kOKzdaYuK02&oFUvA-AZIH_3 zvbclBVyNfl3E?)I0*;S-#t}x8U1;8|wOQ?c2)9T?8!9tsy&B5mKj_=^WY{4L;LMr#(y!o?8+|$#2F;bc{4hwCnEdZJffaWAYFE)v&}FvXR!3Q)fTi# zNO@`y7p=S{f>d(|87GJXnv;FRAf@h~-nE3ZlSAzon%Z^O0ZOI-;V1ofTHQZ|YY8zZ znF6iu|I)RDK$Jth|9*F5s!OK;6LBN`cREwu_m$>to+X?iNH*wnJL7|oH6}( z-VmjsiFg&m86-G)Bp!0f;o=E(qWKv0lgDh(jfE|!3BW<>AWUOKsZrT z{3#U<{yy<)2FY;n5eIR$CoO3?^KAy?V!>l6YUwj=;po#JNV*mFC#|3bzjaGcLE7Vd z+(85#Cy=i6H-Zw`AeLe}CcPRT#^u8x<)GM~{V){U1}WRkYKP(7Z4kB_RcZoA*lwnF zP*>zvcmHloWSA)GETGBao6WbC5p#uI-BMAI_CWm|b+kd8v}sE^vt+|TO-?o45-07U zf#srXH$bg;p8lxf)2Dv}wO$U%5ZHdtK|&0k7Wv&EVoFm;M^*e(Wx-nULpN{*>4A3~ zRF9!LHdBL;lG2v6lr$SgE`y|$G^OhfDJh5ALX>jdb%2t2LQ2Y~04XV-0;HsL3bd5; zk!uMlDen#`DTk(D_f4Vkc=w&;jp02Wh_Z0mWKtGR>g0i@irvFMExvR>QxBjkgA5bJ zzYk~{JipT!pH|r5*XC?7NO|lmw<(*wLCRxirR|1;0-8aT1uI#kfY5^GGd@!c)k_*- zpqW{j$!kF)nyztOOZW+PI)kVsoPT$^matiGF8*?oNtWM9D_B2rkdQFycs&>-t#h9Z zCw%WgS&qk(DqKa_1*-jbO9<8}gmJl%L+qK-UNOz}87r*A9@zf5n=qpZ{ zA&|6gFa$p8lHeMb5>1hXby(qO=|SG-v$a6@E;d(#be%8PQawHgJMPOyznp#k3|tzp zfkf_@<9YE0kvm2jJb*;*m?_#X-2^Wsr_J8?Ka9fw$ysd2p4*&^YrFYSY86>m#weeFiNPaD| zkX+Fq`L)b}|CB+}JUI7BLkBsa$$;V_-atZa^PZc6p75V?|89y{LVImkiE$4gVmb16 zHxaMQCml3p3|)7_u=FF)RB?B|m&^@7Qwt}n3R>!EcNbNV&Lj1%gOICoh&)m`)D*e* z95fP(mXlPskOeUlMdEIwgmD6OkQ!Cy>V=QiDI6X_ysaO1X2}%aW*xG3cy)vv)BE$tD%}mNLKO`0dZ-_TVmVIp*-I) zkPuQXLqInu^fO?N@onn7~YU5ua+gV=P_S&}k* ze~g%4gV=Os8Cf6^HT}KoE_M*@k5?+!WtZm~^GmRqlw77jT^4Wn4J^5jSd_S@4WHMP zdmhj0@%-J$zqU^JhLp)-p|x~T+!};S5-JFk^|}{62~B7f=4;&64B}R+o6%R=4~nb? z)Q*+zg^ z{rT)p5qrJf?x67y>W{BN!8e0c_-M284qnpLiq{Zkf*fLX1?r{yC|hliaur!{1r9)i zl&X2Q&5#5Qa;jztwMF=7adHCc0O^0HRn1du&MGiSshX#DEum`8rT|s5RCxiRYR(6a zsyQFi6znc3G#+1xz9PEJAXLryn9#1|5c+7TIRX;;==X~J1~he;iKIU(DZ>ns`sgKl z!(<&mLLa@(GsC8Ugg$!xlZO)pB=pf6USYj8fMyU{hEnzwXhvpSzdNmuo^l~>I|iYT zR+Scj&_`z<0{UoOj=>=G(a{$?lu&?TeRRK3$sWthtS#P?V>mVl1##XI*1#Mhsx|FS zJN$mSe8~rB5Jzd+ojy(PM`$ugDu~ZPa5jh=eGs;7w+16f(i%iYx&d`X^s|G6WclOb zrXu?tNSv+HIf%10Z>cBh6uB|sh!IOJ3*MXxVh{*onm`Z}EJ&mLV-3$u+BWdTSs-4ImjjZ(*;R3paU#xO}GF z$$MqLS#m=FO%=y{P7K3?V5SzT+BY#X8KfdR7u?H4B17b*a5>pI< z2|_l)Mx+TXH64aA$RI7^li|)Fj1RgmWqYXgdk|W@pVOk84M4aLd642KwZCT0ukcM16UCZLR`^f z(bCF|u9+5caWpR=LRy*Hj((6%jLcmjdA(~0vSSHjK9KPH_`yNk1@+u;5!3`4grw5V z;!`9Q(HV_FXqxhtSQdFpcv__`X;;Jti>d$!fhKP$Pxfw5P&pguG_FGip=pxQ2SCbq z#6hYEFfL*S=_0@mVv%GmA=XG48>lDLn^jKk6_-njJE8zING_F+T}x!x%DU4Peo8(d zAoh^FrTo%k5ZlOY(p3eBYQACgG>D}l zt7rg;i~57Zm9jAqNo<7M8jvU!dSUU80veB7`h+?w24V9HUU20;u;A`)WlBhw(_{(^ z;wGNA#OanoI^bfRfu{%0N8{&9@SM#@2pC3iNX3F6h|2QmW^MA=De(mdvG2&KWz&(; zB9QQH{1u77p#Qn)^h7@I5)=e9Mg0HYDz*xsaj`j16!w#A{ zhOTyFnuf`YL~oF3nMzf>Ws#kn2|z*Gf%#nr)njkVm#QoEQlBKzJ{+qC(OnMVFP(O$ z1(|z`+yunVk++l!GC*i=g-a%o5M+KLkFP=U20cC3Utz>l2|Ga+E%#Mc|a-)C}w|ySSo2tI;Ym9B|j}tPvjUU)ssOo!RH%Q z)tkk>&_31Al&k?jwY1a{P+h16U3XCcw;im=5eDJ?C~vkvBXL#xv&sb#s5OAj`mgTV zBIARDI`Jp9)+v8=r&TR44rCL1?(70`vd37tak^Zf$q=36qE0}Q$GhcI#d!^=hZ-UI z_s9cUYcc6(E0%5G-s4gT3)8FeEHH?R_JRL3rtw&^c+1QO-`xX*!8Bh0Qwj-en7*e5 zG*v7#{D!9O3mxq7LzSIisWE+@`=W#h1F<*f(4=XwF;J6X2i2Mvak=-z^BOu2@my(D zf2^K2Vg>!1JpWJs8iSPb{cbcy1`(bpqi%tO{=Lm`ls)Tc3eeZ#MOkpHbQW1Oo=8NVyvJ88WE+D{_=d-Fo^>!LOYO9(0%V(LP3{wrwu~S z@Yl5Z^^6jd2GmCJ7L+iA5Nl~p2v(Dhq66xtig%!~bb|&$3Qhj`+*WW&K?A z1pQL~K$T_?a%u``neYc<{|wTFD@dPb5SNvF;0TVgRv=I-&a5$MnQowV?8!XkHK@`I zQgKG}ok^UXK}tctFkVIm>D;gQvm2!2jEE>U2dQGz*Vd4g{u9dzWh@@T_M6H!{3iJj0@;QcTErVFHQGxp5!=AV;EjS#^ zpoK@B#z#R~1@nc2>Y@PDU&7nB`q29bHJm~6(0j>2Vt>4gtAIgr9X;e)Vu^?hC_qA) zb3}2K2kHoAj_Xbwk&jbj+8|E99OCV#^Q6C$Ymqb!BFADnPkLAT_Af)qtZqFiNM|8y zI0!jBhZ@v&k89uqHRCb8QtjC@cl11c;vnu0c}sPn7b2O0LE;us@2@hwl?Z}q#sh%(0@X;Uq-#PmQIuktZ<2QzSth;H6 z*f#R+ux+H>>F?koH<{zHmE=Q*??HEtTiEcBtoUimH9?rhVze zJ4D*?%KWh84g%^#?vS;9gMQTYbQYeg>**pqM?BQy)Gj_BRfu*9W44eA<#YVy)pMOU z>bl`Q#t5bM`H_pDK?s7u=F7d)Rwg#JU@XN}w9L6~aZ02nv@rib>S#tK!Xcg`%~+lD zUU@r<9_h{;iPVy;TOjrSL>R8_NIQVn25)-!d?a2e-&IXG=WmI$W8`ak!SOr&FQfl8 zuLKx`n;8KUS5Js#K+|MMd1cCC0e;y-wQMq zNyCzNICZ>pO)>c9A*K=T9T3jJTXr)YTbF(V(~C&9YHL~eIwu}Uh+AR`X}N9+OfLp; zeB~{nX_Z$1pb_(64s>zlv<7O$Io{@R-HBUb-wnJYqOTn^3Z(y?^kMDK=2{Z+(I4Cr z4dN=9cZZ@(hWP^ZEP+sPQFbi}E8QoRzG>T6&c%ab73|}uBSO>#o}d0g3fAT0&TWx@pRJpt0C(qEI&Y~NCw^#g5j2RyH&{<)!vNy=&7pP-{ZL*oPzNX- zIOlLa1>JbyU%Qq#i<2qP5m--`bTUAk$@##0|NZVbm-CjW$C3U!T`A_Va`6PBHhli? zs12Xb)6{k^2^=Y2#0kcr=zun80dm3`B!jRPU2}K<0Zk`9^OaGW8$@Q0Y@T!wR@W_G zg0O_`31}u3UGnY-!b%|>gmnXf#|9CEm49~xVFle)E^|vB>CP4jp%qUdy+3`5Kd(W^ zDpFSmgeEfYE_W*fYQ+c8wIu@zP&-!B{OSfS&X%cJ1qR8pWo`#`f%L!A)l;4yx{6E= zBy>67J4je+o_5`dP>RR#{x?Vlvj18oAzXS{E&Ddf`e~4qeaEo;8HB8oLfS&|KK`r* zv7YjQvz}xgMj$lXB2yud$k@8lA?R`pQmf!AEC2?{3>@PQVijalz$uk>r&qz(RkDV; zKh#;Sf5Gx+kSu*yb1jkOI_ZuV{B&>tmEm1OO!UVns3TcDFD#50w87N_f&!>(*xo$~SLnG6O+W*CE320ih z+UaCZ7wZ!i-UZKv#lDn!T`Ht5y@fV8KSibugQTRPJ*H^iMa?M~?%>-|3&JF8gPYA6f?GmJ39g)`i9aECx}cf#NhToPXJ z2Of|RLU1Rz1q+@454bx73Bd{O?(Xh7?fy2K$J)6H4mwB6lp_v-3et4rV-o*0$& zaNeRIwmk+4wmsA~*FS6P!kA}c*JGQ_R>i&(ovCn^0-7#15qwcO*#nJRvB9>fEwWP8;U7o$=>iYwE_kni=mHOsrq4qhTzIG@)RTHV9X(0wpHpQ; zc2A(Ggbq_FsXz@@3tLh%KAoRnW1k?Yp7g4_2Y^~E1sc)|Pphbog~#_(mwvKcFbxg2 zUC={~vt7`S*Qd9uoe>bWS6|&E-kpJ1#5}~!UbdgKz2&B&q=C%<2*g>4aGe3-EX0q3 zaS^AA9U(!|-m=WmtW)+bn zb#%+JN0}oQK0pbQ)BLS!s{+)B2i-(b5-N{rlU~H$sT_KNMBvIbRY(F*o1+62S~&H} zKC}?1b~N)P;osmPJ{!hcdAV8Y9=DLs-T|cj+A3XjJs_+}A~FDo-M?>>zk(NNWKG&; zap{W{4)@I1rW_RK?eN>dx! zg(k6B#PJ$H(=k(GzfGX&+4;x!fB}ugK9ZXj&>-IVPgT5Lv8kWP)`2;JCJQ&wDu*@D zxJb!ZKodZ=q#1d4_65%rf9t-l_lR@esZ+2|QSIA-reZqjl4MZNaJG^E14L6?uwT^0 zl=DzaXrV=e+Ca9|SkgSyrQx=^X_%M#`FrAa{h}DIhxRXIT0T3r)tJ$INqFn{Hcc-U zW=@0>#E#syN&D=aP;DZCW{4;F;nhbKXfhK#R%U_5;|V@dv`Ofx%N3B&Q$HExMga*u zwO2ssslKFH7zOsV%*vNHh<%*tX6+dGC318n@q76d9Zp8hd=7#Qku#O0ycNrv$eF;Z z{mfn2ex_{@N`sgQD;|&O8u(QrXQry^nWU!qlbCu!&XK*6lP}fmWim7tZw#NR@xU ze31P`o{d|NvcZj$9Ddp$IH!P^a|SXw0r7rMkjx4AL{So34^y4qdi+pS*N$B*+65%G z9&=Y7`9R(OgxGp`NFQOoT4hlI>Wj120?Ox7LA-HNszEr$b}xkkOxxf382fr+2@^!X zp?xVjJM zESVsg7UUhGE)&GX2Em&vUdr@9_RTSoJT$OZfiHiwo<>-4fTm*T2L9U+4G{^+W;sFJ z6ev8!L8fNZ$`*6ehE$P(u=I%#u>>(3&kVB8*Xzvk!@7ekq#bXjWf&!htlGXLuIKk9 zar=@jNq_&o!rvf4D!s?B%}w74l2>~!es$it0CnT^q-#F}_Q$M@4DdR#;D3pkvK^MeH8bRK^JmcODNN>WZ>vXW~B>hn5` zAVDZlq7WT)_at&+Io0n8<1`6j5=2HhW$^;)vi1fWr6gBjck|Wqp2!P@TxEs%5jmqn z|9+A<)9$3`-{*LU>0D}=<*%&Yx+b(6=sP%aH?FBtj`lY>E;tC{EG$7p4+IdaM}k;D zP43&}Z>x_bEMzWX!j&*VXjt;@G9a`S;bsLSw3Tx!n>6L%%bX+JBM6wkJ=>&YARzV#=?0kHiS~k-TkhoIs5suyxBwa4& zE*dU2HLDkp*wlQ7qhx~QKI7xs<#PE)>epf+J*8eQAaNaH<1gK(NW&;0GlL6=>cm3u zdtH|%^yMA*Le#ZbqUkORSY`v!4$6RF*qbsMCK?iiPnD`huV>d)b{?P>I!t`@n;^0% zPmVtZNv>{%7$BD^%#f=s$=9{nDnW!l$p_ZQj!)*>PB$K9B;HQ%B=2MUlOVa1yp4>P z31TNHozj5B+Wc%$omiXisMZ{yR=i0(uYiQ={%%p7I8%J1XgFtz=IQjQ;@y==28dHd zUtOOOuU`u(CJ&P?cR-Wk!SpDf%mm3(#pkN)2Y{w0rIzVTQclZM89*ZC^wZVe9cYIC z(@&FaE>@uNxTNo^;1QsS`1;&NeHOIx4z(s@A+5>$%*jN8q|?Vwb&s#mtE;n+uI|g~ zh!%*I+(S)D($(pN0OO-|2ST{#c8g*-xiFAS3ox9Tx@zZK`&>**-`Dy^@+pdv2uV~A zubq6~EQ(<_;9ET%OMq?=?)yVu5}5*mIZ04;g18aRH=G;c#08EZlVdB`!@0IKfW~7h z*hAI5q(Bp~!Z>sB+Tvr6;o?a(01>f>OIOPz(9Gh9bB&y<7HF1uE&ZU<4uEDA5noj{ zG@#jl?2zP^abMjW|2dZQE#voP{d@r+am)CW#Y>qxwx|DEE5nPZu`eRf zAU4mni#Im|kR2$K<5~C97rDcMgi7&gm0JvG;{Qy88RMz>RAuc3nkgP~vsM9EKr_cC z!;e^;=kYh%KnT0xOLZYWH!%d8F;|GsDh)(#3I}0!mKkw@I`QdzgEs3;*=%V@g9szy zBL6^oAgUfLiMDTiis=;=a+`YywrnET5eU0#iRc&k4E5;u$XOi_yXx>d7m&8ONfD$Y zZ&C!|CAy06*tL(;v-e>x8JhD@OjA=prUH?rkVD>;!V7SvV1$>;BM_E&S&lZw|3Yfs z1QCZHn=X=E&7zf&t0}Yra^{bF7#(umE+8!O`iV)QXb_a}rb9@dC|$sT!t{xa;Y>L` z5N05<-Tie&aGtpu&;cP92wmR*ReMz;z1I>V{8eet<*2V*}R9 zIC>;VcrHveoQW1IWoZTE{$B7za0nD`Hz4{Dq6~fK$ooI<1fgyOzn3!PZD+$KpQZ%K zJc^&yJKZI}saJRl=@tH+>W~4b@!ut}!rPLho6E2>>LCcRy#H3z#qw?-oeB3x>Z;dv z-(=Qy`|x^g|E4I3wOu{DUf7>0ieX{*t!82Ot)3n$mW9SxOYEZ!gnu~pnFNu7&p#b0 z_yUiF%A5-{9xp5}R8Dk26D%x2paH~;u~~c^gKvVws@@nbyyq`VQ;xEDFR^d_Vgbz} zZ0F18)evab1O@#_y3Pbii}x1=G&_(U{d0&r<+97>{XnGN^Y3gf2Ads`bF=i>lIEc# z3(YI8uq)pFeBylZ!0h-4G(YR8inUvQ*7{>>A?<4NeF2H1!;kB9fXn?7*^+oIT%VdC z+GJFXMHkf2FO|{)gsR|6YKSZp1%!dcm4uNifGUqopjPPFx?1H;H7k%vcKBBDbe%B8 z^KkY9Mvf|Lo&h9$WS814jg+~8gpcfUv*qyw)cbD;AK4&+8Bgg1NgvrhfxrnONDQGmK4Z)O3h>+*6wlNOM=F0X+4K!Fd{BD>4TP2`b^h}wc2?NG^iPpW+F z2C*1&G{V48iX3H7$ffJU9LUiERr^r@P5XOs`({Fp+NYimr7zmdA)jRXp9wDIY~N-3 z*tx4is6^nL%rUUl1vM~B4U|ooqHbm2w*WF7{h?Gij>tf8S&*-F4m&JxR4^}XF65@S=ZwV4b- zdP;~+{LQ(F!JZ%$X0h7cKhlQc@PIwG~ znjvp41R{n`gh!aDmTLQxT?lbP|8QN1(0uU(0737yrA%$}EoBHTBnaoD7_EYA zUlhane6*ZH2xD14&3uq)%n?3F4@A|&z;hkL`Fx;M)gB@%oN6{;_|YVYcNs+J6(wQ# zbk(7+$jixqg#Gg~B7ze{#D~ns4n&e|VeSSJw=iDFo*_XpEM)fL=|ot_ss*Idb^nmF z90I9y-Ken%VqNhiq2c(>M9r~~USOW7^PMbzlHP*6Q$TEH9K=4wLcxa#=+zt`^#qVO z`ns!f-vYw*z&~AEB(x?$WrE}-0N)fPiG6XuXt>xH&sIRac+2}hb-620U*tTff}VlI zczV3(C#>x5weYo)^A2eGIIHznWQF2Q|djk z$0kTc?hPC1+x*K12}0|;BS@E6h1vj36HdX)lCCr`>E&l3oGTzPmL!i2yZ0PiXrgBSA=lFXXl>fQ(I@dgedR( z*ZH_52=99t9t(u`z3G)MA5!r^ENDYpMlZHutx-R6KUPRzB3djJLS7|#l{L_$Sl#}q zI$i;q4s|l`%v%NDz+{4d6+paeQ^&aS{l}Nx#VTc^!68k4vDb&6mA_%(@V zD#ceO@eJ=N@!k2?n=A1P_SaMGlf>h*D)E8-*9Uv?p}Fw=mH4zQ-b;uZ)7!!ub9nKh zUVK>=f271$Wbvm;e3cbXy?lPKHeVSW7P~tDLcs3z!FK?UHUfT|b_AdU{XL<2OUi?AsmYbFM+brH#h&xN!k=j`$ zi{Db>HSPTF9G`zZuEgKj!PK2Di}zOI6>Yb4tCr88#M}8_@8QLJdGSGZ>FJ(mJGEO) z;Lnx#i7fs=h^Lu`rU~%|x$c>jc|PwnE-`yq>ORpLK#-D5)B zZ`iu~v)KphZ<_1gLW%eGh3{wIcmGxU>uDGB;%yjfLcDVpZ=}S#(KI36lQ|~Dd--1< z>BXn`2RogWNr=z(h2Q84zaw|c)k^%L8xDNP&6XI>XcsDQJ zD?j&*N_>d__1RwhjulV0gcq-udu<;jKG6UA2>@F zz>AM#$ra+a{jWdD&;7a*e{Fv~Hl-KO!+HM(a?!{aA!jJXh z*X_n*@QMBP3=8JxzD0@uPQXzS_2J+qP}n)~nrKd$n!b zcKe$B+kC&jH_2o&nVC$oi>2>rqxLZ2uX^w@25ilUnp@l9+}1vf2V#P@&SmMnjE}J9 zmst8WCMsJwt@&CL?u4nv)*FMSZ5XO%+l=mDdx)ypU1%12J*;x=gD}n6hok29Ie5nG zJN4k3O!zoUpVZQ&{)a75qBy>jW{%i6w!@0v;7FnI3lq+bR&mtFRN}aUs)bnbc!w0h z+giv59(=1-t)vMb#~X6;kvMqrJLpR(ifX*xgoBaijR{}Exl;rW$p!;X6&IybrN<+d zsu;FgQca{Sv9w92@c@(bPE;**9Ah6z;~jc%y9w{*!A~$gkB*%B6H9+XoF+5l?0W9a zCR|G63MSkg4{(}6Joh1tnQ2aGe8Yra;owdS7Cp|`xNfHnGmWzV#x>^<#>*M+!QhcL z6xW^h8V>G?hn+uHb#z77P`xF6On5TZz^;vWHE`X93hnBM)PaNYh0Y@hqjqI76oEDl1)Xw~kT@GJDxunLTuVVxSb2Q?3SkGGaUbdt8L z&xhBsKv_)Cf$A*X2G zG{S@xzEDd#j7*XqkH2KVl1eh-rAIPh*pti{xFick2g!n zsjhK<6RyFDswN+zT0D4dEMuh(Hld}io_mN1*VD=3kO|l4$kc#?M?;ow#EGgghx;aY z@sOr?Rg`8d-JCUV!Ru~`9~Pt)OSk4c)`k;wTgL71=Z&<-*HY=gj@*&0)(QVgNoPLa zU3g(#*^#?xyx)Yovpe+E(g#hr7ss{Uys$oO)V|nXlYZECl>XSemjS$E13B~zVm}|u zgAc*`w+!VC9mX~vu5o!29>GDA?}9Rl9eFfMkKyw@mIoilW$bvaJSN};TPCuvP2yY4 zWZdtF*c4kV+p_3(9G97vhtpEaKu|F}7nO<}v<__^^j@A;uLMFT_go@CKINfmoJs z=vm5m83m812Osc;F6X=83Z8osXlGi%*nZC62iO%4ay&o8(h*!M9%kty_`ofZTuL70Ejh+EKaT&E9=`-BCJIfu>bKKN8&qlq#_1ZxWC35dY#vOg9F!1 zuJ&$mJio1_N1N~+4tw{wL4KdJ!2`DWLoHp(gdgGHN2Z`7ADM|*9D>^3u*iwAz57 zh>zSrXNru4SU#~)KeJiB;EyEv${YHP&-Zr@nm@Qp^%K8C$S>Z|-;Dp5l7;@%tG<)4 zii*ot(Xez-7PP5~j^&z)!8j%^Tg7G^2VX2zT&%}bJUl}xJ|hN@>gkDH5X$yV-LH7m$8p+?#FUXh4Kjv!|t2nZyqX~*DZ_{<8=6c zMWtuWGvMQz%E*If(%5OjnXzwU4#%~+9GU8IdjHGUImOTw zL{T)gZQEUCYTHU}+qP}nwr$(CZJSB^-SxdQbLY;{KDh7I);dz^I{w~uUC-iP~h za6ND6m)c0{#HkxQ+(g4%>ZTs3nrTNPb#s4q3$2f*ZmDg-)UAAVYfl~8=*VE|w(e8g z`R48IS_16v?k3p5&7h+{yOTDNQ+IY%?Beg;)gw_i*Ou=7>>gU9PTkWb)=T|)>fT!6 zPTl7(-0OdEU)S?~zIlIt?*R@Eba;?QgTdN0Og+S%=1@1_VLH^CdbqpX5jvHhdZd=_ zQ;%{Z8m;Y;)MNg_J^u%fbxMnwYsDn>c-Pbk&QmA4I!w~fs8UaM-!jER%~V&W zX@0cnD(`{CRo+LNyPnVRXV3KbJxk|T26oetqSUk1I}BX!&SQ>8|G6&Ec}}6{`+G0Y z!P?Xdy{NIs-Th*B9!vaaOa0l)ykfH4oyUs5tCRi@Ua8%b)T`9|Q?GWnw?-#WQm=JI zUgs~i{_pCz|ARNUNH%I5J37b1+$PWcH@oZE;x@L`Uu>J-+IBC;?C_)Q^jq8I>ag37 zw#VVUUh~-JtM_~P?SOB7&=vWR=VO=LGhKG(am6Ke)t`OMiOF@B*bOgn-}Fdy%a3+j zKOakd=kLiA{|~V1bFxWpd%dp~mcv8QWKJV-uub$I5joafFoUwBRPrQg~s zH^JAg4sZO<-zt3cyi>_{?zrB2!u7%7kAF8$@IUyIQmWLSoxXo@0{+!6^_z?2yMFnS z`iHOn<$Ue8{^S+k%%u`QA5B2jL;`6`lEA)s5Q78kf2jh)o96^`IJm`5NUYN@B+>9qQoojD`cWOp{nk>rUrXt5 zD&IV{iv)+$xP_*5Gf1axLDK6u6B%428I`8;ul=3me{d$H$YfR?N)|VwtPW?>5K4Bf zE09AAWP?Mh+Z!C(VfW|c^cTyev&`gHx<(#%_j&zj`CJwAYsrHGS_z_{TS*~@3;V4V zak!{oOEF(vT)96beDjj-uuEy-fYPqWW!$Hh^`n(@*t_GDcesMX6}1pdC3o1Bosd;= zxT-skY8HtC9LVf6wz?Zp4gF+?n!dW0Uh0tGT3(~J+gKeR2w#{KcBP(`?})Y3ZA{a&2j?#W~ve=55_OwDXjyy@psiICto% zQ$KX__wMW`@8asvRYUCYlS-+M-*otn!GTuiQ3E~^SdVrhtHN}1UF)u1amae-iap#r z^mO~~^>_8K|G~Xo*ZR03_jPsfAD+Nl?+nm#Dg(7A!5}}{V26jeK!ofwN zx~?WTteNNj>%F$O!B4)?ndT<_MGZDPSKQ*{f2(oD00%~@G7UTB65HkmyxmoChr>G^ z-sJ|o+Zop$Ri@!yr8>P;mFe_-g@;$rO!7<>U45p9!_yr0qn%B!F#Ggd2KKuV9dLmj zboh|V`>=C|Bfj}jCxgdyh@0bT-)HBkS3JAGMY71@iwbi>%j?5eDWy6$UpGJZNa6Dl z6y~JYxK238;j6y+ zHD7(*;TsO$bY;5b0s6Kxt~>thyY71K`Re;lf**J;_|RRC{}u?3z2W)9ujQ$ZnDESt zch8-#z3_DHrCZ4>4>dj%G@`pUde8TCzxKf4FUr?0#L;MQp^w76(W$;mW%Ov5wkv!& zqB_mXF}xJ?*5&=qS?+sZ{lRVQqg&`FT|MHpM#0MkRV0^3I6Ttfu?{bFc%8ymayy(? z)!|AZUtP}O&JO!Os$cOJnUl%xWxYOb>HzmS798$`;kgfp-a{+N=f;S2+`1x_K;AiY$Xk8X^?i=t{E=w zwXSik$ht-$QKAyAtb45_d$021@B9Ay^LoyC&a=*Qp7WgV_cE*GayG{VMR zDrT{``7J1JxCDC&f-5bSl2%D6QkMDd-q+v;8*(K((T%3Q$#7-I z)WCCx4tp_k!JrBcH9=Ji^%i#4b+1HI>>d*is|qvamSKPAGy9;aj~G5hc-4|e1kVmQ@<4>jk*3=ijnz97xi={AQE zj(Q_mgAPVH{~pbkEx{P}rvw>JnZ`Od7-zAJcNRN=3SED%&s#H?I`m#{q0X|8&Gy3P z7|t?0*YG@B%Y0KWa2@G;e&Zzgfmcw$LQ8FtSzByF{?Y4R;=z|0{>AWe#};2Pr%Z5y zy~1;^^x(T_$SM0c_lDx!YBoH={d+??>qxR`vx1+MoVpzsW=);7LxxFbv08)u6;-?SAh z^#nOycdmE;ExbbxwtAD?=DD|9V>=wM|8_dJ({ukrxbO8Y_3W}({`G-sw^`f6SCWBm zzk~he+=utzkb}ozhn^!|*ipmB2={x9F1RVhCyV3e{De*Mq&Yuj_%uIa(yyaq>VFo? zC{p*EYIuHL@Y%c6@c7xO^FaF_*UhZrN#z4M4{&9nzbTkttbyIVKE!i6{b$&$v^b3OTrTDT??<|)(7(5pGhESdOT+!yY`krxL(c;&I))GO$n(ugZgbma zdhSR0cm41&Q$NmIqOhJ7THn;o*j&DSjah5$P4Y#%!Ao@D!G-v4Eo|;}w=mq&a4RP! zZA|?#4{Kpt2d-E6^dx-M`Pyp^d$03eKC>84-S|wr+A?;?jDo;`hbFui1SX zb}?&R4fo(tF}0|L+RIYw?RBRx`A<#e+^JQ0*h{T$>iUijeZ8=L7HWUzYu~VOF10o5 z-{Bxfroo1XaDxt0*$fd5bfAb;;s(PTt&&Y%SdQWS zh7TA%=#YEJrg+#scEn;i>Rs>{JE_9s&Y4bf-BEtJL39DzcA^V;CWGsxyvzd zMdc0q)*)>c6`Hn~@V|FiV-=XbN7pd{PdmchKfSi$y9q}Xt+5*nS2BDf;q*r4yd_Iu z>Agt3`x>j{CUaida9}tz9C@3IxdTTx^N1W(@g`Z-rg#gZVtTHPsTv1Q-*1gIrN(x@ zVYq|!U7d+ZRD&AZz1D-@%2YC{X>+J$_%;X4+f99k;X4i2W+EEhW!COCe2>HZy=JYB zsqbU;J*w+X@_rBg0E?EIHyV;0NfJg!Agu%Hsv zvoSr%T`;O|b7)|=AGtEx;gI!qZXvzGun3E(k|G_thM&SUbLOR zs`4&l-E*)E_uH zd}xhzWY~+&z5Xnl7yJ=_xEggn3xA#${IL&vpRffb`jq`l(PuQKQH}VNVbpUB_oJE+ z-rJb&zxM^kwY{APj~eN@mpJr%$*cM3EB;b(bP|uq`&yCnePhkq*S6Fy_Ry}T?q+N0 zPU-{I$@zi#hL?KXJ?;Lz4EHvi!iA0Q>9nSgqeEX0{s*)BgEe@PJoprgcccH~?ON2& z=Fs0+&j82Nfvnv}gBZBROyzw^G}xREF`R017|Ke~m|bM;P#QmpacD9x9S==4oJD;{ z!?^B@YUKQIQzpTOr*Q5g1AKZP&gQr%%_XpO!y{bV8_BOPWlSOG8Q;K z8S^Rgj78K~#!`F9DCdf!ohy!UzLsHltl@DE9^>u66AWj1?ukAdO!DB9y-`i^!lrug zZwZfmnyJOnNwm~xn!RMYQ|Rx^T4&n%u~}qo>|h%5*!6}F+6`t>YSApdf*x0zVQ*Zr z=bmkS&#}z2oRH0Rwl~jnyA@+xdoJum2`cnt1H)4&^Jsyc=zBZx4=xlhw9FSdIaq9= z{^$z$5>x-gtGj5aIbX)XPv^JHe`bB{^b%A5;)N|Y{Hx&=HiwmtYrhd5zu6AV4wb}t z_wf$_iCU6cA~BspozTlCi&gwGYxF0DI^lN?KEc16n6TQct>)aB=kpAld9fSJ3mGoU zK96XPQ^~dLhKjNsa@X+!25Q$narGZDJ+* z_xUSjEr|lf?1D!;_q&|Cz+}%o)pH+pzIMz~JI+rqL?=vr((oz6rw#v?mr&1sGb27O zk;nNMx8nR1T6{h^iwlT4QDCw4xyvIWL3+vMip6H?#{jqK}nM!n4>j z@NkNy^h~aMrgww*8Ru)y8g9(1xtV`^?&mDj=PlG13^#GE*p$`vxS7}8TySD>W9LjQ zyzZ9l>5p4^VXftYi86=sZePoPUZU)A`p~(GNOoTEOI}wSudA)8Uorfu;n!>|uk(UB zZpRjq_zljzww(uWZ_eK|{FdRjeQJ4!&FS&GY=($C7=DkR!jIoK^#|U7KlHl)=j*=1 zek$WQj$aQ?Ps0caNu@>es^^^ZTZpa_SA?W88d{<~R7OHZW_EUFWNS%9o<~DuH&vo2 zdlO|<*U#VQ_4oVweDCkQzW4Xs_kGUkY~01TtMRMG-Lkk(9PVy)596N3uNn6;?#<La9;Y!AL02ul4C7@l=l@z^9{}XF-*@FR*heYPW=B6o3;IC3@sl^vn7vp zhrH?Rdz{tdy*)O8Nz20fosCU&hfK<({$}qIl1d`~%~8HvXYQ^?V!uD2w~W z;ZLky;2vAZuf69la+egi?8WY}&#eC3dv;$~{iRp#C02jsR$J=Fv}ImgPrVJ>H4ZPg zYb%Ub8m}^5?fzby#RYMA3yq(4YD2JGOi1086>o_V=Uo?vv*H6>rSitx_6PhRYu-ZU z)p^UASLdzbc0%47x|YA)p<{=~=}xahyF83{J6!MaP}*y}k8elh@3;DZ1MWeu1&3_> zFRKr`>?005e>*n(W7m$__;IUGSbfs?-#DDT7aAOuILP6{Oi+a5I4H_S3vwB?g41~O zD>$9q9h|{7&1uF=F!0^XPirxD1jV^E6_ld!ptNxr<8ydfJ}Aps5S(k{<+vXZly{F+ zwDI#9w}MI@EtR>)8eGh`_<~F9+GV_E6kKWb)yCHwM|?UC65Lb^lAa|QmtD=cx^WHT z8<=JWHC^vo4m~%z-Zy!M*5);YppGk6*SI0$b=v%rJ;wJs?A_;~ z*pfL>@Q^)koyGm*a2uEXm_2{oUGjuu>XRO8Pucj>uJb<8Nn_#k(J0{>kj%;g6m!qa(r6&B+j zR#=k#9iGiL4@()BHZEg)4ufV`*7#iGat!xjdAnA@_&m;%up+;k5T4JkO@x=b>?+1p zxzvPLFmQ!e+W5819m4CZzTPv zyrzxUvie5jn~ZB4-(q~LyQChU-oyH?_idgf4eeSZ*tnJPqpnzM52iLY{+RKp+qS>N;U}$rmMK;EoYn1I@AmGJj!c5X zS6KF^-#hE+!gMa|$`h>cRpV}MmhR5DdRX04IA_TxZnfTS^FD5tzV6U|Hs0TOfa^Wb zc(BL$5MEmghuZisa<;VHMZ(R1besuVb7ofu*tzPf4HyHosh3a>!H+!W1={Dc$kh|Sw z?=aqJyvulx@m`0Xea8E3{D6nUA-CEw&+p^h>J3lW^MB(!&z|c?JlBtMxStXg<#R`r z%d{mrjcpp8VSJ|XS;obgU`HjaF3Cv}mA1N!)n$##^UxuxTSk5JQR1j-n(pkxA7jn3mEOS`k?dFLtMRi zSW=1qJ^pT*8K>2zjY`w0rW~_yLB$2--BeSJg;P#h=8~G4nxf){AhcV#P+BSiGObLT zX61sQXy%q66)7g0fnLG|!fPsu_`5dqc|YIh_dNB#KAwAC=bYDh-CL?4f0zv2bAJ>4 z+?Bv}zVsG`d{^+1%xFt*S&PuYTQs>%71pvj_ut2)EYW?-?kl5w)bds7_V$UDi7(6U ztr=e){RqKbb?xsK{-%SnmRJXmpJQsf2KA0E2Ne;>{>am}ue16_T;)BJOI2Hl$$O;( zk!(rLgIpx8=tZ9yWBG&=$5*P(P++C+Cg%~f

)h*F!{47W+C{ae9`8jf9eQw>XH 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 Date: Sun, 29 Sep 2024 01:40:58 +0300 Subject: [PATCH 079/128] Added/Updated tests\bugs\gh_7398_test.py: Checked on 6.0.0.471, 5.0.2.1519, 4.0.6.3157. SEE NOTES. --- tests/bugs/gh_7398_test.py | 155 +++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 tests/bugs/gh_7398_test.py diff --git a/tests/bugs/gh_7398_test.py b/tests/bugs/gh_7398_test.py new file mode 100644 index 00000000..830480ce --- /dev/null +++ b/tests/bugs/gh_7398_test.py @@ -0,0 +1,155 @@ +#coding:utf-8 + +""" +ID: issue-7398 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/7398 +TITLE: Worst plan sort created to execute an indexed tables +DESCRIPTION: +NOTES: + [29.09.2024] pzotov + 1. Ineffective execution plan was up to 4.0.3.2840. + Since 4.0.3.2843 plan changed and is the same for all subsequent FB-4.x snapshots. + Commit: https://github.com/FirebirdSQL/firebird/commit/1b192404d43a15d403b5ff92760bc5df9d3c89c3 + (13.09.2022 19:17, "More complete solution for #3357 and #7118") + + 2. Database provided in the ticket has too big size (~335 Mb). + Test uses much smaller DB that was created on basis of original one by + extraction of small portions of data from tables PCP_TIN_REC_MAT and INV_ETQ_MAT. + These tables in original DB have 114115 and 1351211 rows. + In DB that is used here these tables have 15000 and 30000 rows corresp. + NOT all constraints are used in the test DB. Particularly, following DDL were abandoned: + ALTER TABLE PCP_TIN_REC ADD CONSTRAINT FK_PCP_TIN_REC_EMP FOREIGN KEY (ID_EMP) REFERENCES SYS_EMP (ID_EMP); + ALTER TABLE PCP_TIN_REC ADD CONSTRAINT FK_PCP_TIN_REC_OP FOREIGN KEY (ID_OP) REFERENCES PCP_OP (ID_OP); + ALTER TABLE PCP_TIN_REC_MAT ADD CONSTRAINT FK_PCP_TIN_REC_MAT_MAT FOREIGN KEY (ID_MAT) REFERENCES INV_MAT (ID_MAT); + Test database have been backed up using 4.0.3.2840 and compressed to .zip file. + 3. Because of missed valuable part of source data, I'm not sure that this test verifies exactly ticket issue. + But in any case, using this test one may see difference in execution plan that is produced in 4.0.3.2840 and 4.0.3.2843. + And such difference also can be seen on original DB (although plans there differ from those which are in test DB). + + Checked on 6.0.0.471, 5.0.2.1519, 4.0.6.3157. +""" + +import locale +import re +import zipfile +from pathlib import Path +from firebird.driver import SrvRestoreFlag +import time + +import pytest +from firebird.qa import * + +db = db_factory() + +act = python_act('db') + +check_sql = """ + select r.id_op, r.id_rec, sum(m.q_mat * cus.cus_med) + from pcp_tin_rec r + join pcp_tin_rec_mat m on r.id_rec = m.id_rec + join inv_etq_mat cus on cus.id_mat = m.id_mat and cus.anomes = r.am_bai + join inv_etq_nat nat on nat.id_nat = cus.id_nat + where + nat.cml_stat = 1 and r.id_op = 216262 + group by r.id_op, r.id_rec +""" + +fbk_file = temp_file('gh_7398.tmp.fbk') + +#----------------------------------------------------------- + +def replace_leading(source, char="."): + stripped = source.lstrip() + return char * (len(source) - len(stripped)) + stripped + +#----------------------------------------------------------- + +expected_out_4x = """ + Select Expression + ....-> Aggregate + ........-> Sort (record length: 148, key length: 16) + ............-> Nested Loop Join (inner) + ................-> Filter + ....................-> Table "PCP_TIN_REC" as "R" Full Scan + ................-> Filter + ....................-> Table "PCP_TIN_REC_MAT" as "M" Access By ID + ........................-> Bitmap + ............................-> Index "FK_PCP_TIN_REC_MAT_REC" Range Scan (full match) + ................-> Filter + ....................-> Table "INV_ETQ_MAT" as "CUS" Access By ID + ........................-> Bitmap + ............................-> Index "IDX_INV_ETQ_MAT_ANOMES" Range Scan (full match) + ................-> Filter + ....................-> Table "INV_ETQ_NAT" as "NAT" Access By ID + ........................-> Bitmap + ............................-> Index "PK_INV_ETQ_NAT" Unique Scan +""" +expected_out_5x = """ + Select Expression + ....-> Aggregate + ........-> Sort (record length: 148, key length: 16) + ............-> Filter + ................-> Hash Join (inner) + ....................-> Nested Loop Join (inner) + ........................-> Filter + ............................-> Table "PCP_TIN_REC" as "R" Full Scan + ........................-> Filter + ............................-> Table "PCP_TIN_REC_MAT" as "M" Access By ID + ................................-> Bitmap + ....................................-> Index "FK_PCP_TIN_REC_MAT_REC" Range Scan (full match) + ........................-> Filter + ............................-> Table "INV_ETQ_MAT" as "CUS" Access By ID + ................................-> Bitmap + ....................................-> Index "IDX_INV_ETQ_MAT_ANOMES" Range Scan (full match) + ....................-> Record Buffer (record length: 33) + ........................-> Filter + ............................-> Table "INV_ETQ_NAT" as "NAT" Access By ID + ................................-> Bitmap + ....................................-> Index "IDX_INV_ETQ_NAT_CML_STAT" Range Scan (full match) +""" +expected_out_6x = """ + Select Expression + ....-> Aggregate + ........-> Sort (record length: 148, key length: 16) + ............-> Filter + ................-> Hash Join (inner) (keys: 1, total key length: 4) + ....................-> Nested Loop Join (inner) + ........................-> Filter + ............................-> Table "PCP_TIN_REC" as "R" Full Scan + ........................-> Filter + ............................-> Table "PCP_TIN_REC_MAT" as "M" Access By ID + ................................-> Bitmap + ....................................-> Index "FK_PCP_TIN_REC_MAT_REC" Range Scan (full match) + ........................-> Filter + ............................-> Table "INV_ETQ_MAT" as "CUS" Access By ID + ................................-> Bitmap + ....................................-> Index "IDX_INV_ETQ_MAT_ANOMES" Range Scan (full match) + ....................-> Record Buffer (record length: 33) + ........................-> Filter + ............................-> Table "INV_ETQ_NAT" as "NAT" Access By ID + ................................-> Bitmap + ....................................-> Index "IDX_INV_ETQ_NAT_CML_STAT" Range Scan (full match) +""" + +@pytest.mark.version('>=4.0') +def test_1(act: Action, fbk_file: Path, capsys): + zipped_fbk_file = zipfile.Path(act.files_dir / 'gh_7398.zip', at = 'gh_7398.fbk') + fbk_file.write_bytes(zipped_fbk_file.read_bytes()) + + with act.connect_server(encoding=locale.getpreferredencoding()) as srv: + srv.database.restore(database = act.db.db_path, backup = fbk_file, flags = SrvRestoreFlag.REPLACE) + restore_log = srv.readlines() + assert restore_log == [] + + + with act.db.connect() as con: + chk_sql = 'select 1 from test order by id' + cur = con.cursor() + ps = cur.prepare(check_sql) + # Print explained plan with padding eash line by dots in order to see indentations: + print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) + + act.expected_stdout = expected_out_4x if act.is_version('<5') else expected_out_5x if act.is_version('<6') else expected_out_6x + + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From f85816beb953f695b59d67f360140ce867a93a21 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sun, 29 Sep 2024 01:47:07 +0300 Subject: [PATCH 080/128] Added/Updated tests\bugs\gh_7118_test.py: added comment about related commit --- tests/bugs/gh_7118_test.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/bugs/gh_7118_test.py b/tests/bugs/gh_7118_test.py index e0a222bc..3088a9c3 100644 --- a/tests/bugs/gh_7118_test.py +++ b/tests/bugs/gh_7118_test.py @@ -6,6 +6,11 @@ ISSUE: https://github.com/FirebirdSQL/firebird/issues/7118 TITLE: Chained JOIN .. USING across the same column names may be optimized badly NOTES: [01.03.2023] pzotov + Commit related to this test: + https://github.com/FirebirdSQL/firebird/commit/1b192404d43a15d403b5ff92760bc5df9d3c89c3 + (13.09.2022 19:17, "More complete solution for #3357 and #7118") + One more test that attempts to verify this commit: bugs/gh_7398_test.py + Checked on 3.0.11.33665, 4.0.3.2904, 5.0.0.964 """ From a26e1cce6b881e431d8fb929598648e62bf2f0fe Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sun, 29 Sep 2024 01:47:19 +0300 Subject: [PATCH 081/128] Added/Updated tests\bugs\gh_3357_test.py: added comment about related commit --- tests/bugs/gh_3357_test.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/bugs/gh_3357_test.py b/tests/bugs/gh_3357_test.py index 89b469b4..e73fc608 100644 --- a/tests/bugs/gh_3357_test.py +++ b/tests/bugs/gh_3357_test.py @@ -6,12 +6,17 @@ ISSUE: https://github.com/FirebirdSQL/firebird/issues/3357 TITLE: Bad execution plan if some stream depends on multiple streams via a function [CORE2975] NOTES: [04.03.2023] pzotov - Discussed with dimitr, letters 01-mar-2023 18:37 and 04-mar-2023 10:38. + 1. Discussed with dimitr, letters 01-mar-2023 18:37 and 04-mar-2023 10:38. Test must verify that execution plan uses NESTED LOOPS rather than HASH JOIN. Because of this, tables must be filled with approximately equal volume of data. Confirmed bug on 3.0.9.33548 (28-dec-2021), plan was: PLAN HASH (JOIN (T1 INDEX (T1_COL), T2 INDEX (T2_ID)), T3 NATURAL) - Checked on 5.0.0.970, 4.0.3.2904, 3.0.11.33665. + 2. Commit related to this test: + https://github.com/FirebirdSQL/firebird/commit/1b192404d43a15d403b5ff92760bc5df9d3c89c3 + (13.09.2022 19:17, "More complete solution for #3357 and #7118") + One more test that attempts to verify this commit: bugs/gh_7398_test.py + + Checked on 5.0.0.970, 4.0.3.2904, 3.0.11.33665. """ import pytest From 25dd99989daebfc1ec3d0707d1fe83763a94fea4 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sun, 29 Sep 2024 23:11:41 +0300 Subject: [PATCH 082/128] Added/Updated tests\bugs\core_4345_test.py: added combine_ouput=True in order to see failed details in annotations. --- tests/bugs/core_4345_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/bugs/core_4345_test.py b/tests/bugs/core_4345_test.py index 3a324582..7dcd4620 100644 --- a/tests/bugs/core_4345_test.py +++ b/tests/bugs/core_4345_test.py @@ -101,7 +101,7 @@ def test_1(act: Action): """ # Case 1: Trace functions enabled with act.trace(db_events=trace): - act.isql(switches=['-n', '-q'], input=func_script % (123, 456)) + act.isql(switches=['-n', '-q'], input=func_script % (123, 456), combine_output = True) # for line in act.trace_log: if (func_start_ptn.search(line) @@ -112,7 +112,7 @@ def test_1(act: Action): # Case 2: Trace functions disabled act.trace_log.clear() with act.trace(db_events=trace[:-2]): - act.isql(switches=['-n', '-q'], input=func_script % (789, 987)) + act.isql(switches=['-n', '-q'], input=func_script % (789, 987), combine_output = True) # for line in act.trace_log: if (func_start_ptn.search(line) From 063602005b0caab1bc0dbbaabdd6742dbabaa7e2 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Tue, 22 Oct 2024 20:29:09 +0300 Subject: [PATCH 083/128] Added/Updated tests\bugs\gh_8249_test.py: Checked on 6.0.0.485 -- all OK. No output to STDOUT, all queries finish with errors. --- tests/bugs/gh_8249_test.py | 127 +++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 tests/bugs/gh_8249_test.py diff --git a/tests/bugs/gh_8249_test.py b/tests/bugs/gh_8249_test.py new file mode 100644 index 00000000..30009f1d --- /dev/null +++ b/tests/bugs/gh_8249_test.py @@ -0,0 +1,127 @@ +#coding:utf-8 + +""" +ID: issue-8249 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8249 +TITLE: CAST() ignores collation of target data type +NOTES: + [22.10.2024] pzotov + Commit related to this test (04.10.2024 13:13): + https://github.com/FirebirdSQL/firebird/commit/aa167e2b36122684796d7b34935b0340be6f5074 + See also: gh_7748_test.py + + Confirmed problem on 6.0.0.483: queries to view, function, SP and EB complete OK (rather than expectedly raise error). + Checked on 6.0.0.485 -- all OK. No output to STDOUT, all queries finish with errors. +""" + +import pytest +from firebird.qa import * + +db = db_factory() + +test_script = """ + set list on; + create view v_test_1 as + select cast('x' as varchar(10) character set utf8 collate missed_coll) as view_output from rdb$database + ; + commit; + + set term ^; + create procedure sp_test_1 returns(sp_output varchar(10) character set utf8) as + begin + sp_output = cast('x' as varchar(10) character set utf8 collate missed_coll); + suspend; + end + ^ + create procedure sp_test_2 returns(sp_output varchar(10) character set utf8) as + declare v_text varchar(10) character set utf8; + begin + v_text = cast('x' as varchar(10) character set utf8 collate missed_coll); + sp_output = v_text; + suspend; + end + ^ + create function fn_test_1 returns varchar(10) character set utf8 as + begin + return cast('x' as varchar(10) character set utf8 collate missed_coll); + end + ^ + set term ;^ + commit; + + select * from v_test_1; + select fn_test_1() as fn_output from rdb$database; + select * from sp_test_1; + + set term ^; + execute block returns(eb_text varchar(10) character set utf8) as + begin + execute procedure sp_test_2 returning_values :eb_text; + suspend; + end + ^ + set term ;^ + +""" + +act = isql_act('db', test_script, substitutions = [('[-]?At line \\d+.*', '')]) + +expected_stdout = """ + Statement failed, SQLSTATE = 22021 + unsuccessful metadata update + -CREATE VIEW V_TEST_1 failed + -Dynamic SQL Error + -SQL error code = -204 + -COLLATION MISSED_COLL for CHARACTER SET UTF8 is not defined + + Statement failed, SQLSTATE = 22021 + unsuccessful metadata update + -CREATE PROCEDURE SP_TEST_1 failed + -Dynamic SQL Error + -SQL error code = -204 + -COLLATION MISSED_COLL for CHARACTER SET UTF8 is not defined + + Statement failed, SQLSTATE = 22021 + unsuccessful metadata update + -CREATE PROCEDURE SP_TEST_2 failed + -Dynamic SQL Error + -SQL error code = -204 + -COLLATION MISSED_COLL for CHARACTER SET UTF8 is not defined + + Statement failed, SQLSTATE = 22021 + unsuccessful metadata update + -CREATE FUNCTION FN_TEST_1 failed + -Dynamic SQL Error + -SQL error code = -204 + -COLLATION MISSED_COLL for CHARACTER SET UTF8 is not defined + + Statement failed, SQLSTATE = 42S02 + Dynamic SQL Error + -SQL error code = -204 + -Table unknown + -V_TEST_1 + + Statement failed, SQLSTATE = 39000 + Dynamic SQL Error + -SQL error code = -804 + -Function unknown + -FN_TEST_1 + + Statement failed, SQLSTATE = 42S02 + Dynamic SQL Error + -SQL error code = -204 + -Table unknown + -SP_TEST_1 + + Statement failed, SQLSTATE = 42000 + Dynamic SQL Error + -SQL error code = -204 + -Procedure unknown + -SP_TEST_2 +""" + +@pytest.mark.version('>=6.0') +def test_1(act: Action): + act.expected_stdout = expected_stdout + act.execute(combine_output = True) + assert act.clean_stdout == act.clean_expected_stdout From c93d02de5f097009c0fac79bd518dc0bde9ca785 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Tue, 22 Oct 2024 20:29:33 +0300 Subject: [PATCH 084/128] Added/Updated tests\bugs\gh_7748_test.py: added ref to gh_8249_test.py --- tests/bugs/gh_7748_test.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/bugs/gh_7748_test.py b/tests/bugs/gh_7748_test.py index 1b84aec7..5a8963a3 100644 --- a/tests/bugs/gh_7748_test.py +++ b/tests/bugs/gh_7748_test.py @@ -13,6 +13,7 @@ DESCRIPTION: NOTES: [25.11.2023] pzotov Checked on 6.0.0.150. + See also: gh_8249_test.py """ import pytest From d0a66d4f63f118a20196e6bca7f6254f933093ca Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 24 Oct 2024 23:24:50 +0300 Subject: [PATCH 085/128] Added/Updated tests\bugs\gh_8241_test.py: dummy change to force QA scenario to check all FB versions. --- tests/bugs/gh_8241_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/bugs/gh_8241_test.py b/tests/bugs/gh_8241_test.py index 4d54cdcb..8fcd4b5b 100644 --- a/tests/bugs/gh_8241_test.py +++ b/tests/bugs/gh_8241_test.py @@ -7,7 +7,7 @@ DESCRIPTION: NOTES: Restore must use gbak utility, target DB must be prefixed by 'localhost:'. - Confirmed bug on 6.0.0.447, 5.0.2.1487 + Confirmed bug on 6.0.0.447, 5.0.2.1487. Checked on 6.0.0.450-8591572, 5.0.2.1493-eb720e8. """ From debd6ed3fd1481cad9e2a6f384c039eaaa2ed94d Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Fri, 25 Oct 2024 00:08:12 +0300 Subject: [PATCH 086/128] Added/Updated tests\bugs\gh_8290_test.py: Checked on 6.0.0.502-d2f4cf6, 5.0.2.1542-ab50e20 (intermediate builds). --- tests/bugs/gh_8290_test.py | 154 +++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 tests/bugs/gh_8290_test.py diff --git a/tests/bugs/gh_8290_test.py b/tests/bugs/gh_8290_test.py new file mode 100644 index 00000000..517622dc --- /dev/null +++ b/tests/bugs/gh_8290_test.py @@ -0,0 +1,154 @@ +#coding:utf-8 + +""" +ID: issue-8290 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8290 +TITLE: "Unique scan" is incorrectly reported in the explained plan for unique index and IS NULL predicate +DESCRIPTION: + Test creates a table and checks several cases related to issue: asc/desc, computed-by and partial indices. + For each case we ask engine to show explained plan. Every case must have 'Range Scan (full match)'. +NOTES: + [25.10.2024] pzotov + Confirmed problem on 6.0.0.485, 5.0.2.1519. + Checked on 6.0.0.502-d2f4cf6, 5.0.2.1542-ab50e20 (intermediate builds). +""" + +import pytest +from firebird.qa import * + +init_sql = """ + recreate table test(id int generated by default as identity, x int, y int, z int); + insert into test(x, y, z) select null, null, null from rdb$types, rdb$types rows 1000; + commit; + create unique index test_x_asc on test(x); + create unique descending index test_y_desc on test(y); + create unique index test_x_plus_y on test computed by (x+y); + + create unique index test_z_partial on test(z) where mod(id,2) = 0; + create unique index test_x_minus_y_partial on test computed by (x-y) where mod(id,3) <= 1; + commit; +""" +db = db_factory(init = init_sql) + +act = python_act('db') + +#----------------------------------------------------------- + +def replace_leading(source, char="."): + stripped = source.lstrip() + return char * (len(source) - len(stripped)) + stripped + +#----------------------------------------------------------- + +@pytest.mark.version('>=5.0.2') +def test_1(act: Action, capsys): + + qry_map = { + 0 : 'select count(*) from test where x is null' + ,1 : 'select count(*) from test where y is null' + ,2 : 'select count(*) from test where x+y is null' + ,3 : 'select count(*) from test where z is null and mod(id,2) = 0' + ,4 : 'select count(*) from test where x-y is null and mod(id,3) <= 1' + ,5 : 'select count(*) from test where x is not distinct from null' + ,6 : 'select count(*) from test where y is not distinct from null' + ,7 : 'select count(*) from test where x+y is not distinct from null' + ,8 : 'select count(*) from test where z is not distinct from null and mod(id,2) = 0' + ,9 : 'select count(*) from test where x-y is not distinct from null and mod(id,3) <= 1' + } + + with act.db.connect() as con: + cur = con.cursor() + for k,v in qry_map.items(): + ps = cur.prepare(v) + # Print explained plan with padding eash line by dots in order to see indentations: + print(v) + print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) + print('') + + + expected_out = f""" + {qry_map[0]} + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Table "TEST" Access By ID + ................-> Bitmap + ....................-> Index "TEST_X_ASC" Range Scan (full match) + + {qry_map[1]} + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Table "TEST" Access By ID + ................-> Bitmap + ....................-> Index "TEST_Y_DESC" Range Scan (full match) + + {qry_map[2]} + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Table "TEST" Access By ID + ................-> Bitmap + ....................-> Index "TEST_X_PLUS_Y" Range Scan (full match) + + {qry_map[3]} + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Table "TEST" Access By ID + ................-> Bitmap + ....................-> Index "TEST_Z_PARTIAL" Range Scan (full match) + + {qry_map[4]} + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Table "TEST" Access By ID + ................-> Bitmap + ....................-> Index "TEST_X_MINUS_Y_PARTIAL" Range Scan (full match) + + {qry_map[5]} + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Table "TEST" Access By ID + ................-> Bitmap + ....................-> Index "TEST_X_ASC" Range Scan (full match) + + {qry_map[6]} + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Table "TEST" Access By ID + ................-> Bitmap + ....................-> Index "TEST_Y_DESC" Range Scan (full match) + + {qry_map[7]} + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Table "TEST" Access By ID + ................-> Bitmap + ....................-> Index "TEST_X_PLUS_Y" Range Scan (full match) + + {qry_map[8]} + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Table "TEST" Access By ID + ................-> Bitmap + ....................-> Index "TEST_Z_PARTIAL" Range Scan (full match) + + {qry_map[9]} + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Table "TEST" Access By ID + ................-> Bitmap + ....................-> Index "TEST_X_MINUS_Y_PARTIAL" Range Scan (full match) + """ + + act.expected_stdout = expected_out + + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From d991658a61188f1f021bbd82fcbfe045b9cff0f5 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Fri, 25 Oct 2024 01:05:31 +0300 Subject: [PATCH 087/128] Added/Updated tests\bugs\gh_8291_test.py: Checked on 6.0.0.502-d2f4cf6, 5.0.2.1542-ab50e20 (intermediate builds). --- tests/bugs/gh_8291_test.py | 82 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 tests/bugs/gh_8291_test.py diff --git a/tests/bugs/gh_8291_test.py b/tests/bugs/gh_8291_test.py new file mode 100644 index 00000000..701eeb37 --- /dev/null +++ b/tests/bugs/gh_8291_test.py @@ -0,0 +1,82 @@ +#coding:utf-8 + +""" +ID: issue-8291 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8291 +TITLE: NULLs should be skipped during index navigation when there's no lower bound and matched conditions are known to ignore NULLs +DESCRIPTION: + Test uses script from ticket. We compare number of indexed reads with threshold - see variable MAX_ALLOWED_IDX_READS. + BEFORE fix value of indexed was 500002 (both on 5.x and 6.x), after fix it became 886 (using default page_size = 8k). +NOTES: + [25.10.2024] pzotov + Confirmed problem on 6.0.0.485, 5.0.2.1519. + Checked on 6.0.0.502-d2f4cf6, 5.0.2.1542-ab50e20 (intermediate builds). +""" + +import pytest +from firebird.qa import * + +############################ +MAX_ALLOWED_IDX_READS = 1000 +############################ + +init_sql = """ + create table test (id int); + + set term ^; + execute block as + declare n int = 1000000; + declare i int = 0; + begin + while (i < n) do + begin + insert into test(id) values( iif(mod(:i, 2) = 0, null, :i) ); + i = i + 1; + end + end^ + set term ;^ + commit; + + create index test_id on test(id); + commit; +""" +db = db_factory(page_size = 8192, init = init_sql) + +act = python_act('db') + +#----------------------------------------------------------- + +@pytest.mark.version('>=5.0.2') +def test_1(act: Action, capsys): + msg_prefix = 'Number of indexed reads:' + expected_txt = 'EXPECTED' + idx_reads = {} + with act.db.connect() as con: + cur = con.cursor() + cur.execute("select rdb$relation_id from rdb$relations where rdb$relation_name = 'TEST'") + test_rel_id = cur.fetchone()[0] + idx_reads[test_rel_id] = 0 + + for x_table in con.info.get_table_access_stats(): + if x_table.table_id == test_rel_id: + idx_reads[test_rel_id] = -x_table.indexed + + cur.execute('select count(*) from (select id from test where id < 3 order by id)') + data = cur.fetchall() + + for x_table in con.info.get_table_access_stats(): + if x_table.table_id == test_rel_id: + idx_reads[test_rel_id] += x_table.indexed + + # BEFORE fix value of indexed was 500002. After fix: 886 + if idx_reads[test_rel_id] < MAX_ALLOWED_IDX_READS: + print(f'{msg_prefix} {expected_txt}') + else: + print(f'{msg_prefix} UNEXPECTED: {idx_reads[test_rel_id]} - greater than threshold = {MAX_ALLOWED_IDX_READS}.') + + act.expected_stdout = f""" + {msg_prefix} {expected_txt} + """ + + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From 8d4f444954776647d6435be66920a53e80897b06 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Fri, 25 Oct 2024 13:55:50 +0300 Subject: [PATCH 088/128] Added/Updated tests\bugs\gh_8161_test.py: Splitted expected_out after fixed #8290 -- see notes. --- tests/bugs/gh_8161_test.py | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/tests/bugs/gh_8161_test.py b/tests/bugs/gh_8161_test.py index e293c96d..3a1d5fa9 100644 --- a/tests/bugs/gh_8161_test.py +++ b/tests/bugs/gh_8161_test.py @@ -19,6 +19,12 @@ NOTES: Confirmed bug (regression) on 3.0.12.33735 (date of build: 09-mar-2024). Checked on 3.0.12.33764, 4.0.5.3112, 5.0.1.1416, 6.0.0.374. + + [25.10.2024] pzotov + Splitted expected_out after fixed #8290: 'Index "RDB$INDEX_nn" Range Scan (full match)' must appear in explained plan) + for RDB$PROCEDURES table (index on columns: RDB$PACKAGE_NAME,RDB$PROCEDURE_NAME - is unique and at least one of these + columns allow NULLs). + Checked on 6.0.0.502-d2f4cf6, 5.0.2.1542-ab50e20 (intermediate builds). """ import zipfile from pathlib import Path @@ -79,7 +85,7 @@ def test_1(act: Action, tmp_fbk: Path, capsys): ps = cur.prepare(test_sql) print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) - expected_stdout = """ + expected_stdout_4x = """ Select Expression ....-> Singularity Check ........-> Aggregate @@ -98,6 +104,27 @@ def test_1(act: Action, tmp_fbk: Path, capsys): ............-> Bitmap ................-> Index "RDB$INDEX_3" Range Scan (full match) """ - act.expected_stdout = expected_stdout + + expected_stdout_5x = """ + Select Expression + ....-> Singularity Check + ........-> Aggregate + ............-> Nested Loop Join (inner) + ................-> Filter + ....................-> Table "RDB$DEPENDENCIES" as "DEP" Access By ID + ........................-> Bitmap + ............................-> Index "RDB$INDEX_nn" Range Scan (full match) + ................-> Filter + ....................-> Table "RDB$PROCEDURES" as "PRC" Access By ID + ........................-> Bitmap + ............................-> Index "RDB$INDEX_nn" Range Scan (full match) + Select Expression + ....-> Filter + ........-> Table "RDB$RELATION_FIELDS" as "X" Access By ID + ............-> Bitmap + ................-> Index "RDB$INDEX_nn" Range Scan (full match) + """ + + act.expected_stdout = expected_stdout_4x if act.is_version('<5') else expected_stdout_5x act.stdout = capsys.readouterr().out assert act.clean_stdout == act.clean_expected_stdout From 2c41272f32aa1d9851800d2edd1ec14c37a328c1 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Fri, 25 Oct 2024 18:58:49 +0300 Subject: [PATCH 089/128] Added/Updated tests\bugs\gh_8091_test.py: Checked on 6.0.0.508-67d8e39 (intermediate build). --- tests/bugs/gh_8091_test.py | 144 +++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 tests/bugs/gh_8091_test.py diff --git a/tests/bugs/gh_8091_test.py b/tests/bugs/gh_8091_test.py new file mode 100644 index 00000000..166e48bb --- /dev/null +++ b/tests/bugs/gh_8091_test.py @@ -0,0 +1,144 @@ +#coding:utf-8 + +""" +ID: issue-8091 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8091 +TITLE: Ability to create an inactive index +DESCRIPTION: + Test creates a table with several indices, all of them are specified as INACTIVE. + Then we check that these indices actually can *not* be used: explained plans for any query + to this table that could relate to indexed columns must now contain 'Full Scan'. + After this we extract metadata (with saving it to 'init_meta' variable) and drop test table. + Applying of metada to the test database (which is empty now) must pass without errors and, + more important, all indices must remain inactive after that. + Finally, we change DB dialect to 1, make b/r and again do same actions. + Result must be the same as for iteration with default dialect = 3. +NOTES: + [25.10.2024] pzotov + Checked on 6.0.0.508-67d8e39 (intermediate build). +""" +import time +from io import BytesIO +from firebird.driver import SrvRestoreFlag +import pytest +from firebird.qa import * + +init_sql = """ + set bail on; + recreate table test(id int generated by default as identity, x int, y int, z int); + set term ^; + execute block as + declare n int = 100000; + declare i int = 0; + begin + while (i < n) do + begin + insert into test(x, y, z) values( :i, null, :i); + i = i + 1; + end + end^ + set term ;^ + commit; + + create unique ascending index test_x_asc inactive on test(x); + create descending index test_y_desc inactive on test(y); + create unique descending index test_x_plus_y inactive on test computed by (x+y); + + create index test_z_partial inactive on test(z) where mod(id,2) = 0; + create unique index test_x_minus_y_partial inactive on test computed by (x-y) where mod(id,3) <= 1; + commit; +""" +db = db_factory(init = init_sql) + +act = python_act('db') + +#----------------------------------------------------------- + +def replace_leading(source, char="."): + stripped = source.lstrip() + return char * (len(source) - len(stripped)) + stripped + +#----------------------------------------------------------- + +def check_indices_inactive(act, qry_map, nr_block, capsys): + with act.db.connect() as con: + cur = con.cursor() + for k,v in qry_map.items(): + ps = cur.prepare(v) + # Print explained plan with padding eash line by dots in order to see indentations: + print(v) + print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) + print('') + ps.free() + + expected_out = '\n'.join( [''.join( (qry_map[i],'\n',nr_block) ) for i in range(len(qry_map))] ) + act.expected_stdout = expected_out + + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout + act.reset() + +#----------------------------------------------------------- + +@pytest.mark.version('>=6.0') +def test_1(act: Action, capsys): + + qry_map = { + 0 : 'select count(*) from test where x is null' + ,1 : 'select count(*) from test where y is null' + ,2 : 'select count(*) from test where x+y is null' + ,3 : 'select count(*) from test where z is null and mod(id,2) = 0' + ,4 : 'select count(*) from test where x-y is null and mod(id,3) <= 1' + ,5 : 'select count(*) from test where x is not distinct from null' + ,6 : 'select count(*) from test where y is not distinct from null' + ,7 : 'select count(*) from test where x+y is not distinct from null' + ,8 : 'select count(*) from test where z is not distinct from null and mod(id,2) = 0' + ,9 : 'select count(*) from test where x-y is not distinct from null and mod(id,3) <= 1' + } + nr_block = """ + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Table "TEST" Full Scan + """ + + for iter in range(2): + + # check-1: ensure that all indices actually are INACTIVE, i.e. all queries will use full scan. + ########## + check_indices_inactive(act, qry_map, nr_block, capsys) + + #---===+++---===+++---===+++---===+++---===+++---===+++---===+++---===+++---===+++---===+++--- + + # check-2: extract metadata, drop table and apply metadata which now contains 'INACTIVE' clause for indices. + ########## + act.isql(switches=['-x']) + init_meta = '\n'.join( ('set bail on;', act.stdout) ) + + with act.db.connect() as con: + con.execute_immediate('drop table test') + con.commit() + + # Apply metadata to main test database. + act.isql(switches = [], input = init_meta) + # NO errors must occur now: + assert act.clean_stdout == '' + act.reset() + + #---===+++---===+++---===+++---===+++---===+++---===+++---===+++---===+++---===+++---===+++--- + + # check-3: ensure that all indices REMAIN INACTIVE, i.e. all queries will use full scan. + ########## + check_indices_inactive(act, qry_map, nr_block, capsys) + + if iter == 0: + # change dialect to 1, make backup / restore and repeat all prev actions. + act.gfix(switches = ['-sql_dialect', '1', act.db.dsn], combine_output = True) + assert act.clean_stdout == '' + act.reset() + + backup = BytesIO() + with act.connect_server() as srv: + srv.database.local_backup(database = act.db.db_path, backup_stream = backup) + backup.seek(0) + srv.database.local_restore(backup_stream = backup, database = act.db.db_path, flags = SrvRestoreFlag.REPLACE) From df802f3bfcf256d1aa0909eeb9e51bdb9a2f9fae Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sat, 26 Oct 2024 11:21:35 +0300 Subject: [PATCH 090/128] Added/Updated tests\bugs\gh_8290_test.py: added ps.free() call otherwise pytest hangs at final point and does not return control to caller batch --- tests/bugs/gh_8290_test.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/bugs/gh_8290_test.py b/tests/bugs/gh_8290_test.py index 517622dc..d0efda58 100644 --- a/tests/bugs/gh_8290_test.py +++ b/tests/bugs/gh_8290_test.py @@ -65,6 +65,10 @@ def test_1(act: Action, capsys): print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) print('') + # 26.10.2024. ::: ACHTUNG ::: + # MANDATORY OTHERWISE PYTEST WILL HANG AT FINAL POINT: + ps.free() + expected_out = f""" {qry_map[0]} From 38bdbb14efd5abf7ca63c42138ca68c291173e92 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Mon, 28 Oct 2024 14:21:51 +0300 Subject: [PATCH 091/128] Added/Updated tests\bugs\core_1725_test.py: fully re-implemented - see notes. --- tests/bugs/core_1725_test.py | 509 +++++++++++++++++++++++------------ 1 file changed, 343 insertions(+), 166 deletions(-) diff --git a/tests/bugs/core_1725_test.py b/tests/bugs/core_1725_test.py index 52844ff5..ef821291 100644 --- a/tests/bugs/core_1725_test.py +++ b/tests/bugs/core_1725_test.py @@ -5,140 +5,117 @@ ID: issue-2149 ISSUE: 2149 TITLE: Unable to restore a database with inactive indices if any SP/trigger contains an explicit plan DESCRIPTION: + We create table and indices for it. + Then we create trigger for this table, view, procedure, function and package - and all of them have DDL + which explicitly uses 'TEST ORDER ' in execution plan. + Such database then backed up and restored with command switch '-i(nactive)'. + Restore is logged and we check that this log does not contain 'gbak:error' message (and eventually completes OK). + Restored database must contain all created DB objects, i.e. we must have ability to explicitly specify them in SQL. + Table trigger (containing explicit PLAN clause in its DDL) also must exist and remain active. + + Before this bug was fixed: + 1) log of restore contained: + gbak: ERROR:Error while parsing function FN_WORKER's BLR + gbak: ERROR: index TEST_X cannot be used in the specified plan + 2) restored database had NO indices that were explicitly specified in any DDL and any attempt to use appropriate + DB object failed with SQLSTATE = 42S02/39000/42000 ('Table/Procedure/Function} unknown'). + JIRA: CORE-1725 FBTEST: bugs.core_1725 +NOTES: + [28.10.2024] pzotov + 1. Test fully re-implemented. + We do NOT extract metadata before and after restore (in order to compare it): + in FB 6.x 'gbak -i' leads to 'create INACTIVE index ...' statements in generated SQL + (see https://github.com/FirebirdSQL/firebird/issues/8091 - "Ability to create an inactive index"). + + Comparison of metadata that was before and after restore has no much sense. + Rather, we have to check SQL/DML that attempt to use DB object which DDL contain + explicitly specified execution plan. + All such actions must raise error related to invalid BLR, but *not* error about missing DB object. + + BTW: it looks strange that such messages contain "-there is no index TEST_X for table TEST". + Such index definitely DOES exist but it is inactive. + + 2. Bug existed up to 17-jan-2019. + It was fixed by commits related to other issues, namely: + 3.x: a74130019af89012cc1e04ba18bbc9c4a69e1a5d // 17.01.2019 + 4.x: fea7c61d9741dc142fa020bf3aa93af7e52e2002 // 17.01.2019 + 5.x: fea7c61d9741dc142fa020bf3aa93af7e52e2002 // 18.01.2019 + ("Attempted to fix CORE-2440, CORE-5118 and CORE-5900 together (expression indices contain NULL keys after restore).") + + Checked on: + 6.0.0.511-c4bc943; 5.0.2.1547-1e08f5e; 4.0.0.1384-fea7c61 (17-jan-2019, just after fix); 3.0.13.33793-3e62713 """ +import locale +import re +from collections import defaultdict +from difflib import unified_diff +from pathlib import Path + import pytest from firebird.qa import * -from firebird.driver import SrvRestoreFlag, SrvRepairFlag -from io import BytesIO -from difflib import unified_diff - -substitutions_1 = [('[ \t]+', ' ')] init_script = """ -set bail on; + set bail on; -create or alter procedure sp_init as begin end; -create or alter procedure sp_main as begin end; -create or alter procedure sp_worker as begin end; + create or alter procedure sp_init as begin end; + create or alter procedure sp_main as begin end; + create or alter procedure sp_worker as begin end; -create or alter function fn_init returns int as begin end; -create or alter function fn_main returns int as begin end; -create or alter function fn_worker returns int as begin end; + create or alter function fn_init returns int as begin end; + create or alter function fn_main returns int as begin end; + create or alter function fn_worker returns int as begin end; + create table test(id int primary key, x int, y int); + create index test_x on test(x); + create descending index test_y on test(y); + commit; -create table test(id int primary key, x int, y int); -create index test_x on test(x); -create descending index test_y on test(y); -commit; + insert into test(id, x, y) select row_number()over(), rand()*5, rand()*100 from rdb$types; + commit; -insert into test(id, x, y) select row_number()over(), rand()*5, rand()*100 from rdb$types; -commit; - -create or alter view v_init as - select count(*) as cnt from test group by x - rows 1 -; - -create or alter view v_worker as - select count(*) as cnt - from test - group by y - plan (TEST ORDER TEST_Y) - union all - select cnt from v_init -; -commit; - - -set term ^; -execute block as -begin - rdb$set_context('USER_SESSION','INITIAL_DDL', '1'); -end -^ - -create or alter procedure sp_init as - declare c int; -begin - select count(*) from test group by x - rows 1 - into c + create or alter view v_init as + select count(*) as cnt from test group by x + rows 1 ; -end -^ -create or alter procedure sp_main as -begin - execute procedure sp_worker; -end -^ - -create or alter procedure sp_worker as - declare c int; -begin - select sum(cnt) - from ( + create or alter view v_worker as select count(*) as cnt - from test group by x - plan (TEST ORDER TEST_X) + from test + group by y + plan (TEST ORDER TEST_Y) union all - select cnt from v_worker - ) - into c + select cnt from v_init ; -end -^ -create or alter function fn_init returns int as -begin - return ( select count(*) from test ); -end -^ -create or alter function fn_worker returns int as -begin - return ( - select sum(cnt) - from ( - select count(*) as cnt - from test group by x - plan (TEST ORDER TEST_X) - union all - select cnt from v_worker - ) - ); -end -^ -create or alter function fn_main returns int as -begin - return fn_worker(); -end -^ + commit; -create or alter package pg_test as -begin - function pg_fn_worker returns int; - procedure pg_sp_worker; -end -^ -recreate package body pg_test as -begin - function pg_fn_worker returns int as + + set term ^; + execute block as begin - return ( - select sum(cnt) - from ( - select count(*) as cnt - from test group by x - plan (TEST ORDER TEST_X) - union all - select cnt from v_worker - ) - ); + rdb$set_context('USER_SESSION','INITIAL_DDL', '1'); end + ^ - procedure pg_sp_worker as + create or alter procedure sp_init as + declare c int; + begin + select count(*) from test group by x + rows 1 + into c + ; + end + ^ + + create or alter procedure sp_main as + begin + execute procedure sp_worker; + end + ^ + + create or alter procedure sp_worker as declare c int; begin select sum(cnt) @@ -152,66 +129,266 @@ begin into c ; end - -end -^ - -create or alter trigger trg_attach active on connect position 0 as - declare c int; -begin - if ( rdb$get_context('USER_SESSION','INITIAL_DDL') is null ) then + ^ + create or alter function fn_init returns int as begin - select sum(cnt) - from ( - select count(*) as cnt - from test group by x - plan (TEST ORDER TEST_X) - union all - select cnt from v_worker - ) - into c; + return ( select count(*) from test ); end -end -^ -set term ;^ -commit; + ^ + create or alter function fn_worker returns int as + begin + return ( + select sum(cnt) + from ( + select count(*) as cnt + from test group by x + plan (TEST ORDER TEST_X) + union all + select cnt from v_worker + ) + ); + end + ^ + create or alter function fn_main returns int as + begin + return fn_worker(); + end + ^ + + create or alter package pg_test as + begin + function pg_fn_worker returns int; + procedure pg_sp_worker; + end + ^ + recreate package body pg_test as + begin + function pg_fn_worker returns int as + begin + return ( + select sum(cnt) + from ( + select count(*) as cnt + from test group by x + plan (TEST ORDER TEST_X) + union all + select cnt from v_worker + ) + ); + end + + procedure pg_sp_worker as + declare c int; + begin + select sum(cnt) + from ( + select count(*) as cnt + from test group by x + plan (TEST ORDER TEST_X) + union all + select cnt from v_worker + ) + into c + ; + end + + end + ^ + create or alter trigger test_bi for test active before insert position 0 as + declare c int; + begin + if ( rdb$get_context('USER_SESSION','INITIAL_DDL') is null ) then + begin + select sum(cnt) + from ( + select count(*) as cnt + from test group by x + plan (TEST ORDER TEST_X) + union all + select cnt from v_worker + ) + into c; + end + end + ^ + set term ;^ + commit; """ -db = db_factory(init=init_script) +substitutions = [('[ \t]+', ' '), ('(-)?invalid request BLR at offset \\d+', 'invalid request BLR at offset')] -act = python_act('db') +db = db_factory(init = init_script) +act = python_act('db', substitutions = substitutions) + +tmp_fbk= temp_file('tmp_core_1725.fbk') +tmp_fdb = temp_file('tmp_core_1725.fdb') @pytest.mark.version('>=3.0.6') -def test_1(act: Action): - # Extract metadata from initial DB - act.isql(switches=['-nod', '-x']) - meta_1 = act.stdout +def test_1(act: Action, tmp_fbk: Path, tmp_fdb: Path, capsys): + + outcomes_map = defaultdict(str) + + act.gbak(switches=['-b', act.db.dsn, str(tmp_fbk)]) + + # restore _WITHOUT_ building indices: + act.gbak(switches=['-rep', '-i', '-v', str(tmp_fbk), str(tmp_fdb) ], combine_output = True, io_enc = locale.getpreferredencoding()) + + watching_patterns = [re.compile(x, re.IGNORECASE) for x in (r'gbak:\s?ERROR(:)?\s?', r'gbak:finis.*\s+going home', r'gbak:adjust.*\s+flags')] + + for line in act.clean_stdout.splitlines(): + for p in watching_patterns: + if p.search(line): + outcomes_map['restore_log'] += line+'\n' act.reset() - # backup + restore _WITHOUT_ building indices: - backup = BytesIO() - with act.connect_server() as srv: - srv.database.local_backup(database=act.db.db_path, backup_stream=backup) - backup.seek(0) - srv.database.local_restore(backup_stream=backup, database=act.db.db_path, - flags=SrvRestoreFlag.DEACTIVATE_IDX | SrvRestoreFlag.REPLACE) - # Get FB log before validation, run validation and get FB log after it: - log_before = act.get_firebird_log() - srv.database.repair(database=act.db.db_path, flags=SrvRepairFlag.CORRUPTION_CHECK) - #act.gfix(switches=['-v', '-full', act.db.dsn]) - log_after = act.get_firebird_log() - # Extract metadata from restored DB - act.isql(switches=['-nod', '-x']) - meta_2 = act.stdout + + ########################################################################### + + check_metadata = """ + set list on; + set count on; + + select ri.rdb$index_name, ri.rdb$index_inactive from rdb$indices ri where ri.rdb$relation_name = upper('test') and ri.rdb$index_name starting with upper('test'); + + select p.rdb$package_name, p.rdb$procedure_name as sp_name, p.rdb$valid_blr as sp_valid_blr + from rdb$procedures p + where p.rdb$system_flag is distinct from 1 + order by p.rdb$package_name, p.rdb$procedure_name + ; + + select f.rdb$package_name, f.rdb$function_name as fn_name, f.rdb$valid_blr as fn_valid_blr + from rdb$functions f + where f.rdb$system_flag is distinct from 1 + order by f.rdb$package_name, f.rdb$function_name + ; + + select rt.rdb$trigger_name, rt.rdb$trigger_inactive, rt.rdb$valid_blr as tg_valid_blr + from rdb$triggers rt + where + rt.rdb$system_flag is distinct from 1 and + rt.rdb$relation_name = upper('test') + ; + + set count off; + """ + act.isql(switches=['-nod', '-q', str(tmp_fdb)], input = check_metadata, credentials = True, charset = 'utf8', connect_db = False, combine_output = True, io_enc = locale.getpreferredencoding()) + for line in act.clean_stdout.splitlines(): + outcomes_map['check_metadata'] += line+'\n' + act.reset() + + ########################################################################### + + check_avail_db_objects = """ + set list on; + set echo on; + select * from v_worker; + + execute procedure sp_main; + + select fn_main() from rdb$database; + + execute procedure pg_test.pg_sp_worker; + + select pg_test.pg_fn_worker() from rdb$database; + + insert into test(id, x, y) values(-1, -1, -1) returning id, x, y; + """ + act.isql(switches=['-nod', '-q', str(tmp_fdb)], input = check_avail_db_objects, credentials = True, charset = 'utf8', connect_db = False, combine_output = True, io_enc = locale.getpreferredencoding()) + + for line in act.clean_stdout.splitlines(): + outcomes_map['check_avail_db_objects'] += line+'\n' + act.reset() + + for k,v in outcomes_map.items(): + print(k) + for p in v.splitlines(): + print(p) + print('') + + ########################################################################### + + act.expected_stdout = """ + restore_log + gbak:finishing, closing, and going home + gbak:adjusting the ONLINE and FORCED WRITES flags + + check_metadata + RDB$INDEX_NAME TEST_X + RDB$INDEX_INACTIVE 1 + RDB$INDEX_NAME TEST_Y + RDB$INDEX_INACTIVE 1 + Records affected: 2 + + RDB$PACKAGE_NAME + SP_NAME SP_INIT + SP_VALID_BLR 1 + RDB$PACKAGE_NAME + SP_NAME SP_MAIN + SP_VALID_BLR 1 + RDB$PACKAGE_NAME + SP_NAME SP_WORKER + SP_VALID_BLR 1 + RDB$PACKAGE_NAME PG_TEST + SP_NAME PG_SP_WORKER + SP_VALID_BLR 1 + Records affected: 4 + + RDB$PACKAGE_NAME + FN_NAME FN_INIT + FN_VALID_BLR 1 + RDB$PACKAGE_NAME + FN_NAME FN_MAIN + FN_VALID_BLR 1 + RDB$PACKAGE_NAME + FN_NAME FN_WORKER + FN_VALID_BLR 1 + RDB$PACKAGE_NAME PG_TEST + FN_NAME PG_FN_WORKER + FN_VALID_BLR 1 + Records affected: 4 + + RDB$TRIGGER_NAME TEST_BI + RDB$TRIGGER_INACTIVE 0 + TG_VALID_BLR 1 + Records affected: 1 + + check_avail_db_objects + select * from v_worker; + Statement failed, SQLSTATE = 42000 + invalid request BLR at offset 35 + -there is no index TEST_Y for table TEST + + execute procedure sp_main; + Statement failed, SQLSTATE = 2F000 + Error while parsing procedure SP_MAIN's BLR + -Error while parsing procedure SP_WORKER's BLR + -invalid request BLR at offset 66 + -there is no index TEST_X for table TEST + + select fn_main() from rdb$database; + Statement failed, SQLSTATE = 2F000 + Error while parsing function FN_MAIN's BLR + -Error while parsing function FN_WORKER's BLR + -invalid request BLR at offset 72 + -there is no index TEST_X for table TEST + + execute procedure pg_test.pg_sp_worker; + Statement failed, SQLSTATE = 2F000 + Error while parsing procedure PG_TEST.PG_SP_WORKER's BLR + -invalid request BLR at offset 66 + -there is no index TEST_X for table TEST + + select pg_test.pg_fn_worker() from rdb$database; + Statement failed, SQLSTATE = 2F000 + Error while parsing function PG_TEST.PG_FN_WORKER's BLR + -invalid request BLR at offset 72 + -there is no index TEST_X for table TEST + + insert into test(id, x, y) values(-1, -1, -1) returning id, x, y; + Statement failed, SQLSTATE = 42000 + invalid request BLR at offset + -there is no index TEST_X for table TEST + """ + + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout act.reset() - # Restore with indices. This is necessary to drop the database safely otherwise connect - # to drop will fail in test treadown as connect trigger referes to index tat was not activated - with act.connect_server() as srv: - backup.seek(0) - srv.database.local_restore(backup_stream=backup, database=act.db.db_path, - flags=SrvRestoreFlag.REPLACE) - # - diff_meta = ''.join(unified_diff(meta_1.splitlines(), meta_2.splitlines())) - diff_log = [line for line in unified_diff(log_before, log_after) if line.startswith('+') and 'Validation finished:' in line] - # Checks - assert diff_meta == '' - assert diff_log == ['+\tValidation finished: 0 errors, 0 warnings, 0 fixed\n'] From e72e2163186fc08097ccae2966f7d32691cfd308 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Tue, 29 Oct 2024 14:06:39 +0300 Subject: [PATCH 092/128] Added/Updated tests\bugs\gh_8255_test.py: added/adjusted comments. Tes can run currently only on Windows. On Linux server stil crashes. --- tests/bugs/gh_8255_test.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/bugs/gh_8255_test.py b/tests/bugs/gh_8255_test.py index 78e553e3..835532b7 100644 --- a/tests/bugs/gh_8255_test.py +++ b/tests/bugs/gh_8255_test.py @@ -13,11 +13,16 @@ DESCRIPTION: * 6.x: https://github.com/FirebirdSQL/firebird/commit/6b445c0dc53f1c5778258bd673c0b61f6dd93a69 (20-sep-2024) NOTES: [23.09.2024] pzotov - Initially query containing 15'000 terms in "+1+1...+1" expression used to check. + Initially query contained expression of 15'000 terms ("1+1+1...+1") was used to check. This query causes 'stack overflow' only in FB 5.x and 6.x. But in FB 4.0.6.3156 it successfully COMPLETES calculation and issues result. For FB 4.x this 'threshold' is 16'287 (last number of terms where FB can evaluate result w/o 'stack overflow'). - Because of this, it was decided to increase number of terms to 50'000. + Because of this, it was decided to increase number of terms to 100'000. + + ::: NB ::: + Fix currently exists only for Windows, see: + https://github.com/FirebirdSQL/firebird/pull/8255#issuecomment-2354781108 + On Linux this query still crashes server. Checked on 6.0.0.466, 5.0.2.1513, 4.0.6.3156 """ @@ -32,7 +37,7 @@ act = python_act('db', substitutions=[('[ \t]+', ' '), ('After line \\d+.*', '') tmp_sql = temp_file('tmp_8255_non_ascii_ddl.sql') -@pytest.mark.skipif(platform.system() != 'Windows', reason='See ticket note.') +@pytest.mark.skipif(platform.system() != 'Windows', reason='See ticket note: fix was only for Windows.') @pytest.mark.version('>=4.0.6') def test_1(act: Action, tmp_sql: Path, capsys): From c6c39c6dc8b5df206a6920657d1e7ad514288a49 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Tue, 29 Oct 2024 22:57:01 +0300 Subject: [PATCH 093/128] Added/Updated tests\bugs\gh_8230_test.py: Checked on 6.0.0.511-781e5d9 (intermediate build). --- tests/bugs/gh_8230_test.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 tests/bugs/gh_8230_test.py diff --git a/tests/bugs/gh_8230_test.py b/tests/bugs/gh_8230_test.py new file mode 100644 index 00000000..1941c4d3 --- /dev/null +++ b/tests/bugs/gh_8230_test.py @@ -0,0 +1,36 @@ +#coding:utf-8 + +""" +ID: issue-8230 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8230 +TITLE: Ability to obtain PID of server process for current connection without querying mon$ tables +DESCRIPTION: + Test verifies ability to call appropriate rdb$get_context() and compare its value with + mon$attachments.mon$server_pid. They must be equal (and no error must raise). +NOTES: + [29.10.2024] pzotov + Checked on 6.0.0.511-781e5d9 (intermediate build). +""" +import pytest +from firebird.qa import * + +db = db_factory() + +test_script = """ + set list on; + select cast(rdb$get_context('SYSTEM', 'SERVER_PID') as int) - a.mon$server_pid as result + from mon$attachments a + where a.mon$attachment_id = current_connection; +""" + +act = isql_act('db', test_script, substitutions=[ ('[ \\t]+', ' ') ]) + +@pytest.mark.version('>=4.0.6') +def test_1(act: Action): + + expected_stdout = f""" + RESULT 0 + """ + act.expected_stdout = expected_stdout + act.execute(combine_output = True) + assert act.clean_stdout == act.clean_expected_stdout From d061161bd135d7ddfd4f4395bea61108dc2c7454 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Wed, 30 Oct 2024 10:03:12 +0300 Subject: [PATCH 094/128] Added/Updated tests\bugs\gh_8230_test.py: fixed wrong min_version --- tests/bugs/gh_8230_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/bugs/gh_8230_test.py b/tests/bugs/gh_8230_test.py index 1941c4d3..20901eef 100644 --- a/tests/bugs/gh_8230_test.py +++ b/tests/bugs/gh_8230_test.py @@ -25,7 +25,7 @@ test_script = """ act = isql_act('db', test_script, substitutions=[ ('[ \\t]+', ' ') ]) -@pytest.mark.version('>=4.0.6') +@pytest.mark.version('>=6.0') def test_1(act: Action): expected_stdout = f""" From aa32623dbba3c0c855541d47e95cc6ac19a81493 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Wed, 30 Oct 2024 11:43:36 +0300 Subject: [PATCH 095/128] Added/Updated tests\bugs\gh_8161_test.py: Splitted expected_out again: added separate block for FB 5.x after discuss with dimitr. --- tests/bugs/gh_8161_test.py | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/tests/bugs/gh_8161_test.py b/tests/bugs/gh_8161_test.py index 3a1d5fa9..92ef9bcb 100644 --- a/tests/bugs/gh_8161_test.py +++ b/tests/bugs/gh_8161_test.py @@ -25,6 +25,9 @@ NOTES: for RDB$PROCEDURES table (index on columns: RDB$PACKAGE_NAME,RDB$PROCEDURE_NAME - is unique and at least one of these columns allow NULLs). Checked on 6.0.0.502-d2f4cf6, 5.0.2.1542-ab50e20 (intermediate builds). + + [30.10.2024] pzotov + Splitted expected_out again: added separate block for FB 5.x after discuss with dimitr. """ import zipfile from pathlib import Path @@ -93,19 +96,39 @@ def test_1(act: Action, tmp_fbk: Path, capsys): ................-> Filter ....................-> Table "RDB$DEPENDENCIES" as "DEP" Access By ID ........................-> Bitmap - ............................-> Index "RDB$INDEX_28" Range Scan (full match) + ............................-> Index "RDB$INDEX_nn" Range Scan (full match) ................-> Filter ....................-> Table "RDB$PROCEDURES" as "PRC" Access By ID ........................-> Bitmap - ............................-> Index "RDB$INDEX_21" Unique Scan + ............................-> Index "RDB$INDEX_nn" Unique Scan Select Expression ....-> Filter ........-> Table "RDB$RELATION_FIELDS" as "X" Access By ID ............-> Bitmap - ................-> Index "RDB$INDEX_3" Range Scan (full match) + ................-> Index "RDB$INDEX_nn" Range Scan (full match) """ expected_stdout_5x = """ + Select Expression + ....-> Singularity Check + ........-> Aggregate + ............-> Nested Loop Join (inner) + ................-> Filter + ....................-> Table "RDB$DEPENDENCIES" as "DEP" Access By ID + ........................-> Bitmap + ............................-> Index "RDB$INDEX_nn" Range Scan (full match) + ................-> Filter + ....................-> Table "RDB$PROCEDURES" as "PRC" Access By ID + ........................-> Bitmap + ............................-> Index "RDB$INDEX_nn" Unique Scan + Select Expression + ....-> Filter + ........-> Table "RDB$RELATION_FIELDS" as "X" Access By ID + ............-> Bitmap + ................-> Index "RDB$INDEX_nn" Range Scan (full match) + """ + + expected_stdout_6x = """ Select Expression ....-> Singularity Check ........-> Aggregate @@ -125,6 +148,6 @@ def test_1(act: Action, tmp_fbk: Path, capsys): ................-> Index "RDB$INDEX_nn" Range Scan (full match) """ - act.expected_stdout = expected_stdout_4x if act.is_version('<5') else expected_stdout_5x + act.expected_stdout = expected_stdout_4x if act.is_version('<5') else expected_stdout_5x if act.is_version('<6') else expected_stdout_6x act.stdout = capsys.readouterr().out assert act.clean_stdout == act.clean_expected_stdout From b57a88bd18672e63de6a3be45707819b2317d2d8 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Wed, 30 Oct 2024 11:48:01 +0300 Subject: [PATCH 096/128] Added/Updated tests\functional\arno\optimizer\test_opt_inner_join_05.py: Splitted expected_out : added separate block for FB 5.x after discuss with dimitr. --- .../arno/optimizer/test_opt_inner_join_05.py | 58 ++++++++++++------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/tests/functional/arno/optimizer/test_opt_inner_join_05.py b/tests/functional/arno/optimizer/test_opt_inner_join_05.py index 4abba726..31309442 100644 --- a/tests/functional/arno/optimizer/test_opt_inner_join_05.py +++ b/tests/functional/arno/optimizer/test_opt_inner_join_05.py @@ -21,6 +21,9 @@ NOTES: ("Add key info to the hash join plan output", 23.09.2024 18:26) Discussed with dimitr. Checked on 6.0.0.467-cc183f5, 5.0.2.1513 + + [30.10.2024] pzotov + Splitted expected_out : added separate block for FB 5.x after discuss with dimitr. """ import pytest @@ -326,7 +329,7 @@ act = python_act('db', substitutions = substitutions) #---------------------------------------------------------- -def replace_leading(source, char="#"): +def replace_leading(source, char="."): stripped = source.lstrip() return char * (len(source) - len(stripped)) + stripped @@ -355,31 +358,44 @@ def test_1(act: Action, capsys): expected_stdout_4x = """ Select Expression - ####-> Sort (record length: 150, key length: 44) - ########-> Nested Loop Join (inner) - ############-> Filter - ################-> Table "COUNTRIES" as "C" Access By ID - ####################-> Bitmap - ########################-> Index "I_COUNTRYNAME" Unique Scan - ############-> Filter - ################-> Table "RELATIONS" as "R" Access By ID - ####################-> Bitmap - ########################-> Index "FK_RELATIONS_COUNTRIES" Range Scan (full match) + ....-> Sort (record length: 150, key length: 44) + ........-> Nested Loop Join (inner) + ............-> Filter + ................-> Table "COUNTRIES" as "C" Access By ID + ....................-> Bitmap + ........................-> Index "I_COUNTRYNAME" Unique Scan + ............-> Filter + ................-> Table "RELATIONS" as "R" Access By ID + ....................-> Bitmap + ........................-> Index "FK_RELATIONS_COUNTRIES" Range Scan (full match) """ expected_stdout_5x = """ Select Expression - ####-> Sort (record length: 150, key length: 44) - ########-> Filter - ############-> Hash Join (inner) - ################-> Table "RELATIONS" as "R" Full Scan - ################-> Record Buffer (record length: 81) - ####################-> Filter - ########################-> Table "COUNTRIES" as "C" Access By ID - ############################-> Bitmap - ################################-> Index "I_COUNTRYNAME" Unique Scan + ....-> Sort (record length: 150, key length: 44) + ........-> Filter + ............-> Hash Join (inner) + ................-> Table "RELATIONS" as "R" Full Scan + ................-> Record Buffer (record length: 81) + ....................-> Filter + ........................-> Table "COUNTRIES" as "C" Access By ID + ............................-> Bitmap + ................................-> Index "I_COUNTRYNAME" Range Scan (full match) """ - act.expected_stdout = expected_stdout_4x if act.is_version('<5') else expected_stdout_5x + expected_stdout_6x = """ + Select Expression + ....-> Sort (record length: 150, key length: 44) + ........-> Filter + ............-> Hash Join (inner) + ................-> Table "RELATIONS" as "R" Full Scan + ................-> Record Buffer (record length: 81) + ....................-> Filter + ........................-> Table "COUNTRIES" as "C" Access By ID + ............................-> Bitmap + ................................-> Index "I_COUNTRYNAME" Unique Scan + """ + + act.expected_stdout = expected_stdout_4x if act.is_version('<5') else expected_stdout_5x if act.is_version('<6') else expected_stdout_6x act.stdout = capsys.readouterr().out assert act.clean_stdout == act.clean_expected_stdout From d2c60eef348a9a21ce372a44c676405789b84325 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Wed, 30 Oct 2024 15:03:22 +0300 Subject: [PATCH 097/128] Added/Updated tests\bugs\core_5464_test.py: Checked on 6.0.0.511 (Windows/Linux); 5.0.2.1550; 4.0.6.3165; 3.0.13.33793; 3.0.2.32670-0fab1a8. --- tests/bugs/core_5464_test.py | 136 ++++++++++++++++++++++------------- 1 file changed, 88 insertions(+), 48 deletions(-) diff --git a/tests/bugs/core_5464_test.py b/tests/bugs/core_5464_test.py index fa3855c5..4f4593e5 100644 --- a/tests/bugs/core_5464_test.py +++ b/tests/bugs/core_5464_test.py @@ -5,66 +5,106 @@ ID: issue-5734 ISSUE: 5734 TITLE: AV in fbclient when reading blob stored in incompatible encoding DESCRIPTION: + Domain description contains non-ascii text in Latvian + and is created using charset = win1257. + Subsequent connect which tries to get this description uses cp1253 (Greek). + Commit that fixed ticket: 0fab1a85597baa5054a34cae437f5da6096580b0 (20.01.2017 00:43) JIRA: CORE-5464 FBTEST: bugs.core_5464 NOTES: - [06.10.2022] pzotov - Could not complete adjusting for LINUX in new-qa. - DEFERRED. + [30.10.2024] pzotov + Crash *not* occurs but one may note different behaviour of snapshots before and after fix. + + Snapshot before fix (e.g. 90a46fa3, 06-jan-2017) for query to rdb$fields (see view v_domain_descr) + behave differently depending on connection protocol: + * for TCP is does not return any record for query to view 'v_conn_cset'; + * for LOCAL protocol its returns weird 'RDB$SYSTEM_FLAG 18775' and error 'SQLSTATE = 42000 / invalid BLOB ID'. + + Also, error message for query to view 'v_domain_descr' (before fix) was: + Statement failed, SQLSTATE = HY000 + Cannot transliterate character between character sets + request synchronization error + + Discussed with Vlad, letters date: 29-oct-2024. + Checked on 6.0.0.511 (Windows/Linux); 5.0.2.1550; 4.0.6.3165; 3.0.13.33793; 3.0.2.32670-0fab1a8. """ -import platform +import locale +from pathlib import Path + import pytest from firebird.qa import * -init_script = """ - create domain d_int int; - comment on domain d_int is - '*Лев Николаевич Толстой * *Анна Каренина * /Мне отмщение, и аз воздам/ *ЧАСТЬ ПЕРВАЯ* *I * - Все счастливые семьи похожи друг на друга, каждая несчастливая - семья несчастлива по-своему. - Все смешалось в доме Облонских. Жена узнала, что муж был в связи - с бывшею в их доме француженкою-гувернанткой, и объявила мужу, что - не может жить с ним в одном доме. Положение это продолжалось уже - третий день и мучительно чувствовалось и самими супругами, и всеми - членами семьи, и домочадцами. Все члены семьи и домочадцы - чувствовали, что нет смысла в их сожительстве и что на каждом - п1 - '; - commit; -""" +db = db_factory(charset='win1257') +act = isql_act('db', substitutions = [('TCPv(4|6)', 'TCP')]) -db_1 = db_factory(charset='WIN1251', init=init_script) +tmp_sql = temp_file('tmp_core_5464.sql') -test_script = """ - set blob all; - set list on; +@pytest.mark.version('>=3.0.1') +def test_1(act: Action, tmp_sql: Path, capsys): - select c.rdb$character_set_name as connection_cset, r.rdb$character_set_name as db_default_cset - from mon$attachments a - join rdb$character_sets c on a.mon$character_set_id = c.rdb$character_set_id - cross join rdb$database r where a.mon$attachment_id=current_connection; + non_ascii_txt = """ + Oblonsku mājā viss bija sajaukts. + Sieva uzzināja, ka viņas vīram ir attiecības ar franču guvernanti, + kas atradās viņu mājā, un paziņoja vīram, ka nevar dzīvot ar viņu vienā mājā. + """ - select rdb$field_name, rdb$system_flag, rdb$description - from rdb$fields where rdb$description is not null; -""" + init_script = f""" + create domain dm_test int; + comment on domain dm_test is '{non_ascii_txt}'; + commit; + create view v_conn_cset as + select + rdb$get_context('SYSTEM', 'NETWORK_PROTOCOL') as conn_protocol + ,c.rdb$character_set_name as connection_cset + ,r.rdb$character_set_name as db_default_cset + from mon$attachments a + join rdb$character_sets c on a.mon$character_set_id = c.rdb$character_set_id + cross join rdb$database r where a.mon$attachment_id=current_connection; -act = isql_act('db_1', test_script) + create view v_domain_descr as + select f.rdb$field_name, f.rdb$system_flag, f.rdb$description + from rdb$database d + left join rdb$fields f on f.rdb$description is not null; + commit; + """ + tmp_sql.write_bytes(init_script.encode('cp1257')) + act.isql(switches=['-q'], input_file = tmp_sql, charset='win1257', combine_output = True, io_enc = locale.getpreferredencoding()) + assert act.return_code == 0 -expected_stdout = """ - CONNECTION_CSET WIN1250 - DB_DEFAULT_CSET WIN1251 -""" + test_sql = f""" + set blob all; + set list on; + set count on; + connect '{act.db.dsn}'; + select v1.* from v_conn_cset as v1; + select v2.* from v_domain_descr as v2; + commit; -expected_stderr = """ - Statement failed, SQLSTATE = 22018 - Cannot transliterate character between character sets -""" + connect '{act.db.db_path}'; + select v3.* from v_conn_cset as v3; + select v4.* from v_domain_descr as v4; + commit; + """ + act.isql(switches=['-q'], connect_db = False, input = test_sql, charset='win1253', combine_output = True, io_enc = locale.getpreferredencoding()) -@pytest.mark.skipif(platform.system() != 'Windows', reason='FIXME: see notes') -@pytest.mark.version('>=3.0.2') -def test_1(act: Action): - act.expected_stderr = expected_stderr - act.expected_stdout = expected_stdout - act.isql(switches=['-q'], input=test_script, charset='WIN1250') - assert (act.clean_stderr == act.clean_expected_stderr and - act.clean_stdout == act.clean_expected_stdout) + act.expected_stdout = """ + CONN_PROTOCOL TCP + CONNECTION_CSET WIN1253 + DB_DEFAULT_CSET WIN1257 + Records affected: 1 + + Statement failed, SQLSTATE = 22018 + Cannot transliterate character between character sets + Records affected: 0 + + + CONN_PROTOCOL + CONNECTION_CSET WIN1253 + DB_DEFAULT_CSET WIN1257 + Records affected: 1 + + Statement failed, SQLSTATE = 22018 + Cannot transliterate character between character sets + Records affected: 0 + """ + assert act.clean_stdout == act.clean_expected_stdout From 264a8864e91d5f0a8abe26f3874bda7f535300bc Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Wed, 30 Oct 2024 23:44:28 +0300 Subject: [PATCH 098/128] Added/Updated tests\bugs\core_3489_test.py: Re-implemented. See notes. Checked on 6.0.0.511 (Windows/Linux); 5.0.2.1550; 4.0.6.3165; 3.0.2.32670, 3,0,1,32609 --- tests/bugs/core_3489_test.py | 168 +++++++++++++++++++++-------------- 1 file changed, 102 insertions(+), 66 deletions(-) diff --git a/tests/bugs/core_3489_test.py b/tests/bugs/core_3489_test.py index f959cf20..48bde78d 100644 --- a/tests/bugs/core_3489_test.py +++ b/tests/bugs/core_3489_test.py @@ -1,66 +1,102 @@ -#coding:utf-8 - -""" -ID: issue-3848 -ISSUE: 3848 -TITLE: Blob transliteration may not happen inside the union -DESCRIPTION: -JIRA: CORE-3489 -FBTEST: bugs.core_3489 -NOTES: - [06.10.2022] pzotov - Could not complete adjusting for LINUX in new-qa. - DEFERRED. -""" -import platform -import pytest -from pathlib import Path -from firebird.qa import * - -init_script = """ - set term ^; - create or alter procedure sp_test - returns ( - msg_blob_id blob sub_type 1 segment size 80 character set unicode_fss) - AS - begin - msg_blob_id= 'Это проверка на вывод строки "Йцукёнг"'; -- text in cyrillic - suspend; - end - ^ - set term ;^ - commit; -""" - -db = db_factory(charset='WIN1251', init=init_script) - -act = python_act('db', substitutions=[('MSG_BLOB_ID.*', '')]) - -expected_stdout = """ - Это проверка на вывод строки "Йцукёнг" - Это проверка на вывод строки "Йцукёнг" - Records affected: 2 -""" - -script_file = temp_file('test_script.sql') - -@pytest.mark.skipif(platform.system() != 'Windows', reason='FIXME: see notes') -@pytest.mark.version('>=3') -def test_1(act: Action, script_file: Path): - script_file.write_text(""" - set list on; - set blob all; - set count on; - set list on; - - select msg_blob_id - from sp_test - union - select msg_blob_id - from sp_test; - """, encoding='cp1251') - act.expected_stdout = expected_stdout - act.isql(switches=[], input_file=script_file, charset='WIN1251') - assert act.clean_stdout == act.clean_expected_stdout - - +#coding:utf-8 + +""" +ID: issue-3848 +ISSUE: 3848 +TITLE: Blob transliteration may not happen inside the union +DESCRIPTION: +JIRA: CORE-3489 +FBTEST: bugs.core_3489 +NOTES: + [30.10.2024] pzotov + Bug was fixed for too old FB (3.0 Alpha 1), firebird-driver and/or QA-plugin will not able to run on this version. + to check this version in order to reproduce problem. + Source for this test was taken from ticket almost w/o changes. Only aux view has been added ('v_conn_cset') for + showing current connection protocol and character set - we make query to this view two twice: one for TCP and then + for local protocol. + + Checked on 6.0.0.511 (Windows/Linux); 5.0.2.1550; 4.0.6.3165; 3.0.2.32670, 3,0,1,32609 +""" + +import locale +from pathlib import Path +import pytest +from firebird.qa import * + +db = db_factory(charset='WIN1251') + +act = python_act('db', substitutions=[('MSG_BLOB_ID.*', ''), ('TCPv(4|6)', 'TCP')]) + +expected_stdout = """ + CONN_PROTOCOL TCP + CONNECTION_CSET WIN1251 + DB_DEFAULT_CSET WIN1251 + Records affected: 1 + Это проверка на вывод строки "Йцукёнг" + Это проверка на вывод строки "Йцукёнг" + Records affected: 2 + + CONN_PROTOCOL + CONNECTION_CSET WIN1251 + DB_DEFAULT_CSET WIN1251 + Records affected: 1 + Это проверка на вывод строки "Йцукёнг" + Это проверка на вывод строки "Йцукёнг" + Records affected: 2 +""" + +tmp_sql = temp_file('tmp_core_3489.sql') + +@pytest.mark.version('>=3.0.0') +def test_1(act: Action, tmp_sql: Path): + tmp_sql.write_text( + f""" + set bail on; + set list on; + set blob all; + set count on; + set names win1251; + connect '{act.db.dsn}'; + create view v_conn_cset as + select + rdb$get_context('SYSTEM', 'NETWORK_PROTOCOL') as conn_protocol + ,c.rdb$character_set_name as connection_cset + ,r.rdb$character_set_name as db_default_cset + from mon$attachments a + join rdb$character_sets c on a.mon$character_set_id = c.rdb$character_set_id + cross join rdb$database r where a.mon$attachment_id=current_connection; + + set term ^; + create or alter procedure sp_test + returns ( + msg_blob_id blob sub_type 1 segment size 80 character set unicode_fss) + AS + begin + msg_blob_id= 'Это проверка на вывод строки "Йцукёнг"'; -- text in cyrillic + suspend; + end + ^ + set term ;^ + commit; + -------------------------- + connect '{act.db.dsn}'; -- check TCP protocol + select * from v_conn_cset; + select msg_blob_id + from sp_test + union + select msg_blob_id + from sp_test; + commit; + -------------------------- + connect '{act.db.db_path}'; -- check local protocol + select * from v_conn_cset; + select msg_blob_id + from sp_test + union + select msg_blob_id + from sp_test; + """ + ,encoding='cp1251') + act.expected_stdout = expected_stdout + act.isql(switches = ['-q'], input_file = tmp_sql, charset = 'WIN1251', combine_output = True, connect_db = False) + assert act.clean_stdout == act.clean_expected_stdout From f26daf2d0168e85901eae7437e6e672589f17e96 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 31 Oct 2024 00:15:48 +0300 Subject: [PATCH 099/128] Added/Updated tests\bugs\core_2227_test.py: Re-implemented. See notes. Checked on 6.0.0.511 (Windows/Linux); 5.0.2.1550; 4.0.6.3165; 3.0.2.32670, 3,0,1,32609 --- tests/bugs/core_2227_test.py | 133 +++++++++++++++++++++-------------- 1 file changed, 82 insertions(+), 51 deletions(-) diff --git a/tests/bugs/core_2227_test.py b/tests/bugs/core_2227_test.py index 817dfc74..816b0853 100644 --- a/tests/bugs/core_2227_test.py +++ b/tests/bugs/core_2227_test.py @@ -1,51 +1,82 @@ -#coding:utf-8 - -""" -ID: issue-2655 -ISSUE: 2655 -TITLE: Problem with column names with Accents and triggers -DESCRIPTION: -JIRA: CORE-2227 -FBTEST: bugs.core_2227 -NOTES: - [25.1.2022] pcisar - For yet unknown reason, ISQL gets malformed stdin from act.execute() although it was passed - correctly encoded in iso8859_1. Test changed to use script file writen in iso8859_1 - which works fine. - [06.10.2022] pzotov - Could not complete adjusting for LINUX in new-qa. - DEFERRED. -""" -import platform -import pytest -from pathlib import Path -from firebird.qa import * - -init_script = """ - RECREATE TABLE TESTING ( - "CÓDIGO" INTEGER - ); -""" - -db = db_factory(charset='ISO8859_1', init=init_script) - -test_script = """ - SET TERM ^; - CREATE TRIGGER TESTING_I FOR TESTING - ACTIVE BEFORE INSERT POSITION 0 - AS - BEGIN - NEW."CÓDIGO" = 1; - END - ^ -""" - -act = isql_act('db', test_script) - -script_file = temp_file('test_script.sql') - -@pytest.mark.skipif(platform.system() != 'Windows', reason='FIXME: see notes') -@pytest.mark.version('>=3') -def test_1(act: Action, script_file: Path): - script_file.write_text(test_script, encoding='iso8859_1') - act.isql(switches=[], input_file=script_file) +#coding:utf-8 + +""" +ID: issue-2655 +ISSUE: 2655 +TITLE: Problem with column names with Accents and triggers +DESCRIPTION: +JIRA: CORE-2227 +FBTEST: bugs.core_2227 +NOTES: + [31.10.2024] pzotov + Bug was fixed for too old FB (2.1.2; 2.5 Beta1) so firebird-driver and/or QA-plugin + will not able to run on this version in order to reproduce problem. + Source for this test was taken from ticket almost w/o changes. Only aux view has been added ('v_conn_cset') for + showing current connection protocol and character set - we make query to this view two twice: one for TCP and then + for local protocol. + + Checked on 6.0.0.511 (Windows/Linux); 5.0.2.1550; 4.0.6.3165; 3.0.2.32670, 3,0,1,32609 +""" +from pathlib import Path + +import pytest +from firebird.qa import * + +db = db_factory(charset='ISO8859_1') + +act = isql_act('db', substitutions = [ ('[ \\t]+', ' '), ('TCPv(4|6)', 'TCP') ]) + +tmp_sql = temp_file('tmp_core_2227.sql') + +@pytest.mark.version('>=3.0.0') +def test_1(act: Action, tmp_sql: Path): + test_script = f""" + set bail on; + set list on; + recreate table testing ( + "CÓDIGO" integer + ); + commit; + set term ^; + create trigger testing_i for testing active before insert position 0 as + begin + new."CÓDIGO" = 1; + end + ^ + set term ;^ + commit; + + create view v_conn_cset as + select + rdb$get_context('SYSTEM', 'NETWORK_PROTOCOL') as conn_protocol + ,c.rdb$character_set_name as connection_cset + ,r.rdb$character_set_name as db_default_cset + from mon$attachments a + join rdb$character_sets c on a.mon$character_set_id = c.rdb$character_set_id + cross join rdb$database r where a.mon$attachment_id=current_connection; + commit; + + connect '{act.db.dsn}'; + select * from v_conn_cset; + insert into testing default values returning "CÓDIGO"; + rollback; + + connect '{act.db.db_path}'; + select * from v_conn_cset; + insert into testing default values returning "CÓDIGO"; + """ + + tmp_sql.write_text(test_script, encoding='iso8859_1') + act.expected_stdout = """ + CONN_PROTOCOL TCPv4 + CONNECTION_CSET ISO8859_1 + DB_DEFAULT_CSET ISO8859_1 + CÓDIGO 1 + + CONN_PROTOCOL + CONNECTION_CSET ISO8859_1 + DB_DEFAULT_CSET ISO8859_1 + CÓDIGO 1 + """ + act.isql(switches = ['-q'], input_file = tmp_sql, charset = 'iso8859_1', combine_output = True) + assert act.clean_stdout == act.clean_expected_stdout From b64fc14d0ec54e616aba2bdea0133e7234d6d491 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 31 Oct 2024 00:16:41 +0300 Subject: [PATCH 100/128] Added/Updated tests\bugs\core_3489_test.py: minor change: adjusted notes. --- tests/bugs/core_3489_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/bugs/core_3489_test.py b/tests/bugs/core_3489_test.py index 48bde78d..db620ff4 100644 --- a/tests/bugs/core_3489_test.py +++ b/tests/bugs/core_3489_test.py @@ -9,8 +9,8 @@ JIRA: CORE-3489 FBTEST: bugs.core_3489 NOTES: [30.10.2024] pzotov - Bug was fixed for too old FB (3.0 Alpha 1), firebird-driver and/or QA-plugin will not able to run on this version. - to check this version in order to reproduce problem. + Bug was fixed for too old FB (3.0 Alpha 1), firebird-driver and/or QA-plugin + will not able to run on this version in order to reproduce problem. Source for this test was taken from ticket almost w/o changes. Only aux view has been added ('v_conn_cset') for showing current connection protocol and character set - we make query to this view two twice: one for TCP and then for local protocol. From ba89f2888e6a741e242dda277b6fae436df754fe Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 31 Oct 2024 00:54:53 +0300 Subject: [PATCH 101/128] Added/Updated tests\bugs\core_1366_test.py: Re-implemented. See notes. Checked on 6.0.0.511 (Windows/Linux); 5.0.2.1550; 4.0.6.3165; 3.0.2.32670, 3,0,1,32609 --- tests/bugs/core_1366_test.py | 231 +++++++++++++++++------------------ 1 file changed, 114 insertions(+), 117 deletions(-) diff --git a/tests/bugs/core_1366_test.py b/tests/bugs/core_1366_test.py index c3788cb8..1d53680d 100644 --- a/tests/bugs/core_1366_test.py +++ b/tests/bugs/core_1366_test.py @@ -1,117 +1,114 @@ -#coding:utf-8 - -""" -ID: issue-1784 -ISSUE: 1784 -TITLE: French insensitive collation FR_FR_CI_AI -DESCRIPTION: -JIRA: CORE-1366 -FBTEST: bugs.core_1366 -NOTES: - [06.10.2022] pzotov - Could not complete adjusting for LINUX in new-qa. - DEFERRED. -""" -import platform -import pytest -from firebird.qa import * - -init_script = """ - recreate table test(id int); - commit; - - set term ^; - execute block as - begin - begin execute statement 'drop collation coll_fr'; when any do begin end end - end - ^set term ;^ - commit; - - create collation coll_fr for iso8859_1 from external ('FR_FR') case insensitive accent insensitive; - commit; - - recreate table test(id int, cf varchar(10) collate coll_fr); - commit; - - recreate table noac(id int, nf varchar(10) collate coll_fr); - commit; - - -- http://french.about.com/od/pronunciation/a/accents.htm - - -- ### ONCE AGAIN ### - -- 1) for checking this under ISQL following must be encoded in ISO8859_1 - -- 2) for running under fbt_run utility following must be encoded in UTF8. - - -- (cedilla) is found only on the letter "C": - insert into test(id, cf) values( 1010, 'ç'); - - -- (acute accent) can only be on an "E" - insert into test(id, cf) values( 1020, 'é'); - - -- (grave accent) can be found on an "A", "E", "U" - insert into test(id, cf) values( 1030, 'à'); - insert into test(id, cf) values( 1040, 'è'); - insert into test(id, cf) values( 1050, 'ù'); - - -- (dieresis or umlaut) can be on an E, I and U - insert into test(id, cf) values( 1060, 'ë'); - insert into test(id, cf) values( 1070, 'ï'); - insert into test(id, cf) values( 1080, 'ü'); - - -- (circumflex) can be on an A, E, I, O and U - insert into test(id, cf) values( 1090, 'â'); - insert into test(id, cf) values( 1110, 'ê'); - insert into test(id, cf) values( 1120, 'î'); - insert into test(id, cf) values( 1130, 'û'); - insert into test(id, cf) values( 1140, 'ô'); - commit; - - -- ANSI letters that should be equal to diacritical - -- when doing comparison CI_AI: - insert into noac(id, nf) values( 1150, 'A'); - insert into noac(id, nf) values( 1160, 'C'); - insert into noac(id, nf) values( 1170, 'E'); - insert into noac(id, nf) values( 1180, 'I'); - insert into noac(id, nf) values( 1190, 'O'); - insert into noac(id, nf) values( 1200, 'U'); - commit; - -""" - -db = db_factory(charset='ISO8859_1', init=init_script) - -test_script = """ - select n.id n_id, n.nf, t.cf, t.id t_id - from noac n - left join test t on n.nf is not distinct from t.cf - order by n_id, t_id; -""" - -act = isql_act('db', test_script, substitutions=[('=.*', ''), ('[ \t]+', ' ')]) - -expected_stdout = """ - N_ID NF CF T_ID - ============ ========== ========== ============ - 1150 A à 1030 - 1150 A â 1090 - 1160 C ç 1010 - 1170 E é 1020 - 1170 E è 1040 - 1170 E ë 1060 - 1170 E ê 1110 - 1180 I ï 1070 - 1180 I î 1120 - 1190 O ô 1140 - 1200 U ù 1050 - 1200 U ü 1080 - 1200 U û 1130 -""" - -@pytest.mark.skipif(platform.system() != 'Windows', reason='FIXME: see notes') -@pytest.mark.version('>=3') -def test_1(act: Action): - act.expected_stdout = expected_stdout - act.execute() - assert act.clean_stdout == act.clean_expected_stdout - +#coding:utf-8 + +""" +ID: issue-1784 +ISSUE: 1784 +TITLE: French insensitive collation FR_FR_CI_AI +DESCRIPTION: Add French case-/accent-insensitive collation. +JIRA: CORE-1366 +FBTEST: bugs.core_1366 +NOTES: + [31.10.2024] pzotov + Bug was fixed for too old FB (2.1.8), firebird-driver and/or QA-plugin + will not able to run on this version in order to reproduce problem. + + Checked on 6.0.0.511 (Windows/Linux); 5.0.2.1550; 4.0.6.3165; 3.0.2.32670, 3,0,1,32609 +""" +from pathlib import Path + +import pytest +from firebird.qa import * + +db = db_factory(charset='ISO8859_1') +act = isql_act('db', substitutions=[('=.*', ''), ('[ \\t]+', ' ')]) +tmp_sql = temp_file('tmp_core_1366.sql') + +@pytest.mark.version('>=3.0.0') +def test_1(act: Action, tmp_sql: Path): + + test_script = f""" + recreate table test(id int); + commit; + + set term ^; + execute block as + begin + begin execute statement 'drop collation coll_fr'; when any do begin end end + end + ^set term ;^ + commit; + + create collation coll_fr for iso8859_1 from external ('FR_FR') case insensitive accent insensitive; + commit; + + recreate table test(id int, cf varchar(10) collate coll_fr); + commit; + + recreate table noac(id int, nf varchar(10) collate coll_fr); + commit; + + -- http://french.about.com/od/pronunciation/a/accents.htm + + -- (cedilla) is found only on the letter "C": + insert into test(id, cf) values( 1010, 'ç'); + + -- (acute accent) can only be on an "E" + insert into test(id, cf) values( 1020, 'é'); + + -- (grave accent) can be found on an "A", "E", "U" + insert into test(id, cf) values( 1030, 'à'); + insert into test(id, cf) values( 1040, 'è'); + insert into test(id, cf) values( 1050, 'ù'); + + -- (dieresis or umlaut) can be on an E, I and U + insert into test(id, cf) values( 1060, 'ë'); + insert into test(id, cf) values( 1070, 'ï'); + insert into test(id, cf) values( 1080, 'ü'); + + -- (circumflex) can be on an A, E, I, O and U + insert into test(id, cf) values( 1090, 'â'); + insert into test(id, cf) values( 1110, 'ê'); + insert into test(id, cf) values( 1120, 'î'); + insert into test(id, cf) values( 1130, 'û'); + insert into test(id, cf) values( 1140, 'ô'); + commit; + + -- ANSI letters that should be equal to diacritical + -- when doing comparison CI_AI: + insert into noac(id, nf) values( 1150, 'A'); + insert into noac(id, nf) values( 1160, 'C'); + insert into noac(id, nf) values( 1170, 'E'); + insert into noac(id, nf) values( 1180, 'I'); + insert into noac(id, nf) values( 1190, 'O'); + insert into noac(id, nf) values( 1200, 'U'); + commit; + select n.id n_id, n.nf, t.cf, t.id t_id + from noac n + left join test t on n.nf is not distinct from t.cf + order by n_id, t_id; + """ + + # https://github.com/FirebirdSQL/firebird/issues/1784#issuecomment-826188088 + # ::: NB ::: + # For proper output of test, input script must be encoded in ISO8859_1 rather than in UTF-8. + # + tmp_sql.write_text(test_script, encoding='iso8859_1') + act.expected_stdout = """ + N_ID NF CF T_ID + ============ ========== ========== ============ + 1150 A à 1030 + 1150 A â 1090 + 1160 C ç 1010 + 1170 E é 1020 + 1170 E è 1040 + 1170 E ë 1060 + 1170 E ê 1110 + 1180 I ï 1070 + 1180 I î 1120 + 1190 O ô 1140 + 1200 U ù 1050 + 1200 U ü 1080 + 1200 U û 1130 + """ + act.isql(switches = ['-q'], input_file = tmp_sql, charset = 'iso8859_1', combine_output = True) + assert act.clean_stdout == act.clean_expected_stdout From 86b78aa07eb4f8ac442a3e610e915551696e6b1e Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 31 Oct 2024 01:04:04 +0300 Subject: [PATCH 102/128] Added/Updated tests\bugs\core_0857_test.py: Re-implemented. See notes. Checked on 6.0.0.511 (Windows/Linux); 5.0.2.1550; 4.0.6.3165; 3.0.2.32670, 3,0,1,32609 --- tests/bugs/core_0857_test.py | 153 ++++++++++++++++++----------------- 1 file changed, 77 insertions(+), 76 deletions(-) diff --git a/tests/bugs/core_0857_test.py b/tests/bugs/core_0857_test.py index 0b8ae763..a9938d86 100644 --- a/tests/bugs/core_0857_test.py +++ b/tests/bugs/core_0857_test.py @@ -1,76 +1,77 @@ -#coding:utf-8 - -""" -ID: issue-1247 -ISSUE: 1247 -TITLE: Containing not working correctly -DESCRIPTION: -JIRA: CORE-857 -FBTEST: bugs.core_0857 -NOTES: - [06.10.2022] pzotov - Could not complete adjusting for LINUX in new-qa. - DEFERRED. - -""" - -import platform -import pytest -from firebird.qa import * - -init_script = """ -set echo on; -set bail on; - create collation test_coll_ci_ai for win1252 from WIN_PTBR - case insensitive - accent insensitive - ; - - create table test ( - id int, - f01 varchar(100), - f02 varchar(100) collate WIN_PTBR - ); - - insert into test(id, f01) values(1, 'IHF|groß|850xC|P1'); - update test set f02=f01; - commit; - create view v_test as - select octet_length(t.f01) - octet_length(replace(t.f01, 'ß', '')) as "octet_length diff:" from test t; -""" - -db = db_factory(charset='WIN1252', init=init_script) - -expected_stdout = """ - CONNECTION_CSET WIN1252 - test_1 result: - test_2 result: 1 - ci_ai result: 1 - between result: 1 - octet_length diff: 1 -""" - -test_script = """ - set list on; - select c.rdb$character_set_name as connection_cset - from mon$attachments a - join rdb$character_sets c on a.mon$character_set_id = c.rdb$character_set_id - where a.mon$attachment_id = current_connection; - - select t.id as "test_1 result:" from rdb$database r left join test t on t.f01 not containing 'P1' and t.f01 like 'IHF|gro_|850_C|P1'; - select t.id as "test_2 result:" from rdb$database r left join test t on t.f01 containing 'P1' and t.f01 like 'IHF|gro_|850_C|P1'; - select t.id as "ci_ai result:" from rdb$database r left join test t on lower(t.f02) = upper(t.f02); - select t.id as "between result:" from rdb$database r left join test t on lower(t.f01) between lower(t.f02) and upper(t.f02); - select * from v_test; -""" - -act = isql_act('db', test_script) - -@pytest.mark.skipif(platform.system() != 'Windows', reason='FIXME: see notes') -@pytest.mark.version('>=3') -def test_1(act: Action): - act.expected_stdout = expected_stdout - act.execute() - assert act.clean_stdout == act.clean_expected_stdout - - +#coding:utf-8 + +""" +ID: issue-1247 +ISSUE: 1247 +TITLE: Containing not working correctly +DESCRIPTION: +JIRA: CORE-857 +FBTEST: bugs.core_0857 +NOTES: + [31.10.2024] pzotov + Bug was fixed for too old FB (2.0 RC4 / 2.1 ALpha 1), firebird-driver and/or QA-plugin + will not able to run on this version in order to reproduce problem. + + Checked on 6.0.0.511 (Windows/Linux); 5.0.2.1550; 4.0.6.3165; 3.0.2.32670, 3,0,1,32609 +""" +from pathlib import Path + +import pytest +from firebird.qa import * + +db = db_factory(charset='WIN1252') +act = isql_act('db', substitutions=[('[ \\t]+', ' ')]) +tmp_sql = temp_file('tmp_core_0857.sql') + +@pytest.mark.version('>=3.0.0') +def test_1(act: Action, tmp_sql: Path): + + test_script = """ + set bail on; + create collation test_coll_ci_ai for win1252 from WIN_PTBR + case insensitive + accent insensitive + ; + + create table test ( + id int, + f01 varchar(100), + f02 varchar(100) collate WIN_PTBR + ); + + insert into test(id, f01) values(1, 'IHF|groß|850xC|P1'); + update test set f02=f01; + commit; + create view v_test as + select octet_length(t.f01) - octet_length(replace(t.f01, 'ß', '')) as "octet_length diff:" from test t; + commit; + + set list on; + select c.rdb$character_set_name as connection_cset + from mon$attachments a + join rdb$character_sets c on a.mon$character_set_id = c.rdb$character_set_id + where a.mon$attachment_id = current_connection; + + select t.id as "test_1 result:" from rdb$database r left join test t on t.f01 not containing 'P1' and t.f01 like 'IHF|gro_|850_C|P1'; + select t.id as "test_2 result:" from rdb$database r left join test t on t.f01 containing 'P1' and t.f01 like 'IHF|gro_|850_C|P1'; + select t.id as "ci_ai result:" from rdb$database r left join test t on lower(t.f02) = upper(t.f02); + select t.id as "between result:" from rdb$database r left join test t on lower(t.f01) between lower(t.f02) and upper(t.f02); + select * from v_test; + """ + + # ::: NB ::: + # For proper output of test, input script must be encoded in cp1252 rather than in UTF-8. + # + tmp_sql.write_text(test_script, encoding = 'cp1252') + + act.expected_stdout = """ + CONNECTION_CSET WIN1252 + test_1 result: + test_2 result: 1 + ci_ai result: 1 + between result: 1 + octet_length diff: 1 + """ + + act.isql(switches = ['-q'], input_file = tmp_sql, charset = 'win1252', combine_output = True) + assert act.clean_stdout == act.clean_expected_stdout From 90951ffe146bf4c78d99894e88eba4fae8275a81 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 31 Oct 2024 01:17:54 +0300 Subject: [PATCH 103/128] Added pytest.mark.intl to have ability filtering these files if only QA-run related to non-ascii data is needed. --- tests/bugs/core_0857_test.py | 3 ++- tests/bugs/core_1366_test.py | 1 + tests/bugs/core_2227_test.py | 1 + tests/bugs/core_3489_test.py | 1 + tests/bugs/core_5464_test.py | 1 + 5 files changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/bugs/core_0857_test.py b/tests/bugs/core_0857_test.py index a9938d86..47506058 100644 --- a/tests/bugs/core_0857_test.py +++ b/tests/bugs/core_0857_test.py @@ -9,7 +9,7 @@ JIRA: CORE-857 FBTEST: bugs.core_0857 NOTES: [31.10.2024] pzotov - Bug was fixed for too old FB (2.0 RC4 / 2.1 ALpha 1), firebird-driver and/or QA-plugin + Bug was fixed for too old FB (2.0 RC4 / 2.1 Alpha 1), firebird-driver and/or QA-plugin will not able to run on this version in order to reproduce problem. Checked on 6.0.0.511 (Windows/Linux); 5.0.2.1550; 4.0.6.3165; 3.0.2.32670, 3,0,1,32609 @@ -23,6 +23,7 @@ db = db_factory(charset='WIN1252') act = isql_act('db', substitutions=[('[ \\t]+', ' ')]) tmp_sql = temp_file('tmp_core_0857.sql') +@pytest.mark.intl @pytest.mark.version('>=3.0.0') def test_1(act: Action, tmp_sql: Path): diff --git a/tests/bugs/core_1366_test.py b/tests/bugs/core_1366_test.py index 1d53680d..7fa1c8d8 100644 --- a/tests/bugs/core_1366_test.py +++ b/tests/bugs/core_1366_test.py @@ -23,6 +23,7 @@ db = db_factory(charset='ISO8859_1') act = isql_act('db', substitutions=[('=.*', ''), ('[ \\t]+', ' ')]) tmp_sql = temp_file('tmp_core_1366.sql') +@pytest.mark.intl @pytest.mark.version('>=3.0.0') def test_1(act: Action, tmp_sql: Path): diff --git a/tests/bugs/core_2227_test.py b/tests/bugs/core_2227_test.py index 816b0853..da9e1b03 100644 --- a/tests/bugs/core_2227_test.py +++ b/tests/bugs/core_2227_test.py @@ -28,6 +28,7 @@ act = isql_act('db', substitutions = [ ('[ \\t]+', ' '), ('TCPv(4|6)', 'TCP') ]) tmp_sql = temp_file('tmp_core_2227.sql') +@pytest.mark.intl @pytest.mark.version('>=3.0.0') def test_1(act: Action, tmp_sql: Path): test_script = f""" diff --git a/tests/bugs/core_3489_test.py b/tests/bugs/core_3489_test.py index db620ff4..7cd10edf 100644 --- a/tests/bugs/core_3489_test.py +++ b/tests/bugs/core_3489_test.py @@ -47,6 +47,7 @@ expected_stdout = """ tmp_sql = temp_file('tmp_core_3489.sql') +@pytest.mark.intl @pytest.mark.version('>=3.0.0') def test_1(act: Action, tmp_sql: Path): tmp_sql.write_text( diff --git a/tests/bugs/core_5464_test.py b/tests/bugs/core_5464_test.py index 4f4593e5..8949a8c3 100644 --- a/tests/bugs/core_5464_test.py +++ b/tests/bugs/core_5464_test.py @@ -39,6 +39,7 @@ act = isql_act('db', substitutions = [('TCPv(4|6)', 'TCP')]) tmp_sql = temp_file('tmp_core_5464.sql') +@pytest.mark.intl @pytest.mark.version('>=3.0.1') def test_1(act: Action, tmp_sql: Path, capsys): From 26eae15c96b72d760144cb926f5f395d83def5b0 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 31 Oct 2024 11:16:22 +0300 Subject: [PATCH 104/128] Added/Updated tests\bugs\gh_8161_test.py: Adjusted expected_out discuss with dimitr (explained plans for FB 3.x ...6.x now are identical). --- tests/bugs/gh_8161_test.py | 55 ++++---------------------------------- 1 file changed, 5 insertions(+), 50 deletions(-) diff --git a/tests/bugs/gh_8161_test.py b/tests/bugs/gh_8161_test.py index 92ef9bcb..28e5292f 100644 --- a/tests/bugs/gh_8161_test.py +++ b/tests/bugs/gh_8161_test.py @@ -20,14 +20,9 @@ NOTES: Confirmed bug (regression) on 3.0.12.33735 (date of build: 09-mar-2024). Checked on 3.0.12.33764, 4.0.5.3112, 5.0.1.1416, 6.0.0.374. - [25.10.2024] pzotov - Splitted expected_out after fixed #8290: 'Index "RDB$INDEX_nn" Range Scan (full match)' must appear in explained plan) - for RDB$PROCEDURES table (index on columns: RDB$PACKAGE_NAME,RDB$PROCEDURE_NAME - is unique and at least one of these - columns allow NULLs). - Checked on 6.0.0.502-d2f4cf6, 5.0.2.1542-ab50e20 (intermediate builds). - - [30.10.2024] pzotov - Splitted expected_out again: added separate block for FB 5.x after discuss with dimitr. + [31.10.2024] pzotov + Adjusted expected_out discuss with dimitr (explained plans for FB 3.x ...6.x now are identical). + Checked on 3.0.13.33794, 4.0.6.3165, 5.0.2.1551, 6.0.0.515 """ import zipfile from pathlib import Path @@ -88,7 +83,7 @@ def test_1(act: Action, tmp_fbk: Path, capsys): ps = cur.prepare(test_sql) print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) - expected_stdout_4x = """ + expected_stdout = """ Select Expression ....-> Singularity Check ........-> Aggregate @@ -107,47 +102,7 @@ def test_1(act: Action, tmp_fbk: Path, capsys): ............-> Bitmap ................-> Index "RDB$INDEX_nn" Range Scan (full match) """ - - expected_stdout_5x = """ - Select Expression - ....-> Singularity Check - ........-> Aggregate - ............-> Nested Loop Join (inner) - ................-> Filter - ....................-> Table "RDB$DEPENDENCIES" as "DEP" Access By ID - ........................-> Bitmap - ............................-> Index "RDB$INDEX_nn" Range Scan (full match) - ................-> Filter - ....................-> Table "RDB$PROCEDURES" as "PRC" Access By ID - ........................-> Bitmap - ............................-> Index "RDB$INDEX_nn" Unique Scan - Select Expression - ....-> Filter - ........-> Table "RDB$RELATION_FIELDS" as "X" Access By ID - ............-> Bitmap - ................-> Index "RDB$INDEX_nn" Range Scan (full match) - """ - - expected_stdout_6x = """ - Select Expression - ....-> Singularity Check - ........-> Aggregate - ............-> Nested Loop Join (inner) - ................-> Filter - ....................-> Table "RDB$DEPENDENCIES" as "DEP" Access By ID - ........................-> Bitmap - ............................-> Index "RDB$INDEX_nn" Range Scan (full match) - ................-> Filter - ....................-> Table "RDB$PROCEDURES" as "PRC" Access By ID - ........................-> Bitmap - ............................-> Index "RDB$INDEX_nn" Range Scan (full match) - Select Expression - ....-> Filter - ........-> Table "RDB$RELATION_FIELDS" as "X" Access By ID - ............-> Bitmap - ................-> Index "RDB$INDEX_nn" Range Scan (full match) - """ - act.expected_stdout = expected_stdout_4x if act.is_version('<5') else expected_stdout_5x if act.is_version('<6') else expected_stdout_6x + act.expected_stdout = expected_stdout act.stdout = capsys.readouterr().out assert act.clean_stdout == act.clean_expected_stdout From a8d5d389f724006125e3341e0265aa45020db014 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 31 Oct 2024 11:19:40 +0300 Subject: [PATCH 105/128] Added/Updated tests\functional\arno\optimizer\test_opt_inner_join_05.py: Adjusted expected_out discuss with dimitr. Explained plans for 5.x and 6.x are now identical. Checked on 3.0.13.33794, 4.0.6.3165, 5.0.2.1551, 6.0.0.515 --- .../arno/optimizer/test_opt_inner_join_05.py | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/tests/functional/arno/optimizer/test_opt_inner_join_05.py b/tests/functional/arno/optimizer/test_opt_inner_join_05.py index 31309442..35cbbba6 100644 --- a/tests/functional/arno/optimizer/test_opt_inner_join_05.py +++ b/tests/functional/arno/optimizer/test_opt_inner_join_05.py @@ -22,8 +22,9 @@ NOTES: Discussed with dimitr. Checked on 6.0.0.467-cc183f5, 5.0.2.1513 - [30.10.2024] pzotov - Splitted expected_out : added separate block for FB 5.x after discuss with dimitr. + [31.10.2024] pzotov + Adjusted expected_out discuss with dimitr. Explained plans for 5.x and 6.x are now identical. + Checked on 3.0.13.33794, 4.0.6.3165, 5.0.2.1551, 6.0.0.515 """ import pytest @@ -383,19 +384,6 @@ def test_1(act: Action, capsys): ................................-> Index "I_COUNTRYNAME" Range Scan (full match) """ - expected_stdout_6x = """ - Select Expression - ....-> Sort (record length: 150, key length: 44) - ........-> Filter - ............-> Hash Join (inner) - ................-> Table "RELATIONS" as "R" Full Scan - ................-> Record Buffer (record length: 81) - ....................-> Filter - ........................-> Table "COUNTRIES" as "C" Access By ID - ............................-> Bitmap - ................................-> Index "I_COUNTRYNAME" Unique Scan - """ - - act.expected_stdout = expected_stdout_4x if act.is_version('<5') else expected_stdout_5x if act.is_version('<6') else expected_stdout_6x + act.expected_stdout = expected_stdout_4x if act.is_version('<5') else expected_stdout_5x act.stdout = capsys.readouterr().out assert act.clean_stdout == act.clean_expected_stdout From 19c51597e58412971b94b6cae9f1894cac190170 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 31 Oct 2024 11:28:06 +0300 Subject: [PATCH 106/128] Added pytest.mark.intl to have ability filtering these files if only QA-run related to non-ascii data is needed. --- tests/functional/exception/test_handling_name_and_message.py | 1 + tests/functional/intl/test_non_ascii_firebird_and_trace_utf8.py | 1 + 2 files changed, 2 insertions(+) diff --git a/tests/functional/exception/test_handling_name_and_message.py b/tests/functional/exception/test_handling_name_and_message.py index e737cb9d..c3e3ace3 100644 --- a/tests/functional/exception/test_handling_name_and_message.py +++ b/tests/functional/exception/test_handling_name_and_message.py @@ -157,6 +157,7 @@ expected_stdout = """ Records affected: 1 """ +@pytest.mark.intl @pytest.mark.version('>=4.0') def test_1(act: Action): act.expected_stdout = expected_stdout diff --git a/tests/functional/intl/test_non_ascii_firebird_and_trace_utf8.py b/tests/functional/intl/test_non_ascii_firebird_and_trace_utf8.py index 42f46800..45ad345b 100644 --- a/tests/functional/intl/test_non_ascii_firebird_and_trace_utf8.py +++ b/tests/functional/intl/test_non_ascii_firebird_and_trace_utf8.py @@ -41,6 +41,7 @@ substitutions = [ ('.* FAILED EXECUTE_TRIGGER_FINISH', 'FAILED EXECUTE_TRIGGER_F act = python_act('db', substitutions = substitutions) +@pytest.mark.intl @pytest.mark.trace @pytest.mark.version('>=4.0') def test_1(act: Action, tmp_worker: User, capsys): From 0dece2247fddefdc3c5833a2b8e6666be1d9ff47 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 31 Oct 2024 13:17:14 +0300 Subject: [PATCH 107/128] Added pytest.mark.intl to have ability filtering these files if only QA-run related to non-ascii data is needed. --- tests/bugs/core_0986_test.py | 1 + tests/bugs/core_1026_utf8_test.py | 1 + tests/bugs/core_1254_test.py | 1 + tests/bugs/core_1331_test.py | 1 + tests/bugs/core_2606_test.py | 1 + tests/bugs/core_2912_test.py | 1 + tests/bugs/core_3401_test.py | 1 + tests/bugs/core_3416_test.py | 1 + tests/bugs/core_3511_test.py | 1 + tests/bugs/core_4160_test.py | 1 + tests/bugs/core_4301_test.py | 1 + tests/bugs/core_4599_test.py | 1 + tests/bugs/core_4743_test.py | 1 + tests/bugs/core_4760_test.py | 1 + tests/bugs/core_4881_test.py | 1 + tests/bugs/core_5220_test.py | 1 + tests/bugs/core_5389_test.py | 1 + tests/bugs/core_5470_addi_test.py | 1 + tests/bugs/core_5480_test.py | 1 + tests/bugs/core_5695_test.py | 1 + tests/bugs/core_5926_test.py | 1 + tests/bugs/core_6166_test.py | 1 + tests/bugs/core_6211_test.py | 1 + tests/bugs/gh_0731_test.py | 1 + tests/bugs/gh_7045_test.py | 1 + tests/bugs/gh_8015_test.py | 1 + 26 files changed, 26 insertions(+) diff --git a/tests/bugs/core_0986_test.py b/tests/bugs/core_0986_test.py index 5aed18ef..da60b44f 100644 --- a/tests/bugs/core_0986_test.py +++ b/tests/bugs/core_0986_test.py @@ -188,6 +188,7 @@ non_ascii_ddl=''' tmp_file = temp_file('tmp_0986_non_ascii_ddl.sql') +@pytest.mark.intl @pytest.mark.version('>=3.0') def test_1(act: Action, tmp_file: Path): tmp_file.write_bytes(non_ascii_ddl.encode('cp1251')) diff --git a/tests/bugs/core_1026_utf8_test.py b/tests/bugs/core_1026_utf8_test.py index 3710434b..15e8bb07 100644 --- a/tests/bugs/core_1026_utf8_test.py +++ b/tests/bugs/core_1026_utf8_test.py @@ -261,6 +261,7 @@ expected_stdout = """ Records affected: 30 """ +@pytest.mark.intl @pytest.mark.version('>=4.0') def test_1(act: Action): act.expected_stdout = expected_stdout diff --git a/tests/bugs/core_1254_test.py b/tests/bugs/core_1254_test.py index 06533df9..651e52ed 100644 --- a/tests/bugs/core_1254_test.py +++ b/tests/bugs/core_1254_test.py @@ -101,6 +101,7 @@ expected_stdout = """ case_SENSITIVE_distinct_gr_4 1 """ +@pytest.mark.intl @pytest.mark.version('>=3') def test_1(act: Action): act.expected_stdout = expected_stdout diff --git a/tests/bugs/core_1331_test.py b/tests/bugs/core_1331_test.py index fe9b6f3b..edc993b8 100644 --- a/tests/bugs/core_1331_test.py +++ b/tests/bugs/core_1331_test.py @@ -48,6 +48,7 @@ expected_stdout = """ EXECUTE_STTM_SELECT милан """ +@pytest.mark.intl @pytest.mark.version('>=3.0') def test_1(act: Action): act.expected_stdout = expected_stdout diff --git a/tests/bugs/core_2606_test.py b/tests/bugs/core_2606_test.py index a85ab1f4..6b0dc212 100644 --- a/tests/bugs/core_2606_test.py +++ b/tests/bugs/core_2606_test.py @@ -50,6 +50,7 @@ expected_stdout_b = """ VARC1_ASCII A. """ +@pytest.mark.intl @pytest.mark.version('>=3.0') def test_1(act: Action): act.script = test_script diff --git a/tests/bugs/core_2912_test.py b/tests/bugs/core_2912_test.py index 47b96410..2c6c1d61 100644 --- a/tests/bugs/core_2912_test.py +++ b/tests/bugs/core_2912_test.py @@ -74,6 +74,7 @@ expected_stdout = """ CU FAÿ """ +@pytest.mark.intl @pytest.mark.platform('Windows') @pytest.mark.version('>=3') def test_1(act: Action): diff --git a/tests/bugs/core_3401_test.py b/tests/bugs/core_3401_test.py index 5d369048..dbadd0de 100644 --- a/tests/bugs/core_3401_test.py +++ b/tests/bugs/core_3401_test.py @@ -164,6 +164,7 @@ expected_stdout = """ EQUAL 1 """ +@pytest.mark.intl @pytest.mark.version('>=3.0') def test_1(act: Action): act.expected_stdout = expected_stdout diff --git a/tests/bugs/core_3416_test.py b/tests/bugs/core_3416_test.py index 2a172095..9e315357 100644 --- a/tests/bugs/core_3416_test.py +++ b/tests/bugs/core_3416_test.py @@ -48,6 +48,7 @@ After line 4 in file /tmp/pytest-of-pcisar/pytest-559/test_10/test_script.sql script_file = temp_file('test_script.sql') +@pytest.mark.intl @pytest.mark.version('>=3') def test_1(act: Action, script_file: Path): script_file.write_text(""" diff --git a/tests/bugs/core_3511_test.py b/tests/bugs/core_3511_test.py index 3dba7c29..8b4457cb 100644 --- a/tests/bugs/core_3511_test.py +++ b/tests/bugs/core_3511_test.py @@ -37,6 +37,7 @@ tmp_role2 = role_factory('db', name = '"Groß"') act = python_act('db') +@pytest.mark.intl @pytest.mark.version('>=3.0') def test_1(act: Action, tmp_user: User, tmp_role1: Role, tmp_role2: Role, capsys): init_script = f""" diff --git a/tests/bugs/core_4160_test.py b/tests/bugs/core_4160_test.py index 4014b728..3397af2e 100644 --- a/tests/bugs/core_4160_test.py +++ b/tests/bugs/core_4160_test.py @@ -83,6 +83,7 @@ expected_stderr = """ - Russian: Новый остаток будет меньше нуля (-6) """ +@pytest.mark.intl @pytest.mark.version('>=3.0') def test_1(act: Action): act.expected_stderr = expected_stderr diff --git a/tests/bugs/core_4301_test.py b/tests/bugs/core_4301_test.py index fb5c45a7..aaff92c2 100644 --- a/tests/bugs/core_4301_test.py +++ b/tests/bugs/core_4301_test.py @@ -62,6 +62,7 @@ expected_stdout = """ é alguém do Brasil """ +@pytest.mark.intl @pytest.mark.version('>=3.0') def test_1(act: Action, user_a: User, user_b: User): act.expected_stdout = expected_stdout diff --git a/tests/bugs/core_4599_test.py b/tests/bugs/core_4599_test.py index 71759594..377b7569 100644 --- a/tests/bugs/core_4599_test.py +++ b/tests/bugs/core_4599_test.py @@ -835,6 +835,7 @@ expected_stdout = """ OVERLAY_UTF8_TO_ASCII_LO 1 """ +@pytest.mark.intl @pytest.mark.version('>=3') def test_1(act: Action): act.expected_stdout = expected_stdout diff --git a/tests/bugs/core_4743_test.py b/tests/bugs/core_4743_test.py index 6c28ed6d..995a5d69 100644 --- a/tests/bugs/core_4743_test.py +++ b/tests/bugs/core_4743_test.py @@ -167,6 +167,7 @@ expected_stdout = """ privilege:exec : YES """ +@pytest.mark.intl @pytest.mark.version('>=4.0') def test_1(act: Action, non_acii_user: User, test_role: Role, capsys): act.isql(switches=['-b', '-q'], input=ddl_script) diff --git a/tests/bugs/core_4760_test.py b/tests/bugs/core_4760_test.py index e4d2b18f..ee633b84 100644 --- a/tests/bugs/core_4760_test.py +++ b/tests/bugs/core_4760_test.py @@ -39,6 +39,7 @@ expected_stdout=f""" WHOAMI : {NON_ASCII_NAME} """ +@pytest.mark.intl @pytest.mark.version('>=4.0') def test_1(act: Action, non_ascii_user: User, capsys): with act.db.connect(user=non_ascii_user.name, password=non_ascii_user.password) as con: diff --git a/tests/bugs/core_4881_test.py b/tests/bugs/core_4881_test.py index 5d8d4c1c..e9c78ece 100644 --- a/tests/bugs/core_4881_test.py +++ b/tests/bugs/core_4881_test.py @@ -34,6 +34,7 @@ expected_stdout = """ C_LEN_UTF8_MIXED 16383 """ +@pytest.mark.intl @pytest.mark.version('>=3.0') def test_1(act: Action): script_file = Path(act.files_dir / 'core_4881.zip', at='core_4881_script.sql') diff --git a/tests/bugs/core_5220_test.py b/tests/bugs/core_5220_test.py index 48374cd9..e7dc216f 100644 --- a/tests/bugs/core_5220_test.py +++ b/tests/bugs/core_5220_test.py @@ -62,6 +62,7 @@ remove_metadata = """ r.rdb$system_flag is distinct from 1; """ +@pytest.mark.intl @pytest.mark.version('>=3.0') def test_1(act: Action): # diff --git a/tests/bugs/core_5389_test.py b/tests/bugs/core_5389_test.py index 8f9a1b8e..aab83154 100644 --- a/tests/bugs/core_5389_test.py +++ b/tests/bugs/core_5389_test.py @@ -45,6 +45,7 @@ test_script = """ script_file = temp_file('test-script.sql') +@pytest.mark.intl @pytest.mark.version('>=4.0') def test_1(act: Action, script_file: Path): script_file.write_text(test_script, encoding='cp1251') diff --git a/tests/bugs/core_5470_addi_test.py b/tests/bugs/core_5470_addi_test.py index 78a4568c..e46686f2 100644 --- a/tests/bugs/core_5470_addi_test.py +++ b/tests/bugs/core_5470_addi_test.py @@ -77,6 +77,7 @@ expected_stderr_isql = """ expected_stdout_trace = test_sql.replace('set list on;', '').replace(';','') +@pytest.mark.intl @pytest.mark.trace @pytest.mark.version('>=3.0.6') @pytest.mark.platform('Windows') diff --git a/tests/bugs/core_5480_test.py b/tests/bugs/core_5480_test.py index 4e23bfa6..7c639ef7 100644 --- a/tests/bugs/core_5480_test.py +++ b/tests/bugs/core_5480_test.py @@ -56,6 +56,7 @@ expected_stdout = """ N06 |€| """ +@pytest.mark.intl @pytest.mark.version('>=4.0') def test_1(act: Action): act.expected_stdout = expected_stdout diff --git a/tests/bugs/core_5695_test.py b/tests/bugs/core_5695_test.py index 02e458a9..dc77d9b6 100644 --- a/tests/bugs/core_5695_test.py +++ b/tests/bugs/core_5695_test.py @@ -44,6 +44,7 @@ expected_stdout = """ RES 1 """ +@pytest.mark.intl @pytest.mark.version('>=3.0.3') def test_1(act: Action): act.expected_stdout = expected_stdout diff --git a/tests/bugs/core_5926_test.py b/tests/bugs/core_5926_test.py index 2a72675d..33eec9c7 100644 --- a/tests/bugs/core_5926_test.py +++ b/tests/bugs/core_5926_test.py @@ -32,6 +32,7 @@ expected_stdout = """ test_script = temp_file('test_script.sql') +@pytest.mark.intl @pytest.mark.version('>=3.0.4') def test_1(act: Action, test_script: Path): if act.is_version('<4'): diff --git a/tests/bugs/core_6166_test.py b/tests/bugs/core_6166_test.py index fec5456c..97fb1982 100644 --- a/tests/bugs/core_6166_test.py +++ b/tests/bugs/core_6166_test.py @@ -76,6 +76,7 @@ test_script = """ rollback; """ +@pytest.mark.intl @pytest.mark.version('>=4.0') def test_1(act: Action): act.expected_stdout = expected_stdout diff --git a/tests/bugs/core_6211_test.py b/tests/bugs/core_6211_test.py index c31e2029..e0f30f0e 100644 --- a/tests/bugs/core_6211_test.py +++ b/tests/bugs/core_6211_test.py @@ -36,6 +36,7 @@ ddl_script = """ select rdb$role_name as r_name from rdb$roles where rdb$system_flag is distinct from 1; """ +@pytest.mark.intl @pytest.mark.version('>=4.0') def test_1(act: Action): act.isql(switches=[], input=ddl_script) diff --git a/tests/bugs/gh_0731_test.py b/tests/bugs/gh_0731_test.py index 6fdb0a94..13357886 100644 --- a/tests/bugs/gh_0731_test.py +++ b/tests/bugs/gh_0731_test.py @@ -91,6 +91,7 @@ expected_stdout = """ MSG Passed """ +@pytest.mark.intl @pytest.mark.version('>=3.0') def test_1(act: Action): act.expected_stdout = expected_stdout diff --git a/tests/bugs/gh_7045_test.py b/tests/bugs/gh_7045_test.py index f41ee0e5..858448b9 100644 --- a/tests/bugs/gh_7045_test.py +++ b/tests/bugs/gh_7045_test.py @@ -25,6 +25,7 @@ db = db_factory() act = python_act('db') +@pytest.mark.intl @pytest.mark.version('>=5.0') def test_1(act: Action, capsys): with act.db.connect(charset='iso8859_1') as con: diff --git a/tests/bugs/gh_8015_test.py b/tests/bugs/gh_8015_test.py index c1e78eb8..094061f1 100644 --- a/tests/bugs/gh_8015_test.py +++ b/tests/bugs/gh_8015_test.py @@ -161,6 +161,7 @@ expected_stdout = """ ánoc """ +@pytest.mark.intl @pytest.mark.version('>=6.0.0') def test_1(act: Action): act.expected_stdout = expected_stdout From 20af1b64103fa808a8a7a44c9ada02b6013642c6 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 31 Oct 2024 13:32:10 +0300 Subject: [PATCH 108/128] Added pytest.mark.intl to have ability filtering these files if only QA-run related to non-ascii data is needed. --- tests/bugs/core_0479_test.py | 1 + tests/bugs/core_0967_test.py | 1 + tests/bugs/core_1347_test.py | 1 + tests/bugs/core_1378_test.py | 1 + tests/bugs/core_2531_test.py | 1 + tests/bugs/core_2651_test.py | 1 + tests/bugs/core_2952_test.py | 1 + tests/bugs/core_3227_test.py | 1 + tests/bugs/core_3234_test.py | 1 + tests/bugs/core_4739_test.py | 1 + tests/bugs/core_6414_test.py | 4 ++-- tests/bugs/core_6419_test.py | 1 + tests/bugs/gh_6798_test.py | 1 + 13 files changed, 14 insertions(+), 2 deletions(-) diff --git a/tests/bugs/core_0479_test.py b/tests/bugs/core_0479_test.py index 2c2a636c..04b98453 100644 --- a/tests/bugs/core_0479_test.py +++ b/tests/bugs/core_0479_test.py @@ -274,6 +274,7 @@ expected_stdout_2 = """ Records affected: 0 """ +@pytest.mark.intl @pytest.mark.version('>=4.0') def test_2(act_2: Action): act_2.expected_stdout = expected_stdout_2 diff --git a/tests/bugs/core_0967_test.py b/tests/bugs/core_0967_test.py index 0cbe2091..bbc48172 100644 --- a/tests/bugs/core_0967_test.py +++ b/tests/bugs/core_0967_test.py @@ -22,6 +22,7 @@ db = db_factory(init=init_script) act = python_act('db') +@pytest.mark.intl @pytest.mark.version('>=2.1') def test_1(act: Action): with act.db.connect() as con: diff --git a/tests/bugs/core_1347_test.py b/tests/bugs/core_1347_test.py index fd1fecaf..2c7a00cb 100644 --- a/tests/bugs/core_1347_test.py +++ b/tests/bugs/core_1347_test.py @@ -57,6 +57,7 @@ where pr.rdb$procedure_source containing '1' and pr.rdb$procedure_name = upper('sp_test'); ''' +@pytest.mark.intl @pytest.mark.version('>=3') def test_1(act: Action, tmp_file: Path): tmp_file.write_bytes(sql_txt.encode('cp1251')) diff --git a/tests/bugs/core_1378_test.py b/tests/bugs/core_1378_test.py index db6559c8..58280003 100644 --- a/tests/bugs/core_1378_test.py +++ b/tests/bugs/core_1378_test.py @@ -88,6 +88,7 @@ expected_stdout = """ RDB$COLLATION_NAME вид прописи """ +@pytest.mark.intl @pytest.mark.version('>=3') def test_1(act: Action, tmp_file: Path): tmp_file.write_bytes(sql_txt.encode('cp1251')) diff --git a/tests/bugs/core_2531_test.py b/tests/bugs/core_2531_test.py index cbff7c60..4913c6d4 100644 --- a/tests/bugs/core_2531_test.py +++ b/tests/bugs/core_2531_test.py @@ -45,6 +45,7 @@ expected_stdout = """ Records affected: 1 """ +@pytest.mark.intl @pytest.mark.version('>=3') def test_1(act: Action): non_ascii_query = "select 'gång' as non_ascii_literal from rdb$database" diff --git a/tests/bugs/core_2651_test.py b/tests/bugs/core_2651_test.py index 05acc294..61c0a329 100644 --- a/tests/bugs/core_2651_test.py +++ b/tests/bugs/core_2651_test.py @@ -22,6 +22,7 @@ db = db_factory(init=init_script) act = python_act('db') +@pytest.mark.intl @pytest.mark.version('>=3') def test_1(act: Action): with act.db.connect(charset='CP943C') as con: diff --git a/tests/bugs/core_2952_test.py b/tests/bugs/core_2952_test.py index 87d10423..3574b29c 100644 --- a/tests/bugs/core_2952_test.py +++ b/tests/bugs/core_2952_test.py @@ -2267,6 +2267,7 @@ expected_stdout_2 = """ S_WHITE_SPACE 0 """ +@pytest.mark.intl @pytest.mark.version('>=4.0') def test_2(act_2: Action): act_2.expected_stdout = expected_stdout_2 diff --git a/tests/bugs/core_3227_test.py b/tests/bugs/core_3227_test.py index f3ea9b00..39f30fc7 100644 --- a/tests/bugs/core_3227_test.py +++ b/tests/bugs/core_3227_test.py @@ -32,6 +32,7 @@ ASCII_VAL """ +@pytest.mark.intl @pytest.mark.version('>=3') def test_1(act: Action): act.expected_stdout = expected_stdout diff --git a/tests/bugs/core_3234_test.py b/tests/bugs/core_3234_test.py index 85f2d3ff..b8f5f182 100644 --- a/tests/bugs/core_3234_test.py +++ b/tests/bugs/core_3234_test.py @@ -203,6 +203,7 @@ expected_stdout = """ TRIMMED_CHAR_LEN 11 """ +@pytest.mark.intl @pytest.mark.version('>=3.0') def test_1(act: Action): act.expected_stdout = expected_stdout diff --git a/tests/bugs/core_4739_test.py b/tests/bugs/core_4739_test.py index 90a330f0..98238d77 100644 --- a/tests/bugs/core_4739_test.py +++ b/tests/bugs/core_4739_test.py @@ -63,6 +63,7 @@ expected_stdout = """ Records affected: 0 """ +@pytest.mark.intl @pytest.mark.version('>=4.0') def test_1(act: Action): act.expected_stdout = expected_stdout diff --git a/tests/bugs/core_6414_test.py b/tests/bugs/core_6414_test.py index 3046673e..6d887286 100644 --- a/tests/bugs/core_6414_test.py +++ b/tests/bugs/core_6414_test.py @@ -3,8 +3,7 @@ """ ID: issue-6652 ISSUE: 6652 -TITLE: Error message "expected length N, actual M" contains wrong value of M when - charset UTF8 is used in the field declaration of a table +TITLE: Error message "expected length N, actual M" contains wrong value of M when charset UTF8 is used in the field declaration of a table DESCRIPTION: All attempts to create/alter table with not-null column with size that not enough space to fit default value must fail. Length of such column can be declared either directly or via domain - and both of these ways must fail. @@ -133,6 +132,7 @@ expected_stderr = """ -expected length 1, actual 8 """ +@pytest.mark.intl @pytest.mark.version('>=4.0') def test_1(act: Action): act.expected_stderr = expected_stderr diff --git a/tests/bugs/core_6419_test.py b/tests/bugs/core_6419_test.py index aee8b911..5acb7ddd 100644 --- a/tests/bugs/core_6419_test.py +++ b/tests/bugs/core_6419_test.py @@ -67,6 +67,7 @@ expected_stdout = """ Records affected: 1 """ +@pytest.mark.intl @pytest.mark.version('>=4.0') def test_1(act: Action): act.expected_stdout = expected_stdout diff --git a/tests/bugs/gh_6798_test.py b/tests/bugs/gh_6798_test.py index 1f51e488..daa17550 100644 --- a/tests/bugs/gh_6798_test.py +++ b/tests/bugs/gh_6798_test.py @@ -99,6 +99,7 @@ expected_stderr = """ -Integer overflow. The result of an integer operation caused the most significant bit of the result to carry. """ +@pytest.mark.intl @pytest.mark.version('>=5.0') def test_1(act: Action): act.expected_stdout = expected_stdout From 1370ed4824010ecadd26431e8d85a3e367ea9453 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 31 Oct 2024 15:44:16 +0300 Subject: [PATCH 109/128] Added/Updated tests\bugs\gh_8214_test.py: Checked on 5.0.2.1551, 6.0.0.515. --- tests/bugs/gh_8214_test.py | 441 +++++++++++++++++++++++++++++++++++++ 1 file changed, 441 insertions(+) create mode 100644 tests/bugs/gh_8214_test.py diff --git a/tests/bugs/gh_8214_test.py b/tests/bugs/gh_8214_test.py new file mode 100644 index 00000000..56304b19 --- /dev/null +++ b/tests/bugs/gh_8214_test.py @@ -0,0 +1,441 @@ +#coding:utf-8 + +""" +ID: issue-8214 +ISSUE: 8214 +TITLE: Incorrect result of index list scan for a composite index, the second segment of which is a text field with COLLATE UNICODE_CI +DESCRIPTION: + Test adds check for: + * collation with attributes 'case insensitive accent insensitive'; + * null values of some records (the must not appear in any query); + * non-ascii values; + * both asc and desc indices - results must be identical; + * miscelaneous predicates +NOTES: + [31.10.2024] pzotov + Confirmed bug on 5.0.2.1547. + Checked on 5.0.2.1551, 6.0.0.515. +""" + +import pytest +from firebird.qa import * + +db = db_factory(charset = 'utf8') + +test_script = """ + set bail on; + set list on; + + create collation txt_coll_ci for utf8 from unicode case insensitive; + create collation txt_coll_ci_ai for utf8 from unicode case insensitive accent insensitive; + + recreate table mans ( + id bigint not null, + code_sex smallint not null, + name_1 varchar(50) collate txt_coll_ci, + name_2 varchar(50) collate txt_coll_ci_ai, + constraint pk_mans primary key(id) + ); + + commit; + insert into mans (id, code_sex, name_1, name_2) values (1, 1, 'BoB', 'BØb'); + insert into mans (id, code_sex, name_1, name_2) values (2, 1, 'jOhN', 'jŐhŇ'); + insert into mans (id, code_sex, name_1, name_2) values (3, 2, 'BArbArA', 'BÄŔBĄŕă'); + insert into mans (id, code_sex, name_1, name_2) values (4, 2, 'aNNA', 'âŃŃÁ'); + insert into mans (id, code_sex, name_1, name_2) values (5, 1, null, null); + insert into mans (id, code_sex, name_1, name_2) values (6, 2, null, null); + insert into mans (id, code_sex, name_1, name_2) values (7, 1, 'danIEL', 'ĐÁniel'); + insert into mans (id, code_sex, name_1, name_2) values (8, 2, 'debora', 'ĐeborÁ'); + commit; + + create index mans_sex_name_1_asc on mans(code_sex, name_1); + create index mans_sex_name_2_asc on mans(code_sex, name_2); + + create view v_test_1 as + select msg, id, name_1 + from ( + select 'chk-a' as msg, id, code_sex, name_1 + from mans where code_sex between 1 and 2 and name_1 starts 'b' + UNION ALL + select 'chk-b' as msg, id, code_sex, name_1 + from mans where code_sex > 0 and code_sex < 3 and name_1 starts 'b' + UNION ALL + select 'chk-c' as msg, id, code_sex, name_1 + from mans where (code_sex =1 or code_sex =2) and name_1 starts 'b' + UNION ALL + select 'chk-d' as msg, id, code_sex, name_1 + from mans where code_sex in(1,2) and name_1 starts 'b' + UNION ALL + select 'chk-e' as msg, id, code_sex, name_1 + from mans where code_sex in(1,2) and name_1 like 'b%' + UNION ALL + select 'chk-f' as msg, id, code_sex, name_1 + from mans where code_sex in(1,2) and name_1 similar to 'b%' + UNION ALL + select 'chk-g' as msg, id, code_sex, name_1 + from mans where code_sex in(1,2) and name_1 in ('boB', 'barbarA') + UNION ALL + select 'chk-h' as msg, id, code_sex, name_1 + from mans where code_sex in(1,2) and (name_1 is not distinct from 'boB' or name_1 is not distinct from 'barbarA') + UNION ALL + select 'chk-i' as msg, id, code_sex, name_1 + from mans where code_sex in(1,2) and (name_1 >= 'D' and name_1 <= 'E') + ) + order by msg, id + ; + + create view v_test_2 as + select msg, id, name_2 + from ( + select 'chk-a' as msg, id, code_sex, name_2 + from mans where code_sex between 1 and 2 and name_2 starts 'b' + UNION ALL + select 'chk-b' as msg, id, code_sex, name_2 + from mans where code_sex > 0 and code_sex < 3 and name_2 starts 'b' + UNION ALL + select 'chk-c' as msg, id, code_sex, name_2 + from mans where (code_sex =1 or code_sex =2) and name_2 starts 'b' + UNION ALL + select 'chk-d' as msg, id, code_sex, name_2 + from mans where code_sex in(1,2) and name_2 starts 'b' + UNION ALL + select 'chk-e' as msg, id, code_sex, name_2 + from mans where code_sex in(1,2) and name_2 like 'b%' + UNION ALL + select 'chk-f' as msg, id, code_sex, name_2 + from mans where code_sex in(1,2) and name_2 similar to 'b%' + UNION ALL + select 'chk-g' as msg, id, code_sex, name_2 + from mans where code_sex in(1,2) and name_2 in ('boB', 'barbarA') + UNION ALL + select 'chk-h' as msg, id, code_sex, name_2 + from mans where code_sex in(1,2) and (name_2 is not distinct from 'boB' or name_2 is not distinct from 'barbarA') + UNION ALL + select 'chk-i' as msg, id, code_sex, name_2 + from mans where code_sex in(1,2) and (name_2 >= 'D' and name_2 <= 'E') + ) + order by msg, id + ; + + + select * from v_test_1; + select * from v_test_2; + commit; + + ----------------------------------------------------------- + + alter index mans_sex_name_1_asc inactive; + alter index mans_sex_name_2_asc inactive; + + create descending index mans_sex_name_1_dec on mans(code_sex, name_1); + create descending index mans_sex_name_2_dec on mans(code_sex, name_2); + commit; + + select * from v_test_1; + select * from v_test_2; +""" + +act = isql_act('db', test_script, substitutions = [ ('[ \t]+',' ') ]) + +expected_stdout = """ + MSG chk-a + ID 1 + NAME_1 BoB + + MSG chk-a + ID 3 + NAME_1 BArbArA + + MSG chk-b + ID 1 + NAME_1 BoB + + MSG chk-b + ID 3 + NAME_1 BArbArA + + MSG chk-c + ID 1 + NAME_1 BoB + + MSG chk-c + ID 3 + NAME_1 BArbArA + + MSG chk-d + ID 1 + NAME_1 BoB + + MSG chk-d + ID 3 + NAME_1 BArbArA + + MSG chk-e + ID 1 + NAME_1 BoB + + MSG chk-e + ID 3 + NAME_1 BArbArA + + MSG chk-f + ID 1 + NAME_1 BoB + + MSG chk-f + ID 3 + NAME_1 BArbArA + + MSG chk-g + ID 1 + NAME_1 BoB + + MSG chk-g + ID 3 + NAME_1 BArbArA + + MSG chk-h + ID 1 + NAME_1 BoB + + MSG chk-h + ID 3 + NAME_1 BArbArA + + MSG chk-i + ID 7 + NAME_1 danIEL + + MSG chk-i + ID 8 + NAME_1 debora + + + + MSG chk-a + ID 1 + NAME_2 BØb + + MSG chk-a + ID 3 + NAME_2 BÄŔBĄŕă + + MSG chk-b + ID 1 + NAME_2 BØb + + MSG chk-b + ID 3 + NAME_2 BÄŔBĄŕă + + MSG chk-c + ID 1 + NAME_2 BØb + + MSG chk-c + ID 3 + NAME_2 BÄŔBĄŕă + + MSG chk-d + ID 1 + NAME_2 BØb + + MSG chk-d + ID 3 + NAME_2 BÄŔBĄŕă + + MSG chk-e + ID 1 + NAME_2 BØb + + MSG chk-e + ID 3 + NAME_2 BÄŔBĄŕă + + MSG chk-f + ID 1 + NAME_2 BØb + + MSG chk-f + ID 3 + NAME_2 BÄŔBĄŕă + + MSG chk-g + ID 1 + NAME_2 BØb + + MSG chk-g + ID 3 + NAME_2 BÄŔBĄŕă + + MSG chk-h + ID 1 + NAME_2 BØb + + MSG chk-h + ID 3 + NAME_2 BÄŔBĄŕă + + MSG chk-i + ID 7 + NAME_2 ĐÁniel + + MSG chk-i + ID 8 + NAME_2 ĐeborÁ + + + + MSG chk-a + ID 1 + NAME_1 BoB + + MSG chk-a + ID 3 + NAME_1 BArbArA + + MSG chk-b + ID 1 + NAME_1 BoB + + MSG chk-b + ID 3 + NAME_1 BArbArA + + MSG chk-c + ID 1 + NAME_1 BoB + + MSG chk-c + ID 3 + NAME_1 BArbArA + + MSG chk-d + ID 1 + NAME_1 BoB + + MSG chk-d + ID 3 + NAME_1 BArbArA + + MSG chk-e + ID 1 + NAME_1 BoB + + MSG chk-e + ID 3 + NAME_1 BArbArA + + MSG chk-f + ID 1 + NAME_1 BoB + + MSG chk-f + ID 3 + NAME_1 BArbArA + + MSG chk-g + ID 1 + NAME_1 BoB + + MSG chk-g + ID 3 + NAME_1 BArbArA + + MSG chk-h + ID 1 + NAME_1 BoB + + MSG chk-h + ID 3 + NAME_1 BArbArA + + MSG chk-i + ID 7 + NAME_1 danIEL + + MSG chk-i + ID 8 + NAME_1 debora + + + + MSG chk-a + ID 1 + NAME_2 BØb + + MSG chk-a + ID 3 + NAME_2 BÄŔBĄŕă + + MSG chk-b + ID 1 + NAME_2 BØb + + MSG chk-b + ID 3 + NAME_2 BÄŔBĄŕă + + MSG chk-c + ID 1 + NAME_2 BØb + + MSG chk-c + ID 3 + NAME_2 BÄŔBĄŕă + + MSG chk-d + ID 1 + NAME_2 BØb + + MSG chk-d + ID 3 + NAME_2 BÄŔBĄŕă + + MSG chk-e + ID 1 + NAME_2 BØb + + MSG chk-e + ID 3 + NAME_2 BÄŔBĄŕă + + MSG chk-f + ID 1 + NAME_2 BØb + + MSG chk-f + ID 3 + NAME_2 BÄŔBĄŕă + + MSG chk-g + ID 1 + NAME_2 BØb + + MSG chk-g + ID 3 + NAME_2 BÄŔBĄŕă + + MSG chk-h + ID 1 + NAME_2 BØb + + MSG chk-h + ID 3 + NAME_2 BÄŔBĄŕă + + MSG chk-i + ID 7 + NAME_2 ĐÁniel + + MSG chk-i + ID 8 + NAME_2 ĐeborÁ +""" + +@pytest.mark.version('>=5.0.2') +def test_1(act: Action): + act.expected_stdout = expected_stdout + act.execute(combine_output = True) + assert act.clean_stdout == act.clean_expected_stdout + From d63eb542ca453ff3ed533fd1b087fee72a209b98 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 31 Oct 2024 15:47:12 +0300 Subject: [PATCH 110/128] Added/Updated tests\bugs\gh_8161_test.py: changed comment about explained plan in 6.x --- tests/bugs/gh_8161_test.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/bugs/gh_8161_test.py b/tests/bugs/gh_8161_test.py index 28e5292f..7d50a85b 100644 --- a/tests/bugs/gh_8161_test.py +++ b/tests/bugs/gh_8161_test.py @@ -21,7 +21,10 @@ NOTES: Checked on 3.0.12.33764, 4.0.5.3112, 5.0.1.1416, 6.0.0.374. [31.10.2024] pzotov - Adjusted expected_out discuss with dimitr (explained plans for FB 3.x ...6.x now are identical). + Adjusted expected_out discuss with dimitr: explained plan for FB 6.x became identical to FB 5.x and earlier after + https://github.com/FirebirdSQL/firebird/commit/e7e9e01fa9d7c13d8513fcadca102d23ad7c5e2a + ("Rework fix for #8290: Unique scan is incorrectly reported in the explained plan for unique index and IS NULL predicate") + Checked on 3.0.13.33794, 4.0.6.3165, 5.0.2.1551, 6.0.0.515 """ import zipfile From 920dd0fc36bd39ec6345c03b7d67ad6ffa829880 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 31 Oct 2024 15:48:16 +0300 Subject: [PATCH 111/128] Added/Updated tests\functional\arno\optimizer\test_opt_inner_join_05.py: changed comment about explained plan in 6.x --- tests/functional/arno/optimizer/test_opt_inner_join_05.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/functional/arno/optimizer/test_opt_inner_join_05.py b/tests/functional/arno/optimizer/test_opt_inner_join_05.py index 35cbbba6..b6e2fc91 100644 --- a/tests/functional/arno/optimizer/test_opt_inner_join_05.py +++ b/tests/functional/arno/optimizer/test_opt_inner_join_05.py @@ -23,7 +23,10 @@ NOTES: Checked on 6.0.0.467-cc183f5, 5.0.2.1513 [31.10.2024] pzotov - Adjusted expected_out discuss with dimitr. Explained plans for 5.x and 6.x are now identical. + Adjusted expected_out discuss with dimitr: explained plan for FB 6.x became identical to FB 5.x and earlier after + https://github.com/FirebirdSQL/firebird/commit/e7e9e01fa9d7c13d8513fcadca102d23ad7c5e2a + ("Rework fix for #8290: Unique scan is incorrectly reported in the explained plan for unique index and IS NULL predicate") + Checked on 3.0.13.33794, 4.0.6.3165, 5.0.2.1551, 6.0.0.515 """ From 4cf7cc1a3f4650e67ce1fc4d77852928ea300d48 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 31 Oct 2024 21:38:51 +0300 Subject: [PATCH 112/128] Added/Updated tests\bugs\core_2912_test.py: Checked on 6.0.0.511 (Windows/Linux); 5.0.2.1551; 4.0.6.3165; 3.0.13.33794 --- tests/bugs/core_2912_test.py | 162 +++++++++++++++++------------------ 1 file changed, 79 insertions(+), 83 deletions(-) diff --git a/tests/bugs/core_2912_test.py b/tests/bugs/core_2912_test.py index 2c6c1d61..314d0d95 100644 --- a/tests/bugs/core_2912_test.py +++ b/tests/bugs/core_2912_test.py @@ -1,83 +1,79 @@ -#coding:utf-8 - -""" -ID: issue-3296 -ISSUE: 3296 -TITLE: Exception when upper casing string with lowercase y trema (code 0xFF in ISO8859_1) -DESCRIPTION: - Test creates table and fills it with non-ascii characters in init_script, using charset = UTF8. - Then it generates .sql script for running it in separae ISQL process. - This script makes connection to test DB using charset = ISO8859_1 and perform several queries. - Result will be redirected to .log and .err files (they will be encoded, of course, also in ISO8859_1). - Finally, we open .log file (using codecs package), convert its content to UTF8 and show in expected_stdout. -JIRA: CORE-2912 -FBTEST: bugs.core_2912 -NOTES: - [16.11.2021] pcisar - This test fails as UPPER('ÿ') does not work properly - [16.09.2022] pzotov - Trouble with 'ÿ' raises only on LINUX. All fine on Windows. - Mark for running on Windows was *temporary* added to this test. Problem will be investigated. - - Checked on Windows: 3.0.8.33535, 4.0.1.2692, 5.0.0.730 -""" - -import pytest -from firebird.qa import * - -init_script = """ - create table test(c varchar(10)); - commit; - insert into test(c) values('ÿ'); - insert into test(c) values('Faÿ'); - commit; - create index test_cu on test computed by (upper (c collate iso8859_1)); - commit; -""" - -db = db_factory(charset='ISO8859_1', init=init_script) - -act = python_act('db') - -test_script = """set names ISO8859_1; - set list on; - select upper('aÿb') au from rdb$database; - select c, upper(c) cu from test where c starting with upper('ÿ'); - select c, upper(c) cu from test where c containing 'Faÿ'; - select c, upper(c) cu from test where c starting with 'Faÿ'; - select c, upper(c) cu from test where c like 'Faÿ%'; - -- ### ACHTUNG ### - -- As of WI-V2.5.4.26857, following will FAILS if character class "alpha" - -- will be specified not in UPPER case (see note in CORE-4740 08/Apr/15 05:48 PM): - select c, upper(c) cu from test where c similar to '[[:ALPHA:]]{1,}ÿ%'; - set plan on; - select c from test where upper (c collate iso8859_1) = upper('ÿ'); - select c, upper(c) cu from test where upper (c collate iso8859_1) starting with upper('Faÿ'); -""" - -expected_stdout = """ - AU AÿB - C ÿ - CU ÿ - C Faÿ - CU FAÿ - C Faÿ - CU FAÿ - C Faÿ - CU FAÿ - C Faÿ - CU FAÿ - PLAN (TEST INDEX (TEST_CU)) - C ÿ - PLAN (TEST INDEX (TEST_CU)) - C Faÿ - CU FAÿ -""" - -@pytest.mark.intl -@pytest.mark.platform('Windows') -@pytest.mark.version('>=3') -def test_1(act: Action): - act.expected_stdout = expected_stdout - act.isql(switches=['-q'], charset='ISO8859_1', input=test_script) - assert act.clean_stdout == act.clean_expected_stdout +#coding:utf-8 + +""" +ID: issue-3296 +ISSUE: 3296 +TITLE: Exception when upper casing string with 'ÿ' (lowercase y trema, code 0xFF in ISO8859_1) +DESCRIPTION: +JIRA: CORE-2912 +FBTEST: bugs.core_2912 +NOTES: + [31.10.2024] pzotov + Bug was fixed for too old FB (2.1.6; 2.5.3; 3.0 Alpha 1), firebird-driver and/or QA-plugin + will not able to run on this version in order to reproduce problem. + + Checked on 6.0.0.511 (Windows/Linux); 5.0.2.1551; 4.0.6.3165; 3.0.13.33794 +""" +from pathlib import Path + +import pytest +from firebird.qa import * + +db = db_factory(charset='ISO8859_1') + +act = isql_act('db', substitutions=[('[ \\t]+', ' ')]) +tmp_sql = temp_file('tmp_core_2912.sql') + +@pytest.mark.version('>=3.0.0') +def test_1(act: Action, tmp_sql: Path): + + test_script = """ + create table test(c varchar(10)); + commit; + insert into test(c) values('ÿ'); + insert into test(c) values('Faÿ'); + commit; + create index test_cu on test computed by (upper (c collate iso8859_1)); + commit; + set list on; + select upper('aÿb') au from rdb$database; + select c, upper(c) cu from test where c starting with upper('ÿ'); + select c, upper(c) cu from test where c containing 'Faÿ'; + select c, upper(c) cu from test where c starting with 'Faÿ'; + select c, upper(c) cu from test where c like 'Faÿ%'; + -- ### ACHTUNG ### + -- As of WI-V2.5.4.26857, following will FAILS if character class "alpha" + -- will be specified not in UPPER case (see note in CORE-4740 08/Apr/15 05:48 PM): + select c, upper(c) cu from test where c similar to '[[:ALPHA:]]{1,}ÿ%'; + set plan on; + select c from test where upper (c collate iso8859_1) = upper('ÿ'); + select c, upper(c) cu from test where upper (c collate iso8859_1) starting with upper('Faÿ'); + """ + + # ::: NB ::: + # For proper output of test, input script must be encoded in iso8859_1. + # + tmp_sql.write_text(test_script, encoding = 'iso8859_1') + + act.expected_stdout = """ + AU AÿB + C ÿ + CU ÿ + C Faÿ + CU FAÿ + C Faÿ + CU FAÿ + C Faÿ + CU FAÿ + C Faÿ + CU FAÿ + PLAN (TEST INDEX (TEST_CU)) + C ÿ + PLAN (TEST INDEX (TEST_CU)) + C Faÿ + CU FAÿ + """ + + act.isql(switches = ['-q'], input_file = tmp_sql, charset = 'iso8859_1', combine_output = True) + assert act.clean_stdout == act.clean_expected_stdout + From e42745b7a4f04b2d1e1dedf968613cfacec763a6 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 31 Oct 2024 22:17:41 +0300 Subject: [PATCH 113/128] Added/Updated tests\functional\intfunc\string\test_lpad_01.py: Finished adjusting for work both on Linux and Windows. Checked on 6.0.0.511 (Windows/Linux); 5.0.2.1550; 4.0.6.3165; 3.0.13.33794 --- .../functional/intfunc/string/test_lpad_01.py | 184 +++++++++--------- 1 file changed, 91 insertions(+), 93 deletions(-) diff --git a/tests/functional/intfunc/string/test_lpad_01.py b/tests/functional/intfunc/string/test_lpad_01.py index 331a8f9e..cbc632e3 100644 --- a/tests/functional/intfunc/string/test_lpad_01.py +++ b/tests/functional/intfunc/string/test_lpad_01.py @@ -1,93 +1,91 @@ -#coding:utf-8 - -""" -ID: intfunc.string.lpad -TITLE: LPAD function, including non-ascii characters -DESCRIPTION: -FBTEST: functional.intfunc.string.lpad_01 -NOTES: - [03.03.2021] pzotov - Re-implemented in order to have ability to run this test on Linux. - Added tests from some COREs which have no apropriate .fbt - Test creates table and fills it with non-ascii characters using charset = UTF8. - Then it generates .sql script for running it in separate ISQL process. - This script makes connection to test DB using charset = ISO8859_1 and perform needed DML. - Result will be redirected to .log which will be opened via codecs.open(...encoding='iso-8859-1'). - Its content will be converted to UTF8 for showing in expected_stdout. - [06.10.2022] pzotov - Could not complete adjustingfor LINUX in new-qa. - DEFERRED. -""" - -import os -import platform -import pytest -from firebird.qa import * - -db = db_factory(charset='ISO8859_1') - -act = python_act('db', substitutions=[('BLOB_ID_.*', ''), ('.*After line \\d+.*', '')]) - -test_expected_stdout = """ - ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ - ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ - TXT_LPAD_03 ¡ - ¡ - TXT_LPAD_05A ¿ - TXT_LPAD_05B À - TXT_LPAD_06A ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄ÷øùúûüýþÿ - TXT_LPAD_06B ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄ÷øùúûüýþÿ -""" - -test_expected_stderr = """ - Statement failed, SQLSTATE = 22001 - arithmetic exception, numeric overflow, or string truncation - -string right truncation - -expected length 32765, actual 32766 -""" - -@pytest.mark.skipif(platform.system() != 'Windows', reason='FIXME: see notes') -@pytest.mark.version('>=3.0') -def test_1(act: Action): - - # NB: do NOT include here character "­ ­ soft hyphen" - # It can not be properly represented on linux in utf8 codepage! - # https://jkorpela.fi/shy.html - # - data = "¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" - - null_dev = os.devnull - test_sql = \ - f''' - set list on; - recreate table test(c varchar(32765), b blob sub_type text); - insert into test(c, b) values( '{data}', '{data}' ); - select lpad(c, 2 * char_length(c), b) as blob_id_01 from test; - select lpad(b, 2 * char_length(b), c) as blob_id_02 from test; - - -- from CORE-2745 ("build in function LPAD result is wrong if argument is longer then length to padd parameter"): - select lpad(c, 1, 'ÿ') as txt_lpad_03 from test; - select lpad(b, 1, 'ÿ') as blob_id_04 from test; - - -- from CORE-2597: LPAD result must be varchar(1) instead of varchar(32765) in this example: - select rpad('¿', 1, '¡') as txt_lpad_05a, rpad('À', 1, 'ÿ') as txt_lpad_05b from rdb$database; - - select - lpad('÷øùúûüýþÿ',32765-char_length('÷øùúûüýþÿ'), '{data}') as txt_lpad_06a - ,lpad('÷øùúûüýþÿ',32765-char_length('÷øùúûüýþÿ'), '{data}') as txt_lpad_06b - from rdb$database; - - out {null_dev}; - select lpad(c, 32765, c) from test; -- this must pass - select lpad(c, 32766, c) from test; -- must fail: SQLSTATE = 22001 / ... string truncation / -expected length 32765, actual 32766 - out; - - -- select char_length(lpad('', 2147483647, b)) as r_03 from test; -- <<< 152s :-) - ''' - - act.expected_stdout = test_expected_stdout - act.expected_stderr = test_expected_stderr - - act.isql(switches=['-q'], input = test_sql ) - - assert (act.clean_stdout == act.clean_expected_stdout and act.clean_stderr == act.clean_expected_stderr) +#coding:utf-8 + +""" +ID: intfunc.string.lpad +TITLE: LPAD function, including non-ascii characters +DESCRIPTION: +FBTEST: functional.intfunc.string.lpad_01 +NOTES: + [03.03.2021] pzotov + Re-implemented in order to have ability to run this test on Linux. + Added tests from some COREs which have no apropriate .fbt + Test creates table and fills it with non-ascii characters using charset = UTF8. + Then it generates .sql script for running it in separate ISQL process. + This script makes connection to test DB using charset = ISO8859_1 and perform needed DML. + + [31.10.2024] pzotov + Finished adjusting for work both on Linux and Windows. + + Checked on 6.0.0.511 (Windows/Linux); 5.0.2.1550; 4.0.6.3165; 3.0.13.33794 +""" +import os +from pathlib import Path + +import pytest +from firebird.qa import * + +db = db_factory(charset='ISO8859_1') +act = python_act('db', substitutions=[('BLOB_ID_.*', ''), ('.*After line \\d+.*', '')]) +tmp_sql = temp_file('tmp_internal_func_lpad_01.sql') + +#@pytest.mark.skipif(platform.system() != 'Windows', reason='FIXME: see notes') +@pytest.mark.version('>=3.0.0') +def test_1(act: Action, tmp_sql: Path): + + # NB: do NOT include here character "­ ­ soft hyphen" + # It can not be properly represented on linux in utf8 codepage! + # https://jkorpela.fi/shy.html + # + data = "¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" + + null_dev = os.devnull + test_sql = \ + f''' + set list on; + recreate table test(c varchar(32765), b blob sub_type text); + insert into test(c, b) values( '{data}', '{data}' ); + select lpad(c, 2 * char_length(c), b) as blob_id_01 from test; + select lpad(b, 2 * char_length(b), c) as blob_id_02 from test; + + -- from CORE-2745 ("build in function LPAD result is wrong if argument is longer then length to padd parameter"): + select lpad(c, 1, 'ÿ') as txt_lpad_03 from test; + select lpad(b, 1, 'ÿ') as blob_id_04 from test; + + -- from CORE-2597: LPAD result must be varchar(1) instead of varchar(32765) in this example: + select rpad('¿', 1, '¡') as txt_lpad_05a, rpad('À', 1, 'ÿ') as txt_lpad_05b from rdb$database; + + select + lpad('÷øùúûüýþÿ',32765-char_length('÷øùúûüýþÿ'), '{data}') as txt_lpad_06a + ,lpad('÷øùúûüýþÿ',32765-char_length('÷øùúûüýþÿ'), '{data}') as txt_lpad_06b + from rdb$database; + + out {null_dev}; + select lpad(c, 32765, c) from test; -- this must pass + select lpad(c, 32766, c) from test; -- must fail: SQLSTATE = 22001 / ... string truncation / -expected length 32765, actual 32766 + out; + + -- select char_length(lpad('', 2147483647, b)) as r_03 from test; -- <<< 152s :-) + ''' + # ::: NB ::: + # For proper output of test, input script must be encoded in iso8859_1. + # + tmp_sql.write_text(test_sql, encoding = 'iso8859_1') + + act.expected_stdout = """ + ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ + ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ + TXT_LPAD_03 ¡ + ¡ + TXT_LPAD_05A ¿ + TXT_LPAD_05B À + TXT_LPAD_06A ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄ÷øùúûüýþÿ + TXT_LPAD_06B ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄ÷øùúûüýþÿ + + Statement failed, SQLSTATE = 22001 + arithmetic exception, numeric overflow, or string truncation + -string right truncation + -expected length 32765, actual 32766 + """ + + act.isql(switches = ['-q'], input_file = tmp_sql, charset = 'iso8859_1', combine_output = True) + assert act.clean_stdout == act.clean_expected_stdout From 6ea13016106abcb804e4b1346b177c894a7dc1c6 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 31 Oct 2024 22:23:52 +0300 Subject: [PATCH 114/128] Added/Updated tests\functional\intfunc\string\test_rpad_01.py: Finished adjusting for work both on Linux and Windows. Checked on 6.0.0.511 (Windows/Linux); 5.0.2.1550; 4.0.6.3165; 3.0.13.33794 --- .../functional/intfunc/string/test_rpad_01.py | 177 +++++++++--------- 1 file changed, 87 insertions(+), 90 deletions(-) diff --git a/tests/functional/intfunc/string/test_rpad_01.py b/tests/functional/intfunc/string/test_rpad_01.py index eb78ea9b..de94103f 100644 --- a/tests/functional/intfunc/string/test_rpad_01.py +++ b/tests/functional/intfunc/string/test_rpad_01.py @@ -1,90 +1,87 @@ -#coding:utf-8 - -""" -ID: intfunc.string.rpad -TITLE: RPAD function, including non-ascii characters -DESCRIPTION: -NOTES: -FBTEST: functional.intfunc.string.rpad_01 -NOTES: - [03.03.2021] pzotov - Re-implemented in order to have ability to run this test on Linux. - Added tests from some COREs which have no apropriate .fbt - Test creates table and fills it with non-ascii characters using charset = UTF8. - Then it generates .sql script for running it in separate ISQL process. - This script makes connection to test DB using charset = ISO8859_1 and perform needed DML. - Result will be redirected to .log which will be opened via codecs.open(...encoding='iso-8859-1'). - Its content will be converted to UTF8 for showing in expected_stdout. - [06.10.2022] pzotov - Could not complete adjustingfor LINUX in new-qa. - DEFERRED. -""" - -import os -import platform -import pytest -from firebird.qa import * - -db = db_factory(charset='ISO8859_1') - -act = python_act('db', substitutions=[('BLOB_ID_.*', ''), ('.*After line \\d+.*', '')]) - -test_expected_stdout = """ - ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ - ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ - TXT_RPAD_03 ¡ - ¡ - TXT_RPAD_05A ¿ - TXT_RPAD_05B À - TXT_RPAD_06A ÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄ - TXT_RPAD_06B ÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄ -""" - -test_expected_stderr = """ - Statement failed, SQLSTATE = 22001 - arithmetic exception, numeric overflow, or string truncation - -string right truncation - -expected length 32765, actual 32766 -""" - -@pytest.mark.skipif(platform.system() != 'Windows', reason='FIXME: see notes') -@pytest.mark.version('>=3.0') -def test_1(act: Action): - # NB: do NOT include here character "­ ­ soft hyphen" - # It can not be properly represented on linux in utf8 codepage! - # https://jkorpela.fi/shy.html - data = "¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" - - null_dev = os.devnull - test_sql = \ - f""" - set list on; - recreate table test(c varchar(32765), b blob sub_type text); - insert into test(c, b) values( '{data}', '{data}' ); - select rpad(c, 2 * char_length(c), b) as blob_id_01 from test; - select rpad(b, 2 * char_length(b), c) as blob_id_02 from test; - - -- from CORE-2745 ("build in function RPAD result is wrong if argument is longer then length to padd parameter"): - select rpad(c, 1, 'ÿ') as txt_rpad_03 from test; - select rpad(b, 1, 'ÿ') as blob_id_04 from test; - - -- from CORE-2597: RPAD result must be varchar(1) instead of varchar(32765) in this example: - select rpad('¿', 1, '¡') as txt_rpad_05a, rpad('À', 1, 'ÿ') as txt_rpad_05b from rdb$database; - - select - rpad('÷øùúûüýþÿ',32765-char_length('÷øùúûüýþÿ'), '{data}') as txt_rpad_06a - ,rpad('÷øùúûüýþÿ',32765-char_length('÷øùúûüýþÿ'), '{data}') as txt_rpad_06b - from rdb$database; - - out {null_dev}; - select rpad(c, 32765, c) from test; -- this must pass - select rpad(c, 32766, c) from test; -- must fail: SQLSTATE = 22001 / ... string truncation / -expected length 32765, actual 32766 - out; - """ - - act.expected_stdout = test_expected_stdout - act.expected_stderr = test_expected_stderr - - act.isql(switches=['-q'], input = test_sql ) - - assert (act.clean_stdout == act.clean_expected_stdout and act.clean_stderr == act.clean_expected_stderr) +#coding:utf-8 + +""" +ID: intfunc.string.rpad +TITLE: RPAD function, including non-ascii characters +DESCRIPTION: +NOTES: +FBTEST: functional.intfunc.string.rpad_01 +NOTES: + [03.03.2021] pzotov + Re-implemented in order to have ability to run this test on Linux. + Added tests from some COREs which have no apropriate .fbt + Test creates table and fills it with non-ascii characters using charset = UTF8. + Then it generates .sql script for running it in separate ISQL process. + This script makes connection to test DB using charset = ISO8859_1 and perform needed DML. + + [31.10.2024] pzotov + Finished adjusting for work both on Linux and Windows. + + Checked on 6.0.0.511 (Windows/Linux); 5.0.2.1550; 4.0.6.3165; 3.0.13.33794 +""" +import os +from pathlib import Path + +import pytest +from firebird.qa import * + +db = db_factory(charset='ISO8859_1') +act = python_act('db', substitutions=[('BLOB_ID_.*', ''), ('.*After line \\d+.*', '')]) +tmp_sql = temp_file('tmp_internal_func_rpad_01.sql') + +@pytest.mark.version('>=3.0.0') +def test_1(act: Action, tmp_sql: Path): + # NB: do NOT include here character "­ ­ soft hyphen" + # It can not be properly represented on linux in utf8 codepage! + # https://jkorpela.fi/shy.html + data = "¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" + + null_dev = os.devnull + test_sql = \ + f""" + set list on; + recreate table test(c varchar(32765), b blob sub_type text); + insert into test(c, b) values( '{data}', '{data}' ); + select rpad(c, 2 * char_length(c), b) as blob_id_01 from test; + select rpad(b, 2 * char_length(b), c) as blob_id_02 from test; + + -- from CORE-2745 ("build in function RPAD result is wrong if argument is longer then length to padd parameter"): + select rpad(c, 1, 'ÿ') as txt_rpad_03 from test; + select rpad(b, 1, 'ÿ') as blob_id_04 from test; + + -- from CORE-2597: RPAD result must be varchar(1) instead of varchar(32765) in this example: + select rpad('¿', 1, '¡') as txt_rpad_05a, rpad('À', 1, 'ÿ') as txt_rpad_05b from rdb$database; + + select + rpad('÷øùúûüýþÿ',32765-char_length('÷øùúûüýþÿ'), '{data}') as txt_rpad_06a + ,rpad('÷øùúûüýþÿ',32765-char_length('÷øùúûüýþÿ'), '{data}') as txt_rpad_06b + from rdb$database; + + out {null_dev}; + select rpad(c, 32765, c) from test; -- this must pass + select rpad(c, 32766, c) from test; -- must fail: SQLSTATE = 22001 / ... string truncation / -expected length 32765, actual 32766 + out; + """ + # ::: NB ::: + # For proper output of test, input script must be encoded in iso8859_1. + # + tmp_sql.write_text(test_sql, encoding = 'iso8859_1') + + act.expected_stdout = """ + ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ + ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ + TXT_RPAD_03 ¡ + ¡ + TXT_RPAD_05A ¿ + TXT_RPAD_05B À + TXT_RPAD_06A ÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄ + TXT_RPAD_06B ÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄ + + Statement failed, SQLSTATE = 22001 + arithmetic exception, numeric overflow, or string truncation + -string right truncation + -expected length 32765, actual 32766 + """ + + act.isql(switches = ['-q'], input_file = tmp_sql, charset = 'iso8859_1', combine_output = True) + assert act.clean_stdout == act.clean_expected_stdout \ No newline at end of file From 494488f3ec3108344fdd34e58dce2d7bb97b30f0 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Fri, 1 Nov 2024 23:40:23 +0300 Subject: [PATCH 115/128] Added/Updated tests\bugs\gh_8185_test.py: Checked on 5.0.1.1452-08dc25f (27.07.2024 11:50); 6.0.0.401-a7d10a4 (29.07.2024 01:33) -- all OK. --- tests/bugs/gh_8185_test.py | 346 +++++++++++++++++++++++++++++++++++++ 1 file changed, 346 insertions(+) create mode 100644 tests/bugs/gh_8185_test.py diff --git a/tests/bugs/gh_8185_test.py b/tests/bugs/gh_8185_test.py new file mode 100644 index 00000000..68cad08d --- /dev/null +++ b/tests/bugs/gh_8185_test.py @@ -0,0 +1,346 @@ +#coding:utf-8 + +""" +ID: issue-8185 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8185 +TITLE: SIGSEGV in Firebird 5.0.0.1306 embedded during update on cursor +DESCRIPTION: + Test implements sequence of actions described by Dimitry Sibiryakov in the ticket, + see: https://github.com/FirebirdSQL/firebird/issues/8185#issuecomment-2258598579 +NOTES: + [01.11.2024] pzotov + 1. Bug was fixed on following commits: + 5.x: 27.07.2024 11:48, 08dc25f8c45342a73c786bc60571c8a5f2c8c6e3 + ("Simplest fix for #8185: SIGSEGV in Firebird 5.0.0.1306 embedded during update on cursor - disallow caching for positioned updates/deletes") + 6.x: 29.07.2024 00:53, a7d10a40147d326e56540498b50e40b2da0e5850 + ("Fix #8185 - SIGSEGV with WHERE CURRENT OF statement with statement cache turned on") + 2. In current version of firebird-driver we can *not* set cursor name without executing it first. + But such execution leads to 'update conflict / deadlock' for subsequent UPDATE statement. + Kind of 'hack' is used to solve this problem: ps1._istmt.set_cursor_name(CURSOR_NAME) + 3. GREAT thanks to: + * Vlad for providing workaround and explanation of problem with AV for code like this: + with connect(f'localhost:{DB_NAME}', user = DBA_USER, password = DBA_PSWD) as con: + cur1 = con.cursor() + ps1 = cur1.prepare('update test set id = -id rows 0 returning id') + cur1.execute(ps1) + ps1.free() + It is mandatory to store result of cur1.eecute in some variable, i.e. rs1 = cur1.execute(ps1), + and call then rs1.close() __BEFORE__ ps1.free(). + Discussed 26.10.2024, subj: + "Oddities when using instance of selectable Statement // related to interfaces, VTable, iResultSet, iVersioned , CLOOP" + * Dimitry Sibiryakov for describe the 'step-by-step' algorithm for reproducing problem and providing working example in .cpp + + Confirmed problem on 5.0.1.1452-b056f5b (last snapshot before it was fixed). + Checked on 5.0.1.1452-08dc25f (27.07.2024 11:50); 6.0.0.401-a7d10a4 (29.07.2024 01:33) -- all OK. +""" + +import pytest +from firebird.qa import * +from firebird.driver import driver_config, connect, tpb, TraAccessMode, Isolation, DatabaseError + +init_sql = """ + set bail on; + recreate table test(id int, f01 int); + commit; + insert into test(id, f01) select row_number()over(), row_number()over() * 10 from rdb$types rows 3; + commit; +""" +db = db_factory(init = init_sql) +act = python_act('db') + +@pytest.mark.version('>=5.0.0') +def test_1(act: Action, capsys): + + srv_cfg = driver_config.register_server(name = 'test_srv_gh_8185', config = '') + db_cfg_name = f'db_cfg_8185' + db_cfg_object = driver_config.register_database(name = db_cfg_name) + db_cfg_object.server.value = srv_cfg.name + db_cfg_object.database.value = str(act.db.db_path) + db_cfg_object.config.value = f""" + MaxStatementCacheSize = 1M + """ + + # Pre-check: + with connect(db_cfg_name, user = act.db.user, password = act.db.password) as con: + cur = con.cursor() + cur.execute("select a.mon$remote_protocol, g.rdb$config_value from mon$attachments a left join rdb$config g on g.rdb$config_name = 'MaxStatementCacheSize' where a.mon$attachment_id = current_connection") + for r in cur: + conn_protocol = r[0] + db_sttm_cache_size = int(r[1]) + assert conn_protocol is None, "Test must use LOCAL protocol." + assert db_sttm_cache_size > 0, "Parameter 'MaxStatementCacheSize' (per-database) must be greater than zero for this test." + + #--------------------------------------------- + + CURSOR_NAME = 'k1' + SELECT_STTM = 'select /* ps-1*/ id, f01 from test where id > 0 for update' + UPDATE_STTM = f'update /* ps-2 */ test set id = -id where current of {CURSOR_NAME} returning id' + + update_tpb = tpb( access_mode = TraAccessMode.WRITE, + isolation = Isolation.READ_COMMITTED_RECORD_VERSION, + lock_timeout = 1) + + with connect(db_cfg_name, user = act.db.user, password = act.db.password) as con: + + tx2 = con.transaction_manager(update_tpb) + tx2.begin() + + with con.cursor() as cur1, tx2.cursor() as cur2, con.cursor() as cur3: + + ps1, rs1, ps2, rs2, ps3, rs3 = None, None, None, None, None, None + try: + ps1 = cur1.prepare(SELECT_STTM) # 1. [ticket, DS] Prepare statement 1 "select ... for update" + ps1._istmt.set_cursor_name(CURSOR_NAME) # 2. [ticket, DS] Set cursor name for statement 1 // ~hack. + + # DO NOT use it because subsequent update statement will get 'deadlock / update conflict' and not able to start: + #rs1 = cur1.execute(ps1) + #cur1.set_cursor_name(CURSOR_NAME) + + # DS example: "// Prepare positioned update statement" + ps2 = cur2.prepare(UPDATE_STTM) # 3. [ticket, DS] Prepare statement 2 "update ... where current of " + + # DS .cpp: // fetch records from cursor and print them + rs1 = cur1.execute(ps1) + rs1.fetchall() + + # DS .cpp: // IStatement* stmt2 = att->prepare(&status, tra, 0, "select * from pos where a > 1 for update", + ps3 = cur3.prepare(SELECT_STTM) # 4. [ticket, DS] Prepare statement 3 similar to statement 1 + + rs1.close() # 5. [ticket, DS] Release statement 1 // see hvlad recipe, 26.10.2024 + ps1.free() + + # DS .cpp: updStmt->free(&status); + ps2.free() # 6. [ticket, DS] Release statement 2 // see hvlad recipe, 26.10.2024 + + # DS .cpp: stmt = stmt2 + ps3._istmt.set_cursor_name(CURSOR_NAME) # 7. [ticket, DS] Set cursor name to statement 3 as in step 2 + + ps2 = cur2.prepare(UPDATE_STTM) # 8. [ticket, DS] Prepare statement 2 again (it will be got from cache keeping reference to statement 1) + + rs3 = cur3.execute(ps3) + rs3.fetchone() # 9. [ticket, DS] Run statement 3 and fetch one record + + # At step 10 you can get "Invalid handle" error or a crash if you swap steps 5 and 6. + rs2 = cur2.execute(ps2) # 10. [ticket, DS] Execute statement 2 + data2 = rs2.fetchone() + print('Changed ID:', data2[0]) + # print(f'{rs2.rowcount=}') + + except DatabaseError as e: + print(e.__str__()) + print('gds codes:') + for i in e.gds_codes: + print(i) + + finally: + if rs1: + rs1.close() + if ps1: + ps1.free() + + if rs2: + rs2.close() + if ps2: + ps2.free() + + if rs3: + rs3.close() + if ps3: + ps3.free() + + #--------------------------------------------- + + act.expected_stdout = 'Changed ID: -1' + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout + + +# Example in .cpp (provided by Dimitry Sibiryakov): +################################################### +# +# #include +# #include "ifaceExamples.h" +# static IMaster* master = fb_get_master_interface(); +# +# int main() +# { +# int rc = 0; +# +# // status vector and main dispatcher +# ThrowStatusWrapper status(master->getStatus()); +# IProvider* prov = master->getDispatcher(); +# IUtil* utl = master->getUtilInterface(); +# +# // declare pointers to required interfaces +# IAttachment* att = NULL; +# ITransaction* tra = NULL; +# IStatement* stmt = NULL; +# IMessageMetadata* meta = NULL; +# IMetadataBuilder* builder = NULL; +# IXpbBuilder* tpb = NULL; +# +# // Interface provides access to data returned by SELECT statement +# IResultSet* curs = NULL; +# +# try +# { +# // IXpbBuilder is used to access various parameters blocks used in API +# IXpbBuilder* dpb = NULL; +# +# // create DPB - use non-default page size 4Kb +# dpb = utl->getXpbBuilder(&status, IXpbBuilder::DPB, NULL, 0); +# dpb->insertString(&status, isc_dpb_user_name, "sysdba"); +# dpb->insertString(&status, isc_dpb_password, "masterkey"); +# +# // create empty database +# att = prov->attachDatabase(&status, "ctest", dpb->getBufferLength(&status), +# dpb->getBuffer(&status)); +# +# dpb->dispose(); +# +# printf("database attached.\n"); +# +# att->execute(&status, nullptr, 0, "set debug option dsql_keep_blr = true", SAMPLES_DIALECT, nullptr, nullptr, nullptr, nullptr); +# // start read only transaction +# tpb = utl->getXpbBuilder(&status, IXpbBuilder::TPB, NULL, 0); +# tpb->insertTag(&status, isc_tpb_read_committed); +# tpb->insertTag(&status, isc_tpb_no_rec_version); +# tpb->insertTag(&status, isc_tpb_wait); +# tra = att->startTransaction(&status, tpb->getBufferLength(&status), tpb->getBuffer(&status)); +# +# // prepare statement +# stmt = att->prepare(&status, tra, 0, "select * from pos where a > 1 for update", +# SAMPLES_DIALECT, IStatement::PREPARE_PREFETCH_METADATA); +# +# // get list of columns +# meta = stmt->getOutputMetadata(&status); +# unsigned cols = meta->getCount(&status); +# unsigned messageLength = meta->getMessageLength(&status); +# +# std::unique_ptr buffer(new char[messageLength]); +# +# stmt->setCursorName(&status, "abc"); +# +# // open cursor +# printf("Opening cursor...\n"); +# curs = stmt->openCursor(&status, tra, NULL, NULL, meta, 0); +# +# // Prepare positioned update statement +# printf("Preparing update statement...\n"); +# IStatement* updStmt = att->prepare(&status, tra, 0, "update pos set b=b+1 where current of abc", +# SAMPLES_DIALECT, 0); +# +# const unsigned char items[] = {isc_info_sql_exec_path_blr_text, isc_info_sql_explain_plan}; +# unsigned char infoBuffer[32000]; +# updStmt->getInfo(&status, sizeof items, items, sizeof infoBuffer, infoBuffer); +# +# IXpbBuilder* pb = utl->getXpbBuilder(&status, IXpbBuilder::INFO_RESPONSE, infoBuffer, sizeof infoBuffer); +# for (pb->rewind(&status); !pb->isEof(&status); pb->moveNext(&status)) +# { +# switch (pb->getTag(&status)) +# { +# case isc_info_sql_exec_path_blr_text: +# printf("BLR:\n%s\n", pb->getString(&status)); +# break; +# case isc_info_sql_explain_plan: +# printf("Plan:\n%s\n", pb->getString(&status)); +# break; +# case isc_info_truncated: +# printf(" truncated\n"); +# // fall down... +# case isc_info_end: +# break; +# default: +# printf("Unexpected item %d\n", pb->getTag(&status)); +# } +# } +# pb->dispose(); +# +# // fetch records from cursor and print them +# for (int line = 0; curs->fetchNext(&status, buffer.get()) == IStatus::RESULT_OK; ++line) +# { +# printf("Fetched record %d\n", line); +# updStmt->execute(&status, tra, nullptr, nullptr, nullptr, nullptr); +# printf("Update executed\n"); +# } +# +# IStatement* stmt2 = att->prepare(&status, tra, 0, "select * from pos where a > 1 for update", +# SAMPLES_DIALECT, IStatement::PREPARE_PREFETCH_METADATA); +# +# // close interfaces +# curs->close(&status); +# curs = NULL; +# +# stmt->free(&status); +# stmt = NULL; +# +# updStmt->free(&status); +# +# stmt = stmt2; +# stmt->setCursorName(&status, "abc"); +# +# // open cursor +# printf("Opening cursor2...\n"); +# curs = stmt->openCursor(&status, tra, NULL, NULL, meta, 0); +# +# // Prepare positioned update statement +# printf("Preparing update statement again...\n"); +# updStmt = att->prepare(&status, tra, 0, "update pos set b=b+1 where current of abc", +# SAMPLES_DIALECT, 0); +# +# // fetch records from cursor and print them +# for (int line = 0; curs->fetchNext(&status, buffer.get()) == IStatus::RESULT_OK; ++line) +# { +# printf("Fetched record %d\n", line); +# updStmt->execute(&status, tra, nullptr, nullptr, nullptr, nullptr); +# printf("Update executed\n"); +# } +# +# curs->close(&status); +# curs = NULL; +# +# stmt->free(&status); +# stmt = NULL; +# +# updStmt->free(&status); +# +# meta->release(); +# meta = NULL; +# +# tra->commit(&status); +# tra = NULL; +# +# att->detach(&status); +# att = NULL; +# } +# catch (const FbException& error) +# { +# // handle error +# rc = 1; +# +# char buf[256]; +# master->getUtilInterface()->formatStatus(buf, sizeof(buf), error.getStatus()); +# fprintf(stderr, "%s\n", buf); +# } +# +# // release interfaces after error caught +# if (meta) +# meta->release(); +# if (builder) +# builder->release(); +# if (curs) +# curs->release(); +# if (stmt) +# stmt->release(); +# if (tra) +# tra->release(); +# if (att) +# att->release(); +# if (tpb) +# tpb->dispose(); +# +# prov->release(); +# status.dispose(); +# +# return rc; +# } From 87dfaf7f429caea8cc134a9b51e399a3c9cdbf27 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sat, 2 Nov 2024 22:22:57 +0300 Subject: [PATCH 116/128] Added/Updated tests\bugs\gh_5009_test.py: Checked on 4.0.6.3165, 5.0.2.1551, 6.0.0.415 --- tests/bugs/gh_5009_test.py | 103 +++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 tests/bugs/gh_5009_test.py diff --git a/tests/bugs/gh_5009_test.py b/tests/bugs/gh_5009_test.py new file mode 100644 index 00000000..24f4aab5 --- /dev/null +++ b/tests/bugs/gh_5009_test.py @@ -0,0 +1,103 @@ +#coding:utf-8 + +""" +ID: issue-5009 +ISSUE: 5009 +TITLE: Index and blob garbage collection doesn't take into accout data in undo log [CORE4701] +DESCRIPTION: +JIRA: CORE-4701 +NOTES: + [02.11.2024] pzotov + Confirmed bug on 3.0.13.33794. + Checked on 4.0.6.3165, 5.0.2.1551, 6.0.0.415 +""" + +import pytest +from firebird.qa import * + +db = db_factory() + +test_script = """ + create table g_test (f integer); + create index g_ind on g_test (f); + insert into g_test values (1); + commit; + update g_test set f=2; + savepoint a; + update g_test set f=3; + savepoint b; + update g_test set f=3; + savepoint c; + update g_test set f=4; + savepoint d; + update g_test set f=4; + release savepoint b only; + rollback to savepoint c; + commit; + set list on; + set count on; + set plan on; + + select g.f as f_natreads from g_test g; + + select g.f as f_idxreads from g_test g where g.f between 1 and 4; +""" + +act = isql_act('db', test_script, substitutions = [ ('[ \t]+', ' '), ]) + +@pytest.mark.version('>=4.0.0') +def test_1(act: Action, capsys): + + act.execute(combine_output = True) + + act.expected_stdout = """ + PLAN (G NATURAL) + F_NATREADS 3 + Records affected: 1 + PLAN (G INDEX (G_IND)) + F_IDXREADS 3 + Records affected: 1 + """ + + with act.connect_server() as srv: + srv.database.validate(database = act.db.db_path) + validate_err = '\n'.join( [line for line in srv if 'ERROR' in line.upper()] ) + + expected_isql = 'ISQL output check: PASSED.' + expected_onlv = 'Online validation: FAILED.' + + if act.clean_stdout == act.clean_expected_stdout: + print(expected_isql) + else: + print( + f""" + ISQL output check: FAILED. + Actual: + {act.clean_stdout} + Expected: + {act.expected_stdout} + """ + ) + + if not validate_err: + print(expected_onlv) + else: + print( + f""" + Online validation: FAILED. + Actual: + {validate_err} + Epsected: + + """ + ) + + + act.reset() + act.expected_stdout = f""" + {expected_isql} + {expected_onlv} + """ + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout + From 2a969614c5598e7cfd2d04a0f26ebdfc95f3e098 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sat, 2 Nov 2024 23:42:00 +0300 Subject: [PATCH 117/128] Added/Updated tests\bugs\gh_7269_test.py: Checked on 5.0.2.1551, 6.0.0.415. --- tests/bugs/gh_7269_test.py | 68 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 tests/bugs/gh_7269_test.py diff --git a/tests/bugs/gh_7269_test.py b/tests/bugs/gh_7269_test.py new file mode 100644 index 00000000..aaae9140 --- /dev/null +++ b/tests/bugs/gh_7269_test.py @@ -0,0 +1,68 @@ +#coding:utf-8 + +""" +ID: issue-7269 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/7269 +TITLE: Database restore must make every effort on activating deferred indexes +DESCRIPTION: + Test uses unrecoverable .fbk that was provided in the ticket and tries to restore it using '-verbose' option. + After restore finish, we check its log. It must contain SEVERAL errors related to indices (PK and two FK), + and also it must have messages about FINAL point of restore (regardless error that follows after this): + gbak:finishing, closing, and going home + gbak:adjusting the ONLINE and FORCED WRITES flags +NOTES: + [02.11.2024] pzotov + Checked on 5.0.2.1551, 6.0.0.415. +""" +import subprocess +from pathlib import Path +import zipfile +import locale +import re +import pytest +from firebird.qa import * +from firebird.driver import SrvRestoreFlag + +db = db_factory() +act = python_act('db') +tmp_fbk = temp_file('gh_7269.tmp.fbk') +tmp_fdb = temp_file('gh_7269.tmp.fdb') + +@pytest.mark.version('>=4.0.0') +def test_1(act: Action, tmp_fbk: Path, tmp_fdb: Path, capsys): + zipped_fbk_file = zipfile.Path(act.files_dir / 'gh_7269.zip', at = 'gh-7269-unrecoverable.fbk') + tmp_fbk.write_bytes(zipped_fbk_file.read_bytes()) + + allowed_patterns = \ + ( + r'gbak:(\s+)?ERROR(:)?' + ,r'gbak:(\s+)?finishing, closing, and going home' + ,r'gbak:(\s+)?adjusting the ONLINE and FORCED WRITES flags' + ) + allowed_patterns = [ re.compile(p, re.IGNORECASE) for p in allowed_patterns ] + + act.gbak(switches = ['-rep', '-v', str(tmp_fbk), str(tmp_fdb)], combine_output = True, io_enc = locale.getpreferredencoding()) + + for line in act.stdout.splitlines(): + if act.match_any(line.strip(), allowed_patterns): + print(line) + + expected_stdout = """ + gbak: ERROR:violation of PRIMARY or UNIQUE KEY constraint "PK_A3" on table "A3" + gbak: ERROR: Problematic key value is ("ID" = 9) + gbak: ERROR:violation of PRIMARY or UNIQUE KEY constraint "PK_A1" on table "A1" + gbak: ERROR: Problematic key value is ("ID" = 5) + gbak: ERROR:Cannot create foreign key constraint FK_A1. Partner index does not exist or is inactive. + gbak: ERROR:violation of FOREIGN KEY constraint "FK_A2" on table "B2" + gbak: ERROR: Foreign key reference target does not exist + gbak: ERROR: Problematic key value is ("A2_ID" = 5) + gbak: ERROR:Cannot create foreign key constraint FK_A3. Partner index does not exist or is inactive. + gbak:finishing, closing, and going home + gbak:adjusting the ONLINE and FORCED WRITES flags + gbak: ERROR:Database is not online due to failure to activate one or more indices. + gbak: ERROR: Run gfix -online to bring database online without active indices. + """ + + act.expected_stdout = expected_stdout + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From 524b195208c173db391b3fb8adf097e938db129b Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sun, 3 Nov 2024 09:53:56 +0300 Subject: [PATCH 118/128] Added forgotten .zip that is needed for appropriate test --- files/gh_7269.zip | Bin 0 -> 1185 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 files/gh_7269.zip diff --git a/files/gh_7269.zip b/files/gh_7269.zip new file mode 100644 index 0000000000000000000000000000000000000000..956db23a389e3ee962ab7f25d31e4e4e53001e37 GIT binary patch literal 1185 zcmWIWW@Zs#U|`^2DBqS8xzg@H`%7jZSB8N>5=fr9r0y%J;2?a9xrv8Y#ja(;-4f}1&CKOlu~v7UCHjlXGaplyx1Ym) zL|AC!-6LB)ch44GXlrmX?oRQ$o!{p~#!l$I&7s&cH|hIRxdahKkyFpZet*7xSwDXM z-umyyZqBOvBc^)a&Lu@(X|DLkcil7GzF01O@vHRB$)Zq+RF2rGPy6)T&#|357Ae28 z@BHO^e4K?52I~@H-sEmv$h*^iYPIKL#X5z|*p=2c}4dnB&hExyxoXM(xW7xndS)^k@Me3CNh+ob5O z2HEl%yI#e`O_tYvT_3$F=j8L>pMENqO<_4VY4JXxh1Z|7S6M_K+3Ip-f&UegTtofX zIp%S8`oE<=mtC7bUH9DWSiAf`=Fi@)v&}!hgMatw=Xdvh*i+|}w)E6InTXYMj5oY3 z|1VV*{_E?xui1B&?~U63S--=S=W?W~v)-GCtCzp(N{1KKx2A4uOI@a0er=1)`gBW? zX%pZ7INrWlu2}W(;d%ew$4TUQu2bOUOYd}@)KRpgV&McY2`-sE!7}-etdG9?=hU}& z+Uq_4^bT0FX-sFhf2Cnw1XE2kbJ9kZAM4n@92I(y$t%&Jdf>Zhg0~K1-3mr$pu|SD zoNmJxs(oUjJJi)^b{au;}=XIu3oXMxvQwpB-f)M>U=OMp}+pDbAR6c%|l?Q>LPM+y$HmugLiMJ`7p6 zvLL#_n`0T+j8Cdps{OKO`2J=$e$;leLMruV#*>|#2lLFnb%zQ(%deF_UQ;pU!{iqm z>NlO>5Lq{M#X^@{)hzA6;La@7G!4V(&YNCmLXx6ZZeDR^^WCpG<+B7eVg%T=+78b6 z-p+n={*gvW=bSA|%Dk=F&T@#vZCm2zJ=wzG^D8OcnRhRp^EPH`ovu4GFH=~wZ;=t- z*W=$mEO^oBd~d$b&ks+pte@wl7V1-FH(66H`rw^w)33=c`{i*~*|=Z!v&8J<>ulm2 zr$2aZ9^lQ$WY2)BgiryN5g?!dCh?RPTu>#93=$0SA9R-{=-y_`xwYbJ3Xq2J1H4(; PK;|$4VK$IfU;*&}ns69Z literal 0 HcmV?d00001 From 0f4c5acfef3b040d94ba7811adfbf669331da098 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Mon, 4 Nov 2024 10:03:27 +0300 Subject: [PATCH 119/128] Added/Updated tests\bugs\gh_7269_test.py: fixed wrong min_version --- tests/bugs/gh_7269_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/bugs/gh_7269_test.py b/tests/bugs/gh_7269_test.py index aaae9140..a19440ad 100644 --- a/tests/bugs/gh_7269_test.py +++ b/tests/bugs/gh_7269_test.py @@ -28,7 +28,7 @@ act = python_act('db') tmp_fbk = temp_file('gh_7269.tmp.fbk') tmp_fdb = temp_file('gh_7269.tmp.fdb') -@pytest.mark.version('>=4.0.0') +@pytest.mark.version('>=5.0.2') def test_1(act: Action, tmp_fbk: Path, tmp_fdb: Path, capsys): zipped_fbk_file = zipfile.Path(act.files_dir / 'gh_7269.zip', at = 'gh-7269-unrecoverable.fbk') tmp_fbk.write_bytes(zipped_fbk_file.read_bytes()) From 718804e976c7ea64fe37bc190a9e1a150c8a2f36 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Mon, 4 Nov 2024 12:37:18 +0300 Subject: [PATCH 120/128] Added/Updated tests\bugs\gh_8304_test.py: Checked on 6.0.0.515-1c3dc43; 5.0.2.1551-90fdb97; 4.0.6.3165 (intermediate build). --- tests/bugs/gh_8304_test.py | 96 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 tests/bugs/gh_8304_test.py diff --git a/tests/bugs/gh_8304_test.py b/tests/bugs/gh_8304_test.py new file mode 100644 index 00000000..6260f53e --- /dev/null +++ b/tests/bugs/gh_8304_test.py @@ -0,0 +1,96 @@ +#coding:utf-8 + +""" +ID: issue-8304 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/8304 +TITLE: wrong results using minvalue/maxvalue in join condition +DESCRIPTION: +NOTES: + [04.11.2024] pzotov + Confirmed bug on 6.0.0.515-d53f368 (dob: 30.10.2024). + Checked on 6.0.0.515-1c3dc43; 5.0.2.1551-90fdb97; 4.0.6.3165 (intermediate build). +""" + +import pytest +from firebird.qa import * + +db = db_factory() + +test_script = """ + create domain dm_sml smallint default 0 not null; + create domain dm_txt varchar(100) not null; + create table tbl1 ( + ds int, + ru dm_sml, + wi dm_sml, + ko dm_sml + ); + + create table tbl2 ( + id int, + ru dm_sml, + ru_txt dm_txt, + wi dm_sml, + wi_txt dm_txt, + ko dm_sml, + ko_txt dm_txt + ); + + commit; + + insert into tbl1 (ds, ru, wi, ko) values(50, 1, 1, 0); + + insert into tbl2 (id, ru, ru_txt, wi, wi_txt, ko, ko_txt) values(1, 1, 'a', 1, 'a', 1, 'a'); + insert into tbl2 (id, ru, ru_txt, wi, wi_txt, ko, ko_txt) values(2, 1, 'b', 1, 'b', 0, 'b'); + insert into tbl2 (id, ru, ru_txt, wi, wi_txt, ko, ko_txt) values(3, 1, 'c', 0, 'c', 1, 'c'); + insert into tbl2 (id, ru, ru_txt, wi, wi_txt, ko, ko_txt) values(4, 1, 'd', 0, 'd', 0, 'd'); + insert into tbl2 (id, ru, ru_txt, wi, wi_txt, ko, ko_txt) values(5, 0, 'e', 1, 'e', 1, 'e'); + insert into tbl2 (id, ru, ru_txt, wi, wi_txt, ko, ko_txt) values(6, 0, 'f', 1, 'f', 0, 'f'); + insert into tbl2 (id, ru, ru_txt, wi, wi_txt, ko, ko_txt) values(7, 0, 'g', 0, 'g', 1, 'g'); + insert into tbl2 (id, ru, ru_txt, wi, wi_txt, ko, ko_txt) values(8, 0, 'h', 0, 'h', 0, 'h'); + + commit; + + set count on; + set list on; + + -- no record - wrong: + select 'case-1' as msg, a.* + from tbl1 a + join tbl2 b on minvalue(a.ko, 1) = b.ko and + minvalue(a.ru, 1) = b.ru and + minvalue(a.wi, 1) = b.wi + ; + + -- one record - correct: + select 'case-2' as msg, a.* + from tbl1 a + join tbl2 b on decode(a.ko, 0, 0, 1) = b.ko and + decode(a.ru, 0, 0, 1) = b.ru and + decode(a.wi, 0, 0, 1) = b.wi + ; +""" + +act = isql_act('db', test_script) + +expected_stdout = """ + MSG case-1 + DS 50 + RU 1 + WI 1 + KO 0 + Records affected: 1 + + MSG case-2 + DS 50 + RU 1 + WI 1 + KO 0 + Records affected: 1 +""" + +@pytest.mark.version('>=4.0.6') +def test_1(act: Action): + act.expected_stdout = expected_stdout + act.execute(combine_output = True) + assert act.clean_stdout == act.clean_expected_stdout From aeb3dbe22dc4fb8eafc15bf7f3e9d137ca6eb4f0 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 7 Nov 2024 16:09:24 +0300 Subject: [PATCH 121/128] Added/Updated tests\bugs\core_2668_test.py: Confirmed problem on 5.0.0.731. Checked on 5.0.0.733 (16.09.2022); 5.0.2.1553, 6.0.0.515 --- tests/bugs/core_2668_test.py | 258 ++++++++++++++++++++++++++--------- 1 file changed, 190 insertions(+), 68 deletions(-) diff --git a/tests/bugs/core_2668_test.py b/tests/bugs/core_2668_test.py index e98a8921..a812742e 100644 --- a/tests/bugs/core_2668_test.py +++ b/tests/bugs/core_2668_test.py @@ -5,92 +5,214 @@ ID: issue-3072 ISSUE: 3072 TITLE: Write note into log when automatic sweep is started DESCRIPTION: + Test changes sweep interval to some low value (see SWEEP_GAP) and runs TX_COUNT transactions which + lead difference between OST and OIT to exceed given sweep interval. These transactions are performed + by ISQL which is launched as child process. SQL script uses table with record that is locked at the + beginning of script and execute block with loop of TX_COUNT statements which insert new records. + After this loop finish, we make ISQL to hang by forcing it to update first record (see LOCKED_ROW). + Then we change DB state to full shutdown and wait until ISQL will be terminated. + At this point database has sweep gap that is enough to run auto sweep at first connection to DB. + Finally, we bring DB online and start trace with log_sweep = true and log_transactions = true. + Doing connection and wait about 2..3 seconds cause auto sweep to be started and completed. + This must be reflected in the trace. + + If ServerMode = 'Super' and ParallelWorkers >= 2 and MaxParallelWorkers >= ParallelWorkers + then trace log will contain folloing five lines related to worker(s) activity: + (...) START_TRANSACTION + (ATT_..., , NONE, ) --------------------- [ 1 ] + (TRA_..., READ_COMMITTED | REC_VERSION | WAIT | READ_ONLY) + (...) COMMIT_TRANSACTION + (ATT_..., , NONE, ) --------------------- [ 2 ] + + This is the only difference that can be observed for snapshots before and after fix + (i.e. BEFORE fix trace had no such lines but all other data about sweep *did* present). + Test checks that trace log contains TWO lines with '', see above [ 1 ] and [ 2 ]. + JIRA: CORE-2668 FBTEST: bugs.core_2668 +NOTES: + [07.11.2024] pzotov + Confirmed absense of lines marked as ',\s+NONE,\s+\)', re.IGNORECASE) +################ -test_script = """ -recreate table test(s varchar(36) unique); -insert into test(s) values('LOCKED_FOR_PAUSE'); -commit; - -set transaction read committed WAIT; - -update test set s = s where s = 'LOCKED_FOR_PAUSE'; - -set term ^; -execute block as - declare n int = 150; - declare v_role varchar(31); -begin - while (n > 0) do - in autonomous transaction do - insert into test(s) values( rpad('', 36, uuid_to_char(gen_uuid()) ) ) - returning :n-1 into n; - - v_role = left(replace( uuid_to_char(gen_uuid()), '-', ''), 31); - - begin - execute statement ('update test set s = s where s = ?') ('LOCKED_FOR_PAUSE') - on external - 'localhost:' || rdb$get_context('SYSTEM', 'DB_NAME') - as user 'SYSDBA' password 'masterkey' role v_role - with autonomous transaction; - when any do - begin - end - end - -end -^ -set term ;^ -set heading off; -select '-- shutdown me now --' from rdb$database; -""" - -tmp_script = temp_file('work_script.sql') +tmp_sql = temp_file('tmp_2668.sql') +tmp_log = temp_file('tmp_2668.log') @pytest.mark.es_eds -@pytest.mark.version('>=3') -def test_1(act: Action, tmp_script: Path): - tmp_script.write_text(test_script) +@pytest.mark.version('>=5.0.0') +def test_1(act: Action, tmp_sql: Path, tmp_log: Path, capsys): + + if act.vars['server-arch'] != 'SuperServer': + pytest.skip("Applies only to SuperServer") + + with act.db.connect() as con: + cur = con.cursor() + sql = """ + select + cast(max(iif(g.rdb$config_name = 'ParallelWorkers', g.rdb$config_value, null)) as int) as cfg_par_workers + ,cast(max(iif(g.rdb$config_name = 'MaxParallelWorkers', g.rdb$config_value, null)) as int) as cfg_max_par_workers + from rdb$database + left join rdb$config g on g.rdb$config_name in ('ParallelWorkers', 'MaxParallelWorkers') + """ + cur.execute(sql) + cfg_par_workers, cfg_max_par_workers = cur.fetchone() + + assert cfg_par_workers >=2 and cfg_max_par_workers >= cfg_par_workers, "Server must be configured for parallel work. Check values of ParallelWorkers and MaxParallelWorkers" + + test_script = f""" + set echo on; + set bail on; + connect '{act.db.dsn}' user {act.db.user} password '{act.db.password}'; + + recreate table test(id int primary key); + insert into test(id) values({LOCKED_ROW}); + commit; + + set transaction read committed WAIT; + + update test set id = id where id = {LOCKED_ROW}; + set term ^; + execute block as + declare n int = {TX_COUNT}; + declare v_role varchar(31); + begin + while (n > 0) do + in autonomous transaction do + insert into test(id) values(:n) + returning :n-1 into n; + + v_role = left(replace( uuid_to_char(gen_uuid()), '-', ''), 31); + + begin + execute statement ('update test /* ' || ascii_char(65) || ' */ set id = id where id = ?') ({LOCKED_ROW}) + on external + 'localhost:' || rdb$get_context('SYSTEM', 'DB_NAME') + as user '{act.db.user}' password '{act.db.password}' role v_role + with autonomous transaction; + when any do + begin + end + end + + end + ^ + set term ;^ + set heading off; + select '-- shutdown me now --' from rdb$database; + """ + + tmp_sql.write_text(test_script) with act.connect_server() as srv: - srv.database.set_sweep_interval(database=act.db.db_path, interval=100) + ############################## + ### reduce SWEEEP interval ### + ############################## + srv.database.set_sweep_interval(database = act.db.db_path, interval = SWEEP_GAP) srv.database.set_write_mode(database=act.db.db_path, mode=DbWriteMode.ASYNC) - p_work_sql = subprocess.Popen([act.vars['isql'], '-i', str(tmp_script), - '-user', act.db.user, - '-password', act.db.password, act.db.dsn], - stderr = subprocess.STDOUT) - time.sleep(3) - try: - srv.database.shutdown(database=act.db.db_path, mode=ShutdownMode.FULL, - method=ShutdownMethod.FORCED, timeout=0) - finally: - p_work_sql.terminate() + + with open(tmp_log,'w') as f_log: + p_work_sql = subprocess.Popen([act.vars['isql'], '-q', '-i', str(tmp_sql)], stdout = f_log, stderr = subprocess.STDOUT) + + chk_mon_sql = """ + select 1 + from mon$attachments a + join mon$statements s + using (mon$attachment_id) + where + a.mon$attachment_id <> current_connection + and cast(s.mon$sql_text as varchar(8192)) containing '/* A */' + """ + + found_in_mon_tables = False + with act.db.connect() as con_watcher: + + custom_tpb = tpb(isolation = Isolation.SNAPSHOT, lock_timeout = -1) + tx_watcher = con_watcher.transaction_manager(custom_tpb) + cur_watcher = tx_watcher.cursor() + + ps = cur_watcher.prepare(chk_mon_sql) + + i = 0 + da = dt.now() + while True: + cur_watcher.execute(ps) + mon_result = -1 + for r in cur_watcher: + mon_result = r[0] + + tx_watcher.commit() + db = dt.now() + diff_ms = (db-da).seconds*1000 + (db-da).microseconds//1000 + if mon_result == 1: + found_in_mon_tables = True + break + elif diff_ms > MAX_WAIT_FOR_ISQL_PID_APPEARS_MS: + break + + time.sleep(0.1) + + ps.free() + + assert found_in_mon_tables, f'Could not find attachment in mon$ tables for {MAX_WAIT_FOR_ISQL_PID_APPEARS_MS} ms.' + + try: + ############################################## + ### f u l l s h u t d o w n D B ### + ############################################## + srv.database.shutdown(database=act.db.db_path, mode=ShutdownMode.FULL, + method=ShutdownMethod.FORCED, timeout=0) + finally: + p_work_sql.terminate() + # < with open(tmp_log,'w') as f_log + srv.database.bring_online(database=act.db.db_path) - srv.info.get_log() - fblog_before = srv.readlines() + + trace_options = \ + [ + 'time_threshold = 0' + ,'log_initfini = false' + ,'log_connections = true' + ,'log_transactions = true' + ,'log_errors = true' + ,'log_sweep = true' + ] + + with act.trace(db_events = trace_options, encoding='utf8', encoding_errors='utf8'): with act.db.connect() as con_for_sweep_start: - con_for_sweep_start.begin() time.sleep(2) - srv.info.get_log() - fblog_after = srv.readlines() - pattern = re.compile('Sweep\\s+.*SWEEPER', re.IGNORECASE) - success = False - for line in unified_diff(fblog_before, fblog_after): - if line.startswith('+') and pattern.search(line): - success = True - assert success + + + for line in act.trace_log: + if WATCH_FOR_PTN.search(line): + print(WATCH_FOR_PTN.search(line).group()) + + act.expected_stdout = """ + (ATT_N, , NONE, ) + (ATT_N, , NONE, ) + """ + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From ea96df900b911082f8b9a397f6a7b9d8d52abece Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 7 Nov 2024 16:12:20 +0300 Subject: [PATCH 122/128] Added/Updated tests\bugs\gh_7304_test.py: Confirmed problem on 5.0.0.731. Checked on 5.0.0.733 (16.09.2022); 5.0.2.1553, 6.0.0.515 --- tests/bugs/gh_7304_test.py | 218 +++++++++++++++++++++++++++++++++++++ 1 file changed, 218 insertions(+) create mode 100644 tests/bugs/gh_7304_test.py diff --git a/tests/bugs/gh_7304_test.py b/tests/bugs/gh_7304_test.py new file mode 100644 index 00000000..0c1a3c2d --- /dev/null +++ b/tests/bugs/gh_7304_test.py @@ -0,0 +1,218 @@ +#coding:utf-8 + +""" +ID: issue-7304 +ISSUE: 7304 +TITLE: Events in system attachments (like garbage collector) are not traced +DESCRIPTION: + Test changes sweep interval to some low value (see SWEEP_GAP) and runs TX_COUNT transactions which + lead difference between OST and OIT to exceed given sweep interval. These transactions are performed + by ISQL which is launched as child process. SQL script uses table with record that is locked at the + beginning of script and execute block with loop of TX_COUNT statements which insert new records. + After this loop finish, we make ISQL to hang by forcing it to update first record (see LOCKED_ROW). + Then we change DB state to full shutdown and wait until ISQL will be terminated. + At this point database has sweep gap that is enough to run auto sweep at first connection to DB. + Finally, we bring DB online and start trace with log_sweep = true and log_transactions = true. + Doing connection and wait about 2..3 seconds cause auto sweep to be started and completed. + This must be reflected in the trace. + + If ServerMode = 'Super' and ParallelWorkers >= 2 and MaxParallelWorkers >= ParallelWorkers + then trace log will contain folloing five lines related to worker(s) activity: + (...) START_TRANSACTION + (ATT_..., , NONE, ) --------------------- [ 1 ] + (TRA_..., READ_COMMITTED | REC_VERSION | WAIT | READ_ONLY) + (...) COMMIT_TRANSACTION + (ATT_..., , NONE, ) --------------------- [ 2 ] + + This is the only difference that can be observed for snapshots before and after fix + (i.e. BEFORE fix trace had no such lines but all other data about sweep *did* present). + Test checks that trace log contains TWO lines with '', see above [ 1 ] and [ 2 ]. + +JIRA: CORE-2668 +FBTEST: bugs.core_2668 +NOTES: + [07.11.2024] pzotov + Confirmed absense of lines marked as ',\s+NONE,\s+\)', re.IGNORECASE) +################ + +tmp_sql = temp_file('tmp_2668.sql') +tmp_log = temp_file('tmp_2668.log') + +@pytest.mark.es_eds +@pytest.mark.version('>=5.0.0') +def test_1(act: Action, tmp_sql: Path, tmp_log: Path, capsys): + + if act.vars['server-arch'] != 'SuperServer': + pytest.skip("Applies only to SuperServer") + + with act.db.connect() as con: + cur = con.cursor() + sql = """ + select + cast(max(iif(g.rdb$config_name = 'ParallelWorkers', g.rdb$config_value, null)) as int) as cfg_par_workers + ,cast(max(iif(g.rdb$config_name = 'MaxParallelWorkers', g.rdb$config_value, null)) as int) as cfg_max_par_workers + from rdb$database + left join rdb$config g on g.rdb$config_name in ('ParallelWorkers', 'MaxParallelWorkers') + """ + cur.execute(sql) + cfg_par_workers, cfg_max_par_workers = cur.fetchone() + + assert cfg_par_workers >=2 and cfg_max_par_workers >= cfg_par_workers, "Server must be configured for parallel work. Check values of ParallelWorkers and MaxParallelWorkers" + + test_script = f""" + set echo on; + set bail on; + connect '{act.db.dsn}' user {act.db.user} password '{act.db.password}'; + + recreate table test(id int primary key); + insert into test(id) values({LOCKED_ROW}); + commit; + + set transaction read committed WAIT; + + update test set id = id where id = {LOCKED_ROW}; + set term ^; + execute block as + declare n int = {TX_COUNT}; + declare v_role varchar(31); + begin + while (n > 0) do + in autonomous transaction do + insert into test(id) values(:n) + returning :n-1 into n; + + v_role = left(replace( uuid_to_char(gen_uuid()), '-', ''), 31); + + begin + execute statement ('update test /* ' || ascii_char(65) || ' */ set id = id where id = ?') ({LOCKED_ROW}) + on external + 'localhost:' || rdb$get_context('SYSTEM', 'DB_NAME') + as user '{act.db.user}' password '{act.db.password}' role v_role + with autonomous transaction; + when any do + begin + end + end + + end + ^ + set term ;^ + set heading off; + select '-- shutdown me now --' from rdb$database; + """ + + tmp_sql.write_text(test_script) + with act.connect_server() as srv: + ############################## + ### reduce SWEEEP interval ### + ############################## + srv.database.set_sweep_interval(database = act.db.db_path, interval = SWEEP_GAP) + srv.database.set_write_mode(database=act.db.db_path, mode=DbWriteMode.ASYNC) + + with open(tmp_log,'w') as f_log: + p_work_sql = subprocess.Popen([act.vars['isql'], '-q', '-i', str(tmp_sql)], stdout = f_log, stderr = subprocess.STDOUT) + + chk_mon_sql = """ + select 1 + from mon$attachments a + join mon$statements s + using (mon$attachment_id) + where + a.mon$attachment_id <> current_connection + and cast(s.mon$sql_text as varchar(8192)) containing '/* A */' + """ + + found_in_mon_tables = False + with act.db.connect() as con_watcher: + + custom_tpb = tpb(isolation = Isolation.SNAPSHOT, lock_timeout = -1) + tx_watcher = con_watcher.transaction_manager(custom_tpb) + cur_watcher = tx_watcher.cursor() + + ps = cur_watcher.prepare(chk_mon_sql) + + i = 0 + da = dt.now() + while True: + cur_watcher.execute(ps) + mon_result = -1 + for r in cur_watcher: + mon_result = r[0] + + tx_watcher.commit() + db = dt.now() + diff_ms = (db-da).seconds*1000 + (db-da).microseconds//1000 + if mon_result == 1: + found_in_mon_tables = True + break + elif diff_ms > MAX_WAIT_FOR_ISQL_PID_APPEARS_MS: + break + + time.sleep(0.1) + + ps.free() + + assert found_in_mon_tables, f'Could not find attachment in mon$ tables for {MAX_WAIT_FOR_ISQL_PID_APPEARS_MS} ms.' + + try: + ############################################## + ### f u l l s h u t d o w n D B ### + ############################################## + srv.database.shutdown(database=act.db.db_path, mode=ShutdownMode.FULL, + method=ShutdownMethod.FORCED, timeout=0) + finally: + p_work_sql.terminate() + # < with open(tmp_log,'w') as f_log + + srv.database.bring_online(database=act.db.db_path) + + trace_options = \ + [ + 'time_threshold = 0' + ,'log_initfini = false' + ,'log_connections = true' + ,'log_transactions = true' + ,'log_errors = true' + ,'log_sweep = true' + ] + + with act.trace(db_events = trace_options, encoding='utf8', encoding_errors='utf8'): + with act.db.connect() as con_for_sweep_start: + time.sleep(2) + + + for line in act.trace_log: + if WATCH_FOR_PTN.search(line): + print(WATCH_FOR_PTN.search(line).group()) + + act.expected_stdout = """ + (ATT_N, , NONE, ) + (ATT_N, , NONE, ) + """ + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout From f537764866efefdf94d529b0219a0055b7234b8e Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Thu, 7 Nov 2024 16:15:14 +0300 Subject: [PATCH 123/128] Added/Updated tests\bugs\core_2668_test.py: reverted wrong changes --- tests/bugs/core_2668_test.py | 258 +++++++++-------------------------- 1 file changed, 68 insertions(+), 190 deletions(-) diff --git a/tests/bugs/core_2668_test.py b/tests/bugs/core_2668_test.py index a812742e..e98a8921 100644 --- a/tests/bugs/core_2668_test.py +++ b/tests/bugs/core_2668_test.py @@ -5,214 +5,92 @@ ID: issue-3072 ISSUE: 3072 TITLE: Write note into log when automatic sweep is started DESCRIPTION: - Test changes sweep interval to some low value (see SWEEP_GAP) and runs TX_COUNT transactions which - lead difference between OST and OIT to exceed given sweep interval. These transactions are performed - by ISQL which is launched as child process. SQL script uses table with record that is locked at the - beginning of script and execute block with loop of TX_COUNT statements which insert new records. - After this loop finish, we make ISQL to hang by forcing it to update first record (see LOCKED_ROW). - Then we change DB state to full shutdown and wait until ISQL will be terminated. - At this point database has sweep gap that is enough to run auto sweep at first connection to DB. - Finally, we bring DB online and start trace with log_sweep = true and log_transactions = true. - Doing connection and wait about 2..3 seconds cause auto sweep to be started and completed. - This must be reflected in the trace. - - If ServerMode = 'Super' and ParallelWorkers >= 2 and MaxParallelWorkers >= ParallelWorkers - then trace log will contain folloing five lines related to worker(s) activity: - (...) START_TRANSACTION - (ATT_..., , NONE, ) --------------------- [ 1 ] - (TRA_..., READ_COMMITTED | REC_VERSION | WAIT | READ_ONLY) - (...) COMMIT_TRANSACTION - (ATT_..., , NONE, ) --------------------- [ 2 ] - - This is the only difference that can be observed for snapshots before and after fix - (i.e. BEFORE fix trace had no such lines but all other data about sweep *did* present). - Test checks that trace log contains TWO lines with '', see above [ 1 ] and [ 2 ]. - JIRA: CORE-2668 FBTEST: bugs.core_2668 -NOTES: - [07.11.2024] pzotov - Confirmed absense of lines marked as ',\s+NONE,\s+\)', re.IGNORECASE) -################ +act = python_act('db') -tmp_sql = temp_file('tmp_2668.sql') -tmp_log = temp_file('tmp_2668.log') +test_script = """ +recreate table test(s varchar(36) unique); +insert into test(s) values('LOCKED_FOR_PAUSE'); +commit; + +set transaction read committed WAIT; + +update test set s = s where s = 'LOCKED_FOR_PAUSE'; + +set term ^; +execute block as + declare n int = 150; + declare v_role varchar(31); +begin + while (n > 0) do + in autonomous transaction do + insert into test(s) values( rpad('', 36, uuid_to_char(gen_uuid()) ) ) + returning :n-1 into n; + + v_role = left(replace( uuid_to_char(gen_uuid()), '-', ''), 31); + + begin + execute statement ('update test set s = s where s = ?') ('LOCKED_FOR_PAUSE') + on external + 'localhost:' || rdb$get_context('SYSTEM', 'DB_NAME') + as user 'SYSDBA' password 'masterkey' role v_role + with autonomous transaction; + when any do + begin + end + end + +end +^ +set term ;^ +set heading off; +select '-- shutdown me now --' from rdb$database; +""" + +tmp_script = temp_file('work_script.sql') @pytest.mark.es_eds -@pytest.mark.version('>=5.0.0') -def test_1(act: Action, tmp_sql: Path, tmp_log: Path, capsys): - - if act.vars['server-arch'] != 'SuperServer': - pytest.skip("Applies only to SuperServer") - - with act.db.connect() as con: - cur = con.cursor() - sql = """ - select - cast(max(iif(g.rdb$config_name = 'ParallelWorkers', g.rdb$config_value, null)) as int) as cfg_par_workers - ,cast(max(iif(g.rdb$config_name = 'MaxParallelWorkers', g.rdb$config_value, null)) as int) as cfg_max_par_workers - from rdb$database - left join rdb$config g on g.rdb$config_name in ('ParallelWorkers', 'MaxParallelWorkers') - """ - cur.execute(sql) - cfg_par_workers, cfg_max_par_workers = cur.fetchone() - - assert cfg_par_workers >=2 and cfg_max_par_workers >= cfg_par_workers, "Server must be configured for parallel work. Check values of ParallelWorkers and MaxParallelWorkers" - - test_script = f""" - set echo on; - set bail on; - connect '{act.db.dsn}' user {act.db.user} password '{act.db.password}'; - - recreate table test(id int primary key); - insert into test(id) values({LOCKED_ROW}); - commit; - - set transaction read committed WAIT; - - update test set id = id where id = {LOCKED_ROW}; - set term ^; - execute block as - declare n int = {TX_COUNT}; - declare v_role varchar(31); - begin - while (n > 0) do - in autonomous transaction do - insert into test(id) values(:n) - returning :n-1 into n; - - v_role = left(replace( uuid_to_char(gen_uuid()), '-', ''), 31); - - begin - execute statement ('update test /* ' || ascii_char(65) || ' */ set id = id where id = ?') ({LOCKED_ROW}) - on external - 'localhost:' || rdb$get_context('SYSTEM', 'DB_NAME') - as user '{act.db.user}' password '{act.db.password}' role v_role - with autonomous transaction; - when any do - begin - end - end - - end - ^ - set term ;^ - set heading off; - select '-- shutdown me now --' from rdb$database; - """ - - tmp_sql.write_text(test_script) +@pytest.mark.version('>=3') +def test_1(act: Action, tmp_script: Path): + tmp_script.write_text(test_script) with act.connect_server() as srv: - ############################## - ### reduce SWEEEP interval ### - ############################## - srv.database.set_sweep_interval(database = act.db.db_path, interval = SWEEP_GAP) + srv.database.set_sweep_interval(database=act.db.db_path, interval=100) srv.database.set_write_mode(database=act.db.db_path, mode=DbWriteMode.ASYNC) - - with open(tmp_log,'w') as f_log: - p_work_sql = subprocess.Popen([act.vars['isql'], '-q', '-i', str(tmp_sql)], stdout = f_log, stderr = subprocess.STDOUT) - - chk_mon_sql = """ - select 1 - from mon$attachments a - join mon$statements s - using (mon$attachment_id) - where - a.mon$attachment_id <> current_connection - and cast(s.mon$sql_text as varchar(8192)) containing '/* A */' - """ - - found_in_mon_tables = False - with act.db.connect() as con_watcher: - - custom_tpb = tpb(isolation = Isolation.SNAPSHOT, lock_timeout = -1) - tx_watcher = con_watcher.transaction_manager(custom_tpb) - cur_watcher = tx_watcher.cursor() - - ps = cur_watcher.prepare(chk_mon_sql) - - i = 0 - da = dt.now() - while True: - cur_watcher.execute(ps) - mon_result = -1 - for r in cur_watcher: - mon_result = r[0] - - tx_watcher.commit() - db = dt.now() - diff_ms = (db-da).seconds*1000 + (db-da).microseconds//1000 - if mon_result == 1: - found_in_mon_tables = True - break - elif diff_ms > MAX_WAIT_FOR_ISQL_PID_APPEARS_MS: - break - - time.sleep(0.1) - - ps.free() - - assert found_in_mon_tables, f'Could not find attachment in mon$ tables for {MAX_WAIT_FOR_ISQL_PID_APPEARS_MS} ms.' - - try: - ############################################## - ### f u l l s h u t d o w n D B ### - ############################################## - srv.database.shutdown(database=act.db.db_path, mode=ShutdownMode.FULL, - method=ShutdownMethod.FORCED, timeout=0) - finally: - p_work_sql.terminate() - # < with open(tmp_log,'w') as f_log - + p_work_sql = subprocess.Popen([act.vars['isql'], '-i', str(tmp_script), + '-user', act.db.user, + '-password', act.db.password, act.db.dsn], + stderr = subprocess.STDOUT) + time.sleep(3) + try: + srv.database.shutdown(database=act.db.db_path, mode=ShutdownMode.FULL, + method=ShutdownMethod.FORCED, timeout=0) + finally: + p_work_sql.terminate() srv.database.bring_online(database=act.db.db_path) - - trace_options = \ - [ - 'time_threshold = 0' - ,'log_initfini = false' - ,'log_connections = true' - ,'log_transactions = true' - ,'log_errors = true' - ,'log_sweep = true' - ] - - with act.trace(db_events = trace_options, encoding='utf8', encoding_errors='utf8'): + srv.info.get_log() + fblog_before = srv.readlines() with act.db.connect() as con_for_sweep_start: + con_for_sweep_start.begin() time.sleep(2) - - - for line in act.trace_log: - if WATCH_FOR_PTN.search(line): - print(WATCH_FOR_PTN.search(line).group()) - - act.expected_stdout = """ - (ATT_N, , NONE, ) - (ATT_N, , NONE, ) - """ - act.stdout = capsys.readouterr().out - assert act.clean_stdout == act.clean_expected_stdout + srv.info.get_log() + fblog_after = srv.readlines() + pattern = re.compile('Sweep\\s+.*SWEEPER', re.IGNORECASE) + success = False + for line in unified_diff(fblog_before, fblog_after): + if line.startswith('+') and pattern.search(line): + success = True + assert success From 27486062b94eb964f2c67200673a011f11ee0df4 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Fri, 8 Nov 2024 10:19:22 +0300 Subject: [PATCH 124/128] Added/Updated tests\bugs\core_5381_test.py: Reimplemented - see notes. Checked on 3.0.13.33794, 4.0.6.3165, 5.0.2.1553, 6.0.0.520 --- tests/bugs/core_5381_test.py | 2055 ++++++++++++++++++++++++++++++++-- 1 file changed, 1985 insertions(+), 70 deletions(-) diff --git a/tests/bugs/core_5381_test.py b/tests/bugs/core_5381_test.py index 0577b6d5..f085b286 100644 --- a/tests/bugs/core_5381_test.py +++ b/tests/bugs/core_5381_test.py @@ -2,104 +2,2019 @@ """ ID: issue-5654 -ISSUE: 5654 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/5654 TITLE: Regression: could not execute query (select from view with nested view) DESCRIPTION: + Test uses queries from ticket but creates user tables instead of rdb$ ones. + We ask FB to show explained plan for query. + Before fix this caused to '335544382 : request size limit exceeded' JIRA: CORE-5381 FBTEST: bugs.core_5381 +NOTES: + [08.11.2024] pzotov + + Re-implemented. No sense to check execution time. Only explained plan must be verified. + + Confirmed bug on 3.0.1.32609 (27-sep-2016), got in trace: + 2024-11-08T00:42:49.8710 ERROR AT JStatement::prepare + 335544382 : request size limit exceeded + + 2024-11-08T00:42:49.8710 FAILED EXECUTE_STATEMENT_FINISH + ... + 0 records fetched + 135383 ms + + Checked 3.0.2.32659 (06-jan-2017), got: + 2024-11-08T00:39:40.0380 EXECUTE_STATEMENT_FINISH + 0 records fetched + 2 ms, 11 read(s), 3763 fetch(es) + ... + Table statistics same for 3.x ... 6.x. + + Checked on 3.0.13.33794, 4.0.6.3165, 5.0.2.1553, 6.0.0.520 """ import pytest from firebird.qa import * +from firebird.driver import DatabaseError -db = db_factory() +init_sql = """ + create or alter procedure sp_test as begin end; + recreate view test_view as select 1 x from rdb$database; + recreate view inner_view as select 1 x from rdb$database; -test_script = """ - create table t1(ID bigint not null primary key); - create table t2(ID bigint not null primary key); - create table t3(ID bigint not null primary key); - create table t4(ID bigint not null primary key); - create table t5(ID bigint not null primary key); - create table t6(ID bigint not null primary key); - create table t7(ID bigint not null primary key); - create table t8(ID bigint not null primary key); + recreate table rdb_types( + id int generated by default as identity constraint pk_rdb_types primary key + ,type_id int + ); - create view inner_view(ID) + recreate table rdb_rels( + id int generated by default as identity constraint pk_rdb_rels primary key + ,rel_id int + ); + + recreate table rdb_deps( + id int generated by default as identity constraint pk_rdb_deps primary key + ,dep_type int + ); + + recreate table rdb_colls( + id int generated by default as identity constraint pk_rdb_colls primary key + ,coll_id int + ); + + recreate table rdb_flds( + id int generated by default as identity constraint pk_rdb_flds primary key + ,fld_type_id int + ); + + recreate table rdb_csets( + id int generated by default as identity constraint pk_rdb_csets primary key + ,cset_id int + ); + + + recreate table t1(id bigint not null primary key using index pk_t1_id); + recreate table t2(id bigint not null primary key using index pk_t2_id); + recreate table t3(id bigint not null primary key using index pk_t3_id); + recreate table t4(id bigint not null primary key using index pk_t4_id); + recreate table t5(id bigint not null primary key using index pk_t5_id); + recreate table t6(id bigint not null primary key using index pk_t6_id); + recreate table t7(id bigint not null primary key using index pk_t7_id); + recreate table t8(id bigint not null primary key using index pk_t8_id); + + recreate view inner_view as - select t1.ID - from t1 - inner join t8 B on B.ID = t1.ID - inner join t2 C on C.ID = t1.ID - left join t4 D on D.ID = t1.ID - inner join t5 E on E.ID = t1.ID - left join t6 F on F.ID = t1.ID + select t1.id + from t1 + inner join t8 b on b.id = t1.id + inner join t2 c on c.id = t1.id + left join t4 d on d.id = t1.id + inner join t5 e on e.id = t1.id + left join t6 f on f.id = t1.id - inner join RDB$TYPES G1 on G1.rdb$type = t1.ID - inner join RDB$RELATIONS G2 on G2.rdb$relation_id = t1.ID - inner join RDB$DEPENDENCIES G3 on G3.rdb$dependent_type = t1.ID - inner join RDB$COLLATIONS G4 on G4.rdb$collation_id = t1.ID - inner join RDB$FIELDS G5 on G5.rdb$field_type = t1.ID - inner join RDB$CHARACTER_SETS G6 on G6.rdb$character_set_id = t1.ID + inner join rdb_types g1 on g1.type_id = t1.id + inner join rdb_rels g2 on g2.rel_id = t1.id + inner join rdb_deps g3 on g3.dep_type = t1.id + inner join rdb_colls g4 on g4.coll_id = t1.id + inner join rdb_flds g5 on g5.fld_type_id = t1.id + inner join rdb_csets g6 on g6.cset_id = t1.id ; - create view test_view(ID) + recreate view test_view as - select t1.ID - from t1 - inner join inner_view on inner_view.ID = t1.ID - inner join t7 on t7.ID = t1.ID - left join t3 on t3.ID = t1.ID + select t1.id + from t1 + inner join inner_view on inner_view.id = t1.id + inner join t7 on t7.id = t1.id + left join t3 on t3.id = t1.id - inner join RDB$TYPES D1 on D1.rdb$type = t1.ID - inner join RDB$RELATIONS D2 on D2.rdb$relation_id = t1.ID - inner join RDB$DEPENDENCIES D3 on D3.rdb$dependent_type = t1.ID - inner join RDB$COLLATIONS D4 on D4.rdb$collation_id = t1.ID - inner join RDB$FIELDS D5 on D5.rdb$field_type = t1.ID + inner join rdb_types d1 on d1.type_id = t1.id + inner join rdb_rels d2 on d2.rel_id = t1.id + inner join rdb_deps d3 on d3.dep_type = t1.id + inner join rdb_colls d4 on d4.coll_id = t1.id + inner join rdb_flds d5 on d5.fld_type_id = t1.id ; - commit; - - set list on; set term ^; - execute block returns( result varchar(128) ) as - declare dts_beg timestamp; + create or alter procedure sp_test as declare c int; - declare elap_ms int; - declare max_allowed_ms int = 1000; - -- ##### - -- ^ - -- | - -- ########################### - -- ### T H R E S H O L D ### - -- ########################### begin - dts_beg ='now'; - - select A.ID - from test_view A - inner join RDB$TYPES D1 on D1.rdb$type = A.ID - inner join RDB$RELATIONS D2 on D2.rdb$relation_id = A.ID - inner join RDB$DEPENDENCIES D3 on D3.rdb$dependent_type = A.ID - where A.ID = 1 - into c; - elap_ms = datediff(millisecond from dts_beg to cast('now' as timestamp)); - result = iif(elap_ms <= max_allowed_ms, 'Acceptable.', 'TOO LONG: ' || elap_ms || ' ms - more than max allowed ' || max_allowed_ms || ' ms.' ); - suspend; + for execute statement + 'select a.id + from test_view a + inner join rdb_types d1 on d1.type_id = a.id + inner join rdb_rels d2 on d2.rel_id = a.id + inner join rdb_deps d3 on d3.dep_type = a.id + where a.id = 1' + into c + do begin + -- nop -- + end end ^ set term ;^ + commit; + insert into t1(id) values(1); + insert into t2(id) select id from t1; + insert into t3(id) select id from t1; + insert into t4(id) select id from t1; + insert into t5(id) select id from t1; + insert into t6(id) select id from t1; + insert into t7(id) select id from t1; + insert into t8(id) select id from t1; + + insert into rdb_csets (cset_id) values (0); + insert into rdb_csets (cset_id) values (1); + insert into rdb_csets (cset_id) values (2); + insert into rdb_csets (cset_id) values (3); + insert into rdb_csets (cset_id) values (4); + insert into rdb_csets (cset_id) values (5); + insert into rdb_csets (cset_id) values (6); + insert into rdb_csets (cset_id) values (10); + insert into rdb_csets (cset_id) values (11); + insert into rdb_csets (cset_id) values (12); + insert into rdb_csets (cset_id) values (21); + insert into rdb_csets (cset_id) values (22); + insert into rdb_csets (cset_id) values (23); + insert into rdb_csets (cset_id) values (34); + insert into rdb_csets (cset_id) values (35); + insert into rdb_csets (cset_id) values (36); + insert into rdb_csets (cset_id) values (37); + insert into rdb_csets (cset_id) values (38); + insert into rdb_csets (cset_id) values (39); + insert into rdb_csets (cset_id) values (40); + insert into rdb_csets (cset_id) values (45); + insert into rdb_csets (cset_id) values (46); + insert into rdb_csets (cset_id) values (13); + insert into rdb_csets (cset_id) values (47); + insert into rdb_csets (cset_id) values (14); + insert into rdb_csets (cset_id) values (50); + insert into rdb_csets (cset_id) values (9); + insert into rdb_csets (cset_id) values (15); + insert into rdb_csets (cset_id) values (16); + insert into rdb_csets (cset_id) values (17); + insert into rdb_csets (cset_id) values (18); + insert into rdb_csets (cset_id) values (48); + insert into rdb_csets (cset_id) values (49); + insert into rdb_csets (cset_id) values (51); + insert into rdb_csets (cset_id) values (52); + insert into rdb_csets (cset_id) values (53); + insert into rdb_csets (cset_id) values (54); + insert into rdb_csets (cset_id) values (55); + insert into rdb_csets (cset_id) values (19); + insert into rdb_csets (cset_id) values (58); + insert into rdb_csets (cset_id) values (59); + insert into rdb_csets (cset_id) values (60); + insert into rdb_csets (cset_id) values (44); + insert into rdb_csets (cset_id) values (56); + insert into rdb_csets (cset_id) values (57); + insert into rdb_csets (cset_id) values (63); + insert into rdb_csets (cset_id) values (64); + insert into rdb_csets (cset_id) values (65); + insert into rdb_csets (cset_id) values (66); + insert into rdb_csets (cset_id) values (67); + insert into rdb_csets (cset_id) values (68); + insert into rdb_csets (cset_id) values (69); + + + insert into rdb_rels(rel_id) select row_number()over()-1 from rdb$types rows 50; + + -- insert into rdb_flds (fld_type_id) values (1); + + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (261); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (261); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (261); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (261); + insert into rdb_flds (fld_type_id) values (261); + insert into rdb_flds (fld_type_id) values (261); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (261); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (261); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (261); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (261); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (35); + insert into rdb_flds (fld_type_id) values (261); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (261); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (27); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (261); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (261); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (261); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (261); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (23); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (261); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (35); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (35); + insert into rdb_flds (fld_type_id) values (35); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (35); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (35); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (35); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (35); + insert into rdb_flds (fld_type_id) values (35); + insert into rdb_flds (fld_type_id) values (35); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (35); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (261); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (35); + insert into rdb_flds (fld_type_id) values (35); + insert into rdb_flds (fld_type_id) values (35); + insert into rdb_flds (fld_type_id) values (35); + insert into rdb_flds (fld_type_id) values (35); + insert into rdb_flds (fld_type_id) values (35); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (35); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (35); + insert into rdb_flds (fld_type_id) values (35); + insert into rdb_flds (fld_type_id) values (35); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (7); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (14); + insert into rdb_flds (fld_type_id) values (8); + insert into rdb_flds (fld_type_id) values (16); + insert into rdb_flds (fld_type_id) values (37); + insert into rdb_flds (fld_type_id) values (37); + + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (2); + insert into rdb_colls (coll_id) values (3); + insert into rdb_colls (coll_id) values (4); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (2); + insert into rdb_colls (coll_id) values (3); + insert into rdb_colls (coll_id) values (4); + insert into rdb_colls (coll_id) values (5); + insert into rdb_colls (coll_id) values (6); + insert into rdb_colls (coll_id) values (7); + insert into rdb_colls (coll_id) values (8); + insert into rdb_colls (coll_id) values (9); + insert into rdb_colls (coll_id) values (10); + insert into rdb_colls (coll_id) values (11); + insert into rdb_colls (coll_id) values (12); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (2); + insert into rdb_colls (coll_id) values (3); + insert into rdb_colls (coll_id) values (4); + insert into rdb_colls (coll_id) values (5); + insert into rdb_colls (coll_id) values (6); + insert into rdb_colls (coll_id) values (7); + insert into rdb_colls (coll_id) values (8); + insert into rdb_colls (coll_id) values (9); + insert into rdb_colls (coll_id) values (10); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (2); + insert into rdb_colls (coll_id) values (3); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (2); + insert into rdb_colls (coll_id) values (3); + insert into rdb_colls (coll_id) values (4); + insert into rdb_colls (coll_id) values (5); + insert into rdb_colls (coll_id) values (6); + insert into rdb_colls (coll_id) values (7); + insert into rdb_colls (coll_id) values (8); + insert into rdb_colls (coll_id) values (9); + insert into rdb_colls (coll_id) values (10); + insert into rdb_colls (coll_id) values (11); + insert into rdb_colls (coll_id) values (12); + insert into rdb_colls (coll_id) values (14); + insert into rdb_colls (coll_id) values (15); + insert into rdb_colls (coll_id) values (16); + insert into rdb_colls (coll_id) values (17); + insert into rdb_colls (coll_id) values (18); + insert into rdb_colls (coll_id) values (19); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (2); + insert into rdb_colls (coll_id) values (3); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (2); + insert into rdb_colls (coll_id) values (4); + insert into rdb_colls (coll_id) values (5); + insert into rdb_colls (coll_id) values (6); + insert into rdb_colls (coll_id) values (7); + insert into rdb_colls (coll_id) values (8); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (2); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (2); + insert into rdb_colls (coll_id) values (3); + insert into rdb_colls (coll_id) values (4); + insert into rdb_colls (coll_id) values (5); + insert into rdb_colls (coll_id) values (6); + insert into rdb_colls (coll_id) values (7); + insert into rdb_colls (coll_id) values (8); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (2); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (2); + insert into rdb_colls (coll_id) values (3); + insert into rdb_colls (coll_id) values (4); + insert into rdb_colls (coll_id) values (5); + insert into rdb_colls (coll_id) values (6); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (2); + insert into rdb_colls (coll_id) values (3); + insert into rdb_colls (coll_id) values (4); + insert into rdb_colls (coll_id) values (5); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (2); + insert into rdb_colls (coll_id) values (3); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + insert into rdb_colls (coll_id) values (0); + insert into rdb_colls (coll_id) values (1); + + + insert into rdb_deps (dep_type) values (4); + insert into rdb_deps (dep_type) values (4); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (2); + insert into rdb_deps (dep_type) values (15); + insert into rdb_deps (dep_type) values (15); + insert into rdb_deps (dep_type) values (15); + insert into rdb_deps (dep_type) values (15); + insert into rdb_deps (dep_type) values (15); + insert into rdb_deps (dep_type) values (15); + insert into rdb_deps (dep_type) values (15); + insert into rdb_deps (dep_type) values (15); + insert into rdb_deps (dep_type) values (15); + insert into rdb_deps (dep_type) values (15); + insert into rdb_deps (dep_type) values (15); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (1); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (3); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + insert into rdb_deps (dep_type) values (5); + + insert into rdb_types (type_id) values (14); + insert into rdb_types (type_id) values (7); + insert into rdb_types (type_id) values (8); + insert into rdb_types (type_id) values (9); + insert into rdb_types (type_id) values (10); + insert into rdb_types (type_id) values (27); + insert into rdb_types (type_id) values (35); + insert into rdb_types (type_id) values (37); + insert into rdb_types (type_id) values (261); + insert into rdb_types (type_id) values (40); + insert into rdb_types (type_id) values (45); + insert into rdb_types (type_id) values (12); + insert into rdb_types (type_id) values (13); + insert into rdb_types (type_id) values (16); + insert into rdb_types (type_id) values (23); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (2); + insert into rdb_types (type_id) values (3); + insert into rdb_types (type_id) values (4); + insert into rdb_types (type_id) values (5); + insert into rdb_types (type_id) values (6); + insert into rdb_types (type_id) values (7); + insert into rdb_types (type_id) values (8); + insert into rdb_types (type_id) values (9); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (2); + insert into rdb_types (type_id) values (3); + insert into rdb_types (type_id) values (4); + insert into rdb_types (type_id) values (5); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (2); + insert into rdb_types (type_id) values (3); + insert into rdb_types (type_id) values (4); + insert into rdb_types (type_id) values (5); + insert into rdb_types (type_id) values (6); + insert into rdb_types (type_id) values (8192); + insert into rdb_types (type_id) values (8193); + insert into rdb_types (type_id) values (8194); + insert into rdb_types (type_id) values (8195); + insert into rdb_types (type_id) values (8196); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (2); + insert into rdb_types (type_id) values (3); + insert into rdb_types (type_id) values (4); + insert into rdb_types (type_id) values (5); + insert into rdb_types (type_id) values (6); + insert into rdb_types (type_id) values (7); + insert into rdb_types (type_id) values (8); + insert into rdb_types (type_id) values (9); + insert into rdb_types (type_id) values (10); + insert into rdb_types (type_id) values (11); + insert into rdb_types (type_id) values (12); + insert into rdb_types (type_id) values (13); + insert into rdb_types (type_id) values (14); + insert into rdb_types (type_id) values (15); + insert into rdb_types (type_id) values (16); + insert into rdb_types (type_id) values (17); + insert into rdb_types (type_id) values (18); + insert into rdb_types (type_id) values (19); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (2); + insert into rdb_types (type_id) values (3); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (2); + insert into rdb_types (type_id) values (3); + insert into rdb_types (type_id) values (4); + insert into rdb_types (type_id) values (5); + insert into rdb_types (type_id) values (6); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (2); + insert into rdb_types (type_id) values (3); + insert into rdb_types (type_id) values (4); + insert into rdb_types (type_id) values (5); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (2); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (2); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (2); + insert into rdb_types (type_id) values (3); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (2); + insert into rdb_types (type_id) values (3); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (2); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (2); + insert into rdb_types (type_id) values (3); + insert into rdb_types (type_id) values (4); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (2); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (2); + insert into rdb_types (type_id) values (3); + insert into rdb_types (type_id) values (4); + insert into rdb_types (type_id) values (5); + insert into rdb_types (type_id) values (6); + insert into rdb_types (type_id) values (7); + insert into rdb_types (type_id) values (8); + insert into rdb_types (type_id) values (9); + insert into rdb_types (type_id) values (10); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (0); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (2); + insert into rdb_types (type_id) values (3); + insert into rdb_types (type_id) values (4); + insert into rdb_types (type_id) values (5); + insert into rdb_types (type_id) values (6); + insert into rdb_types (type_id) values (10); + insert into rdb_types (type_id) values (11); + insert into rdb_types (type_id) values (12); + insert into rdb_types (type_id) values (21); + insert into rdb_types (type_id) values (22); + insert into rdb_types (type_id) values (23); + insert into rdb_types (type_id) values (34); + insert into rdb_types (type_id) values (35); + insert into rdb_types (type_id) values (36); + insert into rdb_types (type_id) values (37); + insert into rdb_types (type_id) values (38); + insert into rdb_types (type_id) values (39); + insert into rdb_types (type_id) values (40); + insert into rdb_types (type_id) values (45); + insert into rdb_types (type_id) values (46); + insert into rdb_types (type_id) values (13); + insert into rdb_types (type_id) values (47); + insert into rdb_types (type_id) values (14); + insert into rdb_types (type_id) values (50); + insert into rdb_types (type_id) values (9); + insert into rdb_types (type_id) values (15); + insert into rdb_types (type_id) values (16); + insert into rdb_types (type_id) values (17); + insert into rdb_types (type_id) values (18); + insert into rdb_types (type_id) values (48); + insert into rdb_types (type_id) values (49); + insert into rdb_types (type_id) values (51); + insert into rdb_types (type_id) values (52); + insert into rdb_types (type_id) values (53); + insert into rdb_types (type_id) values (54); + insert into rdb_types (type_id) values (55); + insert into rdb_types (type_id) values (19); + insert into rdb_types (type_id) values (58); + insert into rdb_types (type_id) values (59); + insert into rdb_types (type_id) values (60); + insert into rdb_types (type_id) values (44); + insert into rdb_types (type_id) values (56); + insert into rdb_types (type_id) values (57); + insert into rdb_types (type_id) values (63); + insert into rdb_types (type_id) values (64); + insert into rdb_types (type_id) values (65); + insert into rdb_types (type_id) values (66); + insert into rdb_types (type_id) values (67); + insert into rdb_types (type_id) values (68); + insert into rdb_types (type_id) values (69); + insert into rdb_types (type_id) values (1); + insert into rdb_types (type_id) values (2); + insert into rdb_types (type_id) values (2); + insert into rdb_types (type_id) values (3); + insert into rdb_types (type_id) values (3); + insert into rdb_types (type_id) values (4); + insert into rdb_types (type_id) values (5); + insert into rdb_types (type_id) values (6); + insert into rdb_types (type_id) values (10); + insert into rdb_types (type_id) values (11); + insert into rdb_types (type_id) values (12); + insert into rdb_types (type_id) values (21); + insert into rdb_types (type_id) values (21); + insert into rdb_types (type_id) values (21); + insert into rdb_types (type_id) values (22); + insert into rdb_types (type_id) values (22); + insert into rdb_types (type_id) values (22); + insert into rdb_types (type_id) values (23); + insert into rdb_types (type_id) values (23); + insert into rdb_types (type_id) values (23); + insert into rdb_types (type_id) values (34); + insert into rdb_types (type_id) values (34); + insert into rdb_types (type_id) values (34); + insert into rdb_types (type_id) values (35); + insert into rdb_types (type_id) values (35); + insert into rdb_types (type_id) values (36); + insert into rdb_types (type_id) values (36); + insert into rdb_types (type_id) values (37); + insert into rdb_types (type_id) values (37); + insert into rdb_types (type_id) values (38); + insert into rdb_types (type_id) values (38); + insert into rdb_types (type_id) values (39); + insert into rdb_types (type_id) values (39); + insert into rdb_types (type_id) values (39); + insert into rdb_types (type_id) values (40); + insert into rdb_types (type_id) values (40); + insert into rdb_types (type_id) values (40); + insert into rdb_types (type_id) values (45); + insert into rdb_types (type_id) values (46); + insert into rdb_types (type_id) values (13); + insert into rdb_types (type_id) values (47); + insert into rdb_types (type_id) values (14); + insert into rdb_types (type_id) values (9); + insert into rdb_types (type_id) values (15); + insert into rdb_types (type_id) values (16); + insert into rdb_types (type_id) values (17); + insert into rdb_types (type_id) values (18); + insert into rdb_types (type_id) values (48); + insert into rdb_types (type_id) values (49); + insert into rdb_types (type_id) values (51); + insert into rdb_types (type_id) values (52); + insert into rdb_types (type_id) values (53); + insert into rdb_types (type_id) values (54); + insert into rdb_types (type_id) values (55); + insert into rdb_types (type_id) values (58); + insert into rdb_types (type_id) values (59); + insert into rdb_types (type_id) values (60); + insert into rdb_types (type_id) values (65); + insert into rdb_types (type_id) values (44); + insert into rdb_types (type_id) values (44); + insert into rdb_types (type_id) values (44); + insert into rdb_types (type_id) values (56); + insert into rdb_types (type_id) values (56); + commit; + + set term ^; + execute block as + begin + for + select trim(ri.rdb$index_name) as idx_name + from rdb$indices ri + where ri.rdb$system_flag is distinct from 1 + as cursor c + do begin + execute statement 'set statistics index ' || c.idx_name ; + end + end + ^ + set term ;^ + commit; """ +db = db_factory(init = init_sql) -act = isql_act('db', test_script) +act = python_act('db') -expected_stdout = """ - RESULT Acceptable. -""" +#----------------------------------------------------------- -@pytest.mark.version('>=3.0.2') -def test_1(act: Action): - act.expected_stdout = expected_stdout - act.execute() +def replace_leading(source, char="."): + stripped = source.lstrip() + return char * (len(source) - len(stripped)) + stripped + +#----------------------------------------------------------- + +@pytest.mark.version('>=3.0.1') +def test_1(act: Action, capsys): + + test_sql = """ + select count(*) + from test_view a + inner join rdb_types d1 on d1.type_id = a.id + inner join rdb_rels d2 on d2.rel_id = a.id + inner join rdb_deps d3 on d3.dep_type = a.id + where a.id = 1 + ; + """ + + with act.db.connect() as con: + cur = con.cursor() + ps = None + try: + ps = cur.prepare(test_sql) + + # Print explained plan with padding eash line by dots in order to see indentations: + print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) ) + print('') + except DatabaseError as e: + print(e.__str__()) + print(e.gds_codes) + finally: + if ps: + ps.free() + + + expected_stdout_3x = """ + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Hash Join (inner) + ................-> Filter + ....................-> Table "RDB_FLDS" as "A D5" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Filter + ........................-> Table "RDB_DEPS" as "D3" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Filter + ........................-> Table "RDB_DEPS" as "A D3" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Filter + ........................-> Table "RDB_TYPES" as "D1" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Filter + ........................-> Table "RDB_TYPES" as "A D1" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Filter + ........................-> Table "RDB_COLLS" as "A D4" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Filter + ........................-> Table "RDB_RELS" as "D2" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Filter + ........................-> Table "RDB_RELS" as "A D2" Full Scan + ................-> Record Buffer (record length: 359) + ....................-> Filter + ........................-> Nested Loop Join (outer) + ............................-> Filter + ................................-> Hash Join (inner) + ....................................-> Filter + ........................................-> Table "RDB_FLDS" as "A INNER_VIEW G5" Full Scan + ....................................-> Record Buffer (record length: 25) + ........................................-> Filter + ............................................-> Table "RDB_DEPS" as "A INNER_VIEW G3" Full Scan + ....................................-> Record Buffer (record length: 25) + ........................................-> Filter + ............................................-> Table "RDB_TYPES" as "A INNER_VIEW G1" Full Scan + ....................................-> Record Buffer (record length: 25) + ........................................-> Filter + ............................................-> Table "RDB_COLLS" as "A INNER_VIEW G4" Full Scan + ....................................-> Record Buffer (record length: 25) + ........................................-> Filter + ............................................-> Table "RDB_CSETS" as "A INNER_VIEW G6" Full Scan + ....................................-> Record Buffer (record length: 25) + ........................................-> Filter + ............................................-> Table "RDB_RELS" as "A INNER_VIEW G2" Full Scan + ....................................-> Record Buffer (record length: 208) + ........................................-> Nested Loop Join (inner) + ............................................-> Nested Loop Join (outer) + ................................................-> Nested Loop Join (inner) + ....................................................-> Nested Loop Join (outer) + ........................................................-> Nested Loop Join (inner) + ............................................................-> Filter + ................................................................-> Table "T1" as "A INNER_VIEW T1" Access By ID + ....................................................................-> Bitmap + ........................................................................-> Index "PK_T1_ID" Unique Scan + ............................................................-> Filter + ................................................................-> Table "T8" as "A INNER_VIEW B" Access By ID + ....................................................................-> Bitmap + ........................................................................-> Index "PK_T8_ID" Unique Scan + ............................................................-> Filter + ................................................................-> Table "T2" as "A INNER_VIEW C" Access By ID + ....................................................................-> Bitmap + ........................................................................-> Index "PK_T2_ID" Unique Scan + ........................................................-> Filter + ............................................................-> Table "T4" as "A INNER_VIEW D" Access By ID + ................................................................-> Bitmap + ....................................................................-> Index "PK_T4_ID" Unique Scan + ....................................................-> Filter + ........................................................-> Table "T5" as "A INNER_VIEW E" Access By ID + ............................................................-> Bitmap + ................................................................-> Index "PK_T5_ID" Unique Scan + ................................................-> Filter + ....................................................-> Table "T6" as "A INNER_VIEW F" Access By ID + ........................................................-> Bitmap + ............................................................-> Index "PK_T6_ID" Unique Scan + ............................................-> Nested Loop Join (inner) + ................................................-> Filter + ....................................................-> Table "T1" as "A T1" Access By ID + ........................................................-> Bitmap + ............................................................-> Index "PK_T1_ID" Unique Scan + ................................................-> Filter + ....................................................-> Table "T7" as "A T7" Access By ID + ........................................................-> Bitmap + ............................................................-> Index "PK_T7_ID" Unique Scan + ............................-> Filter + ................................-> Table "T3" as "A T3" Access By ID + ....................................-> Bitmap + ........................................-> Index "PK_T3_ID" Unique Scan + """ + + expected_stdout_4x = """ + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Hash Join (inner) + ................-> Table "RDB_FLDS" as "A D5" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Table "RDB_DEPS" as "D3" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Table "RDB_DEPS" as "A D3" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Table "RDB_TYPES" as "D1" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Table "RDB_COLLS" as "A D4" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Table "RDB_TYPES" as "A D1" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Table "RDB_RELS" as "D2" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Table "RDB_RELS" as "A D2" Full Scan + ................-> Record Buffer (record length: 359) + ....................-> Filter + ........................-> Nested Loop Join (outer) + ............................-> Filter + ................................-> Hash Join (inner) + ....................................-> Table "RDB_FLDS" as "A INNER_VIEW G5" Full Scan + ....................................-> Record Buffer (record length: 25) + ........................................-> Table "RDB_DEPS" as "A INNER_VIEW G3" Full Scan + ....................................-> Record Buffer (record length: 25) + ........................................-> Table "RDB_COLLS" as "A INNER_VIEW G4" Full Scan + ....................................-> Record Buffer (record length: 25) + ........................................-> Table "RDB_TYPES" as "A INNER_VIEW G1" Full Scan + ....................................-> Record Buffer (record length: 25) + ........................................-> Table "RDB_CSETS" as "A INNER_VIEW G6" Full Scan + ....................................-> Record Buffer (record length: 25) + ........................................-> Table "RDB_RELS" as "A INNER_VIEW G2" Full Scan + ....................................-> Record Buffer (record length: 208) + ........................................-> Nested Loop Join (inner) + ............................................-> Nested Loop Join (outer) + ................................................-> Nested Loop Join (inner) + ....................................................-> Nested Loop Join (outer) + ........................................................-> Nested Loop Join (inner) + ............................................................-> Filter + ................................................................-> Table "T1" as "A INNER_VIEW T1" Access By ID + ....................................................................-> Bitmap + ........................................................................-> Index "PK_T1_ID" Unique Scan + ............................................................-> Filter + ................................................................-> Table "T8" as "A INNER_VIEW B" Access By ID + ....................................................................-> Bitmap + ........................................................................-> Index "PK_T8_ID" Unique Scan + ............................................................-> Filter + ................................................................-> Table "T2" as "A INNER_VIEW C" Access By ID + ....................................................................-> Bitmap + ........................................................................-> Index "PK_T2_ID" Unique Scan + ........................................................-> Filter + ............................................................-> Table "T4" as "A INNER_VIEW D" Access By ID + ................................................................-> Bitmap + ....................................................................-> Index "PK_T4_ID" Unique Scan + ....................................................-> Filter + ........................................................-> Table "T5" as "A INNER_VIEW E" Access By ID + ............................................................-> Bitmap + ................................................................-> Index "PK_T5_ID" Unique Scan + ................................................-> Filter + ....................................................-> Table "T6" as "A INNER_VIEW F" Access By ID + ........................................................-> Bitmap + ............................................................-> Index "PK_T6_ID" Unique Scan + ............................................-> Nested Loop Join (inner) + ................................................-> Filter + ....................................................-> Table "T1" as "A T1" Access By ID + ........................................................-> Bitmap + ............................................................-> Index "PK_T1_ID" Unique Scan + ................................................-> Filter + ....................................................-> Table "T7" as "A T7" Access By ID + ........................................................-> Bitmap + ............................................................-> Index "PK_T7_ID" Unique Scan + ............................-> Filter + ................................-> Table "T3" as "A T3" Access By ID + ....................................-> Bitmap + ........................................-> Index "PK_T3_ID" Unique Scan + """ + + expected_stdout_5x = """ + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Hash Join (inner) + ................-> Table "RDB_FLDS" as "A D5" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Table "RDB_RELS" as "A D2" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Table "RDB_RELS" as "D2" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Table "RDB_TYPES" as "A D1" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Table "RDB_COLLS" as "A D4" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Table "RDB_TYPES" as "D1" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Table "RDB_DEPS" as "A D3" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Table "RDB_DEPS" as "D3" Full Scan + ................-> Record Buffer (record length: 359) + ....................-> Filter + ........................-> Nested Loop Join (outer) + ............................-> Filter + ................................-> Hash Join (inner) + ....................................-> Table "RDB_FLDS" as "A INNER_VIEW G5" Full Scan + ....................................-> Record Buffer (record length: 25) + ........................................-> Table "RDB_RELS" as "A INNER_VIEW G2" Full Scan + ....................................-> Record Buffer (record length: 25) + ........................................-> Table "RDB_CSETS" as "A INNER_VIEW G6" Full Scan + ....................................-> Record Buffer (record length: 25) + ........................................-> Table "RDB_TYPES" as "A INNER_VIEW G1" Full Scan + ....................................-> Record Buffer (record length: 25) + ........................................-> Table "RDB_COLLS" as "A INNER_VIEW G4" Full Scan + ....................................-> Record Buffer (record length: 25) + ........................................-> Table "RDB_DEPS" as "A INNER_VIEW G3" Full Scan + ....................................-> Record Buffer (record length: 208) + ........................................-> Nested Loop Join (inner) + ............................................-> Nested Loop Join (outer) + ................................................-> Nested Loop Join (inner) + ....................................................-> Filter + ........................................................-> Nested Loop Join (outer) + ............................................................-> Nested Loop Join (inner) + ................................................................-> Filter + ....................................................................-> Table "T1" as "A INNER_VIEW T1" Access By ID + ........................................................................-> Bitmap + ............................................................................-> Index "PK_T1_ID" Unique Scan + ................................................................-> Filter + ....................................................................-> Table "T8" as "A INNER_VIEW B" Access By ID + ........................................................................-> Bitmap + ............................................................................-> Index "PK_T8_ID" Unique Scan + ................................................................-> Filter + ....................................................................-> Table "T2" as "A INNER_VIEW C" Access By ID + ........................................................................-> Bitmap + ............................................................................-> Index "PK_T2_ID" Unique Scan + ............................................................-> Filter + ................................................................-> Table "T4" as "A INNER_VIEW D" Access By ID + ....................................................................-> Bitmap + ........................................................................-> Index "PK_T4_ID" Unique Scan + ....................................................-> Filter + ........................................................-> Table "T5" as "A INNER_VIEW E" Access By ID + ............................................................-> Bitmap + ................................................................-> Index "PK_T5_ID" Unique Scan + ................................................-> Filter + ....................................................-> Table "T6" as "A INNER_VIEW F" Access By ID + ........................................................-> Bitmap + ............................................................-> Index "PK_T6_ID" Unique Scan + ............................................-> Nested Loop Join (inner) + ................................................-> Filter + ....................................................-> Table "T1" as "A T1" Access By ID + ........................................................-> Bitmap + ............................................................-> Index "PK_T1_ID" Unique Scan + ................................................-> Filter + ....................................................-> Table "T7" as "A T7" Access By ID + ........................................................-> Bitmap + ............................................................-> Index "PK_T7_ID" Unique Scan + ............................-> Filter + ................................-> Table "T3" as "A T3" Access By ID + ....................................-> Bitmap + ........................................-> Index "PK_T3_ID" Unique Scan + """ + + expected_stdout_6x = """ + Select Expression + ....-> Aggregate + ........-> Filter + ............-> Hash Join (inner) (keys: 1, total key length: 8) + ................-> Table "RDB_FLDS" as "A D5" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Table "RDB_RELS" as "A D2" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Table "RDB_RELS" as "D2" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Table "RDB_TYPES" as "A D1" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Table "RDB_COLLS" as "A D4" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Table "RDB_TYPES" as "D1" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Table "RDB_DEPS" as "A D3" Full Scan + ................-> Record Buffer (record length: 25) + ....................-> Table "RDB_DEPS" as "D3" Full Scan + ................-> Record Buffer (record length: 359) + ....................-> Filter + ........................-> Nested Loop Join (outer) + ............................-> Filter + ................................-> Hash Join (inner) (keys: 1, total key length: 8) + ....................................-> Table "RDB_FLDS" as "A INNER_VIEW G5" Full Scan + ....................................-> Record Buffer (record length: 25) + ........................................-> Table "RDB_RELS" as "A INNER_VIEW G2" Full Scan + ....................................-> Record Buffer (record length: 25) + ........................................-> Table "RDB_CSETS" as "A INNER_VIEW G6" Full Scan + ....................................-> Record Buffer (record length: 25) + ........................................-> Table "RDB_TYPES" as "A INNER_VIEW G1" Full Scan + ....................................-> Record Buffer (record length: 25) + ........................................-> Table "RDB_COLLS" as "A INNER_VIEW G4" Full Scan + ....................................-> Record Buffer (record length: 25) + ........................................-> Table "RDB_DEPS" as "A INNER_VIEW G3" Full Scan + ....................................-> Record Buffer (record length: 208) + ........................................-> Nested Loop Join (inner) + ............................................-> Nested Loop Join (outer) + ................................................-> Nested Loop Join (inner) + ....................................................-> Filter + ........................................................-> Nested Loop Join (outer) + ............................................................-> Nested Loop Join (inner) + ................................................................-> Filter + ....................................................................-> Table "T1" as "A INNER_VIEW T1" Access By ID + ........................................................................-> Bitmap + ............................................................................-> Index "PK_T1_ID" Unique Scan + ................................................................-> Filter + ....................................................................-> Table "T8" as "A INNER_VIEW B" Access By ID + ........................................................................-> Bitmap + ............................................................................-> Index "PK_T8_ID" Unique Scan + ................................................................-> Filter + ....................................................................-> Table "T2" as "A INNER_VIEW C" Access By ID + ........................................................................-> Bitmap + ............................................................................-> Index "PK_T2_ID" Unique Scan + ............................................................-> Filter + ................................................................-> Table "T4" as "A INNER_VIEW D" Access By ID + ....................................................................-> Bitmap + ........................................................................-> Index "PK_T4_ID" Unique Scan + ....................................................-> Filter + ........................................................-> Table "T5" as "A INNER_VIEW E" Access By ID + ............................................................-> Bitmap + ................................................................-> Index "PK_T5_ID" Unique Scan + ................................................-> Filter + ....................................................-> Table "T6" as "A INNER_VIEW F" Access By ID + ........................................................-> Bitmap + ............................................................-> Index "PK_T6_ID" Unique Scan + ............................................-> Nested Loop Join (inner) + ................................................-> Filter + ....................................................-> Table "T1" as "A T1" Access By ID + ........................................................-> Bitmap + ............................................................-> Index "PK_T1_ID" Unique Scan + ................................................-> Filter + ....................................................-> Table "T7" as "A T7" Access By ID + ........................................................-> Bitmap + ............................................................-> Index "PK_T7_ID" Unique Scan + ............................-> Filter + ................................-> Table "T3" as "A T3" Access By ID + ....................................-> Bitmap + ........................................-> Index "PK_T3_ID" Unique Scan + """ + + act.expected_stdout = expected_stdout_3x if act.is_version('<4') else expected_stdout_4x if act.is_version('<5') else expected_stdout_5x if act.is_version('<6') else expected_stdout_6x + + act.stdout = capsys.readouterr().out assert act.clean_stdout == act.clean_expected_stdout - From a8f00de4fb47daa11ed167faeb9046150b34da0a Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sat, 9 Nov 2024 15:49:01 +0300 Subject: [PATCH 125/128] Added/Updated tests\bugs\gh_5537_test.py: Checked on 3.0.13.33794, 4.0.6.3165, 5.0.2.1553, 6.0.0.520 --- tests/bugs/gh_5537_test.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 tests/bugs/gh_5537_test.py diff --git a/tests/bugs/gh_5537_test.py b/tests/bugs/gh_5537_test.py new file mode 100644 index 00000000..114b1ed9 --- /dev/null +++ b/tests/bugs/gh_5537_test.py @@ -0,0 +1,38 @@ +#coding:utf-8 + +""" +ID: issue-5537 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/5537 +TITLE: Non US-ASCII field names treated as unicode, although charset non-unicode, lowering max field length [CORE5258] +DESCRIPTION: +NOTES: + [09.11.2024] pzotov + FB-3.x must raise "Name longer than database column size", all others must work fine. + Checked on 3.0.13.33794, 4.0.6.3165, 5.0.2.1553, 6.0.0.520 +""" +from pathlib import Path +import pytest +from firebird.qa import * + +db = db_factory() +act = python_act('db', substitutions = [(r'After line \d+ .*', '')]) +tmp_file = temp_file('tmp_5537.sql') + +@pytest.mark.intl +@pytest.mark.version('>=3') +def test_1(act: Action, tmp_file: Path): + + NON_ASCII_TXT = 'Поле в 26 символов!' + tmp_file.write_bytes(f"""set list on; select '' as "{NON_ASCII_TXT}" from rdb$database;""".encode('cp1251')) + + expected_3x = """ + Statement failed, SQLSTATE = 42000 + Dynamic SQL Error + -SQL error code = -104 + -Name longer than database column size + """ + expected_4x = f"{NON_ASCII_TXT}" + + act.expected_stdout = expected_3x if act.is_version('<4') else expected_4x + act.isql(switches = ['-q'], input_file = tmp_file, charset = 'win1251', io_enc = 'cp1251', combine_output = True) + assert act.clean_stdout == act.clean_expected_stdout From a4e323c2123e8598d37644f1ab8f7b1fb942a90d Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sun, 10 Nov 2024 12:57:50 +0300 Subject: [PATCH 126/128] Added/Updated tests\bugs\core_5381_test.py: changed expected output for 4.x: adjusted INDENTATION. --- tests/bugs/core_5381_test.py | 42 ++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/tests/bugs/core_5381_test.py b/tests/bugs/core_5381_test.py index f085b286..d56058c6 100644 --- a/tests/bugs/core_5381_test.py +++ b/tests/bugs/core_5381_test.py @@ -1774,37 +1774,51 @@ def test_1(act: Action, capsys): ....-> Aggregate ........-> Filter ............-> Hash Join (inner) - ................-> Table "RDB_FLDS" as "A D5" Full Scan + ................-> Filter + ....................-> Table "RDB_FLDS" as "A D5" Full Scan ................-> Record Buffer (record length: 25) - ....................-> Table "RDB_DEPS" as "D3" Full Scan + ....................-> Filter + ........................-> Table "RDB_DEPS" as "D3" Full Scan ................-> Record Buffer (record length: 25) - ....................-> Table "RDB_DEPS" as "A D3" Full Scan + ....................-> Filter + ........................-> Table "RDB_DEPS" as "A D3" Full Scan ................-> Record Buffer (record length: 25) - ....................-> Table "RDB_TYPES" as "D1" Full Scan + ....................-> Filter + ........................-> Table "RDB_TYPES" as "D1" Full Scan ................-> Record Buffer (record length: 25) - ....................-> Table "RDB_COLLS" as "A D4" Full Scan + ....................-> Filter + ........................-> Table "RDB_COLLS" as "A D4" Full Scan ................-> Record Buffer (record length: 25) - ....................-> Table "RDB_TYPES" as "A D1" Full Scan + ....................-> Filter + ........................-> Table "RDB_TYPES" as "A D1" Full Scan ................-> Record Buffer (record length: 25) - ....................-> Table "RDB_RELS" as "D2" Full Scan + ....................-> Filter + ........................-> Table "RDB_RELS" as "D2" Full Scan ................-> Record Buffer (record length: 25) - ....................-> Table "RDB_RELS" as "A D2" Full Scan + ....................-> Filter + ........................-> Table "RDB_RELS" as "A D2" Full Scan ................-> Record Buffer (record length: 359) ....................-> Filter ........................-> Nested Loop Join (outer) ............................-> Filter ................................-> Hash Join (inner) - ....................................-> Table "RDB_FLDS" as "A INNER_VIEW G5" Full Scan + ....................................-> Filter + ........................................-> Table "RDB_FLDS" as "A INNER_VIEW G5" Full Scan ....................................-> Record Buffer (record length: 25) - ........................................-> Table "RDB_DEPS" as "A INNER_VIEW G3" Full Scan + ........................................-> Filter + ............................................-> Table "RDB_DEPS" as "A INNER_VIEW G3" Full Scan ....................................-> Record Buffer (record length: 25) - ........................................-> Table "RDB_COLLS" as "A INNER_VIEW G4" Full Scan + ........................................-> Filter + ............................................-> Table "RDB_COLLS" as "A INNER_VIEW G4" Full Scan ....................................-> Record Buffer (record length: 25) - ........................................-> Table "RDB_TYPES" as "A INNER_VIEW G1" Full Scan + ........................................-> Filter + ............................................-> Table "RDB_TYPES" as "A INNER_VIEW G1" Full Scan ....................................-> Record Buffer (record length: 25) - ........................................-> Table "RDB_CSETS" as "A INNER_VIEW G6" Full Scan + ........................................-> Filter + ............................................-> Table "RDB_CSETS" as "A INNER_VIEW G6" Full Scan ....................................-> Record Buffer (record length: 25) - ........................................-> Table "RDB_RELS" as "A INNER_VIEW G2" Full Scan + ........................................-> Filter + ............................................-> Table "RDB_RELS" as "A INNER_VIEW G2" Full Scan ....................................-> Record Buffer (record length: 208) ........................................-> Nested Loop Join (inner) ............................................-> Nested Loop Join (outer) From e4df62936a49c66c4d8b8549a5935691cd212db2 Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sun, 10 Nov 2024 15:37:21 +0300 Subject: [PATCH 127/128] Added/Updated tests\bugs\core_5381_test.py: Adjusted notes about changed FB 4.x --- tests/bugs/core_5381_test.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/tests/bugs/core_5381_test.py b/tests/bugs/core_5381_test.py index d56058c6..710dbc29 100644 --- a/tests/bugs/core_5381_test.py +++ b/tests/bugs/core_5381_test.py @@ -31,7 +31,24 @@ NOTES: ... Table statistics same for 3.x ... 6.x. - Checked on 3.0.13.33794, 4.0.6.3165, 5.0.2.1553, 6.0.0.520 + [10.11.2024] pzotov + Explained plan in FB 4.x changed since 4.0.6.3168: + Was: + -> Hash Join (inner) + -> Table "RDB_FLDS" as "A D5" Full Scan + -> Record Buffer (record length: 25) + -> Table "RDB_DEPS" as "D3" Full Scan + ... + Now: + -> Hash Join (inner) + -> Filter + -> Table "RDB_FLDS" as "A D5" Full Scan + -> Record Buffer (record length: 25) + -> Filter + -> Table "RDB_DEPS" as "D3" Full Scan + ... + + Checked on 3.0.13.33794, 4.0.6.3168, 5.0.2.1553, 6.0.0.520 """ import pytest From 6ed135d077f5521c161915b5e238bd0942af57bc Mon Sep 17 00:00:00 2001 From: pavel-zotov Date: Sun, 10 Nov 2024 16:02:38 +0300 Subject: [PATCH 128/128] Added/Updated tests\bugs\gh_8309_test.py: Checked on 6.0.0.523-8ca2314. --- tests/bugs/gh_8309_test.py | 90 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 tests/bugs/gh_8309_test.py diff --git a/tests/bugs/gh_8309_test.py b/tests/bugs/gh_8309_test.py new file mode 100644 index 00000000..ac456856 --- /dev/null +++ b/tests/bugs/gh_8309_test.py @@ -0,0 +1,90 @@ +#coding:utf-8 + +""" +ID: issue-8309 +ISSUE: https://github.com/FirebirdSQL/firebird/pull/8309 +TITLE: Add ALTER PACKAGE BODY and CRAETE OR ALTER PACKAGE BODY parse rules +DESCRIPTION: + We create package with body. Then we change its body two times: + * using 'ALTER PACKAGE'; + * using 'CREATE OR ALTER PACKAGE' clause. + Both changes must complete without error. +NOTES: + [10.11.2024] pzotov + Checked on 6.0.0.523-8ca2314. +""" + +import pytest +from firebird.qa import * + +db = db_factory() + +act = isql_act('db', substitutions=[('[ \\t]+', ' ')]) + +@pytest.mark.version('>=6.0.0') +def test_1(act: Action): + + msg_map = { + 0: 'Initial' + ,1: 'Changed via "ALTER PACKAGE BODY"' + ,2: 'Changed via "CREATE OR ALTER PACKAGE BODY"' + } + + test_sql = f""" + set term ^; + set heading off + ^ + set bail on + ^ + create or alter package pg_test as + begin + function fn_dummy returns varchar(50); + end + ^ + recreate package body pg_test as + begin + function fn_dummy returns varchar(50) as + begin + return '{msg_map[0]}'; + end + end + ^ + select pg_test.fn_dummy() from rdb$database + ^ + + set bail off + ^ + + -- must NOT fail since 6.0.0.523: + alter package body pg_test as + begin + function fn_dummy returns varchar(50) as + begin + return '{msg_map[1]}'; + end + end + ^ + select pg_test.fn_dummy() from rdb$database + ^ + + -- must NOT fail since 6.0.0.523: + create or alter package body pg_test as + begin + function fn_dummy returns varchar(50) as + begin + return '{msg_map[2]}'; + end + end + ^ + select pg_test.fn_dummy() from rdb$database + ^ + """ + + act.expected_stdout = f""" + {msg_map[0]} + {msg_map[1]} + {msg_map[2]} + """ + act.isql(switches = ['-q'], input = test_sql, combine_output = True) + assert act.clean_stdout == act.clean_expected_stdout +