diff --git a/firmware/README.md b/firmware/README.md new file mode 100644 index 0000000..83e84c6 --- /dev/null +++ b/firmware/README.md @@ -0,0 +1,20 @@ +cube/i10 +-------- + +| Item | Description | +|---------------------------|-------------| +| Manufacturer | Cube | +| Device | i10 | +| Website | http://www.cube-tablet.com/cube-i10-10-6-inch-dual-boot-tablet.html | +| Vendor driver (Windows) | http://techtablets.com/download/cube/i10/Windows%208.1%20Drivers/i10%20Windows%208.1%20drivers%20and%20touchscreen%20config%20files.zip or https://drive.google.com/open?id=0B3eEskvA0DSXZ0RZRVJnR2t1RE0 (drivers for Windows 8.1) http://pan.baidu.com/s/1pKabwdP (system image for i10-R) http://pan.baidu.com/s/1kT8gooJ (system image for i10-BW) http://pan.baidu.com/s/1eQz3bN0 (system image for i10-W) http://pan.baidu.com/s/1kT5yzbT (system image for i10-W) | +| Extracted firmware | [Touch screen calibration files Touch/SileadTouch.fw](Touch screen calibration files Touch/SileadTouch.fw) | +| Firmware for gslx680-acpi | [silead_ts.fw](silead_ts.fw) | +| Display resolution | 1366x768 | +| Touch panel resolution | 1366x768 (unverified) | +| Touch controller | ? | +| Multitouch support | Yes (10) (unverified) | +| Finger tracking | Yes | +| Mirrored horizontally | No | +| Mirrored vertically | No | +| Axes swapped | No | +| Comments | ./fwtool -c SileadTouch.fw -3 -m 1680 -w 1366 -h 768 -t 10 silead_ts.fw | diff --git a/firmware/Touch screen calibration files Touch/ReadMe.txt b/firmware/Touch screen calibration files Touch/ReadMe.txt new file mode 100644 index 0000000..accc7ff --- /dev/null +++ b/firmware/Touch screen calibration files Touch/ReadMe.txt @@ -0,0 +1,3 @@ +Move these files to C;/windows/system32/drivers and reboot. +This will restore the touch screen. +Techtablets.com \ No newline at end of file diff --git a/firmware/Touch screen calibration files Touch/SileadTouch.fw b/firmware/Touch screen calibration files Touch/SileadTouch.fw new file mode 100644 index 0000000..f089f6f --- /dev/null +++ b/firmware/Touch screen calibration files Touch/SileadTouch.fw @@ -0,0 +1 @@ +ը󅂁𺸸뻿뼤𰹸餸𹰸𹰸길𽹸𻺸𼤸𱸸𼸸𹸾𹸼𹺼𾼤龸鸸츸줸츸𰸼𱸸𱸸𹼸뤸鸸뤸鸸𼸸𹸰𹤧𹸸𹸸𰸸𺺹𺸹𿸾긱𹸸줸𹼹𹱹餸𺹺𺽺𺱺餸𻺻𻾻黱ꤸ𻸺𼸼𾸽鸰ꤸ𹽹깱𺸹뤅𺽺꺱𻸺뤸𻽻𻱻餸뤸줅𻸺𿸾鸱뤸𹻹𹿹鹱뤅𺻺𺿺麱뤸𻻻𻿻黱뤅𻸺𿸾鸱뤸𹻹𹿹鹱뤅𺻺𺿺麱뤸𻻻𻿻黱뤅𻸺𿸾鸱뤸𹻹𹿹鹱뤅𺻺𺿺麱뤸𻻻𻿻黱뤅𻸺𿸾鸱뤸𹻹𹿹鹱뤅𺻺𺿺麱뤸𻻻𻿻黱뤅𻤅𹸹𹸸𺸤𹸤𰤸𼤅𼤸𾸸븤ɨը󅂧᥻أυ+2+2+2𸸤𸸸𸼤𸸸𸰤𸸸뤸𸸸𹸤𸸸𹼤𸸸𹰤𸸸뤸𸸸𺸤𸸸𺼤𸸸𺰤𸸸뤸𸸸𻸤𸸸𻼤𸸸𻰤𸸸뤸𸸸𼸤𸸸𼼤𸸸𼰤𸸸뤸𸸸𽸤𸸸𽼤𸸸𽰤𸸸뤸𸸸𾸤𸸸𾼤𾰤𸸸뤸𹸸𿸤𸸸𿼤𸸸𿰤𸸸뤸𹰹𸸤鱽𸼤𸸸𸰤𸸸뤸𸸸𹸤𸸸𹼤𸸸𹰤𸸸뤸𸸸𺸤𸸸𺼤𸸸𺰤𸸸뤸𸸸𻸤𸸸𻼤𸸸𻰤𸸸뤸𸸸𼸤𸸸𼼤𸸸𼰤𸸸뤸𸸸𽸤𸸸𽼤𸸸𽰤𸸸뤸𸸸𾸤𸸸𾼤븸𾰤𸸸뤸𸸸𿸤𸸸𿼤𿰤뤸𸸸𸸤𸸸𸼤𸸸𸰤𸸸뤸𸸸𹸤𸸸𹼤𸸸𹰤𸸸뤸𸸸𺸤𸸸𺼤𸸸𺰤𸸸뤸𸸸𻸤𸸸𻼤𸸸𻰤𸸸뤸𸸸𼸤𸸸𼼤𸼸鸸𼰤𸸹뤸鸸𽸤𸸸𽼤𸸸𽰤𸼸뤸𸰸𾸤𾼤𹸹𾰤𹼹뤸𹰹𿸤𿼤𸸹𿰤𰸰뤸鱰𸸤𸸸𸼤𸸸𸰤𸸸뤸𰸾𹸤𸸸𹼤𸸸𹰤𸸸뤸𹸾𺸤𹸼𺼤𸸸𺰤𸸸뤸𸸸𻸤𰸰𻼤𰸰𻰤𰸰뤸𰸰𼸤𰸰𼼤𰸰𼰤𰸰뤸𰸰𽸤𽼤𸸸𽰤𸸸뤸𸸸𾸤𸸸𾼤𸸸𾰤𸸸뤸𸸸𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𸸸𸼤𸸸𸰤𸸸뤸𸼸𹸤𸸸𹼤𹼸鹼𹰤𸸸뤸𸸸𺸤𸸸𺼤𸸸𺰤𸸸뤸𻸤𻼤𸸸𻰤𸸸뤸𸸸𼸤𰸸𼼤𸸹𼰤𸸸뤸𸼸𽸤𸸸𽼤𸸸𽰤𸸸뤸𹺼𾸤𺸹𾼤𸸸𾰤𸸸뤸𸸸𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𸹸츸𸼤𸻸𸰤𸽹뤸𸿹𹸤𸱹𹼤깿鹾𹰤𸸸뤸𸸸𺸤𸸸𺼤𺰤뤸𻸤𻼤𸸸𻰤𸸸뤸𸸸𼸤𸸸𼼤𸸾𼰤𸰹뤸𸸸𽸤𸸸𽼤𸸸𽰤𸸸뤸𸸹츸𾸤𸸹𾼤𸸹𾰤𸸸鸸뤸𸸸鸸𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸾𸸤𸼤츹𸰤긹뤸𹸤𹼤𹰤뤸𺸤𺼤𺻰𺰤𺻼뤸𺻸𻸤𻼤𺺰𻰤𺺼뤸𼺸𼸤𸹸𼼤𸱸𼰤𹹹뤸𸺸𽸤𽼤𹺹𽰤𸸸츸뤸𸸸𾸤𸸸𾼤𸼸𾰤븰뤸𸸻𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𸼤𸸸𸰤뤸𸸸𹸤𹼤𸸸𹰤뤸𸹸𺸤𺼤𸸸𺰤뤸𸸹𻸤𻼤𸸸𻰤뤸𸸸𼸤𼼤𸸸𼰤뤸𸸸𽸤𽼤𸸸𽰤뤸𸸸𾸤𾼤𸸸𾰤뤸𸸸𿸤𿼤𸸸𿰤뤸𸸸𸸤𸸻𸼤𸸼𸰤𸸾鸸뤸𸸾𹸤𸸾𹼤𸸽𹰤𸸽길뤸𸸽𺸤𸸽𺼤𸸽𺰤𸸽뤸𸸽𻸤𸸼븸𻼤𸸾𻰤𸸽뤸𸸽𼸤𸸾𼼤𸸾𼰤𸻽뤸𸸽𽸤𸸽𽼤𸺽𽰤𸺽뤸𸸹븺𾸤𸸾𾼤𸸾𾰤𸸸뤸𸸼𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𸸼𸼤𸸻𸰤𸸺뤸𸸹𹸤𸸹𹼤𸸻𹰤𸸼뤸𸸿𺸤𸸿𺼤𸸿𺰤𸸾븸뤸𸸰𻸤𸸾𻼤𸸽츸𻰤𸸾뤸𸸽𼸤𸸸𼼤𸸸𼰤𸸸뤸𸸸𽸤𸸸𽼤𸸸𽰤𸸸뤸𸸸𾸤𸸸𾼤𸸸𾰤𸸸뤸𸸸𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𸸽𸼤𸸼𸰤𸸾뤸𸸽𹸤𸸾𹼤𸸼븸𹰤𸸽뤸𸸾𺸤𸸽𺼤𸸼𺰤𸸽鸸뤸𸸽𻸤𸸼𻼤𸸻鸸𻰤𸸸뤸𸸹𼸤𸸾鸸𼼤𸸾𼰤𸸾뤸𸸾鸸𽸤𸸿𽼤𸸾𽰤𸸾뤸𸸼츸𾸤𸸽𾼤𸸼𾰤𸸻길뤸𸸺𿸤𸸹븸𿼤𸸹鸸𿰤𸸹뤸𸸻븸𸸤𸸸𸼤𸸸𸰤𸸸뤸𸸸𹸤𸸸𹼤𸸸𹰤𸸸뤸𸸸𺸤𸸸𺼤𸸸𺰤𸸸뤸𸸸𻸤𸸸𻼤𸸸𻰤𸸸뤸𸸸𼸤𸸸𼼤𸸸𼰤𸸸뤸𸸸𽸤𸸸𽼤𸸸𽰤𸸸뤸𸸸𾸤𸸸𾼤𸸸𾰤𸸸뤸𸸸𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𸸸𸼤𸸸𸰤𸸸뤸𸸸𹸤𸸸𹼤𸸸𹰤𸸸뤸𸸸𺸤𸸸𺼤𸸸𺰤𸸸뤸𸸸𻸤𸸸𻼤𸸸𻰤𸸸뤸𸸸𼸤𸸸𼼤𸸸𼰤𸸸뤸𸸸𽸤𸸸𽼤𸸸𽰤𸸸뤸𸸸𾸤𸸸𾼤𸸸𾰤𸸸뤸𸸸𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𸸸𸼤𸸸𸰤𸸸뤸𸸸𹸤𸸸𹼤𸸸𹰤𸸸뤸𸸸𺸤𸸸𺼤𸸸𺰤𸸸뤸𸸸𻸤𸸸𻼤𸸸𻰤𸸸뤸𸸸𼸤𸸸𼼤𸸸𼰤𸸸뤸𸸸𽸤𸸸𽼤𸸸𽰤𸸸뤸𸸸𾸤𸸸𾼤𸸸𾰤𸸸뤸𸸸𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𸸸𸼤𸸸𸰤𸸸뤸𸸸𹸤𸸸𹼤𸸸𹰤𸸸뤸𸸸𺸤𸸸𺼤𸸸𺰤𸸸뤸𸸸𻸤𸸸𻼤𸸸𻰤𸸸뤸𸸸𼸤𸸸𼼤𸸸𼰤𸸸뤸𸸸𽸤𸸸𽼤𸸸𽰤𸸸뤸𸸸𾸤𸸸𾼤𸸸𾰤𸸸뤸𸸸𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𸼤𸸸𸰤𸸸뤸𸸸齰𹸤𸸸𹼤𸸸𹰤𸸸뤸𸸸𺸤𸸸𺼤𸸸𺰤𸸸뤸𸸸𻸤𸸸𻼤𸸸𻰤𸸸뤸𸸸𼸤𸸸𼼤𸸸뽸𼰤𸸸콸뤸𸸸𽸤𸸸𽼤𸸸𽰤𸸸뤸𸸸𾸤𸸸𾼤𸸸鸰𾰤𸸸뤸𸸸껼𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𸸸𸼤𸸸𸰤𸸸뤸𸸸𹸤𸸸𹼤𸸸𹰤𸸸뤸𸸸𺸤𸸸𺼤𸸸𺰤𸸸뤸𸸸𻸤𸸸𻼤𸸸𻰤𸸸뤸𸸸𼸤𸸸𼼤𸸸𼰤𸸸뤸𸸸𽸤𸸸𽼤𸸸𽰤𸸸뤸𸸸𾸤𸸸𾼤𸸸𾰤𸸸뤸𸸸𿸤𸸸𿼤𸸸𿰤𸸸콰뤸𸸤𸹸𸼤𸹸𸰤𸹸뤸𺻻𹸤麹𹼤鼹𹰤뤸𺻻𺸤麹𺼤𺽸𺰤鼹뤸𻸤𸹸𻼤𰺹𻰤𰹰뤸𸹸𼸤𸹸𼼤鼹𼰤鸸뤸𸹸𽸤鸹𽼤麹𽰤鼹뤸龹𾸤鰹𾼤鹸𾰤빸뤸𿸤𱸹𿼤𱺹𿰤𱼹뤸𱾹𸸤𱰹𸼤鹸𸰤빸뤸𹸤𰼹𹼤𸹸𹰤𸹸뤸𰺹𺸤𰹱𺼤𰺹𺰤𰹱뤸𰹰𻸤𸹸𻼤𸹸𻰤𸹸뤸빸𼸤빸𼼤𸹸𼰤𸹸뤸𺿸𽸤龹𽼤鸸𽰤𸹸뤸𼸸𾸤𸹸𾼤𸹸𾰤뤸𸹸𿸤𸻹𿼤𰺹𿰤𸻺뤸𰺹𸸤𸼤𼸸𸰤𸹸뤸𼸸𹸤𸹸𹼤𼸸𹰤𸹸뤸𼸸𺸤𸹸𺼤𺰤𰺹뤸𰹱𻸤𸹸𻼤𸹸𻰤𸹸뤸𼸤𸹸𼼤𸻸𼰤𰺹뤸黰𽸤𸻸𽼤𰺹𽰤𰹱뤸𸹸𾸤𸹸𾼤𸹸𾰤뤸𸹸𿸤𸹸𿼤𸹸𿰤𸹸뤸鿰𸸤𸹸𸼤𸹸𸰤𸹸뤸𹸤𸹸𹼤麺𹰤𸺰뤸𸹸𺸤𸹸𺼤𱸰𺰤뤸𸹸𻸤𻼤𸹸𻰤𸹸뤸𸽸𼸤𰼹鸸𼼤鸸𼰤𸹸뤸𽸤𸹸𽼤𽰤꺸뤸𱾹𾸤𾼤븺𾰤𱰹뤸길𿸤켸𿼤鸾𿰤갹뤸𱰸𸸤길𸼤麰𸰤𹾰뤸꾹𹸤鸸𹼤𰻺꾸𹰤꺸뤸꼸𺸤븹𺼤鿸𺰤𹾰뤸𸹸𻸤뺸𻼤鸼𻰤𸼰뤸鿸𼸤꾸𼼤𼰤꼸뤸𹾰𽸤鿸𽼤뺸𽰤뺺뤸갸𾸤鿸𾼤𹾰𾰤꺸뤸뺸𿸤鸼𿼤𿰤갸뤸鿸𸸤𹾰𸼤𸹸𸰤뺺뤸꾸𹸤꼸𹼤鿸𹰤뤸鿸𺸤길𺼤𰺸𺰤뺺뤸켺𻸤𰻺𻼤길𻰤븸뤸鸿𼸤麾𼼤麾𼰤𱰸뤸黻𽸤𽼤켸𽰤뤸𾸤𸸸𾼤𸸸𾰤𸸸뤸𸸸𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𰻽𸼤𰺸𸰤𰻻뤸鸾𹸤𸺰𹼤𸹸𹰤鸾뤸𸺰𺸤𸹸𺼤鸾𺰤𸺰뤸𸹸𻸤鸾𻼤𸺰𻰤𸹸뤸鸾𼸤𸺰𼼤𸹸𼰤𸿻빰뤸𰾹𽸤𸽹𽼤𰼸𽰤뼺븸뤸𸿻븸𾸤𰾹𾼤𰼹𾰤뼺븸뤸𸽸𿸤𸹸𿼤𸹸𿰤𰼰뤸𸸤𸹸𸼤𸹸𸰤𸿻븸뤸𰾹𹸤𰼹𹼤뼺븸𹰤𸹸뤸𸹸𺸤뼼𺼤밸𺰤𸹸뤸鿽𻸤鱺𻼤鿻𻰤龹븹뤸龸𼸤𰹱𼼤𸹸𼰤𸹸뤸𽸤鸸𽼤鸸𽰤鸹뤸鸹𾸤鸺𾼤鸺𾰤鸻뤸鸻𿸤𿼤𰹱븸𿰤𸹸뤸𸹸𸸤뼼𸼤밸𸰤𸹸뤸鿽𹸤鱻𹼤鿺𹰤龹븹뤸龸𺸤𰹱𺼤𸹸𺰤𸹸뤸𻸤𻼤鸸𻰤鸸뤸鸹𼸤鸹𼼤鸺𼰤鸺뤸鸻𽸤鸻𽼤𽰤뤸𰹱븸𾸤𸹸𾼤𸹸𾰤뼼뤸밸𿸤𸹸𿼤𸹸𿰤𰺹뤸𺿻𸸤龹𸼤뺺븸𸰤𸹸뤸𸻻𹸤𰺹𹼤龹𹰤뤸𸹸𺸤𸹸𺼤𸹸𺰤龹뤸𰻼𻸤𰺹𻼤𰹰𻰤𸹸뤸𼸸𼸤𸹸𼼤𸹸𼰤𸹸뤸鿽𽸤鱻𽼤鿺𽰤龹븹뤸龸𾸤𰹱𾼤𸹸𾰤뤸鸸𿸤鸸𿼤鸹𿰤鸹뤸鸺𸸤鸺𸼤鸻𸰤鸻뤸𹸤𰹱븸𹼤𸹸𹰤龹뤸𰻼𺸤𰺺𺼤𰹰𺰤𸹸뤸𸻻𻸤𰺹𻼤龹𻰤뤸𸹸𼸤𸹸𼼤𸹸𼰤뼼뤸밸𽸤𸹸𽼤𰺹𽰤𺿻뤸龹𾸤뺺븸𾼤𸹸𾰤뼼뤸밸𿸤𸹸𿼤뼰𿰤鸸뤸𸹸𸸤빼𸼤𰺹𸰤뺹뤸𰺸𹸤𰺸𹼤𰻺𹰤鹻뤸𺸤츸𺼤𱼹𺰤𱾹뤸𰻺𻸤캸𻼤𱰹𻰤𰻺꺸뤸鸸𼸤鸺𼼤𱰸𼰤麺뤸黺𽸤𽼤𱼸鸸𽰤𱾸뤸𾸤𾼤𰻺𾰤뤸𸹸𿸤𰺸𿼤𰺸𿰤껺뤸𰺸𸸤𰺸𸼤𰻺𸰤𱺸龸뤸𱻺龸𹸤츸𹼤𱹻𹰤뤸𱸸麸𺸤鸺𺼤鸻𺰤𱿻뤸鸻𻸤鸻𻼤𱺸龸𻰤꾸뤸𱻺龸𼸤𰺹𼼤참𼰤𰻺뤸𰺺길𽸤𱽺鰸𽼤𰺹𽰤뺺뤸𱹺麸𾸤鸺𾼤𱿺𾰤뤸뺺𿸤鹸𿼤𰺹𿰤麻뤸𰺺𸸤꾸𸼤麺𸰤𹼰뤸𱱺𹸤𸻻뺸𹼤𰺹𹰤뺸뤸𹸰𺸤𰻻𺼤𸻻뺸𺰤𰺹뤸뺸𻸤𰻻𻼤𻰤𱸸뤸𼸤鹺𼼤鹼𼰤쾹뤸뺸𽸤긺븸𽼤𰺽꼸𽰤꺹뤸𱺰𾸤𸺰𾼤鸸𾰤긹뤸𱰸𿸤𰺸𿼤뺹𿰤뺺뤸뺸𸸤鸻𸼤기𸰤뤸𱰸𹸤𹼤𱸸𹰤鹼뤸쾹𺸤黼𺼤𱺹𺰤𹰰뤸긹𻸤𰻺꾸𻼤𰺸𻰤𱰸뤸뺸𼸤길𼼤𱺸𼰤龸뤸𽸤𱰸𽼤긺븸𽰤길뤸𰹰𾸤𸹸𾼤𸹸𾰤𸹸뤸긿𿸤𿼤𿰤𸻻뺸뤸𱾹𸸤𱰹𸼤𰻺꺸𸰤鸻뤸鹻𹸤𱰸𹼤黺𹰤뤸麸𺸤𺼤𸹸𺰤뤸뺸𻸤𰻻𻼤龸𻰤鰸뤸𱸹𼸤𼼤𸹸𼰤𹸰뤸길𽸤𽼤𱸺𽰤𱸸뤸길𾸤𾼤𾰤뤸鰹𿸤뺸𿼤齸𿰤鰸뤸𸸤鼹𸼤뺸𸰤鼰뤸鰸𹸤鰸𹼤𹰤𱸹뤸鹸𺸤𱸹𺼤𺰤𱺹뤸龺𻸤𹺰𻼤鸹𻰤𹸰뤸鸹𼸤龺𼼤𹰰𼰤龺뤸𽸤𸹸𽼤𱼹𽰤𱸹뤸𾸤𱺹𾼤麸𾰤𸼰뤸龹𿸤鹸𿼤麻𿰤𰺹뤸𰻺𸸤鸺븸𸼤龺𸰤𹰰뤸龺𹸤鹸𹼤麻𹰤𰺹뤸𰻺𺸤𹸰𺼤鸹𺰤𹺰뤸𰺹𻸤鼺𻼤𺼰𻰤鸸뤸𸻸𼸤鸸𼼤𰺹𼰤𹸰뤸𽸤鸸𽼤龸𽰤鼺뤸𸼰𾸤𰺹𾼤𰺹𾰤𰸰꼸뤸𸺰𿸤𱺹𿼤𸻸𿰤鸸뤸𰺹𸸤뺸𸼤鸼𸰤𹰰뤸麸𹸤麼𹼤븹𹰤𹼰뤸𰺺븹𺸤𰺺𺼤黼𺰤鸾뤸𱺹𻸤𱼹𻼤𻰤𱸹뤸𼸤鼸鸸𼼤뺸𼰤齸뤸𽸤鼹𽼤𽰤뤸𱰹𾸤𱾹𾼤麺𾰤𹺰뤸𰺹𿸤𰺺븸𿼤𰻺𿰤鸸뤸黿𸸤𸺰𸼤𱰸𸰤뺸뤸黺𹸤𹼤뺺𹰤뤸𸹸𺸤𺼤참𺰤뺸뤸𱰹𻸤鸸𻼤𸻻븸𻰤꼸뤸𹽻빰𼸤𸻺𼼤𰺹𼰤𱾹鸻뤸뺺븸𽸤𸻹𽼤찺𽰤黼뤸븺𾸤龹𾼤𹺰𾰤鰹뤸𸻸𿸤鸸𿼤𰺹𿰤꼸뤸참𸸤𸻻𸼤𱰸길𸰤鹻뤸麸𹸤龺𹼤𹾰𹰤꺱뤸븼𺸤뺸𺼤𰺸𺰤깾뤸鸼𻸤𺺰𻼤龹𻰤鸸뤸뺸𼸤黼𼼤鰸𼰤꺱뤸𸻹𽸤鸸𽼤𰺹𽰤黼뤸𸺰𾸤𸻺𾼤𰺹𾰤黼뤸𹺰𿸤꺱𿼤𹹸𿰤𱸹뤸𼸸𸸤𹻸𸼤𸻸𸰤𱾹뤸鰹𹸤𱰹𹼤꺸𹰤𱰸뤸뺸𺸤黺𺼤𺰤뺺뤸꺱𻸤鸸𻼤𰺻𻰤鼹뤸𱸼𼸤𰻻𼼤깾𼰤麹뤸𽸤켸𽼤𽰤𱰹뤸뺸𾸤𱾸齸𾼤𱺹꺽𾰤鸼뤸𸺰𿸤鹰𿼤鸸𿰤𰺾뤸𰸱𸸤𸺰𸼤𸰤뤸鼸𹸤鸸𹼤𰺾𹰤𰸱뤸𻺰𺸤𱰸𺼤𺰤𸺰뤸𰺸𻸤鸾𻼤𺰰𻰤𱰸뤸븺𼸤𱰸𼼤黺𼰤뤸뺸𽸤龺𽼤𸾰𽰤𸻸뤸𰺹𾸤𰺸鰸𾼤𹸰𾰤뺺뤸뺹𿸤𰻺𿼤뺺𿰤뺸뤸쾸𸸤鸸𸼤𱾸𸰤참뤸𱸸𹸤껻𹼤𱼸𹰤꾺뤸𱰸𺸤𰻻𺼤𱰹𺰤𱸹뤸뺸𻸤𰺸븸𻼤鸸𻰤𱼹뤸찺𼸤뺺𼼤麺𼰤𱻻뤸麸𽸤麾𽼤쾺𽰤쾺뤸츺𾸤𹺰𾼤麸𾰤𸻸뤸𰺹𿸤𿼤𰺸鸸𿰤븸뤸𰺹𸸤뺺𸼤𸰤𻺰뤸𸻺𹸤𰺹𹼤鸸𹰤麸뤸𹸰𺸤𰺹𺼤鸸𺰤𰺹뤸黼𻸤𹺰𻼤𸹸𻰤뺸뤸𰸰𼸤𹺰𼼤𰺹𼰤뺺뤸𽸤𱸹𽼤𽰤뤸𸹸𾸤𾼤𾰤뤸𼸸𿸤𱸹𿼤𹽻뺸𿰤뤸뺸𸸤𱰹鸿𸼤뺺𸰤𸻻븸뤸참𹸤𰺹𹼤찺𹰤뺸뤸𱸹鸿𺸤뺺𺼤빼𺰤𸻸뤸鸹𻸤𱺹𻼤麹𻰤鼹뤸龹𼸤𰺹𼼤𹿸𼰤뺺뤸𱾹𽸤鹻𽼤쾺𽰤뤸𸻺𾸤𾼤𰺹𾰤뺺뤸𸻻𿸤𰺹𿼤븺𿰤븺뤸쾺𸸤븸𸼤齺𸰤뺸뤸鸸𹸤쾸𹼤켸𹰤𸺰뤸츸𺸤𰺽𺼤𰺸𺰤𹸰뤸黻𻸤麹𻼤𺹻빼𻰤𱰹뤸캸𼸤껻𼼤𰺽꼸𼰤𱺸鿰뤸𱺹𽸤캺𽼤𰺹𽰤캸뤸𱺸𾸤𺽻뺸𾼤𱺹𾰤캺뤸𱰹鸰𿸤캸𿼤𱺸𿰤𱺹뤸캺𸸤𰺹鸸𸼤켺𸰤鹼鸸뤸𹸤츺𹼤鹼鸿𹰤캸뤸𸻻𺸤𱺺鼸𺼤캺𺰤𸻻뤸鸸𻸤𰺹𻼤麸𻰤𸻸뤸𱾹𼸤𰺹𼼤𱼹𼰤𹱸뤸뺺븸𽸤鸹𽼤찺𽰤鼾뤸𸺰𾸤찺𾼤𱻺뾸𾰤𰺸뤸뾸𿸤𰻺𿼤鸺𿰤𱰹鸰뤸麻𸸤𰺸𸼤𱾹鸰𸰤𰺸뤸𱼹鸰𹸤캺븸𹼤뺺𹰤뺸뤸鸾𺸤𸺰𺼤𹿻븰𺰤뺸뤸鸰𻸤𱰹𻼤뺺𻰤麺븸뤸𼸤𱸹𼼤𼰤𱸹뤸𽸤𰺹𽼤鹻𽰤뺺뤸𸻺𾸤뺺𾼤𾰤뤸𿸤뺸𿼤𰸰𿰤𸺰뤸빰𸸤𰺹𸼤鹻𸰤뺺뤸뺸𹸤𰺸𹼤鸼𹰤𹺰뤸𸻻빰𺸤밾𺼤𸹸𺰤鸸뤸𸻻븼𻸤꾸𻼤𰺹𻰤븺뤸𼸤黼𼼤𰺹𼰤븺뤸𽸤𽼤鹸𽰤𰻺꾸뤸鸻𾸤黾𾼤𾰤븺뤸𿸤𸹸𿼤뺸𿰤鸸뤸𰺽𸸤𰻻𸼤𱾹𸰤븸뤸鰸𹸤𸻸𹼤𱼹𹰤𱰹뤸麾𺸤𸺰𺼤麾𺰤𹺰뤸麾𻸤뺸𻼤鸰𻰤𰻻뤸𰻺𼸤𹸰𼼤껻𼰤𺰰뤸鸺𽸤鸻𽼤𰻻𽰤𰺸뤸꼸𾸤𰹰𾼤𸹸𾰤𸹸뤸𸹸𿸤𰺿𿼤鸻𿰤𰻺뤸𰹰𸸤𸹸𸼤𸹸𸰤𸹸뤸鿻𹸤𰺸𹼤𹸰𹰤뺺뤸𰻻𺸤𰹰𺼤𸹸𺰤𸹸뤸𸹸𻸤𰺿𻼤꼸𻰤𰻺뤸𰹰𼸤𸹸𼼤𸹸𼰤𸹸뤸鿻𽸤𰺸𽼤뺺𽰤뺸뤸鸸𾸤𰺽𾼤𱾸𾰤𰻻뤸븸𿸤𿼤𱰸𿰤뤸𸹸𸸤𱰹𸼤꺸𸰤𱰸뤸뺸𹸤黺𹼤𹰤뺺뤸𺸤𸹸𺼤쾸𺰤참뤸𱹻𻸤𱽻𻼤𱸸𻰤𱼸뤸𸻸𼸤麺𼼤𰺹𼰤𱼸길뤸𱸸븸𽸤𱸺𽼤꼸𽰤𱸽鸸뤸𾸤𱸸𾼤𾰤𰺽뤸𰺸𿸤길𿼤𰻺𿰤鹿뤸鸾𸸤𸼤꺸𸰤뺸뤸𱰺븸𹸤龼𹼤꼸𹰤𹼰뤸𱾹𺸤𱼹𺼤갽𺰤길뤸𰻻𻸤鸿𻼤𰺺𻰤뤸꿻𼸤鸿𼼤龺𼰤𺼰뤸길𽸤뺸𽼤鸼𽰤𰺾뤸𰸰𾸤𺺰𾼤길𾰤뺸뤸龼𿸤𻰰𿼤길𿰤뺸뤸鸼𸸤𸼰𸼤鸼𸰤𹸰뤸긹𹸤𺼰𹼤𱾹𹰤길뤸龸𺸤𺼤鸿𺰤꺸뤸龼𻸤𻼤갸𻰤긹뤸𼸤𼼤뺸𼰤𰺸뤸뺺𽸤븺𽼤븺𽰤鹸뤸𰻺꾸𾸤鸻𾼤븺𾰤黾뤸𿸤븺𿼤𿰤𸹸뤸𸸤𰺸𸼤갸𸰤𰺹뤸鹾𹸤𰸱𹼤龹𹰤𸾰뤸鼹𺸤뺸𺼤龸𺰤𻰰뤸긹𻸤뺸𻼤龼𻰤𻰰뤸긹𼸤𱼸𼼤𱾸𼰤麸뤸𰺸𽸤긹𽼤븺𽰤기뤸𾸤𰺸𾼤뺸𾰤𰸰뤸𸺰𿸤긹𿼤龾𿰤𸺰뤸𰺹𸸤뺸𸼤龸𸰤𸺰뤸𰺹𹸤뺸𹼤龼𹰤𹺰뤸鿸𺸤𰺹𺼤뺺𺰤鿸뤸𹼰𻸤꺹𻼤𰺸𻰤鸺븸뤸鸿𼸤𰺸𼼤𰺺𼰤길뤸鸹𽸤𱰺𽼤𽰤길뤸𰺸𾸤𰻺𾼤鸾𾰤꼸뤸꾸𿸤𱸹𿼤𱻺鸸𿰤뤸걺𸸤鸿𸼤𸰤𰻻뤸𰻻𹸤鸿𹼤뺸𹰤𰺺뤸𺸤𺼤鸼𺰤𸼰뤸갸𻸤뺸𻼤𰺹𻰤뺺뤸𼸤𼼤걺𼰤길뤸꾸𽸤龸𽼤𽰤꼸鸸뤸꺸𾸤鸻𾼤龼𾰤뤸𱰸𿸤뺸𿼤𰸰𿰤𸺰뤸鸿𸸤뺸𸼤𰸰𸰤𸺰뤸𰸰𹸤𰸰𹼤𹺰𹰤긹뤸鸿𺸤𰸰𺼤𸺰𺰤뺸뤸𰸰𻸤𸺰𻼤𰸰𻰤뺸뤸𰸰𼸤𻺰𼼤긹𼰤𰸰뤸𸺰𽸤뺸𽼤뺸𽰤𰸰뤸𸺰𾸤뺸𾼤𹸰𾰤긹뤸𰸰𿸤𸺰𿼤긹𿰤𰸰뤸𸺰𸸤𰸰𸼤𹺰𸰤긹뤸긹𹸤𹼤𹰤뤸깺𺸤𺼤𺰤깻뤸길𻸤꾸𻼤鸿𻰤𸻸뤸𰺹𼸤𼼤鸿𼰤뺸뤸𽸤𰻻𽼤𰻻𽰤鸿뤸𾸤걻𾼤뺸𾰤𱸹뤸𱼹𿸤龸𿼤𰸰𿰤길뤸𸺰𸸤鸻𸼤뺸𸰤𰸰뤸𻺰𹸤길𹼤뺸𹰤鸾뤸𺺰𺸤鸻𺼤뺸𺰤龸뤸𺰰𻸤鸻𻼤𹸰𻰤길뤸뺸𼸤𰻻𼼤𰺸𼰤鸸뤸鸾𽸤鸻𽼤𰻻𽰤𰸱뤸𹺰𾸤길𾼤龺𾰤𸾰뤸鸸𿸤뺸𿼤𰺸𿰤黼뤸𹰰𸸤鸸𸼤뺸𸰤𰺸뤸龸𹸤𹰰𹼤麹𹰤𺽸뤸𱰹𺸤鰹麸𺼤𱾹麸𺰤鸸뤸𻸤𹺰𻼤꺸𻰤뤸꺹𼸤𰺺𼼤麻븸𼰤𰺽뤸𰺸𽸤𰻺𽼤鸸𽰤뺸뤸𾸤𰻻𾼤𰻻𾰤𱺽뤸鸿𿸤𿼤꼽𿰤꾸뤸𸸤𰺸븸𸼤갸𸰤𰻺뤸꿺𹸤꼸𹼤꺸𹰤鸾븸뤸꼸𺸤꺽𺼤鿼𺰤𹼰뤸𰻺𻸤鸸𻼤𺺰𻰤𰺸뤸꼸𼸤꼸𼼤𰺸𼰤꿺뤸뺸𽸤鸼𽼤𹼰𽰤𱰸뤸뺸븹𾸤鸼𾼤𻾰𾰤麹뤸黺𿸤𿼤𱾹麸𿰤鼾뤸𸸤鸻𸼤鸸𸰤𹺰뤸긺𹸤긺𹼤𹰤뤸𱼹𺸤뺸𺼤麰𺰤𱾹뤸鰸𻸤𻼤뺸𻰤𱾸뤸鸾𼸤𸺰𼼤𱱺鸸𼰤뺺뤸뺸𽸤𱼸鸸𽼤뺺𽰤뺸뤸𾸤븸𾼤𾰤켺뤸켸𿸤𸻸𿼤𱰸𿰤𰺹뤸鹻𸸤뺸𸼤뺽𸰤鸼뤸𸺰𹸤𸻸𹼤𹰤𸼰뤸𰺹𺸤鸺𺼤𰻺𺰤븸뤸𻼰𻸤𱿻븸𻼤𹸰𻰤𱾹뤸𹾰𼸤𸻸𼼤鸺𼰤𰺹뤸𰻺𽸤븸𽼤𻾰𽰤𱾹뤸𱿻븸𾸤𸻸𾼤𱺹𾰤𰺸뤸뺹𿸤𱾸븸𿼤𰸰鸸𿰤𸺰뤸鸹𸸤껻𸼤鸺𸰤꾸뤸꾸𹸤참𹼤𸻻𹰤𱰸길뤸𸻸𺸤𰺹𺼤𰺸븸𺰤𱰸뤸𹸰𻸤찺𻼤껻𻰤鸺뤸꾸𼸤꾸𼼤𸻸𼰤참뤸𰺹𽸤𱰸길𽼤𰻺𽰤𰺸뤸뺺𾸤뺸𾼤鸸𾰤𰺸뤸𿸤뺺𿼤𿰤𰻻뤸츸𸸤𰺺𸼤麺𸰤𸺰뤸껸𹸤𸻻븸𹼤鸹𹰤뺸뤸鸸𺸤𰺼𺼤𰸰𺰤뺸뤸𸺰𻸤긹𻼤鸸𻰤𰺾뤸齾𼸤뺺𼼤뺸𼰤𹸰뤸뺺𽸤𸻻븸𽼤𰺹𽰤뤸𾸤𾼤𾰤齼뤸𸹸𿸤𸻻븼𿼤𿰤𰺹뤸鼺𸸤𸰰𸼤븺𸰤븺뤸麹𹸤𰻺뾸𹼤뺸𹰤鸾뤸𸺰𺸤麸𺼤븼𺰤𸹸뤸뺸𻸤鸾𻼤𹺰𻰤鼾뤸𼸤𰻺뾸𼼤𹸰𼰤뺸뤸鼺𽸤𹺰𽼤鼺𽰤𹱹뤸鹻𾸤뺸𾼤鸼𾰤𹺰뤸鹻𿸤뺸𿼤鸼𿰤𺺰뤸뺸𸸤𼸸𸼤𸹸𸰤뺸뤸븼𹸤𸹸𹼤뾻𹰤𱸹뤸뽸𺸤𱸹𺼤𹸰𺰤뺸뤸𹰰𻸤鼺𻼤𰸰뺸𻰤𻺰뤸뺸𼸤𱸸𼼤𼰤𱹻뤸𽸤𸹸𽼤𹸰𽰤뺸뤸𹰰𾸤鼺𾼤𸻻빰𾰤鸸뤸𰺹𿸤麸𿼤𸻻뺸𿰤𰺹뤸鸸𸸤麸𸼤뻾𸰤𱸹뤸뺸𹸤뺺𹼤𹸰𹰤뺸뤸𹰰𺸤鼺𺼤𱸹𺰤𱺹뤸뺸𻸤븼𻼤𱼹𻰤𹹸뤸찾𼸤𱸹𼼤𹸰𼰤뺸뤸𻰰𽸤뺸𽼤𽰤𺻸뤸𱺹𾸤뺸𾼤븼𾰤𱼸뤸鼺𿸤𻺰𿼤뺸𿰤𱸹뤸𸸤𱺹𸼤뺸𸰤鸾뤸𺺰𹸤뺸𹼤븼𹰤𸹸뤸뺸𺸤鼸𺼤𹺰𺰤𸻹뤸𰺹𻸤鼸𻼤𻰰𻰤𺹸뤸鸸𼸤𸻻빰𼼤𰺹𼰤뤸𽸤𽼤𽰤뤸𸹸𾸤𾼤𾰤龾뤸𸺰𿸤긹𿼤𸻹𿰤꼹뤸𰺹𸸤꺰𸼤龺𸰤꾸뤸𹺰𹸤갹𹼤뺸𹰤𰻻뤸𰺸𺸤뺺𺼤龺𺰤𸰰뤸뺸𻸤鸻븹𻼤껿𻰤𹸰뤸𼸤鸻븹𼼤𰺸𼰤뺺뤸𽸤𽼤𰺹𽰤뤸𾸤𸻹𾼤鸸𾰤𰺹뤸黼𿸤𱼹𿼤𹺰𿰤𱾹뤸𸻻빰𸸤𰺹𸼤𹸰𸰤麸뤸𹸤𻺰𹼤뺸븸𹰤뤸𱾹𺸤𱾸𺼤𺰤뤸𱼸𻸤𱾹츸𻼤캸𻰤𸻸뤸븸𼸤鰸𼼤𱸹𼰤참븸뤸𱾸𽸤븸𽼤鼸𽰤麸뤸𰺾𾸤𰸰꼸𾼤𾰤𱼸뤸뺸𿸤𱼺𿼤𸻹𿰤𰺹뤸麰𸸤𸻻빰𸼤𰺹𸰤𸺰뤸켺𹸤𸻸𹼤븾𹰤𱸹뤸𸹸𺸤𺼤𸹸𺰤뤸𻸤𸻸𻼤긹𻰤鹸뤸꾹𼸤𰻺𼼤꾸𼰤뤸𽸤븺𽼤꾹𽰤뺸뤸븸𾸤鰸𾼤𸻸𾰤꺹뤸꼹𿸤뺸𿼤龰𿰤鰸뤸𰻺𸸤갸𸼤뺸𸰤뤸𰺽𹸤𰺸𹼤𰺸𹰤鹾뤸뺹븸𺸤𰺺𺼤뺺𺰤꼸鸸뤸뺸𻸤龰𻼤𻰤갸뤸꾸𼸤뺸𼼤븸𼰤뤸꼹𽸤𽼤𽰤뤸𹹸𾸤뺸𾼤븼𾰤𱸹뤸뺸𿸤鸸𿼤𹹸𿰤𱰸뤸𰸰𸸤𸺰𸼤麸𸰤뺸뤸鸸𹸤鸻𹼤뺸𹰤꺸뤸鸻𺸤𰺹𺼤𰺺𺰤뤸𱿻꾸𻸤𰹰𻼤𸹸𻰤𸹸뤸𸹸𼸤꺿꼸𼼤찺𼰤뺸뤸븼𽸤𸹸𽼤𽰤뺸뤸븼𾸤𹹸𾼤龼𾰤龸뤸뺸𿸤龼𿼤𹹸𿰤𰺾뤸𰸱𸸤𸺰𸼤𱸹𸰤龿뤸𸹸𹸤𹼤𸹸𹰤𰺹뤸𹸰𺸤뺺𺼤븺𺰤𻹸뤸뺸𻸤긹𻼤鸾𻰤𹺰뤸𻻸𼸤𸻹𼼤𰺹𼰤뺺뤸븺𽸤븺𽼤𽰤뤸𸹸𾸤𾼤𾰤븺뤸𿸤𸹸𿼤𿰤뺸뤸鸾𸸤𸺰𸼤𸹸𸰤뺸뤸鸾𹸤𹺰𹼤𹹸𹰤뤸𸹸𺸤뺸𺼤鸸𺰤𰺸뤸鸻𻸤뺺𻼤黻𻰤麸뤸𹻸𼸤뺸𼼤븼𼰤켸뤸𸹸𽸤𽼤𽰤뤸뺸𾸤鸾𾼤𸺰𾰤𸻸뤸鸸𿸤𰺹𿼤꼸𿰤黾뤸𹺰𸸤𹹸𸼤뺸𸰤鸾뤸𹺰𹸤𱸹𹼤뿸𹰤𸹸뤸鸸𺸤뺸𺼤𰺸𺰤鸻뤸뺺𻸤鹼𻼤麸𻰤𹻸뤸𱺹𼸤뺸𼼤븼𼰤켸뤸𸹸𽸤𽼤𽰤뤸뺸𾸤鸾𾼤𸺰𾰤𹹸뤸참𿸤𰻻𿼤𰸰𿰤𺺰뤸뺸𸸤뺸𸼤鸾𸰤𻺰뤸뺸𹸤뺸𹼤鸾𹰤𻺰뤸뺸𺸤𹹸𺼤츺𺰤븺뤸𹸰𻸤캸𻼤鸾𻰤𹺰뤸𰺹𼸤鸸𼼤뺸𼰤鸼뤸鰸𽸤𰸰꺼𽼤𰺹𽰤麸뤸뺺𾸤𹸰𾼤븺𾰤𹺰뤸𸻸𿸤𸻸𿼤𰺹𿰤뺺뤸캸𸸤𹸰𸼤츸𸰤𹸰뤸뺺𹸤뻱𹼤𸹸𹰤𹻸뤸뺸𺸤𱺹𺼤븼𺰤츸뤸뺸𻸤𰺸𻼤鸰𻰤黾뤸𹺰𼸤뺺𼼤뺸𼰤鸾뤸𻺰𽸤뺺𽼤𰺹𽰤뺺뤸뺸𾸤鸾𾼤𻺰𾰤뺸뤸鸸𿸤𰻻𿼤𰸰𿰤𺺰뤸𸻸𸸤뺸𸼤길𸰤𹸰뤸𰺹𹸤𰺺꼸𹼤뺺𹰤뤸𺸤𹽸𺼤참𺰤𰺹黸뤸길𻸤𰸰𻼤𸺰𻰤𱸹뤸뺸𼸤𰺹𼼤뺺𼰤븸뤸뺸𽸤𱾸길𽼤鸾𽰤븺뤸𸰰𾸤𸻻𾼤길𾰤𸻹뤸븸𿸤𹺰𿼤𱼹𿰤뺸뤸𰺸𸸤𰺹𸼤뺺𸰤𸻸뤸븾𹸤𸹸𹼤𸹸𹰤鸸뤸뺸𺸤𰺽𺼤𰻻𺰤鹸뤸黼𻸤鰸𻼤𸻹𻰤𱾹뤸𱰸𼸤麾𼼤𸼰𼰤꾸뤸뺸𽸤𰻻𽼤𹸰𽰤𰺸뤸뺸𾸤𰺽𾼤뺺𾰤鸸뤸뺸𿸤𰺽𿼤𰻻𿰤黸뤸𸸤鹸𸼤𸰤𸹸뤸𹸤𹼤𹰤𸺰뤸𸹸𺸤뺸𺼤鸸𺰤𱰸뤸뺸𻸤黸𻼤𹺰𻰤𸹸뤸鸸𼸤뺸𼼤𰺸𼰤鸼뤸𸺰𽸤黾𽼤𹺰𽰤𸹸뤸𾸤𰸰뾸𾼤𾰤𸺰뤸𱾹𿸤𿼤𹻸𿰤𱼹뤸麰𸸤𹼰𸼤鸹𸰤𰻺뤸𱰸𹸤빺𹼤鹺𹰤鰹뤸츸𺸤鸻𺼤黼𺰤𺾰뤸𱼸鸸𻸤鸸𻼤𺺰𻰤뺸뤸뺸𼸤黼𼼤𺼰𼰤𱼸鸸뤸뺸𽸤麰𽼤𺺰𽰤鸸뤸뺸𾸤黼𾼤𺾰𾰤𱼸鸸뤸鸸𿸤𱼸鸸𿼤麰𿰤뤸𱰸𸸤鼸𸼤𻼰𸰤뤸𱾸𹸤𰺸뾸𹼤븸𹰤뤸𱼹𺸤𱾹𺼤뺸𺰤鸾뤸𺺰𻸤𱾸𻼤븸𻰤𻼰뤸뺸𼸤𱾸𼼤𼰤뤸뺸𽸤𻸰𽼤鸸𽰤𰺽뤸𰻻𾸤뺺𾼤𾰤鼺뤸𸺰𿸤𸹸𿼤鸸𿰤𰺸뤸鸾𸸤𹺰𸼤뺺𸰤𰺸뤸𹸰𹸤뺺𹼤𰺹𹰤뺺뤸츸𺸤𺼤캸𺰤뺸뤸𰺸𻸤뺺𻼤鸸𻰤뺸뤸黼𼸤𹰰𼼤𰺸𼰤뺺뤸𽸤𽼤𽰤뺸뤸鸾𾸤𹺰𾼤𸹸𾰤뺸뤸𰺸𿸤鸸𿼤鸼𿰤鰸뤸뺺𸸤𸼤鿺𸰤𸺰뤸븺𹸤뺸𹼤鸸𹰤꾽뤸𰻺𺸤𺼤껻𺰤븹뤸꼹𻸤鰸𻼤鹸𻰤𻹸뤸𰺸𼸤뺹𼼤龼𼰤꼼뤸鸿𽸤鿼𽼤𽰤𰺸뤸껿𾸤龰𾼤𹼰𾰤갹뤸갹𿸤븹𿼤𹼰𿰤𰺹뤸𰺹𸸤𰸱𸼤𸺰𸰤𸻻빰뤸길𹸤𰺹𹼤麸𹰤뤸𺸤𺼤뺸𺰤𰻻뤸𰸰𻸤𹺰𻼤𸹸𻰤鸸뤸뺸𼸤鿼𼼤𹰰𼰤𸹸뤸뺸𽸤𰻻𽼤𰺸𽰤鸸뤸龸𾸤𱼸𾼤뺽麹𾰤鸾뤸𸺰𿸤𰺸𿼤갹𿰤븺뤸갰𸸤𸼤𰺸𸰤긹뤸뺸𹸤龸𹼤𹰰𹰤꼹뤸𱾹𺸤꼹𺼤뺸𺰤龰뤸𹰰𻸤𸻸𻼤𻰤𰺹뤸鸿𼸤꺸𼼤齺麹𼰤뺸뤸鸼𽸤𻾰𽼤꼸鸸𽰤𰻺鸹뤸𾸤𰺸𾼤𾰤갹뤸𱰹𿸤꾸𿼤𿰤뺸뤸龰𸸤𹺰𸼤갸𸰤뺸뤸龸𹸤𻺰𹼤뺹𹰤찺븸뤸뺹𺸤鸾𺼤𻰰𺰤꼸鸸뤸뺸𻸤𰺸𻼤𹸰𻰤뺺뤸뺹𼸤鸾𼼤𹺰𼰤鿺뤸찺븸𽸤𹸰𽼤𽰤뤸꾸𾸤꼸鸸𾼤뺸𾰤龰뤸𿸤꺸𿼤길𿰤뺸뤸龸𸸤𸼤𱾸𸰤꼹뤸갹𹸤꾸𹼤𹰤𰺸뤸뺸𺸤鸾𺼤𻺰𺰤鹿뤸𹸰𻸤븺𻼤뺸꾻𻰤鿼뤸꼾𼸤갸𼼤鿺𼰤뤸𽸤뺸꾻𽼤龰𽰤𸰰뤸길𾸤뺸𾼤𰺹𾰤뺺뤸𿸤𿼤𿰤길뤸뺸𸸤鹻𸼤𸰤龹뤸鸸𹸤븸𹼤𹰰𹰤黻뤸鼹𺸤빸𺼤鹸𺰤鰹뤸鼾𻸤𸺰𻼤鸹𻰤𸻸뤸𱾹𼸤𱺹𼼤𱰸𼰤𰺸뤸鸰𽸤𰺸𽼤黾𽰤𸺰뤸𰻺𾸤뺸𾼤뺺𾰤𱺸뤸麾𿸤𿼤𱰸𿰤뤸𱸸𸸤븹𸼤𹼰𸰤𱺹뤸𰻺𹸤𰺸𹼤鸸𹰤뺸뤸𱺸𺸤鸸𺼤麼𺰤뤸鸻𻸤𰺺𻼤𰺸𻰤뺸뤸𰹰𼸤𸹸𼼤𸹸𼰤𸹸뤸鸿븸𽸤뺽𽼤鼸𽰤𺾰뤸鸹𾸤𸻸𾼤𱼹𾰤𱺹뤸𰺸𿸤鸰𿼤𰺸𿰤𱱺뤸黾𸸤𸺰𸼤𱾹𸰤鼺뤸𺼰𹸤뺸븸𹼤뺸𹰤鸼뤸𹾰𺸤𱰹𺼤鸾𺰤𺼰뤸𱰹𻸤𹸰𻼤𰺸𻰤뺸븸뤸𱰺𼸤𰺸𼼤꺰𼰤뺸뤸𰻻𽸤𰸰𽼤𸺰𽰤𱺸뤸뺸𾸤𰺽길𾼤𱱻𾰤麾뤸𿸤찺𿼤븽鸸𿰤鰸뤸鸸𸸤𸼤鸽𸰤龸뤸뺸𹸤븸𹼤𹰤鼸鸹뤸𺸤𺼤𺰤뺸뤸鸾𻸤𸺰𻼤𸹸𻰤뺸뤸鸸𼸤뺸𼼤鼸𼰤𹼰뤸麽뺸𽸤鼹𽼤𱰹𽰤뺸뤸黸𾸤𹼰𾼤𸻸𾰤𰺹뤸𰺸𿸤鸸𿼤𱾸𿰤뺸뤸뺺븸𸸤𱰸𸼤뺸𸰤黸뤸鸻𹸤𹼤𱾸𹰤𱸸뤸𺸤캸𺼤뺸𺰤𰻺뤸𰺸𻸤쾸𻼤𻰤𺾰뤸鸸𼸤𱰹𼼤뺸𼰤黸뤸𹼰𽸤𸻸𽼤𱼹𽰤鸼뤸뺸𾸤𰺺𾼤뺺𾰤𱰸뤸뺸𿸤黸𿼤𿰤鸻뤸鸸𸸤뺸𸼤鼸𸰤鼸鸾뤸𹸤麸𹼤𹰤뤸𺸤𺼤鼾𺰤𸺰뤸𸹸𻸤뺸𻼤鼼𻰤𹾰뤸鸹𼸤뺸𼼤鼸𼰤𹼰뤸𽸤𱾹𽼤뺸𽰤븸뤸𹼰𾸤𸻸𾼤뺸𾰤𰺹뤸鸻𿸤鸻𿼤𱰸𿰤뺸뤸뺺𸸤𱾸𸼤뺸𸰤븸뤸鸻𹸤𹼤𱰸𹰤𱸸뤸𺸤캸𺼤𱾹𺰤鼰뤸𹼰𻸤𱼹𻼤𰻺鸸𻰤𰺸뤸鸸𼸤뺸𼼤𱾸𼰤𱼸뤸븹𽸤𽼤鸻𽰤𰺺뤸𰺸𾸤鸹𾼤𰹰𾰤𸹸뤸𸹸𿸤𸹸𿼤𱼿鰸𿰤뺽뤸麰𸸤𺾰𸼤𱼹𸰤𱾹뤸뺸𹸤븸𹼤𹼰𹰤𰻺뺸뤸𹹸𺸤𱰸𺼤𱺹𺰤鸸뤸𸼰𻸤鹺𻼤뺸𻰤鸼뤸𻾰𼸤뺸𼼤鸾𼰤𻼰뤸븺𽸤𹸰𽼤뺸𽰤뺸뤸𰺺𾸤뺺𾼤뺸𾰤𰻻뤸𰸰𿸤𸺰𿼤𱾸𿰤뺺뤸뺸𸸤𰺽𸼤껰𸰤껻뤸𰺸𹸤𰻻𹼤뺺𹰤뺸뤸븸𺸤𺼤𱰸𺰤鸸뤸뺸𻸤鼸𻼤𻰤𱾹뤸𼸤𼼤𼰤齸뤸鿾𽸤𸺰𽼤긹𽰤뺸뤸龸𾸤𹼰𾼤𹱸𾰤𰺹뤸鹸𿸤𿼤鸰𿰤鿾뤸꺹𸸤𸺰𸼤𰺹𸰤갹뤸𹸤鸻𹼤𹰤븹뤸𸾰𺸤鸿𺼤꺸𺰤𰺸뤸갰𻸤𻼤𻰤鸾뤸𺺰𼸤길𼼤𱿻𼰤𰹰뤸𸹸𽸤𸹸𽼤𸹸𽰤𰺿뤸𰺽𾸤껰𾼤껿𾰤𰺸뤸갹𿸤鸰𿼤鿸𿰤𹼰뤸껻𸸤𰻺𸼤鸸𸰤꾹뤸뺸𹸤𰺺𹼤뺺𹰤갸뤸뺸𺸤鿸𺼤𺰤鸿뤸길𻸤뺸𻼤龸𻰤뤸𼸤𼼤𼰤뤸참𽸤黺𽼤𸺰𽰤꺹뤸뺸𾸤龼𾼤𹼰𾰤𹻸뤸꾹𿸤뺸𿼤븸𿰤𻼰뤸꺸𸸤𹽸𸼤𱸹𸰤𰺽뤸𰺸𹸤걺𹼤𰺹麸𹰤뤸龰𺸤𺼰𺼤꾸𺰤𰺹鹱뤸뺸𻸤龰𻼤𺾰𻰤꾸뤸뺸𼸤龰𼼤𺼰𼰤꾸뤸뺸𽸤𰸰𽼤𸺰𽰤𱾸뤸鸸𾸤𰻻𾼤븸𾰤𺰰뤸𿸤𰺺𿼤꾸𿰤𹸰뤸𸸤𸼤鸸𸰤뺸뤸𹸤鸿𹼤𹰤𰻻뤸𰻻𺸤鸿𺼤뺸𺰤𰺽뤸𻸤鸿𻼤뺸𻰤꼸븸뤸𼸤뺸𼼤龰𼰤𹼰뤸鸿𽸤긹𽼤뺸𽰤𰸰뤸𺺰𾸤뺸𾼤鸸𾰤𰺸뤸𰻻𿸤龰𿼤𹰰𿰤뤸𻺰𸸤뺸𸼤𰻻𸰤龰뤸𹰰𹸤꾹𹼤뺸𹰤龰뤸𹰰𺸤𰺺𺼤𺰤𹺰뤸꾸𻸤꾹𻼤갽𻰤鸿뤸𼸤뺸𼼤𰺺𼰤뺺뤸鸸𽸤븹𽼤𺼰𽰤꼸鸸뤸뺸𾸤𰸰𾼤𸺰𾰤𰺹뤸𰺸𿸤븸𿼤𻺰𿰤𰺹뤸뺸𸸤𰺸𸼤麸𸰤뺸뤸꼸𹸤𹼤𰻻𹰤𰻻뤸갸𺸤鸿𺼤걺𺰤뺸뤸𻸤𰺺𻼤뺺𻰤꼸鸸뤸뺸𼸤龰𼼤𼰤뺸뤸꾹𽸤꾸𽼤뺸𽰤븸뤸𾸤𰺽𾼤꺸𾰤뺸뤸龼𿸤𿼤꾹𿰤뤸𸸤뺸𸼤鸸𸰤𰺸뤸참𹸤꼸𹼤𱰸𹰤𰹰뤸𸹸𺸤𸹸𺼤𸹸𺰤鿻뤸麸𻸤𱾹𻼤𰻺𻰤참뤸鹸𼸤꼸𼼤껻𼰤𱾸뤸𽸤𽼤麸𽰤뺸뤸鸾𾸤𸺰𾼤𰺹𾰤뺸뤸鸾𿸤𺺰𿼤뺸𿰤𰺹뤸뺺𸸤뺸𸼤鸾𸰤𸺰뤸뺸𹸤껸𹼤𰻻𹰤𰺸뤸뺺𺸤𸻸𺼤븾𺰤𸹸뤸𸹸𻸤𻼤꺹𻰤뺸뤸龼𼸤𹰰𼼤𼰤𸻸뤸갽𽸤길𽼤꾸븹𽰤뤸갸𾸤꼹𾼤𻹸𾰤鸿뤸뺸𿸤鿼𿼤𸼰𿰤꺸뤸뺸𸸤鿼𸼤𺰰𸰤뺸뤸뺸𹸤꺰𹼤𹰤𰺸뤸뺺𺸤뺸𺼤뺺𺰤뺸뤸뺺𻸤븺𻼤뺸𻰤龼뤸꾸븹𼸤𼼤갸𼰤뤸𽸤𽼤뺸𽰤𰸰뤸𹺰𾸤𸹸𾼤뺸𾰤鸾뤸𸺰𿸤鼹𿼤𰺸𿰤뺺뤸뺸𸸤鼰𸼤𹰰𸰤鹸뤸麹𹸤뺸𹼤鼼𹰤𹰰뤸쾸𺸤𸻸𺼤鰸𺰤龸뤸뺸𻸤鸾𻼤𹰰𻰤𸻸뤸𰺹𼸤鸼븸𼼤뺸𼰤黼뤸𸾰𽸤𸻸𽼤𱸹𽰤뤸𱺹𾸤麺𾼤𸺰𾰤𸻸뤸뺸𿸤鸾𿼤𺺰𿰤뺸뤸𱸹𸸤븼𸼤𱺹𸰤뺸뤸鸾𹸤𹺰𹼤𸻸𹰤뺸뤸鸾𺸤𺺰𺼤뺸𺰤𱸹뤸𱺹𻸤븼𻼤켸𻰤뺸뤸鸾𼸤𹺰𼼤𸻸𼰤뺸뤸鸾𽸤𸺰𽼤鸹𽰤𱸹뤸븼𾸤𱺹𾼤𾰤𱸹뤸𱺹𿸤𱼹𿼤𿰤쾸뤸麺𸸤𸺰𸼤𸻸𸰤뺸뤸鸾𹸤𸺰𹼤𱸹𹰤𱺹뤸븼𺸤𱼹𺼤𹸰𺰤𱼹뤸븺𻸤𱼹𻼤𱸹𻰤𱺹뤸𼸤𱾹𼼤麺𼰤𺺰뤸뺸𽸤뺸𽼤鸾𽰤𻺰뤸뺸𾸤뺸𾼤𰺹𾰤뺺뤸뺸𿸤참𿼤뺺𿰤뾸뤸𰻺꺸𸸤鸻𸼤麸𸰤𱰸뤸𹸰𹸤찺𹼤꺰𹰤뤸𰺸𺸤뺺𺼤𸻸𺰤鰸뤸麸𻸤뺸𻼤鼼𻰤뤸龸𼸤鼸鸸𼼤뺸𼰤鼰뤸𽸤鸽𽼤𽰤뤸뺸𾸤鸾𾼤𸺰𾰤𱰹뤸뺸𿸤黸𿼤鰸𿰤꺸뤸뺸𸸤𰻻𸼤𰸰𸰤뤸𱰸𹸤𹼤븺𹰤븺뤸𺸤𸹸𺼤𰺺𺰤齰뤸𰻻꾸𻸤麸𻼤𰻻𻰤𸼰뤸𱸹𼸤𰺸𼼤𱹻𼰤뤸𸹸𽸤𽼤𽰤鹸뤸뺸𾸤鸿𾼤𸺰𾰤龹뤸鰹𿸤𺻸𿼤𰺹𿰤鼹뤸캸븸𸸤켸𸼤𸰤츸븹뤸𰺹𹸤츺븸𹼤𹰤鸸뤸鹺뺸𺸤麹𺼤츸𺰤캸뤸𻸤켸𻼤츺𻰤뺸뤸鸽𼸤𰺸𼼤齼𼰤龸뤸𽸤鰸𽼤龹𽰤뺸뤸븸𾸤𹰰𾼤𺻸𾰤鹺뤸𰺹𿸤鼹𿼤캸𿰤켸뤸𸸤츸𸼤𰺹𸰤츺뤸𹸤鸽뺸𹼤鸸𹰤鹺뺸뤸麹𺸤츸𺼤캸𺰤뤸켸𻸤츺𻼤龸𻰤뺸뤸븸𼸤𼼤𺻸𼰤뤸𽸤𽼤𻿸𽰤鹾뤸긹𾸤鸾𾼤뺸𾰤뤸븸𿸤𰺸𿼤𰺽𿰤𱰹뤸𸸤꼹𸼤𰻻𸰤뺺뤸걺𹸤꾹𹼤鸿𹰤뺸뤸𰺸𺸤𰺽𺼤𰻻𺰤뺺뤸꺹𻸤𻼤갽𻰤鸿뤸뺸𼸤𰺸𼼤鸻븸𼰤𰺽뤸𰻻𽸤뺺𽼤鸾𽰤뺸뤸𾸤鸿𾼤𾰤뤸뺸𿸤𰺸𿼤븸𿰤𰺽뤸𰻻𸸤뺺𸼤𸰤뤸𹸤뺸𹼤븼𹰤츸뤸鸸𺸤𰻺꾸𺼤𰺺𺰤뤸𰺸𻸤𰻻𻼤뺺𻰤𹹸뤸뺸𼸤븼𼼤𱸹𼰤뺸뤸鸰𽸤꼸𽼤뺸𽰤𰺸뤸뺺𾸤鸸𾼤뺸𾰤黼뤸𺰰𿸤뺸𿼤뺸𿰤鸼뤸𸰰𸸤뺸𸼤鼺𸰤𸺰뤸𸹸𹸤𰺸𹼤뺺𹰤뺸뤸鸾𺸤𺾰𺼤븺𺰤𹸰뤸뺸𻸤𰺹𻼤뺺𻰤뺸뤸鸸𼸤𰺾𼼤鸸𼰤참뤸𰻻𽸤𰸰𽼤𸺰𽰤鸸뤸𹸰𾸤鸹𾼤𸻻뺸𾰤𰺹뤸鸸𿸤뺸𿼤黼𿰤𻺰뤸븺𸸤뺸𸼤鸾𸰤𻺰뤸븺𹸤鸸𹼤𸻸𹰤𰸰꼸뤸𻺰𺸤븺𺼤鸸𺰤뺸뤸黼𻸤鰸𻼤뺸𻰤뺸뤸𰻻𼸤𰸰𼼤𹺰𼰤𰸰꺸뤸뺸𽸤鸾𽼤𺺰𽰤뺸뺻뤸𰸰꺸𾸤𺺰𾼤뺸뺻𾰤𰸰꺸뤸𻺰𿸤븺𿼤뺸뺻𿰤鸾뤸𺺰𸸤븺𸼤뺸𸰤𰺸뤸뺺𹸤뺻𹼤鸼𹰤𸾰뤸𸹸𺸤븺𺼤뺸뺻𺰤뺺뤸뺸뺻𻸤뺺𻼤鸹𻰤뺸뤸鼸𼸤鰸𼼤𸹸𼰤뺸뺻뤸뺺𽸤麹𽼤뺸𽰤鼼뤸鰸𾸤鸸𾼤𾰤𱸸뤸𿸤麸𿼤뺸𿰤鼸뤸𸸤뺸뺻𸼤𸰤뤸𹸤참𹼤黺𹰤𺺰뤸븺𺸤鸸𺼤𰻻𺰤𰸰뤸𹺰𻸤𸻸𻼤뺸𻰤鸾뤸𺺰𼸤뺸𼼤𸻸𼰤𰺺꼸뤸뺺𽸤븺𽼤𹸰𽰤븺뤸鸾𾸤𻺰𾼤븺𾰤뺸뤸𰺸𿸤鸼𿼤𸾰𿰤뺺뤸뺸𸸤뺺𸼤뺸𸰤뺺뤸鸹𹸤뺸𹼤鼸𹰤鰸뤸븺𺸤뺸𺼤鸸𺰤꼸뤸뺸뺻𻸤𰺸𻼤뺺𻰤뤸𱸸𼸤𼼤鸸𼰤뤸𽸤𽼤𸻸𽰤𰺹뤸뺺𾸤뺺𾼤鼹𾰤뺸뤸鼰𿸤鰸𿼤麹𿰤𰺸뤸鸼𸸤鹺뾸𸼤鸸𸰤켼뤸𱸹𹸤𹼤캼𹰤麸뤸鼾𺸤𺼤츺𺰤뺸뤸鸾𻸤𸺰𻼤鸿𻰤븼뤸𱸸𼸤鸿𼼤뺸𼰤𰻺뤸꾸𽸤鸻𽼤뺸𽰤𰻺뤸鸻𾸤뺸𾼤鸻𾰤𰻺鸸뤸麸𿸤鼸鸸𿼤뺸𿰤鼰뤸𸸤麹𸼤𸰤뤸𹸤𱸹𹼤뺸𹰤麸뤸鰸𺸤𱺹𺼤麸𺰤뤸뺸𻸤龼𻼤𻰤鹸뤸𹼰𼸤𱰹𼼤𸻸𼰤鸹뤸갽𽸤뺸𽼤𽰤븸뤸𹼰𾸤𰺸𾼤𰻺𾰤꼸뤸𱼸𿸤쾸龿𿼤鸾𿰤𰺸뤸꾹𸸤긽𸼤꼸鸸𸰤鿾뤸𸼰𹸤𰺽𹼤鸻𹰤𱰸뤸븹𺸤븸𺼤𺰤鸾뤸麸𻸤꺸𻼤뺸𻰤龼뤸𼸤갸𼼤𰻺꾸𼰤걺꺸뤸껰𽸤𰹰𽼤𸹸𽰤𸹸뤸𸹸𾸤꾿𾼤鸺𾰤𰻻뤸𰹰𿸤𸹸𿼤𸹸𿰤𸹸뤸갿𸸤껿𸼤𰸰𸰤鸾뤸𸺰𹸤𱰸𹼤뺸𹰤鸾뤸𺺰𺸤鸾𺼤𱰸𺰤黾뤸𺼰𻸤鹸𻼤黺𻰤𺼰뤸𱰹𼸤鸰𼼤𰻺𼰤黼뤸𻾰𽸤鸸𽼤뺸𽰤𰻺뤸黸𾸤𻾰𾼤𱰸𾰤뺸뤸鸾𿸤𺺰𿼤𿰤鿾뤸𻰰𸸤𸼤𰹰𸰤𸹸뤸𸹸𹸤𸹸𹼤븸𹰤𹺰뤸𺸤𹸰𺼤𺰤𻼰뤸𻸤𹸰𻼤𰻺꾸𻰤𰻺꾸뤸𰺸𼸤𼼤鸿𼰤뤸𸻸𽸤갸𽼤鸿𽰤麺뤸𱸸𾸤뺸𾼤麸𾰤뤸𱺸𿸤𿼤𿰤𸹸뤸𸸤참𸼤𰻻𸰤𰸰뤸𹺰𹸤𸹸𹼤뺸𹰤鸾뤸𹺰𺸤𸹸𺼤뺸𺰤鸾뤸𸺰𻸤𸹸𻼤뺸𻰤𰺽뤸鸸𼸤黼𼼤鰸𼰤𸹸뤸쾸𽸤𽼤𹼰𽰤𰺸뤸뺸𾸤鸾𾼤𻺰𾰤븺뤸뺸𿸤鸾𿼤𹺰𿰤𰸰꺸뤸𹸰𸸤븺𸼤𻺰𸰤참뤸𹸤𸾰𹼤𰺸𹰤참뤸𸻸𺸤껻𺼤𰺹𺰤𱰸길뤸黰𻸤麻𻼤븸𻰤𸾰뤸𸻺𼸤𰺸𼼤𹸰𼰤뺺뤸鹸𽸤뺸𽼤鸼𽰤𸺰뤸鸹𾸤麸𾼤븺𾰤𰻺뺸뤸𱺸𿸤뺸𿼤𱸹𿰤鸾뤸𸺰𸸤鸸𸼤𸰤𸹸뤸뺸𹸤鸸𹼤𰺽𹰤꼸뤸𰺸𺸤𰻺𺼤麸𺰤鰸뤸𸹸𻸤鼺𻼤𻰤𰻺뺸뤸𸻸𼸤뺺𼼤鸹𼰤뺸뤸뺸𽸤鸰𽼤𽰤뺺뤸鸸𾸤뺸𾼤뺺𾰤黾뤸𹼰𿸤𱸹𿼤𱸹𿰤𸻸뤸麹𸸤𸼤𸻸𸰤龹뤸𱺸𹸤鸹𹼤鼹𹰤𱿺뺸뤸𰺸븸𺸤鹸𺼤𱰸𺰤켹뤸뺹븸𻸤찹𻼤𰺽𻰤꼸뤸𰺸𼸤鸻𼼤𰹰𼰤𸹸뤸𸹸𽸤𸹸𽼤𰺿𽰤𰹰뤸𸹸𾸤𸹸𾼤𸹸𾰤鿻뤸𰻺𿸤꼸𿼤𰺸𿰤鸸뤸鼺𸸤𸼤뺺븹𸰤캺뤸𹸤𹼤𹰤麹뤸뺸𺸤鼼𺼤鸹𺰤鰸뤸𰻺뺸𻸤𱺸𻼤뺸𻰤鸾뤸𸺰𼸤𱸹𼼤𼰤𸹸뤸𰺹𽸤麸𽼤鰸𽰤𰻺뤸麹𾸤鸸𾼤뺸𾰤뤸鼸𿸤𿼤𿰤뤸𸻸𸸤𰺹𸼤뺺𸰤븺뤸鸹𹸤𰺸𹼤𰺸𹰤캼뤸츼𺸤𱸸𺼤𱺸𺰤𱼹뤸𻸤𱾹𻼤麺𻰤𸺰뤸鸸𼸤𹸰𼼤긹𼰤鼺뤸𽸤𰺸𽼤긹𽰤뤸𾸤𾼤뺹𾰤𰸰뤸𹺰𿸤𸻸𿼤𰺹𿰤뺺뤸븺𸸤鸸𸼤뺸𸰤黼뤸갹𹸤鹸𹼤𹰰𹰤뤸뺸𺸤𰻻𺼤𰸰𺰤𺺰뤸뺸𻸤鹸𻼤뺸𻰤𰸰뤸𻺰𼸤뺸𼼤𸻺𼰤鸸뤸𰺹𽸤黼𽼤𹺰𽰤뺸뤸𰸰𾸤𻺰𾼤뺸𾰤뺸뤸𰸰𿸤𺺰𿼤븸𿰤뺸뤸𰸰𸸤𹺰𸼤갹𸰤뺸뤸츸𹸤븼𹼤𹻸𹰤뺸뤸𰺹𺸤뺺𺼤𹸰𺰤븸뤸𸻸𻸤𰺹𻼤𹸰𻰤뺺뤸𼸤𱸹𼼤鹸𼰤鹺쾸뤸뺸𽸤鸾𽼤𺺰𽰤鸽뤸齾𾸤𹺰𾼤鿾𾰤뺸뤸鸾𿸤𹺰𿼤𺱺𿰤𹸰뤸鰹𸸤𸺰𸼤𱸸𸰤븺뤸𹸰𹸤븺𹼤𹰤𱺹뤸鰹𺸤齺𺼤𹺰𺰤븹뤸뺹𻸤鸾𻼤𺺰𻰤븺뤸뺸𼸤𼼤𰺸𼰤𹸰뤸뺺𽸤뺹𽼤鸾𽰤𸺰뤸齾𾸤뺸𾼤𰺸𾰤뺺뤸뺹𿸤鸾𿼤𻺰𿰤鸽뤸齾𸸤𹺰𸼤길𸰤뺸뤸𰺹𹸤𹸰𹼤뺺𹰤뺸뤸길𺸤𰺹𺼤뺺𺰤𹸰뤸븺𻸤鸸𻼤𰻻𻰤𰸰뤸𼸤鿺𼼤𼰤麹뤸뺸𽸤鼼𽼤鰸𽰤𰻻뤸𰸰𾸤𸺰𾼤뾸𾰤뺸뤸껸𿸤𰺸𿼤𰻻𿰤꾸뤸鼸𸸤龸𸼤𱺹𸰤켹뤸𹸤𱸹𹼤麺𹰤𹺰뤸𰺹𺸤켹𺼤鸸𺰤𺺰뤸뺸𻸤뺸𻼤𱸹𻰤𰸰뤸𸺰𼸤𱺹𼼤𼰤𸹸뤸麺𽸤𺺰𽼤뺸𽰤𰺹뤸𰻺𾸤𹸰𾼤鰺츸𾰤뺸뤸𰺸𿸤鸾𿼤𿰤뺺뤸𸸤麸𸼤齺𸰤𻺰뤸鸽𹸤븺𹼤븺𹰤鸽뤸齾𺸤𺼤鹺쾸𺰤뤸𺺰𻸤븺𻼤뺸𻰤鸾뤸𸺰𼸤鿾𼼤뺸𼰤鸾뤸𹺰𽸤鿾𽼤𸻸𽰤뺺뤸뺸𾸤뺺𾼤𹺰𾰤鹸뤸뺸𿸤齼𿼤鰸𿰤𱾹뤸𱱺쾸𸸤뺸𸼤𰻻𸰤𰸰뤸𻺰𹸤鸽𹼤𰻺븹𹰤𰸰븸뤸𻺰𺸤鸽𺼤麹𺰤뾸뤸뺸𻸤鸾𻼤𹺰𻰤麸뤸뺸𼸤鿺𼼤𸺰𼰤뺺뤸𹸰𽸤뺸𽼤뺸𽰤𹸰뤸뺺𾸤鼾𾼤𾰤뾸뤸鸽𿸤뺸𿼤齼𿰤뤸𱱺쾸𸸤𸼤𸰤뤸𹸤𸹸𹼤뺸𹰤鸾뤸𺺰𺸤뺸𺼤𰺸𺰤鸾뤸𹺰𻸤뺺𻼤뺸𻰤길뤸𰺹𼸤뺺𼼤뺸𼰤鸾뤸𸺰𽸤𸻻빰𽼤븺𽰤鸹뤸𾸤𱸹𾼤𹹸𾰤뤸𱸹𿸤鸰𿼤𿰤𸹸뤸𸸤𱸹𸼤鸸𸰤𰻻뤸𰸰𹸤𻺰𹼤븺𹰤𰻻뤸𰸰𺸤𻺰𺼤뺸𺰤뺸뤸뺺𻸤뺸𻼤뺺𻰤뤸𱸹𼸤𰺹𼼤뺺𼰤뤸𽸤뺸𽼤鸾𽰤𻺰뤸뺸𾸤뺸𾼤뺺𾰤븺뤸뺸𿸤鸾𿼤𻺰𿰤뺹뤸뺸𸸤뺺𸼤븺𸰤뺹뤸𰸰𹸤𸺰𹼤𸹸𹰤뺸뤸鸾𺸤𹰰𺼤𰺹𺰤뺺뤸𻸤𸹸𻼤뺸𻰤𰻻뤸𰸰𼸤𹺰𼼤𱰹𼰤뺸뤸黸𽸤鰸𽼤𸻻빰𽰤𱾹뤸𰻺꺸𾸤鸸𾼤麸𾰤𱰸뤸뺸𿸤黸𿼤𿰤𰻺꺸뤸鸸𸸤𰸰꾸𸼤𻺰𸰤뺸뤸뺸𹸤鹻𹼤𰺹𹰤麸뤸뺺𺸤뺸𺼤鸾𺰤𻺰뤸참𻸤뺸𻼤𰻻𻰤𰸰뤸𺺰𼸤참𼼤뺸𼰤𰺹뤸뺺𽸤참𽼤𰻻𽰤𰸰뤸𹺰𾸤뺸𾼤鸾𾰤𻺰뤸鸸𿸤뺸𿼤鸾𿰤𺺰뤸뺸𸸤鸸𸼤뺸𸰤꾸뤸𰺹𹸤뺺𹼤뺸𹰤鸾뤸𺺰𺸤뺸𺼤뺸𺰤𰸰뤸𸺰𻸤黺𻼤뺸𻰤𰺹뤸뺺𼸤𻾰𼼤뺸𼰤뺸뤸길𽸤𰺹𽼤뺺𽰤뺸뤸鸾𾸤𺺰𾼤鸸𾰤𰺸뤸鸰𿸤黾𿼤𸺰𿰤뺺뤸뺸𸸤길𸼤𰺹𸰤뺺뤸鸸𹸤𸻻빰𹼤麸𹰤뤸𸹸𺸤𺼤참𺰤𰻻뤸𰸰𻸤𺺰𻼤뺹𻰤𸻸뤸𰺺길𼸤𹸰𼼤뺺𼰤鸾뤸𸺰𽸤껻𽼤𰸰꺸𽰤𺺰뤸뺸𾸤껻𾼤𰻻𾰤𰺸뤸꾸𿸤鸼𿼤𺺰𿰤뺸뤸뺸𸸤鸾𸼤𺺰𸰤𰺹뤸𰺹𹸤뺺𹼤𹸰𹰤𱸹뤸鸾𺸤𸺰𺼤𱸹𺰤뤸𰺸𻸤𻼤𸹸𻰤뺸뤸鸸𼸤꾸𼼤𰺸𼰤𰺹뤸뺺𽸤𽼤𽰤𸸸뤸𸸸𾸤𸸸𾼤𸸸𾰤𸸸뤸𸸸𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𸸸𸼤齸𸰤齸뤸𸸸𹸤뼱𹼤𼱼𹰤뤸𺸤𺼤𱺽뾽𺰤갹뤸뼿𻸤밹𻼤鰰𻰤鰾뤸뼸뾼𼸤칻𼼤𸸸𼰤𸸸뤸𸸸𽸤𸸸𽼤𸸸𽰤𸸸뤸𸸸𾸤𸸸𾼤𸸸𾰤𼼾뤸𻹻𿸤𻸻𿼤𸸸𿰤𻹻黼뤸𻼻黸 \ No newline at end of file diff --git a/firmware/Touch screen calibration files Touch/SileadTouch.sys b/firmware/Touch screen calibration files Touch/SileadTouch.sys new file mode 100644 index 0000000..fc869f6 Binary files /dev/null and b/firmware/Touch screen calibration files Touch/SileadTouch.sys differ diff --git a/firmware/silead_ts.fw b/firmware/silead_ts.fw new file mode 100644 index 0000000..59cb875 Binary files /dev/null and b/firmware/silead_ts.fw differ diff --git a/tools/AUTHORS.md b/tools/AUTHORS.md new file mode 100644 index 0000000..c1622f1 --- /dev/null +++ b/tools/AUTHORS.md @@ -0,0 +1,3 @@ +fw_extractor is (c) 2013-2014 by Joe Burmeister +fwtool, unscramble, untscfg and autoconvert are (c) 2015-2016 by Gregor Riepl +scanwindrv is (c) 2018 by Gregor Riepl , based on an example script by Bernhard Übelacker \ No newline at end of file diff --git a/tools/Firmware/Silead.pm b/tools/Firmware/Silead.pm new file mode 100644 index 0000000..9a14763 --- /dev/null +++ b/tools/Firmware/Silead.pm @@ -0,0 +1,530 @@ +package Firmware::Silead; + +use strict; +use IO::File; + +our $MAGIC = 'GSLX'; +our $FORMAT = 1; +our $HEADER_SIZE = 24; +our $PAGE_SIZE = 132; + +sub _unpack_header { + my ($header) = @_; + return (unpack '(a4a4S4C4L)<', $header); +} + +sub _unpack_page { + my ($buffer) = @_; + return (unpack '(S2a128)<', $buffer); +} + +sub _pack_header { + my ($model, @params) = @_; + return pack '(a4a4S4C4L)<', $MAGIC, $model, $FORMAT, @params +} + +sub _pack_page { + my ($page, $data) = @_; + return pack '(S2a128)<', $page, length $data, $data; +} + +sub new { + my ($class) = @_; + return bless { + pages => { }, + model => '', + touches => 0, + width => 0, + height => 0, + swapped => 0, + xmirrored => 0, + ymirrored => 0, + tracking => 0, + }, ref $class ? ref $class : $class; +} + +sub load { + my ($class, $handle) = @_; + if (!ref $handle) { + $handle = IO::File->new($handle, 'r'); + } + if (!defined $handle) { + $@ = "Invalid file handle"; + return undef; + } + binmode $handle; + read $handle, my $header, $HEADER_SIZE; + my ($magic, $model, $format, $touches, $width, $height, $swapped, $xmirrored, $ymirrored, $tracking, $pages) = _unpack_header $header; + if ($magic ne $MAGIC) { + $@ = "Invalid magic $magic"; + return undef; + } + if ($format ne $FORMAT) { + $@ = "Invalid file format $format"; + return undef; + } + my $self = bless { + pages => { }, + model => $model, + touches => $touches, + width => $width, + height => $height, + swapped => $swapped, + xmirrored => $xmirrored, + ymirrored => $ymirrored, + tracking => $tracking, + }, ref $class ? ref $class : $class; + for (my $i = 0; $i < $pages; $i++) { + read $handle, my $buffer, $PAGE_SIZE; + my ($address, $size, $data) = _unpack_page $buffer; + if (!$self->set_page($address, substr $data, 0, $size)) { + return undef; + } + } + return $self; +} + +sub save { + my ($self, $handle) = @_; + if (!ref $handle) { + $handle = IO::File->new($handle, 'w'); + } + if (!defined $handle) { + $@ = "Invalid file handle"; + return 0; + } + binmode $handle; + my @pages = $self->get_pages; + my $header = _pack_header $self->model, $self->touches, $self->width, $self->height, $self->swapped, $self->xmirrored, $self->ymirrored, $self->tracking, scalar(@pages); + print $handle $header; + for my $page (@pages) { + my $pagedata = $self->get_page($page); + my $buffer = _pack_page $page, $pagedata; + print $handle $buffer; + } + return 1; +} + +sub unpack { + my ($class, $data) = @_; + my $header = substr $data, 0, $HEADER_SIZE; + my ($magic, $model, $format, $touches, $width, $height, $swapped, $xmirrored, $ymirrored, $tracking, $pages) = _unpack_header $header; + if ($magic ne $MAGIC) { + $@ = "Invalid magic $magic"; + return undef; + } + if ($format ne $FORMAT) { + $@ = "Invalid file format $format"; + return undef; + } + my $self = bless { + pages => { }, + model => $model, + touches => $touches, + width => $width, + height => $height, + swapped => $swapped, + xmirrored => $xmirrored, + ymirrored => $ymirrored, + tracking => $tracking, + }, ref $class ? ref $class : $class; + for (my $i = 0; $i < $pages; $i++) { + my $buffer = substr $HEADER_SIZE + $i * $PAGE_SIZE, $PAGE_SIZE; + my ($address, $size, $data) = _unpack_page $buffer ; + if (!$self->set_page($address, substr $data, 0, $size)) { + return undef; + } + } + return $self; +} + +sub pack { + my ($self) = @_; + my $data = ''; + my @pages = $self->get_pages; + my $header = _pack_header $self->model, $self->touches, $self->width, $self->height, $self->swapped, $self->xmirrored, $self->ymirrored, $self->tracking, scalar(@pages); + $data .= $header; + for my $page (@pages) { + my $pagedata = $self->get_page($page); + my $buffer = _pack_page $page, $pagedata; + $data .= $buffer; + } + return $data; +} + +sub import_scrambled { + my ($self, $input) = @_; + my $tscfg = ''; + for my $byte (split //, $input) { + my $descrambled = chr(ord($byte) ^ 0x88); + $tscfg .= $descrambled; + } + return $self->import_tscfg($tscfg); +} + +sub import_tscfg { + my ($self, $input) = @_; + my ($cfg, $fw) = (0, ''); + for my $line (split /\n/, $input) { + if ($cfg and $line =~ /};/) { + $cfg = 0; + } + if ($line =~ /TS_CFG_DATA|GSLX68X_FW/) { + $cfg = 1; + } + if ($cfg) { + $line =~ s/\s//g; + $line = lc($line); + if ($line =~ /{0x([0-9a-f]+),0x([0-9a-f]+)},/) { + my $address = hex($1); + my $data = hex($2); + $fw .= pack '(LL)<', $address, $data; + } + } + } + return $self->import_fw($fw); +} + +sub import_fw { + my ($self, $input) = @_; + + my $length = length $input; + + my ($page, $lastaddr, $data); + for (my $offset = 0; $offset + 7 < $length; $offset += 8) { + my $buffer = substr $input, $offset, 8; + my ($addr, $value) = unpack '(L2)<', $buffer; + if ($addr == 0xf0) { + if (defined $data) { + $self->set_page($page, $data) or return 0; + } + $page = $value; + $lastaddr = undef; + $data = ''; + printf "Got page 0x%02x\n", $page; + } else { + if (!defined $page) { + $@ = "Invalid firmware: page command missing at start"; + return 0; + } + if ($addr > 128) { + $@ = sprintf "Invalid firmware: invalid address %d at page 0x%02x, max 128", $addr, $page; + return 0; + } + if (defined $lastaddr and $addr != $lastaddr + 4) { + $@ = sprintf "Invalid firmware: non-consecutive at page 0x%02x, address 0x%02x, expected 0x%02x", $page, $addr, $lastaddr + 4; + return 0; + } + $data .= substr $buffer, 4, 4; + $lastaddr = $addr; + } + } + if (defined $page and defined $data) { + # the last page has not been stored yet + return $self->set_page($page, $data); + } + return 1; +} + +sub export_fw { + my ($self) = @_; + my $data = ''; + my @pages = $self->get_pages; + for my $page (@pages) { + my $pagedata = $self->get_page($page); + $data .= pack '(L2)<', 0xf0, $page; + my $length = length $pagedata; + for (my $offset = 0; $offset + 3 < $length; $offset += 4) { + my $word = substr $pagedata, $offset, 4; + $data .= pack '(La4)<', $offset, $word; + } + } + return $data; +} + +sub set_page { + my ($self, $page, $data) = @_; + if ($page > 0xff) { + $@ = "Invalid page number $page"; + return 0; + } + if (length $data > 128) { + $@ = "Page too large"; + return 0; + } + $self->{pages}->{$page} = $data; + return 1; +} + +sub delete_page { + my ($self, $page) = @_; + if (!exists $self->{pages}->{$page}) { + $@ = "Page number $page does not exist"; + return 0; + } + delete $self->{pages}->{$page}; + return 1; +} + +sub get_pages { + my ($self) = @_; + return sort { $a <=> $b } keys %{$self->{pages}}; +} + +sub get_page { + my ($self, $page) = @_; + return $self->{pages}->{$page}; +} + +sub touches { + return shift->{touches}; +} + +sub set_touches { + my ($self, $value) = @_; + $self->{touches} = $value; +} + +sub model { + return shift->{model}; +} + +sub set_model { + my ($self, $value) = @_; + $self->{model} = $value; +} + +sub width { + return shift->{width}; +} + +sub set_width { + my ($self, $value) = @_; + $self->{width} = $value; +} + +sub height { + return shift->{height}; +} + +sub set_height { + my ($self, $value) = @_; + $self->{height} = $value; +} + +sub swapped { + return shift->{swapped}; +} + +sub set_swapped { + my ($self, $value) = @_; + $self->{swapped} = $value; +} + +sub xmirrored { + return shift->{xmirrored}; +} + +sub set_xmirrored { + my ($self, $value) = @_; + $self->{xmirrored} = $value; +} + +sub ymirrored { + return shift->{ymirrored}; +} + +sub set_ymirrored { + my ($self, $value) = @_; + $self->{ymirrored} = $value; +} + +sub tracking { + return shift->{tracking}; +} + +sub set_tracking { + my ($self, $value) = @_; + $self->{tracking} = $value; +} + +=head1 NAME + +Firmware::Silead - Silead touchscren firmware packager + +=head1 SYNOPSIS + + use Firmware::Silead; + my $rep = Firmware::Silead->new(); + printf "width=%d height=%d num_touches=%d\n", $req->width, $rep->height, $rep->touches; + $rep->add_page(0x00, "\0" x 128); + $rep->save('firmware.fw'); + + $rep = Firmware::Silead->load('firmware.fw'); + print unpack('H*', $req->get_page(0x00)); + +=head1 DESCRIPTION + +=head2 Constructors + +On error, all constructors set C<$@> to a description +of the error and return C. + +=head3 C + +Creates a new firmware image without data. + +=head3 C + +Loads a firmware image from a file. +C<$io> may be a file handle or a file name. + +=head3 C + +Unpacks a firmware image from a byte string. + +=head2 Import/Export + +These methods allow importing firmware data from various formats. +Limited export is also available. + +Note: Page order is not preserved when importing firmware. +Pages are always sorted sequentially. + +=head3 C + +Import a firmware image from a scrambled TS_CFG.h byte string, as used in the form +of SileadTouch.fw by newer Windows drivers. + +=head3 C + +Import a firmware image from a plain TS_CFG.h byte string, as used by older +Windows drivers. + +=head3 C + +Import a firmware image in legacy format, as used by most other Linux and +Android drivers. + +=head3 C + +Export a firmware image into legacy format, as usable by most other Linux and +Android drivers. A binary string is returned. + +=head2 Storage + +=head3 C + +Saves the firmware data to a file. +C<$io> may be a file handle or a file name. + +=head3 C + +Packs a firmware image into a byte string and returns it. + +=head2 Accessors + +=head3 C + C + +Gets/sets the controller model ID. +The ID is a 4-character ASCII string identifying the +particular controller supported by this firmware. + +Examples: 1680, 3682 + +=head3 C + C + +Gets/sets the panel width. + +=head3 C + C + +Gets/sets the panel height. + +=head3 C + C + +Gets/sets the number of supported touch points. + +=head3 C + C + +Gets/sets the axis swapping flag. +If true, the X and Y axes are swapped. + +=head3 C + C + +Gets/sets the X axis mirroring flag. +If true, the X axis is inverted. + +=head3 C + C + +Gets/sets the y axis mirroring flag. +If true, the Y axis is inverted. + +=head3 C + C + +Gets/sets the software tracking flag. +If true, hardware finger tracking is not available and +driver finger tracking will be used instead. + +=head2 Page access + +On error, all page accessors set C<$@> to a description +of the error. They return 1 on success, 0 on error. + +=head3 C + +Returns the list of defined pages (their page addresses, actually). + +=head3 C + +Returns the binary data for page number C<$page_no>. + +=head3 C + +Stores the data of page number C<$page_no>. Automatically defines +the page if it did not exist previously. + +=head3 C + +Removes page C<$page_no>. + +=head1 FIRMWARE FORMAT + +=head2 New-style firmware file format, version 1 + + Offset | Type | Description + ------------------------------------------------------------------- + 0 | u8[4] | ASCII 'GSLX' (magic) + 4 | u8[4] | Touchscreen model (ASCII string) + 8 | u16le | File format version (1) + 10 | u16le | Number of supported touch events + 12 | u16le | Panel width (0..4095) + 14 | u16le | Panel height (0..4095) + 16 | u8 | 1 if X and Y axis are swapped, 0 otherwise + 17 | u8 | 1 if X axis is mirrored, 0 otherwise + 18 | u8 | 1 if Y axis is mirrored, 0 otherwise + 19 | u8 | 0 if finger tracking is supported by hardware, + | | 1 if the driver needs to provide it + 20 | u32le | Number of memory pages that follow (N) + 24 | u16le | Memory page 1: Page address + 26 | u16le | Memory page 1: Effective size in bytes + 28 | u8[128] | Memory page 1: Data (must be 0 padded) + ... + 24+N*132 | u16le | Memory page N: Page address + 26+N*132 | u16le | Memory page N: Effective size in bytes + 28+N*132 | u8[128] | Memory page N: Data (must be 0 padded) + +=head1 AUTHOR + +Gregor Riepl + +=cut + +1; diff --git a/tools/LICENSE b/tools/LICENSE new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/tools/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/tools/SileadTouch.fw b/tools/SileadTouch.fw new file mode 100644 index 0000000..f089f6f --- /dev/null +++ b/tools/SileadTouch.fw @@ -0,0 +1 @@ +ը󅂁𺸸뻿뼤𰹸餸𹰸𹰸길𽹸𻺸𼤸𱸸𼸸𹸾𹸼𹺼𾼤龸鸸츸줸츸𰸼𱸸𱸸𹼸뤸鸸뤸鸸𼸸𹸰𹤧𹸸𹸸𰸸𺺹𺸹𿸾긱𹸸줸𹼹𹱹餸𺹺𺽺𺱺餸𻺻𻾻黱ꤸ𻸺𼸼𾸽鸰ꤸ𹽹깱𺸹뤅𺽺꺱𻸺뤸𻽻𻱻餸뤸줅𻸺𿸾鸱뤸𹻹𹿹鹱뤅𺻺𺿺麱뤸𻻻𻿻黱뤅𻸺𿸾鸱뤸𹻹𹿹鹱뤅𺻺𺿺麱뤸𻻻𻿻黱뤅𻸺𿸾鸱뤸𹻹𹿹鹱뤅𺻺𺿺麱뤸𻻻𻿻黱뤅𻸺𿸾鸱뤸𹻹𹿹鹱뤅𺻺𺿺麱뤸𻻻𻿻黱뤅𻤅𹸹𹸸𺸤𹸤𰤸𼤅𼤸𾸸븤ɨը󅂧᥻أυ+2+2+2𸸤𸸸𸼤𸸸𸰤𸸸뤸𸸸𹸤𸸸𹼤𸸸𹰤𸸸뤸𸸸𺸤𸸸𺼤𸸸𺰤𸸸뤸𸸸𻸤𸸸𻼤𸸸𻰤𸸸뤸𸸸𼸤𸸸𼼤𸸸𼰤𸸸뤸𸸸𽸤𸸸𽼤𸸸𽰤𸸸뤸𸸸𾸤𸸸𾼤𾰤𸸸뤸𹸸𿸤𸸸𿼤𸸸𿰤𸸸뤸𹰹𸸤鱽𸼤𸸸𸰤𸸸뤸𸸸𹸤𸸸𹼤𸸸𹰤𸸸뤸𸸸𺸤𸸸𺼤𸸸𺰤𸸸뤸𸸸𻸤𸸸𻼤𸸸𻰤𸸸뤸𸸸𼸤𸸸𼼤𸸸𼰤𸸸뤸𸸸𽸤𸸸𽼤𸸸𽰤𸸸뤸𸸸𾸤𸸸𾼤븸𾰤𸸸뤸𸸸𿸤𸸸𿼤𿰤뤸𸸸𸸤𸸸𸼤𸸸𸰤𸸸뤸𸸸𹸤𸸸𹼤𸸸𹰤𸸸뤸𸸸𺸤𸸸𺼤𸸸𺰤𸸸뤸𸸸𻸤𸸸𻼤𸸸𻰤𸸸뤸𸸸𼸤𸸸𼼤𸼸鸸𼰤𸸹뤸鸸𽸤𸸸𽼤𸸸𽰤𸼸뤸𸰸𾸤𾼤𹸹𾰤𹼹뤸𹰹𿸤𿼤𸸹𿰤𰸰뤸鱰𸸤𸸸𸼤𸸸𸰤𸸸뤸𰸾𹸤𸸸𹼤𸸸𹰤𸸸뤸𹸾𺸤𹸼𺼤𸸸𺰤𸸸뤸𸸸𻸤𰸰𻼤𰸰𻰤𰸰뤸𰸰𼸤𰸰𼼤𰸰𼰤𰸰뤸𰸰𽸤𽼤𸸸𽰤𸸸뤸𸸸𾸤𸸸𾼤𸸸𾰤𸸸뤸𸸸𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𸸸𸼤𸸸𸰤𸸸뤸𸼸𹸤𸸸𹼤𹼸鹼𹰤𸸸뤸𸸸𺸤𸸸𺼤𸸸𺰤𸸸뤸𻸤𻼤𸸸𻰤𸸸뤸𸸸𼸤𰸸𼼤𸸹𼰤𸸸뤸𸼸𽸤𸸸𽼤𸸸𽰤𸸸뤸𹺼𾸤𺸹𾼤𸸸𾰤𸸸뤸𸸸𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𸹸츸𸼤𸻸𸰤𸽹뤸𸿹𹸤𸱹𹼤깿鹾𹰤𸸸뤸𸸸𺸤𸸸𺼤𺰤뤸𻸤𻼤𸸸𻰤𸸸뤸𸸸𼸤𸸸𼼤𸸾𼰤𸰹뤸𸸸𽸤𸸸𽼤𸸸𽰤𸸸뤸𸸹츸𾸤𸸹𾼤𸸹𾰤𸸸鸸뤸𸸸鸸𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸾𸸤𸼤츹𸰤긹뤸𹸤𹼤𹰤뤸𺸤𺼤𺻰𺰤𺻼뤸𺻸𻸤𻼤𺺰𻰤𺺼뤸𼺸𼸤𸹸𼼤𸱸𼰤𹹹뤸𸺸𽸤𽼤𹺹𽰤𸸸츸뤸𸸸𾸤𸸸𾼤𸼸𾰤븰뤸𸸻𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𸼤𸸸𸰤뤸𸸸𹸤𹼤𸸸𹰤뤸𸹸𺸤𺼤𸸸𺰤뤸𸸹𻸤𻼤𸸸𻰤뤸𸸸𼸤𼼤𸸸𼰤뤸𸸸𽸤𽼤𸸸𽰤뤸𸸸𾸤𾼤𸸸𾰤뤸𸸸𿸤𿼤𸸸𿰤뤸𸸸𸸤𸸻𸼤𸸼𸰤𸸾鸸뤸𸸾𹸤𸸾𹼤𸸽𹰤𸸽길뤸𸸽𺸤𸸽𺼤𸸽𺰤𸸽뤸𸸽𻸤𸸼븸𻼤𸸾𻰤𸸽뤸𸸽𼸤𸸾𼼤𸸾𼰤𸻽뤸𸸽𽸤𸸽𽼤𸺽𽰤𸺽뤸𸸹븺𾸤𸸾𾼤𸸾𾰤𸸸뤸𸸼𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𸸼𸼤𸸻𸰤𸸺뤸𸸹𹸤𸸹𹼤𸸻𹰤𸸼뤸𸸿𺸤𸸿𺼤𸸿𺰤𸸾븸뤸𸸰𻸤𸸾𻼤𸸽츸𻰤𸸾뤸𸸽𼸤𸸸𼼤𸸸𼰤𸸸뤸𸸸𽸤𸸸𽼤𸸸𽰤𸸸뤸𸸸𾸤𸸸𾼤𸸸𾰤𸸸뤸𸸸𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𸸽𸼤𸸼𸰤𸸾뤸𸸽𹸤𸸾𹼤𸸼븸𹰤𸸽뤸𸸾𺸤𸸽𺼤𸸼𺰤𸸽鸸뤸𸸽𻸤𸸼𻼤𸸻鸸𻰤𸸸뤸𸸹𼸤𸸾鸸𼼤𸸾𼰤𸸾뤸𸸾鸸𽸤𸸿𽼤𸸾𽰤𸸾뤸𸸼츸𾸤𸸽𾼤𸸼𾰤𸸻길뤸𸸺𿸤𸸹븸𿼤𸸹鸸𿰤𸸹뤸𸸻븸𸸤𸸸𸼤𸸸𸰤𸸸뤸𸸸𹸤𸸸𹼤𸸸𹰤𸸸뤸𸸸𺸤𸸸𺼤𸸸𺰤𸸸뤸𸸸𻸤𸸸𻼤𸸸𻰤𸸸뤸𸸸𼸤𸸸𼼤𸸸𼰤𸸸뤸𸸸𽸤𸸸𽼤𸸸𽰤𸸸뤸𸸸𾸤𸸸𾼤𸸸𾰤𸸸뤸𸸸𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𸸸𸼤𸸸𸰤𸸸뤸𸸸𹸤𸸸𹼤𸸸𹰤𸸸뤸𸸸𺸤𸸸𺼤𸸸𺰤𸸸뤸𸸸𻸤𸸸𻼤𸸸𻰤𸸸뤸𸸸𼸤𸸸𼼤𸸸𼰤𸸸뤸𸸸𽸤𸸸𽼤𸸸𽰤𸸸뤸𸸸𾸤𸸸𾼤𸸸𾰤𸸸뤸𸸸𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𸸸𸼤𸸸𸰤𸸸뤸𸸸𹸤𸸸𹼤𸸸𹰤𸸸뤸𸸸𺸤𸸸𺼤𸸸𺰤𸸸뤸𸸸𻸤𸸸𻼤𸸸𻰤𸸸뤸𸸸𼸤𸸸𼼤𸸸𼰤𸸸뤸𸸸𽸤𸸸𽼤𸸸𽰤𸸸뤸𸸸𾸤𸸸𾼤𸸸𾰤𸸸뤸𸸸𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𸸸𸼤𸸸𸰤𸸸뤸𸸸𹸤𸸸𹼤𸸸𹰤𸸸뤸𸸸𺸤𸸸𺼤𸸸𺰤𸸸뤸𸸸𻸤𸸸𻼤𸸸𻰤𸸸뤸𸸸𼸤𸸸𼼤𸸸𼰤𸸸뤸𸸸𽸤𸸸𽼤𸸸𽰤𸸸뤸𸸸𾸤𸸸𾼤𸸸𾰤𸸸뤸𸸸𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𸼤𸸸𸰤𸸸뤸𸸸齰𹸤𸸸𹼤𸸸𹰤𸸸뤸𸸸𺸤𸸸𺼤𸸸𺰤𸸸뤸𸸸𻸤𸸸𻼤𸸸𻰤𸸸뤸𸸸𼸤𸸸𼼤𸸸뽸𼰤𸸸콸뤸𸸸𽸤𸸸𽼤𸸸𽰤𸸸뤸𸸸𾸤𸸸𾼤𸸸鸰𾰤𸸸뤸𸸸껼𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𸸸𸼤𸸸𸰤𸸸뤸𸸸𹸤𸸸𹼤𸸸𹰤𸸸뤸𸸸𺸤𸸸𺼤𸸸𺰤𸸸뤸𸸸𻸤𸸸𻼤𸸸𻰤𸸸뤸𸸸𼸤𸸸𼼤𸸸𼰤𸸸뤸𸸸𽸤𸸸𽼤𸸸𽰤𸸸뤸𸸸𾸤𸸸𾼤𸸸𾰤𸸸뤸𸸸𿸤𸸸𿼤𸸸𿰤𸸸콰뤸𸸤𸹸𸼤𸹸𸰤𸹸뤸𺻻𹸤麹𹼤鼹𹰤뤸𺻻𺸤麹𺼤𺽸𺰤鼹뤸𻸤𸹸𻼤𰺹𻰤𰹰뤸𸹸𼸤𸹸𼼤鼹𼰤鸸뤸𸹸𽸤鸹𽼤麹𽰤鼹뤸龹𾸤鰹𾼤鹸𾰤빸뤸𿸤𱸹𿼤𱺹𿰤𱼹뤸𱾹𸸤𱰹𸼤鹸𸰤빸뤸𹸤𰼹𹼤𸹸𹰤𸹸뤸𰺹𺸤𰹱𺼤𰺹𺰤𰹱뤸𰹰𻸤𸹸𻼤𸹸𻰤𸹸뤸빸𼸤빸𼼤𸹸𼰤𸹸뤸𺿸𽸤龹𽼤鸸𽰤𸹸뤸𼸸𾸤𸹸𾼤𸹸𾰤뤸𸹸𿸤𸻹𿼤𰺹𿰤𸻺뤸𰺹𸸤𸼤𼸸𸰤𸹸뤸𼸸𹸤𸹸𹼤𼸸𹰤𸹸뤸𼸸𺸤𸹸𺼤𺰤𰺹뤸𰹱𻸤𸹸𻼤𸹸𻰤𸹸뤸𼸤𸹸𼼤𸻸𼰤𰺹뤸黰𽸤𸻸𽼤𰺹𽰤𰹱뤸𸹸𾸤𸹸𾼤𸹸𾰤뤸𸹸𿸤𸹸𿼤𸹸𿰤𸹸뤸鿰𸸤𸹸𸼤𸹸𸰤𸹸뤸𹸤𸹸𹼤麺𹰤𸺰뤸𸹸𺸤𸹸𺼤𱸰𺰤뤸𸹸𻸤𻼤𸹸𻰤𸹸뤸𸽸𼸤𰼹鸸𼼤鸸𼰤𸹸뤸𽸤𸹸𽼤𽰤꺸뤸𱾹𾸤𾼤븺𾰤𱰹뤸길𿸤켸𿼤鸾𿰤갹뤸𱰸𸸤길𸼤麰𸰤𹾰뤸꾹𹸤鸸𹼤𰻺꾸𹰤꺸뤸꼸𺸤븹𺼤鿸𺰤𹾰뤸𸹸𻸤뺸𻼤鸼𻰤𸼰뤸鿸𼸤꾸𼼤𼰤꼸뤸𹾰𽸤鿸𽼤뺸𽰤뺺뤸갸𾸤鿸𾼤𹾰𾰤꺸뤸뺸𿸤鸼𿼤𿰤갸뤸鿸𸸤𹾰𸼤𸹸𸰤뺺뤸꾸𹸤꼸𹼤鿸𹰤뤸鿸𺸤길𺼤𰺸𺰤뺺뤸켺𻸤𰻺𻼤길𻰤븸뤸鸿𼸤麾𼼤麾𼰤𱰸뤸黻𽸤𽼤켸𽰤뤸𾸤𸸸𾼤𸸸𾰤𸸸뤸𸸸𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𰻽𸼤𰺸𸰤𰻻뤸鸾𹸤𸺰𹼤𸹸𹰤鸾뤸𸺰𺸤𸹸𺼤鸾𺰤𸺰뤸𸹸𻸤鸾𻼤𸺰𻰤𸹸뤸鸾𼸤𸺰𼼤𸹸𼰤𸿻빰뤸𰾹𽸤𸽹𽼤𰼸𽰤뼺븸뤸𸿻븸𾸤𰾹𾼤𰼹𾰤뼺븸뤸𸽸𿸤𸹸𿼤𸹸𿰤𰼰뤸𸸤𸹸𸼤𸹸𸰤𸿻븸뤸𰾹𹸤𰼹𹼤뼺븸𹰤𸹸뤸𸹸𺸤뼼𺼤밸𺰤𸹸뤸鿽𻸤鱺𻼤鿻𻰤龹븹뤸龸𼸤𰹱𼼤𸹸𼰤𸹸뤸𽸤鸸𽼤鸸𽰤鸹뤸鸹𾸤鸺𾼤鸺𾰤鸻뤸鸻𿸤𿼤𰹱븸𿰤𸹸뤸𸹸𸸤뼼𸼤밸𸰤𸹸뤸鿽𹸤鱻𹼤鿺𹰤龹븹뤸龸𺸤𰹱𺼤𸹸𺰤𸹸뤸𻸤𻼤鸸𻰤鸸뤸鸹𼸤鸹𼼤鸺𼰤鸺뤸鸻𽸤鸻𽼤𽰤뤸𰹱븸𾸤𸹸𾼤𸹸𾰤뼼뤸밸𿸤𸹸𿼤𸹸𿰤𰺹뤸𺿻𸸤龹𸼤뺺븸𸰤𸹸뤸𸻻𹸤𰺹𹼤龹𹰤뤸𸹸𺸤𸹸𺼤𸹸𺰤龹뤸𰻼𻸤𰺹𻼤𰹰𻰤𸹸뤸𼸸𼸤𸹸𼼤𸹸𼰤𸹸뤸鿽𽸤鱻𽼤鿺𽰤龹븹뤸龸𾸤𰹱𾼤𸹸𾰤뤸鸸𿸤鸸𿼤鸹𿰤鸹뤸鸺𸸤鸺𸼤鸻𸰤鸻뤸𹸤𰹱븸𹼤𸹸𹰤龹뤸𰻼𺸤𰺺𺼤𰹰𺰤𸹸뤸𸻻𻸤𰺹𻼤龹𻰤뤸𸹸𼸤𸹸𼼤𸹸𼰤뼼뤸밸𽸤𸹸𽼤𰺹𽰤𺿻뤸龹𾸤뺺븸𾼤𸹸𾰤뼼뤸밸𿸤𸹸𿼤뼰𿰤鸸뤸𸹸𸸤빼𸼤𰺹𸰤뺹뤸𰺸𹸤𰺸𹼤𰻺𹰤鹻뤸𺸤츸𺼤𱼹𺰤𱾹뤸𰻺𻸤캸𻼤𱰹𻰤𰻺꺸뤸鸸𼸤鸺𼼤𱰸𼰤麺뤸黺𽸤𽼤𱼸鸸𽰤𱾸뤸𾸤𾼤𰻺𾰤뤸𸹸𿸤𰺸𿼤𰺸𿰤껺뤸𰺸𸸤𰺸𸼤𰻺𸰤𱺸龸뤸𱻺龸𹸤츸𹼤𱹻𹰤뤸𱸸麸𺸤鸺𺼤鸻𺰤𱿻뤸鸻𻸤鸻𻼤𱺸龸𻰤꾸뤸𱻺龸𼸤𰺹𼼤참𼰤𰻺뤸𰺺길𽸤𱽺鰸𽼤𰺹𽰤뺺뤸𱹺麸𾸤鸺𾼤𱿺𾰤뤸뺺𿸤鹸𿼤𰺹𿰤麻뤸𰺺𸸤꾸𸼤麺𸰤𹼰뤸𱱺𹸤𸻻뺸𹼤𰺹𹰤뺸뤸𹸰𺸤𰻻𺼤𸻻뺸𺰤𰺹뤸뺸𻸤𰻻𻼤𻰤𱸸뤸𼸤鹺𼼤鹼𼰤쾹뤸뺸𽸤긺븸𽼤𰺽꼸𽰤꺹뤸𱺰𾸤𸺰𾼤鸸𾰤긹뤸𱰸𿸤𰺸𿼤뺹𿰤뺺뤸뺸𸸤鸻𸼤기𸰤뤸𱰸𹸤𹼤𱸸𹰤鹼뤸쾹𺸤黼𺼤𱺹𺰤𹰰뤸긹𻸤𰻺꾸𻼤𰺸𻰤𱰸뤸뺸𼸤길𼼤𱺸𼰤龸뤸𽸤𱰸𽼤긺븸𽰤길뤸𰹰𾸤𸹸𾼤𸹸𾰤𸹸뤸긿𿸤𿼤𿰤𸻻뺸뤸𱾹𸸤𱰹𸼤𰻺꺸𸰤鸻뤸鹻𹸤𱰸𹼤黺𹰤뤸麸𺸤𺼤𸹸𺰤뤸뺸𻸤𰻻𻼤龸𻰤鰸뤸𱸹𼸤𼼤𸹸𼰤𹸰뤸길𽸤𽼤𱸺𽰤𱸸뤸길𾸤𾼤𾰤뤸鰹𿸤뺸𿼤齸𿰤鰸뤸𸸤鼹𸼤뺸𸰤鼰뤸鰸𹸤鰸𹼤𹰤𱸹뤸鹸𺸤𱸹𺼤𺰤𱺹뤸龺𻸤𹺰𻼤鸹𻰤𹸰뤸鸹𼸤龺𼼤𹰰𼰤龺뤸𽸤𸹸𽼤𱼹𽰤𱸹뤸𾸤𱺹𾼤麸𾰤𸼰뤸龹𿸤鹸𿼤麻𿰤𰺹뤸𰻺𸸤鸺븸𸼤龺𸰤𹰰뤸龺𹸤鹸𹼤麻𹰤𰺹뤸𰻺𺸤𹸰𺼤鸹𺰤𹺰뤸𰺹𻸤鼺𻼤𺼰𻰤鸸뤸𸻸𼸤鸸𼼤𰺹𼰤𹸰뤸𽸤鸸𽼤龸𽰤鼺뤸𸼰𾸤𰺹𾼤𰺹𾰤𰸰꼸뤸𸺰𿸤𱺹𿼤𸻸𿰤鸸뤸𰺹𸸤뺸𸼤鸼𸰤𹰰뤸麸𹸤麼𹼤븹𹰤𹼰뤸𰺺븹𺸤𰺺𺼤黼𺰤鸾뤸𱺹𻸤𱼹𻼤𻰤𱸹뤸𼸤鼸鸸𼼤뺸𼰤齸뤸𽸤鼹𽼤𽰤뤸𱰹𾸤𱾹𾼤麺𾰤𹺰뤸𰺹𿸤𰺺븸𿼤𰻺𿰤鸸뤸黿𸸤𸺰𸼤𱰸𸰤뺸뤸黺𹸤𹼤뺺𹰤뤸𸹸𺸤𺼤참𺰤뺸뤸𱰹𻸤鸸𻼤𸻻븸𻰤꼸뤸𹽻빰𼸤𸻺𼼤𰺹𼰤𱾹鸻뤸뺺븸𽸤𸻹𽼤찺𽰤黼뤸븺𾸤龹𾼤𹺰𾰤鰹뤸𸻸𿸤鸸𿼤𰺹𿰤꼸뤸참𸸤𸻻𸼤𱰸길𸰤鹻뤸麸𹸤龺𹼤𹾰𹰤꺱뤸븼𺸤뺸𺼤𰺸𺰤깾뤸鸼𻸤𺺰𻼤龹𻰤鸸뤸뺸𼸤黼𼼤鰸𼰤꺱뤸𸻹𽸤鸸𽼤𰺹𽰤黼뤸𸺰𾸤𸻺𾼤𰺹𾰤黼뤸𹺰𿸤꺱𿼤𹹸𿰤𱸹뤸𼸸𸸤𹻸𸼤𸻸𸰤𱾹뤸鰹𹸤𱰹𹼤꺸𹰤𱰸뤸뺸𺸤黺𺼤𺰤뺺뤸꺱𻸤鸸𻼤𰺻𻰤鼹뤸𱸼𼸤𰻻𼼤깾𼰤麹뤸𽸤켸𽼤𽰤𱰹뤸뺸𾸤𱾸齸𾼤𱺹꺽𾰤鸼뤸𸺰𿸤鹰𿼤鸸𿰤𰺾뤸𰸱𸸤𸺰𸼤𸰤뤸鼸𹸤鸸𹼤𰺾𹰤𰸱뤸𻺰𺸤𱰸𺼤𺰤𸺰뤸𰺸𻸤鸾𻼤𺰰𻰤𱰸뤸븺𼸤𱰸𼼤黺𼰤뤸뺸𽸤龺𽼤𸾰𽰤𸻸뤸𰺹𾸤𰺸鰸𾼤𹸰𾰤뺺뤸뺹𿸤𰻺𿼤뺺𿰤뺸뤸쾸𸸤鸸𸼤𱾸𸰤참뤸𱸸𹸤껻𹼤𱼸𹰤꾺뤸𱰸𺸤𰻻𺼤𱰹𺰤𱸹뤸뺸𻸤𰺸븸𻼤鸸𻰤𱼹뤸찺𼸤뺺𼼤麺𼰤𱻻뤸麸𽸤麾𽼤쾺𽰤쾺뤸츺𾸤𹺰𾼤麸𾰤𸻸뤸𰺹𿸤𿼤𰺸鸸𿰤븸뤸𰺹𸸤뺺𸼤𸰤𻺰뤸𸻺𹸤𰺹𹼤鸸𹰤麸뤸𹸰𺸤𰺹𺼤鸸𺰤𰺹뤸黼𻸤𹺰𻼤𸹸𻰤뺸뤸𰸰𼸤𹺰𼼤𰺹𼰤뺺뤸𽸤𱸹𽼤𽰤뤸𸹸𾸤𾼤𾰤뤸𼸸𿸤𱸹𿼤𹽻뺸𿰤뤸뺸𸸤𱰹鸿𸼤뺺𸰤𸻻븸뤸참𹸤𰺹𹼤찺𹰤뺸뤸𱸹鸿𺸤뺺𺼤빼𺰤𸻸뤸鸹𻸤𱺹𻼤麹𻰤鼹뤸龹𼸤𰺹𼼤𹿸𼰤뺺뤸𱾹𽸤鹻𽼤쾺𽰤뤸𸻺𾸤𾼤𰺹𾰤뺺뤸𸻻𿸤𰺹𿼤븺𿰤븺뤸쾺𸸤븸𸼤齺𸰤뺸뤸鸸𹸤쾸𹼤켸𹰤𸺰뤸츸𺸤𰺽𺼤𰺸𺰤𹸰뤸黻𻸤麹𻼤𺹻빼𻰤𱰹뤸캸𼸤껻𼼤𰺽꼸𼰤𱺸鿰뤸𱺹𽸤캺𽼤𰺹𽰤캸뤸𱺸𾸤𺽻뺸𾼤𱺹𾰤캺뤸𱰹鸰𿸤캸𿼤𱺸𿰤𱺹뤸캺𸸤𰺹鸸𸼤켺𸰤鹼鸸뤸𹸤츺𹼤鹼鸿𹰤캸뤸𸻻𺸤𱺺鼸𺼤캺𺰤𸻻뤸鸸𻸤𰺹𻼤麸𻰤𸻸뤸𱾹𼸤𰺹𼼤𱼹𼰤𹱸뤸뺺븸𽸤鸹𽼤찺𽰤鼾뤸𸺰𾸤찺𾼤𱻺뾸𾰤𰺸뤸뾸𿸤𰻺𿼤鸺𿰤𱰹鸰뤸麻𸸤𰺸𸼤𱾹鸰𸰤𰺸뤸𱼹鸰𹸤캺븸𹼤뺺𹰤뺸뤸鸾𺸤𸺰𺼤𹿻븰𺰤뺸뤸鸰𻸤𱰹𻼤뺺𻰤麺븸뤸𼸤𱸹𼼤𼰤𱸹뤸𽸤𰺹𽼤鹻𽰤뺺뤸𸻺𾸤뺺𾼤𾰤뤸𿸤뺸𿼤𰸰𿰤𸺰뤸빰𸸤𰺹𸼤鹻𸰤뺺뤸뺸𹸤𰺸𹼤鸼𹰤𹺰뤸𸻻빰𺸤밾𺼤𸹸𺰤鸸뤸𸻻븼𻸤꾸𻼤𰺹𻰤븺뤸𼸤黼𼼤𰺹𼰤븺뤸𽸤𽼤鹸𽰤𰻺꾸뤸鸻𾸤黾𾼤𾰤븺뤸𿸤𸹸𿼤뺸𿰤鸸뤸𰺽𸸤𰻻𸼤𱾹𸰤븸뤸鰸𹸤𸻸𹼤𱼹𹰤𱰹뤸麾𺸤𸺰𺼤麾𺰤𹺰뤸麾𻸤뺸𻼤鸰𻰤𰻻뤸𰻺𼸤𹸰𼼤껻𼰤𺰰뤸鸺𽸤鸻𽼤𰻻𽰤𰺸뤸꼸𾸤𰹰𾼤𸹸𾰤𸹸뤸𸹸𿸤𰺿𿼤鸻𿰤𰻺뤸𰹰𸸤𸹸𸼤𸹸𸰤𸹸뤸鿻𹸤𰺸𹼤𹸰𹰤뺺뤸𰻻𺸤𰹰𺼤𸹸𺰤𸹸뤸𸹸𻸤𰺿𻼤꼸𻰤𰻺뤸𰹰𼸤𸹸𼼤𸹸𼰤𸹸뤸鿻𽸤𰺸𽼤뺺𽰤뺸뤸鸸𾸤𰺽𾼤𱾸𾰤𰻻뤸븸𿸤𿼤𱰸𿰤뤸𸹸𸸤𱰹𸼤꺸𸰤𱰸뤸뺸𹸤黺𹼤𹰤뺺뤸𺸤𸹸𺼤쾸𺰤참뤸𱹻𻸤𱽻𻼤𱸸𻰤𱼸뤸𸻸𼸤麺𼼤𰺹𼰤𱼸길뤸𱸸븸𽸤𱸺𽼤꼸𽰤𱸽鸸뤸𾸤𱸸𾼤𾰤𰺽뤸𰺸𿸤길𿼤𰻺𿰤鹿뤸鸾𸸤𸼤꺸𸰤뺸뤸𱰺븸𹸤龼𹼤꼸𹰤𹼰뤸𱾹𺸤𱼹𺼤갽𺰤길뤸𰻻𻸤鸿𻼤𰺺𻰤뤸꿻𼸤鸿𼼤龺𼰤𺼰뤸길𽸤뺸𽼤鸼𽰤𰺾뤸𰸰𾸤𺺰𾼤길𾰤뺸뤸龼𿸤𻰰𿼤길𿰤뺸뤸鸼𸸤𸼰𸼤鸼𸰤𹸰뤸긹𹸤𺼰𹼤𱾹𹰤길뤸龸𺸤𺼤鸿𺰤꺸뤸龼𻸤𻼤갸𻰤긹뤸𼸤𼼤뺸𼰤𰺸뤸뺺𽸤븺𽼤븺𽰤鹸뤸𰻺꾸𾸤鸻𾼤븺𾰤黾뤸𿸤븺𿼤𿰤𸹸뤸𸸤𰺸𸼤갸𸰤𰺹뤸鹾𹸤𰸱𹼤龹𹰤𸾰뤸鼹𺸤뺸𺼤龸𺰤𻰰뤸긹𻸤뺸𻼤龼𻰤𻰰뤸긹𼸤𱼸𼼤𱾸𼰤麸뤸𰺸𽸤긹𽼤븺𽰤기뤸𾸤𰺸𾼤뺸𾰤𰸰뤸𸺰𿸤긹𿼤龾𿰤𸺰뤸𰺹𸸤뺸𸼤龸𸰤𸺰뤸𰺹𹸤뺸𹼤龼𹰤𹺰뤸鿸𺸤𰺹𺼤뺺𺰤鿸뤸𹼰𻸤꺹𻼤𰺸𻰤鸺븸뤸鸿𼸤𰺸𼼤𰺺𼰤길뤸鸹𽸤𱰺𽼤𽰤길뤸𰺸𾸤𰻺𾼤鸾𾰤꼸뤸꾸𿸤𱸹𿼤𱻺鸸𿰤뤸걺𸸤鸿𸼤𸰤𰻻뤸𰻻𹸤鸿𹼤뺸𹰤𰺺뤸𺸤𺼤鸼𺰤𸼰뤸갸𻸤뺸𻼤𰺹𻰤뺺뤸𼸤𼼤걺𼰤길뤸꾸𽸤龸𽼤𽰤꼸鸸뤸꺸𾸤鸻𾼤龼𾰤뤸𱰸𿸤뺸𿼤𰸰𿰤𸺰뤸鸿𸸤뺸𸼤𰸰𸰤𸺰뤸𰸰𹸤𰸰𹼤𹺰𹰤긹뤸鸿𺸤𰸰𺼤𸺰𺰤뺸뤸𰸰𻸤𸺰𻼤𰸰𻰤뺸뤸𰸰𼸤𻺰𼼤긹𼰤𰸰뤸𸺰𽸤뺸𽼤뺸𽰤𰸰뤸𸺰𾸤뺸𾼤𹸰𾰤긹뤸𰸰𿸤𸺰𿼤긹𿰤𰸰뤸𸺰𸸤𰸰𸼤𹺰𸰤긹뤸긹𹸤𹼤𹰤뤸깺𺸤𺼤𺰤깻뤸길𻸤꾸𻼤鸿𻰤𸻸뤸𰺹𼸤𼼤鸿𼰤뺸뤸𽸤𰻻𽼤𰻻𽰤鸿뤸𾸤걻𾼤뺸𾰤𱸹뤸𱼹𿸤龸𿼤𰸰𿰤길뤸𸺰𸸤鸻𸼤뺸𸰤𰸰뤸𻺰𹸤길𹼤뺸𹰤鸾뤸𺺰𺸤鸻𺼤뺸𺰤龸뤸𺰰𻸤鸻𻼤𹸰𻰤길뤸뺸𼸤𰻻𼼤𰺸𼰤鸸뤸鸾𽸤鸻𽼤𰻻𽰤𰸱뤸𹺰𾸤길𾼤龺𾰤𸾰뤸鸸𿸤뺸𿼤𰺸𿰤黼뤸𹰰𸸤鸸𸼤뺸𸰤𰺸뤸龸𹸤𹰰𹼤麹𹰤𺽸뤸𱰹𺸤鰹麸𺼤𱾹麸𺰤鸸뤸𻸤𹺰𻼤꺸𻰤뤸꺹𼸤𰺺𼼤麻븸𼰤𰺽뤸𰺸𽸤𰻺𽼤鸸𽰤뺸뤸𾸤𰻻𾼤𰻻𾰤𱺽뤸鸿𿸤𿼤꼽𿰤꾸뤸𸸤𰺸븸𸼤갸𸰤𰻺뤸꿺𹸤꼸𹼤꺸𹰤鸾븸뤸꼸𺸤꺽𺼤鿼𺰤𹼰뤸𰻺𻸤鸸𻼤𺺰𻰤𰺸뤸꼸𼸤꼸𼼤𰺸𼰤꿺뤸뺸𽸤鸼𽼤𹼰𽰤𱰸뤸뺸븹𾸤鸼𾼤𻾰𾰤麹뤸黺𿸤𿼤𱾹麸𿰤鼾뤸𸸤鸻𸼤鸸𸰤𹺰뤸긺𹸤긺𹼤𹰤뤸𱼹𺸤뺸𺼤麰𺰤𱾹뤸鰸𻸤𻼤뺸𻰤𱾸뤸鸾𼸤𸺰𼼤𱱺鸸𼰤뺺뤸뺸𽸤𱼸鸸𽼤뺺𽰤뺸뤸𾸤븸𾼤𾰤켺뤸켸𿸤𸻸𿼤𱰸𿰤𰺹뤸鹻𸸤뺸𸼤뺽𸰤鸼뤸𸺰𹸤𸻸𹼤𹰤𸼰뤸𰺹𺸤鸺𺼤𰻺𺰤븸뤸𻼰𻸤𱿻븸𻼤𹸰𻰤𱾹뤸𹾰𼸤𸻸𼼤鸺𼰤𰺹뤸𰻺𽸤븸𽼤𻾰𽰤𱾹뤸𱿻븸𾸤𸻸𾼤𱺹𾰤𰺸뤸뺹𿸤𱾸븸𿼤𰸰鸸𿰤𸺰뤸鸹𸸤껻𸼤鸺𸰤꾸뤸꾸𹸤참𹼤𸻻𹰤𱰸길뤸𸻸𺸤𰺹𺼤𰺸븸𺰤𱰸뤸𹸰𻸤찺𻼤껻𻰤鸺뤸꾸𼸤꾸𼼤𸻸𼰤참뤸𰺹𽸤𱰸길𽼤𰻺𽰤𰺸뤸뺺𾸤뺸𾼤鸸𾰤𰺸뤸𿸤뺺𿼤𿰤𰻻뤸츸𸸤𰺺𸼤麺𸰤𸺰뤸껸𹸤𸻻븸𹼤鸹𹰤뺸뤸鸸𺸤𰺼𺼤𰸰𺰤뺸뤸𸺰𻸤긹𻼤鸸𻰤𰺾뤸齾𼸤뺺𼼤뺸𼰤𹸰뤸뺺𽸤𸻻븸𽼤𰺹𽰤뤸𾸤𾼤𾰤齼뤸𸹸𿸤𸻻븼𿼤𿰤𰺹뤸鼺𸸤𸰰𸼤븺𸰤븺뤸麹𹸤𰻺뾸𹼤뺸𹰤鸾뤸𸺰𺸤麸𺼤븼𺰤𸹸뤸뺸𻸤鸾𻼤𹺰𻰤鼾뤸𼸤𰻺뾸𼼤𹸰𼰤뺸뤸鼺𽸤𹺰𽼤鼺𽰤𹱹뤸鹻𾸤뺸𾼤鸼𾰤𹺰뤸鹻𿸤뺸𿼤鸼𿰤𺺰뤸뺸𸸤𼸸𸼤𸹸𸰤뺸뤸븼𹸤𸹸𹼤뾻𹰤𱸹뤸뽸𺸤𱸹𺼤𹸰𺰤뺸뤸𹰰𻸤鼺𻼤𰸰뺸𻰤𻺰뤸뺸𼸤𱸸𼼤𼰤𱹻뤸𽸤𸹸𽼤𹸰𽰤뺸뤸𹰰𾸤鼺𾼤𸻻빰𾰤鸸뤸𰺹𿸤麸𿼤𸻻뺸𿰤𰺹뤸鸸𸸤麸𸼤뻾𸰤𱸹뤸뺸𹸤뺺𹼤𹸰𹰤뺸뤸𹰰𺸤鼺𺼤𱸹𺰤𱺹뤸뺸𻸤븼𻼤𱼹𻰤𹹸뤸찾𼸤𱸹𼼤𹸰𼰤뺸뤸𻰰𽸤뺸𽼤𽰤𺻸뤸𱺹𾸤뺸𾼤븼𾰤𱼸뤸鼺𿸤𻺰𿼤뺸𿰤𱸹뤸𸸤𱺹𸼤뺸𸰤鸾뤸𺺰𹸤뺸𹼤븼𹰤𸹸뤸뺸𺸤鼸𺼤𹺰𺰤𸻹뤸𰺹𻸤鼸𻼤𻰰𻰤𺹸뤸鸸𼸤𸻻빰𼼤𰺹𼰤뤸𽸤𽼤𽰤뤸𸹸𾸤𾼤𾰤龾뤸𸺰𿸤긹𿼤𸻹𿰤꼹뤸𰺹𸸤꺰𸼤龺𸰤꾸뤸𹺰𹸤갹𹼤뺸𹰤𰻻뤸𰺸𺸤뺺𺼤龺𺰤𸰰뤸뺸𻸤鸻븹𻼤껿𻰤𹸰뤸𼸤鸻븹𼼤𰺸𼰤뺺뤸𽸤𽼤𰺹𽰤뤸𾸤𸻹𾼤鸸𾰤𰺹뤸黼𿸤𱼹𿼤𹺰𿰤𱾹뤸𸻻빰𸸤𰺹𸼤𹸰𸰤麸뤸𹸤𻺰𹼤뺸븸𹰤뤸𱾹𺸤𱾸𺼤𺰤뤸𱼸𻸤𱾹츸𻼤캸𻰤𸻸뤸븸𼸤鰸𼼤𱸹𼰤참븸뤸𱾸𽸤븸𽼤鼸𽰤麸뤸𰺾𾸤𰸰꼸𾼤𾰤𱼸뤸뺸𿸤𱼺𿼤𸻹𿰤𰺹뤸麰𸸤𸻻빰𸼤𰺹𸰤𸺰뤸켺𹸤𸻸𹼤븾𹰤𱸹뤸𸹸𺸤𺼤𸹸𺰤뤸𻸤𸻸𻼤긹𻰤鹸뤸꾹𼸤𰻺𼼤꾸𼰤뤸𽸤븺𽼤꾹𽰤뺸뤸븸𾸤鰸𾼤𸻸𾰤꺹뤸꼹𿸤뺸𿼤龰𿰤鰸뤸𰻺𸸤갸𸼤뺸𸰤뤸𰺽𹸤𰺸𹼤𰺸𹰤鹾뤸뺹븸𺸤𰺺𺼤뺺𺰤꼸鸸뤸뺸𻸤龰𻼤𻰤갸뤸꾸𼸤뺸𼼤븸𼰤뤸꼹𽸤𽼤𽰤뤸𹹸𾸤뺸𾼤븼𾰤𱸹뤸뺸𿸤鸸𿼤𹹸𿰤𱰸뤸𰸰𸸤𸺰𸼤麸𸰤뺸뤸鸸𹸤鸻𹼤뺸𹰤꺸뤸鸻𺸤𰺹𺼤𰺺𺰤뤸𱿻꾸𻸤𰹰𻼤𸹸𻰤𸹸뤸𸹸𼸤꺿꼸𼼤찺𼰤뺸뤸븼𽸤𸹸𽼤𽰤뺸뤸븼𾸤𹹸𾼤龼𾰤龸뤸뺸𿸤龼𿼤𹹸𿰤𰺾뤸𰸱𸸤𸺰𸼤𱸹𸰤龿뤸𸹸𹸤𹼤𸹸𹰤𰺹뤸𹸰𺸤뺺𺼤븺𺰤𻹸뤸뺸𻸤긹𻼤鸾𻰤𹺰뤸𻻸𼸤𸻹𼼤𰺹𼰤뺺뤸븺𽸤븺𽼤𽰤뤸𸹸𾸤𾼤𾰤븺뤸𿸤𸹸𿼤𿰤뺸뤸鸾𸸤𸺰𸼤𸹸𸰤뺸뤸鸾𹸤𹺰𹼤𹹸𹰤뤸𸹸𺸤뺸𺼤鸸𺰤𰺸뤸鸻𻸤뺺𻼤黻𻰤麸뤸𹻸𼸤뺸𼼤븼𼰤켸뤸𸹸𽸤𽼤𽰤뤸뺸𾸤鸾𾼤𸺰𾰤𸻸뤸鸸𿸤𰺹𿼤꼸𿰤黾뤸𹺰𸸤𹹸𸼤뺸𸰤鸾뤸𹺰𹸤𱸹𹼤뿸𹰤𸹸뤸鸸𺸤뺸𺼤𰺸𺰤鸻뤸뺺𻸤鹼𻼤麸𻰤𹻸뤸𱺹𼸤뺸𼼤븼𼰤켸뤸𸹸𽸤𽼤𽰤뤸뺸𾸤鸾𾼤𸺰𾰤𹹸뤸참𿸤𰻻𿼤𰸰𿰤𺺰뤸뺸𸸤뺸𸼤鸾𸰤𻺰뤸뺸𹸤뺸𹼤鸾𹰤𻺰뤸뺸𺸤𹹸𺼤츺𺰤븺뤸𹸰𻸤캸𻼤鸾𻰤𹺰뤸𰺹𼸤鸸𼼤뺸𼰤鸼뤸鰸𽸤𰸰꺼𽼤𰺹𽰤麸뤸뺺𾸤𹸰𾼤븺𾰤𹺰뤸𸻸𿸤𸻸𿼤𰺹𿰤뺺뤸캸𸸤𹸰𸼤츸𸰤𹸰뤸뺺𹸤뻱𹼤𸹸𹰤𹻸뤸뺸𺸤𱺹𺼤븼𺰤츸뤸뺸𻸤𰺸𻼤鸰𻰤黾뤸𹺰𼸤뺺𼼤뺸𼰤鸾뤸𻺰𽸤뺺𽼤𰺹𽰤뺺뤸뺸𾸤鸾𾼤𻺰𾰤뺸뤸鸸𿸤𰻻𿼤𰸰𿰤𺺰뤸𸻸𸸤뺸𸼤길𸰤𹸰뤸𰺹𹸤𰺺꼸𹼤뺺𹰤뤸𺸤𹽸𺼤참𺰤𰺹黸뤸길𻸤𰸰𻼤𸺰𻰤𱸹뤸뺸𼸤𰺹𼼤뺺𼰤븸뤸뺸𽸤𱾸길𽼤鸾𽰤븺뤸𸰰𾸤𸻻𾼤길𾰤𸻹뤸븸𿸤𹺰𿼤𱼹𿰤뺸뤸𰺸𸸤𰺹𸼤뺺𸰤𸻸뤸븾𹸤𸹸𹼤𸹸𹰤鸸뤸뺸𺸤𰺽𺼤𰻻𺰤鹸뤸黼𻸤鰸𻼤𸻹𻰤𱾹뤸𱰸𼸤麾𼼤𸼰𼰤꾸뤸뺸𽸤𰻻𽼤𹸰𽰤𰺸뤸뺸𾸤𰺽𾼤뺺𾰤鸸뤸뺸𿸤𰺽𿼤𰻻𿰤黸뤸𸸤鹸𸼤𸰤𸹸뤸𹸤𹼤𹰤𸺰뤸𸹸𺸤뺸𺼤鸸𺰤𱰸뤸뺸𻸤黸𻼤𹺰𻰤𸹸뤸鸸𼸤뺸𼼤𰺸𼰤鸼뤸𸺰𽸤黾𽼤𹺰𽰤𸹸뤸𾸤𰸰뾸𾼤𾰤𸺰뤸𱾹𿸤𿼤𹻸𿰤𱼹뤸麰𸸤𹼰𸼤鸹𸰤𰻺뤸𱰸𹸤빺𹼤鹺𹰤鰹뤸츸𺸤鸻𺼤黼𺰤𺾰뤸𱼸鸸𻸤鸸𻼤𺺰𻰤뺸뤸뺸𼸤黼𼼤𺼰𼰤𱼸鸸뤸뺸𽸤麰𽼤𺺰𽰤鸸뤸뺸𾸤黼𾼤𺾰𾰤𱼸鸸뤸鸸𿸤𱼸鸸𿼤麰𿰤뤸𱰸𸸤鼸𸼤𻼰𸰤뤸𱾸𹸤𰺸뾸𹼤븸𹰤뤸𱼹𺸤𱾹𺼤뺸𺰤鸾뤸𺺰𻸤𱾸𻼤븸𻰤𻼰뤸뺸𼸤𱾸𼼤𼰤뤸뺸𽸤𻸰𽼤鸸𽰤𰺽뤸𰻻𾸤뺺𾼤𾰤鼺뤸𸺰𿸤𸹸𿼤鸸𿰤𰺸뤸鸾𸸤𹺰𸼤뺺𸰤𰺸뤸𹸰𹸤뺺𹼤𰺹𹰤뺺뤸츸𺸤𺼤캸𺰤뺸뤸𰺸𻸤뺺𻼤鸸𻰤뺸뤸黼𼸤𹰰𼼤𰺸𼰤뺺뤸𽸤𽼤𽰤뺸뤸鸾𾸤𹺰𾼤𸹸𾰤뺸뤸𰺸𿸤鸸𿼤鸼𿰤鰸뤸뺺𸸤𸼤鿺𸰤𸺰뤸븺𹸤뺸𹼤鸸𹰤꾽뤸𰻺𺸤𺼤껻𺰤븹뤸꼹𻸤鰸𻼤鹸𻰤𻹸뤸𰺸𼸤뺹𼼤龼𼰤꼼뤸鸿𽸤鿼𽼤𽰤𰺸뤸껿𾸤龰𾼤𹼰𾰤갹뤸갹𿸤븹𿼤𹼰𿰤𰺹뤸𰺹𸸤𰸱𸼤𸺰𸰤𸻻빰뤸길𹸤𰺹𹼤麸𹰤뤸𺸤𺼤뺸𺰤𰻻뤸𰸰𻸤𹺰𻼤𸹸𻰤鸸뤸뺸𼸤鿼𼼤𹰰𼰤𸹸뤸뺸𽸤𰻻𽼤𰺸𽰤鸸뤸龸𾸤𱼸𾼤뺽麹𾰤鸾뤸𸺰𿸤𰺸𿼤갹𿰤븺뤸갰𸸤𸼤𰺸𸰤긹뤸뺸𹸤龸𹼤𹰰𹰤꼹뤸𱾹𺸤꼹𺼤뺸𺰤龰뤸𹰰𻸤𸻸𻼤𻰤𰺹뤸鸿𼸤꺸𼼤齺麹𼰤뺸뤸鸼𽸤𻾰𽼤꼸鸸𽰤𰻺鸹뤸𾸤𰺸𾼤𾰤갹뤸𱰹𿸤꾸𿼤𿰤뺸뤸龰𸸤𹺰𸼤갸𸰤뺸뤸龸𹸤𻺰𹼤뺹𹰤찺븸뤸뺹𺸤鸾𺼤𻰰𺰤꼸鸸뤸뺸𻸤𰺸𻼤𹸰𻰤뺺뤸뺹𼸤鸾𼼤𹺰𼰤鿺뤸찺븸𽸤𹸰𽼤𽰤뤸꾸𾸤꼸鸸𾼤뺸𾰤龰뤸𿸤꺸𿼤길𿰤뺸뤸龸𸸤𸼤𱾸𸰤꼹뤸갹𹸤꾸𹼤𹰤𰺸뤸뺸𺸤鸾𺼤𻺰𺰤鹿뤸𹸰𻸤븺𻼤뺸꾻𻰤鿼뤸꼾𼸤갸𼼤鿺𼰤뤸𽸤뺸꾻𽼤龰𽰤𸰰뤸길𾸤뺸𾼤𰺹𾰤뺺뤸𿸤𿼤𿰤길뤸뺸𸸤鹻𸼤𸰤龹뤸鸸𹸤븸𹼤𹰰𹰤黻뤸鼹𺸤빸𺼤鹸𺰤鰹뤸鼾𻸤𸺰𻼤鸹𻰤𸻸뤸𱾹𼸤𱺹𼼤𱰸𼰤𰺸뤸鸰𽸤𰺸𽼤黾𽰤𸺰뤸𰻺𾸤뺸𾼤뺺𾰤𱺸뤸麾𿸤𿼤𱰸𿰤뤸𱸸𸸤븹𸼤𹼰𸰤𱺹뤸𰻺𹸤𰺸𹼤鸸𹰤뺸뤸𱺸𺸤鸸𺼤麼𺰤뤸鸻𻸤𰺺𻼤𰺸𻰤뺸뤸𰹰𼸤𸹸𼼤𸹸𼰤𸹸뤸鸿븸𽸤뺽𽼤鼸𽰤𺾰뤸鸹𾸤𸻸𾼤𱼹𾰤𱺹뤸𰺸𿸤鸰𿼤𰺸𿰤𱱺뤸黾𸸤𸺰𸼤𱾹𸰤鼺뤸𺼰𹸤뺸븸𹼤뺸𹰤鸼뤸𹾰𺸤𱰹𺼤鸾𺰤𺼰뤸𱰹𻸤𹸰𻼤𰺸𻰤뺸븸뤸𱰺𼸤𰺸𼼤꺰𼰤뺸뤸𰻻𽸤𰸰𽼤𸺰𽰤𱺸뤸뺸𾸤𰺽길𾼤𱱻𾰤麾뤸𿸤찺𿼤븽鸸𿰤鰸뤸鸸𸸤𸼤鸽𸰤龸뤸뺸𹸤븸𹼤𹰤鼸鸹뤸𺸤𺼤𺰤뺸뤸鸾𻸤𸺰𻼤𸹸𻰤뺸뤸鸸𼸤뺸𼼤鼸𼰤𹼰뤸麽뺸𽸤鼹𽼤𱰹𽰤뺸뤸黸𾸤𹼰𾼤𸻸𾰤𰺹뤸𰺸𿸤鸸𿼤𱾸𿰤뺸뤸뺺븸𸸤𱰸𸼤뺸𸰤黸뤸鸻𹸤𹼤𱾸𹰤𱸸뤸𺸤캸𺼤뺸𺰤𰻺뤸𰺸𻸤쾸𻼤𻰤𺾰뤸鸸𼸤𱰹𼼤뺸𼰤黸뤸𹼰𽸤𸻸𽼤𱼹𽰤鸼뤸뺸𾸤𰺺𾼤뺺𾰤𱰸뤸뺸𿸤黸𿼤𿰤鸻뤸鸸𸸤뺸𸼤鼸𸰤鼸鸾뤸𹸤麸𹼤𹰤뤸𺸤𺼤鼾𺰤𸺰뤸𸹸𻸤뺸𻼤鼼𻰤𹾰뤸鸹𼸤뺸𼼤鼸𼰤𹼰뤸𽸤𱾹𽼤뺸𽰤븸뤸𹼰𾸤𸻸𾼤뺸𾰤𰺹뤸鸻𿸤鸻𿼤𱰸𿰤뺸뤸뺺𸸤𱾸𸼤뺸𸰤븸뤸鸻𹸤𹼤𱰸𹰤𱸸뤸𺸤캸𺼤𱾹𺰤鼰뤸𹼰𻸤𱼹𻼤𰻺鸸𻰤𰺸뤸鸸𼸤뺸𼼤𱾸𼰤𱼸뤸븹𽸤𽼤鸻𽰤𰺺뤸𰺸𾸤鸹𾼤𰹰𾰤𸹸뤸𸹸𿸤𸹸𿼤𱼿鰸𿰤뺽뤸麰𸸤𺾰𸼤𱼹𸰤𱾹뤸뺸𹸤븸𹼤𹼰𹰤𰻺뺸뤸𹹸𺸤𱰸𺼤𱺹𺰤鸸뤸𸼰𻸤鹺𻼤뺸𻰤鸼뤸𻾰𼸤뺸𼼤鸾𼰤𻼰뤸븺𽸤𹸰𽼤뺸𽰤뺸뤸𰺺𾸤뺺𾼤뺸𾰤𰻻뤸𰸰𿸤𸺰𿼤𱾸𿰤뺺뤸뺸𸸤𰺽𸼤껰𸰤껻뤸𰺸𹸤𰻻𹼤뺺𹰤뺸뤸븸𺸤𺼤𱰸𺰤鸸뤸뺸𻸤鼸𻼤𻰤𱾹뤸𼸤𼼤𼰤齸뤸鿾𽸤𸺰𽼤긹𽰤뺸뤸龸𾸤𹼰𾼤𹱸𾰤𰺹뤸鹸𿸤𿼤鸰𿰤鿾뤸꺹𸸤𸺰𸼤𰺹𸰤갹뤸𹸤鸻𹼤𹰤븹뤸𸾰𺸤鸿𺼤꺸𺰤𰺸뤸갰𻸤𻼤𻰤鸾뤸𺺰𼸤길𼼤𱿻𼰤𰹰뤸𸹸𽸤𸹸𽼤𸹸𽰤𰺿뤸𰺽𾸤껰𾼤껿𾰤𰺸뤸갹𿸤鸰𿼤鿸𿰤𹼰뤸껻𸸤𰻺𸼤鸸𸰤꾹뤸뺸𹸤𰺺𹼤뺺𹰤갸뤸뺸𺸤鿸𺼤𺰤鸿뤸길𻸤뺸𻼤龸𻰤뤸𼸤𼼤𼰤뤸참𽸤黺𽼤𸺰𽰤꺹뤸뺸𾸤龼𾼤𹼰𾰤𹻸뤸꾹𿸤뺸𿼤븸𿰤𻼰뤸꺸𸸤𹽸𸼤𱸹𸰤𰺽뤸𰺸𹸤걺𹼤𰺹麸𹰤뤸龰𺸤𺼰𺼤꾸𺰤𰺹鹱뤸뺸𻸤龰𻼤𺾰𻰤꾸뤸뺸𼸤龰𼼤𺼰𼰤꾸뤸뺸𽸤𰸰𽼤𸺰𽰤𱾸뤸鸸𾸤𰻻𾼤븸𾰤𺰰뤸𿸤𰺺𿼤꾸𿰤𹸰뤸𸸤𸼤鸸𸰤뺸뤸𹸤鸿𹼤𹰤𰻻뤸𰻻𺸤鸿𺼤뺸𺰤𰺽뤸𻸤鸿𻼤뺸𻰤꼸븸뤸𼸤뺸𼼤龰𼰤𹼰뤸鸿𽸤긹𽼤뺸𽰤𰸰뤸𺺰𾸤뺸𾼤鸸𾰤𰺸뤸𰻻𿸤龰𿼤𹰰𿰤뤸𻺰𸸤뺸𸼤𰻻𸰤龰뤸𹰰𹸤꾹𹼤뺸𹰤龰뤸𹰰𺸤𰺺𺼤𺰤𹺰뤸꾸𻸤꾹𻼤갽𻰤鸿뤸𼸤뺸𼼤𰺺𼰤뺺뤸鸸𽸤븹𽼤𺼰𽰤꼸鸸뤸뺸𾸤𰸰𾼤𸺰𾰤𰺹뤸𰺸𿸤븸𿼤𻺰𿰤𰺹뤸뺸𸸤𰺸𸼤麸𸰤뺸뤸꼸𹸤𹼤𰻻𹰤𰻻뤸갸𺸤鸿𺼤걺𺰤뺸뤸𻸤𰺺𻼤뺺𻰤꼸鸸뤸뺸𼸤龰𼼤𼰤뺸뤸꾹𽸤꾸𽼤뺸𽰤븸뤸𾸤𰺽𾼤꺸𾰤뺸뤸龼𿸤𿼤꾹𿰤뤸𸸤뺸𸼤鸸𸰤𰺸뤸참𹸤꼸𹼤𱰸𹰤𰹰뤸𸹸𺸤𸹸𺼤𸹸𺰤鿻뤸麸𻸤𱾹𻼤𰻺𻰤참뤸鹸𼸤꼸𼼤껻𼰤𱾸뤸𽸤𽼤麸𽰤뺸뤸鸾𾸤𸺰𾼤𰺹𾰤뺸뤸鸾𿸤𺺰𿼤뺸𿰤𰺹뤸뺺𸸤뺸𸼤鸾𸰤𸺰뤸뺸𹸤껸𹼤𰻻𹰤𰺸뤸뺺𺸤𸻸𺼤븾𺰤𸹸뤸𸹸𻸤𻼤꺹𻰤뺸뤸龼𼸤𹰰𼼤𼰤𸻸뤸갽𽸤길𽼤꾸븹𽰤뤸갸𾸤꼹𾼤𻹸𾰤鸿뤸뺸𿸤鿼𿼤𸼰𿰤꺸뤸뺸𸸤鿼𸼤𺰰𸰤뺸뤸뺸𹸤꺰𹼤𹰤𰺸뤸뺺𺸤뺸𺼤뺺𺰤뺸뤸뺺𻸤븺𻼤뺸𻰤龼뤸꾸븹𼸤𼼤갸𼰤뤸𽸤𽼤뺸𽰤𰸰뤸𹺰𾸤𸹸𾼤뺸𾰤鸾뤸𸺰𿸤鼹𿼤𰺸𿰤뺺뤸뺸𸸤鼰𸼤𹰰𸰤鹸뤸麹𹸤뺸𹼤鼼𹰤𹰰뤸쾸𺸤𸻸𺼤鰸𺰤龸뤸뺸𻸤鸾𻼤𹰰𻰤𸻸뤸𰺹𼸤鸼븸𼼤뺸𼰤黼뤸𸾰𽸤𸻸𽼤𱸹𽰤뤸𱺹𾸤麺𾼤𸺰𾰤𸻸뤸뺸𿸤鸾𿼤𺺰𿰤뺸뤸𱸹𸸤븼𸼤𱺹𸰤뺸뤸鸾𹸤𹺰𹼤𸻸𹰤뺸뤸鸾𺸤𺺰𺼤뺸𺰤𱸹뤸𱺹𻸤븼𻼤켸𻰤뺸뤸鸾𼸤𹺰𼼤𸻸𼰤뺸뤸鸾𽸤𸺰𽼤鸹𽰤𱸹뤸븼𾸤𱺹𾼤𾰤𱸹뤸𱺹𿸤𱼹𿼤𿰤쾸뤸麺𸸤𸺰𸼤𸻸𸰤뺸뤸鸾𹸤𸺰𹼤𱸹𹰤𱺹뤸븼𺸤𱼹𺼤𹸰𺰤𱼹뤸븺𻸤𱼹𻼤𱸹𻰤𱺹뤸𼸤𱾹𼼤麺𼰤𺺰뤸뺸𽸤뺸𽼤鸾𽰤𻺰뤸뺸𾸤뺸𾼤𰺹𾰤뺺뤸뺸𿸤참𿼤뺺𿰤뾸뤸𰻺꺸𸸤鸻𸼤麸𸰤𱰸뤸𹸰𹸤찺𹼤꺰𹰤뤸𰺸𺸤뺺𺼤𸻸𺰤鰸뤸麸𻸤뺸𻼤鼼𻰤뤸龸𼸤鼸鸸𼼤뺸𼰤鼰뤸𽸤鸽𽼤𽰤뤸뺸𾸤鸾𾼤𸺰𾰤𱰹뤸뺸𿸤黸𿼤鰸𿰤꺸뤸뺸𸸤𰻻𸼤𰸰𸰤뤸𱰸𹸤𹼤븺𹰤븺뤸𺸤𸹸𺼤𰺺𺰤齰뤸𰻻꾸𻸤麸𻼤𰻻𻰤𸼰뤸𱸹𼸤𰺸𼼤𱹻𼰤뤸𸹸𽸤𽼤𽰤鹸뤸뺸𾸤鸿𾼤𸺰𾰤龹뤸鰹𿸤𺻸𿼤𰺹𿰤鼹뤸캸븸𸸤켸𸼤𸰤츸븹뤸𰺹𹸤츺븸𹼤𹰤鸸뤸鹺뺸𺸤麹𺼤츸𺰤캸뤸𻸤켸𻼤츺𻰤뺸뤸鸽𼸤𰺸𼼤齼𼰤龸뤸𽸤鰸𽼤龹𽰤뺸뤸븸𾸤𹰰𾼤𺻸𾰤鹺뤸𰺹𿸤鼹𿼤캸𿰤켸뤸𸸤츸𸼤𰺹𸰤츺뤸𹸤鸽뺸𹼤鸸𹰤鹺뺸뤸麹𺸤츸𺼤캸𺰤뤸켸𻸤츺𻼤龸𻰤뺸뤸븸𼸤𼼤𺻸𼰤뤸𽸤𽼤𻿸𽰤鹾뤸긹𾸤鸾𾼤뺸𾰤뤸븸𿸤𰺸𿼤𰺽𿰤𱰹뤸𸸤꼹𸼤𰻻𸰤뺺뤸걺𹸤꾹𹼤鸿𹰤뺸뤸𰺸𺸤𰺽𺼤𰻻𺰤뺺뤸꺹𻸤𻼤갽𻰤鸿뤸뺸𼸤𰺸𼼤鸻븸𼰤𰺽뤸𰻻𽸤뺺𽼤鸾𽰤뺸뤸𾸤鸿𾼤𾰤뤸뺸𿸤𰺸𿼤븸𿰤𰺽뤸𰻻𸸤뺺𸼤𸰤뤸𹸤뺸𹼤븼𹰤츸뤸鸸𺸤𰻺꾸𺼤𰺺𺰤뤸𰺸𻸤𰻻𻼤뺺𻰤𹹸뤸뺸𼸤븼𼼤𱸹𼰤뺸뤸鸰𽸤꼸𽼤뺸𽰤𰺸뤸뺺𾸤鸸𾼤뺸𾰤黼뤸𺰰𿸤뺸𿼤뺸𿰤鸼뤸𸰰𸸤뺸𸼤鼺𸰤𸺰뤸𸹸𹸤𰺸𹼤뺺𹰤뺸뤸鸾𺸤𺾰𺼤븺𺰤𹸰뤸뺸𻸤𰺹𻼤뺺𻰤뺸뤸鸸𼸤𰺾𼼤鸸𼰤참뤸𰻻𽸤𰸰𽼤𸺰𽰤鸸뤸𹸰𾸤鸹𾼤𸻻뺸𾰤𰺹뤸鸸𿸤뺸𿼤黼𿰤𻺰뤸븺𸸤뺸𸼤鸾𸰤𻺰뤸븺𹸤鸸𹼤𸻸𹰤𰸰꼸뤸𻺰𺸤븺𺼤鸸𺰤뺸뤸黼𻸤鰸𻼤뺸𻰤뺸뤸𰻻𼸤𰸰𼼤𹺰𼰤𰸰꺸뤸뺸𽸤鸾𽼤𺺰𽰤뺸뺻뤸𰸰꺸𾸤𺺰𾼤뺸뺻𾰤𰸰꺸뤸𻺰𿸤븺𿼤뺸뺻𿰤鸾뤸𺺰𸸤븺𸼤뺸𸰤𰺸뤸뺺𹸤뺻𹼤鸼𹰤𸾰뤸𸹸𺸤븺𺼤뺸뺻𺰤뺺뤸뺸뺻𻸤뺺𻼤鸹𻰤뺸뤸鼸𼸤鰸𼼤𸹸𼰤뺸뺻뤸뺺𽸤麹𽼤뺸𽰤鼼뤸鰸𾸤鸸𾼤𾰤𱸸뤸𿸤麸𿼤뺸𿰤鼸뤸𸸤뺸뺻𸼤𸰤뤸𹸤참𹼤黺𹰤𺺰뤸븺𺸤鸸𺼤𰻻𺰤𰸰뤸𹺰𻸤𸻸𻼤뺸𻰤鸾뤸𺺰𼸤뺸𼼤𸻸𼰤𰺺꼸뤸뺺𽸤븺𽼤𹸰𽰤븺뤸鸾𾸤𻺰𾼤븺𾰤뺸뤸𰺸𿸤鸼𿼤𸾰𿰤뺺뤸뺸𸸤뺺𸼤뺸𸰤뺺뤸鸹𹸤뺸𹼤鼸𹰤鰸뤸븺𺸤뺸𺼤鸸𺰤꼸뤸뺸뺻𻸤𰺸𻼤뺺𻰤뤸𱸸𼸤𼼤鸸𼰤뤸𽸤𽼤𸻸𽰤𰺹뤸뺺𾸤뺺𾼤鼹𾰤뺸뤸鼰𿸤鰸𿼤麹𿰤𰺸뤸鸼𸸤鹺뾸𸼤鸸𸰤켼뤸𱸹𹸤𹼤캼𹰤麸뤸鼾𺸤𺼤츺𺰤뺸뤸鸾𻸤𸺰𻼤鸿𻰤븼뤸𱸸𼸤鸿𼼤뺸𼰤𰻺뤸꾸𽸤鸻𽼤뺸𽰤𰻺뤸鸻𾸤뺸𾼤鸻𾰤𰻺鸸뤸麸𿸤鼸鸸𿼤뺸𿰤鼰뤸𸸤麹𸼤𸰤뤸𹸤𱸹𹼤뺸𹰤麸뤸鰸𺸤𱺹𺼤麸𺰤뤸뺸𻸤龼𻼤𻰤鹸뤸𹼰𼸤𱰹𼼤𸻸𼰤鸹뤸갽𽸤뺸𽼤𽰤븸뤸𹼰𾸤𰺸𾼤𰻺𾰤꼸뤸𱼸𿸤쾸龿𿼤鸾𿰤𰺸뤸꾹𸸤긽𸼤꼸鸸𸰤鿾뤸𸼰𹸤𰺽𹼤鸻𹰤𱰸뤸븹𺸤븸𺼤𺰤鸾뤸麸𻸤꺸𻼤뺸𻰤龼뤸𼸤갸𼼤𰻺꾸𼰤걺꺸뤸껰𽸤𰹰𽼤𸹸𽰤𸹸뤸𸹸𾸤꾿𾼤鸺𾰤𰻻뤸𰹰𿸤𸹸𿼤𸹸𿰤𸹸뤸갿𸸤껿𸼤𰸰𸰤鸾뤸𸺰𹸤𱰸𹼤뺸𹰤鸾뤸𺺰𺸤鸾𺼤𱰸𺰤黾뤸𺼰𻸤鹸𻼤黺𻰤𺼰뤸𱰹𼸤鸰𼼤𰻺𼰤黼뤸𻾰𽸤鸸𽼤뺸𽰤𰻺뤸黸𾸤𻾰𾼤𱰸𾰤뺸뤸鸾𿸤𺺰𿼤𿰤鿾뤸𻰰𸸤𸼤𰹰𸰤𸹸뤸𸹸𹸤𸹸𹼤븸𹰤𹺰뤸𺸤𹸰𺼤𺰤𻼰뤸𻸤𹸰𻼤𰻺꾸𻰤𰻺꾸뤸𰺸𼸤𼼤鸿𼰤뤸𸻸𽸤갸𽼤鸿𽰤麺뤸𱸸𾸤뺸𾼤麸𾰤뤸𱺸𿸤𿼤𿰤𸹸뤸𸸤참𸼤𰻻𸰤𰸰뤸𹺰𹸤𸹸𹼤뺸𹰤鸾뤸𹺰𺸤𸹸𺼤뺸𺰤鸾뤸𸺰𻸤𸹸𻼤뺸𻰤𰺽뤸鸸𼸤黼𼼤鰸𼰤𸹸뤸쾸𽸤𽼤𹼰𽰤𰺸뤸뺸𾸤鸾𾼤𻺰𾰤븺뤸뺸𿸤鸾𿼤𹺰𿰤𰸰꺸뤸𹸰𸸤븺𸼤𻺰𸰤참뤸𹸤𸾰𹼤𰺸𹰤참뤸𸻸𺸤껻𺼤𰺹𺰤𱰸길뤸黰𻸤麻𻼤븸𻰤𸾰뤸𸻺𼸤𰺸𼼤𹸰𼰤뺺뤸鹸𽸤뺸𽼤鸼𽰤𸺰뤸鸹𾸤麸𾼤븺𾰤𰻺뺸뤸𱺸𿸤뺸𿼤𱸹𿰤鸾뤸𸺰𸸤鸸𸼤𸰤𸹸뤸뺸𹸤鸸𹼤𰺽𹰤꼸뤸𰺸𺸤𰻺𺼤麸𺰤鰸뤸𸹸𻸤鼺𻼤𻰤𰻺뺸뤸𸻸𼸤뺺𼼤鸹𼰤뺸뤸뺸𽸤鸰𽼤𽰤뺺뤸鸸𾸤뺸𾼤뺺𾰤黾뤸𹼰𿸤𱸹𿼤𱸹𿰤𸻸뤸麹𸸤𸼤𸻸𸰤龹뤸𱺸𹸤鸹𹼤鼹𹰤𱿺뺸뤸𰺸븸𺸤鹸𺼤𱰸𺰤켹뤸뺹븸𻸤찹𻼤𰺽𻰤꼸뤸𰺸𼸤鸻𼼤𰹰𼰤𸹸뤸𸹸𽸤𸹸𽼤𰺿𽰤𰹰뤸𸹸𾸤𸹸𾼤𸹸𾰤鿻뤸𰻺𿸤꼸𿼤𰺸𿰤鸸뤸鼺𸸤𸼤뺺븹𸰤캺뤸𹸤𹼤𹰤麹뤸뺸𺸤鼼𺼤鸹𺰤鰸뤸𰻺뺸𻸤𱺸𻼤뺸𻰤鸾뤸𸺰𼸤𱸹𼼤𼰤𸹸뤸𰺹𽸤麸𽼤鰸𽰤𰻺뤸麹𾸤鸸𾼤뺸𾰤뤸鼸𿸤𿼤𿰤뤸𸻸𸸤𰺹𸼤뺺𸰤븺뤸鸹𹸤𰺸𹼤𰺸𹰤캼뤸츼𺸤𱸸𺼤𱺸𺰤𱼹뤸𻸤𱾹𻼤麺𻰤𸺰뤸鸸𼸤𹸰𼼤긹𼰤鼺뤸𽸤𰺸𽼤긹𽰤뤸𾸤𾼤뺹𾰤𰸰뤸𹺰𿸤𸻸𿼤𰺹𿰤뺺뤸븺𸸤鸸𸼤뺸𸰤黼뤸갹𹸤鹸𹼤𹰰𹰤뤸뺸𺸤𰻻𺼤𰸰𺰤𺺰뤸뺸𻸤鹸𻼤뺸𻰤𰸰뤸𻺰𼸤뺸𼼤𸻺𼰤鸸뤸𰺹𽸤黼𽼤𹺰𽰤뺸뤸𰸰𾸤𻺰𾼤뺸𾰤뺸뤸𰸰𿸤𺺰𿼤븸𿰤뺸뤸𰸰𸸤𹺰𸼤갹𸰤뺸뤸츸𹸤븼𹼤𹻸𹰤뺸뤸𰺹𺸤뺺𺼤𹸰𺰤븸뤸𸻸𻸤𰺹𻼤𹸰𻰤뺺뤸𼸤𱸹𼼤鹸𼰤鹺쾸뤸뺸𽸤鸾𽼤𺺰𽰤鸽뤸齾𾸤𹺰𾼤鿾𾰤뺸뤸鸾𿸤𹺰𿼤𺱺𿰤𹸰뤸鰹𸸤𸺰𸼤𱸸𸰤븺뤸𹸰𹸤븺𹼤𹰤𱺹뤸鰹𺸤齺𺼤𹺰𺰤븹뤸뺹𻸤鸾𻼤𺺰𻰤븺뤸뺸𼸤𼼤𰺸𼰤𹸰뤸뺺𽸤뺹𽼤鸾𽰤𸺰뤸齾𾸤뺸𾼤𰺸𾰤뺺뤸뺹𿸤鸾𿼤𻺰𿰤鸽뤸齾𸸤𹺰𸼤길𸰤뺸뤸𰺹𹸤𹸰𹼤뺺𹰤뺸뤸길𺸤𰺹𺼤뺺𺰤𹸰뤸븺𻸤鸸𻼤𰻻𻰤𰸰뤸𼸤鿺𼼤𼰤麹뤸뺸𽸤鼼𽼤鰸𽰤𰻻뤸𰸰𾸤𸺰𾼤뾸𾰤뺸뤸껸𿸤𰺸𿼤𰻻𿰤꾸뤸鼸𸸤龸𸼤𱺹𸰤켹뤸𹸤𱸹𹼤麺𹰤𹺰뤸𰺹𺸤켹𺼤鸸𺰤𺺰뤸뺸𻸤뺸𻼤𱸹𻰤𰸰뤸𸺰𼸤𱺹𼼤𼰤𸹸뤸麺𽸤𺺰𽼤뺸𽰤𰺹뤸𰻺𾸤𹸰𾼤鰺츸𾰤뺸뤸𰺸𿸤鸾𿼤𿰤뺺뤸𸸤麸𸼤齺𸰤𻺰뤸鸽𹸤븺𹼤븺𹰤鸽뤸齾𺸤𺼤鹺쾸𺰤뤸𺺰𻸤븺𻼤뺸𻰤鸾뤸𸺰𼸤鿾𼼤뺸𼰤鸾뤸𹺰𽸤鿾𽼤𸻸𽰤뺺뤸뺸𾸤뺺𾼤𹺰𾰤鹸뤸뺸𿸤齼𿼤鰸𿰤𱾹뤸𱱺쾸𸸤뺸𸼤𰻻𸰤𰸰뤸𻺰𹸤鸽𹼤𰻺븹𹰤𰸰븸뤸𻺰𺸤鸽𺼤麹𺰤뾸뤸뺸𻸤鸾𻼤𹺰𻰤麸뤸뺸𼸤鿺𼼤𸺰𼰤뺺뤸𹸰𽸤뺸𽼤뺸𽰤𹸰뤸뺺𾸤鼾𾼤𾰤뾸뤸鸽𿸤뺸𿼤齼𿰤뤸𱱺쾸𸸤𸼤𸰤뤸𹸤𸹸𹼤뺸𹰤鸾뤸𺺰𺸤뺸𺼤𰺸𺰤鸾뤸𹺰𻸤뺺𻼤뺸𻰤길뤸𰺹𼸤뺺𼼤뺸𼰤鸾뤸𸺰𽸤𸻻빰𽼤븺𽰤鸹뤸𾸤𱸹𾼤𹹸𾰤뤸𱸹𿸤鸰𿼤𿰤𸹸뤸𸸤𱸹𸼤鸸𸰤𰻻뤸𰸰𹸤𻺰𹼤븺𹰤𰻻뤸𰸰𺸤𻺰𺼤뺸𺰤뺸뤸뺺𻸤뺸𻼤뺺𻰤뤸𱸹𼸤𰺹𼼤뺺𼰤뤸𽸤뺸𽼤鸾𽰤𻺰뤸뺸𾸤뺸𾼤뺺𾰤븺뤸뺸𿸤鸾𿼤𻺰𿰤뺹뤸뺸𸸤뺺𸼤븺𸰤뺹뤸𰸰𹸤𸺰𹼤𸹸𹰤뺸뤸鸾𺸤𹰰𺼤𰺹𺰤뺺뤸𻸤𸹸𻼤뺸𻰤𰻻뤸𰸰𼸤𹺰𼼤𱰹𼰤뺸뤸黸𽸤鰸𽼤𸻻빰𽰤𱾹뤸𰻺꺸𾸤鸸𾼤麸𾰤𱰸뤸뺸𿸤黸𿼤𿰤𰻺꺸뤸鸸𸸤𰸰꾸𸼤𻺰𸰤뺸뤸뺸𹸤鹻𹼤𰺹𹰤麸뤸뺺𺸤뺸𺼤鸾𺰤𻺰뤸참𻸤뺸𻼤𰻻𻰤𰸰뤸𺺰𼸤참𼼤뺸𼰤𰺹뤸뺺𽸤참𽼤𰻻𽰤𰸰뤸𹺰𾸤뺸𾼤鸾𾰤𻺰뤸鸸𿸤뺸𿼤鸾𿰤𺺰뤸뺸𸸤鸸𸼤뺸𸰤꾸뤸𰺹𹸤뺺𹼤뺸𹰤鸾뤸𺺰𺸤뺸𺼤뺸𺰤𰸰뤸𸺰𻸤黺𻼤뺸𻰤𰺹뤸뺺𼸤𻾰𼼤뺸𼰤뺸뤸길𽸤𰺹𽼤뺺𽰤뺸뤸鸾𾸤𺺰𾼤鸸𾰤𰺸뤸鸰𿸤黾𿼤𸺰𿰤뺺뤸뺸𸸤길𸼤𰺹𸰤뺺뤸鸸𹸤𸻻빰𹼤麸𹰤뤸𸹸𺸤𺼤참𺰤𰻻뤸𰸰𻸤𺺰𻼤뺹𻰤𸻸뤸𰺺길𼸤𹸰𼼤뺺𼰤鸾뤸𸺰𽸤껻𽼤𰸰꺸𽰤𺺰뤸뺸𾸤껻𾼤𰻻𾰤𰺸뤸꾸𿸤鸼𿼤𺺰𿰤뺸뤸뺸𸸤鸾𸼤𺺰𸰤𰺹뤸𰺹𹸤뺺𹼤𹸰𹰤𱸹뤸鸾𺸤𸺰𺼤𱸹𺰤뤸𰺸𻸤𻼤𸹸𻰤뺸뤸鸸𼸤꾸𼼤𰺸𼰤𰺹뤸뺺𽸤𽼤𽰤𸸸뤸𸸸𾸤𸸸𾼤𸸸𾰤𸸸뤸𸸸𿸤𸸸𿼤𸸸𿰤𸸸뤸𸸸𸸤𸸸𸼤齸𸰤齸뤸𸸸𹸤뼱𹼤𼱼𹰤뤸𺸤𺼤𱺽뾽𺰤갹뤸뼿𻸤밹𻼤鰰𻰤鰾뤸뼸뾼𼸤칻𼼤𸸸𼰤𸸸뤸𸸸𽸤𸸸𽼤𸸸𽰤𸸸뤸𸸸𾸤𸸸𾼤𸸸𾰤𼼾뤸𻹻𿸤𻸻𿼤𸸸𿰤𻹻黼뤸𻼻黸 \ No newline at end of file diff --git a/tools/autoconvert b/tools/autoconvert new file mode 100755 index 0000000..1c14768 --- /dev/null +++ b/tools/autoconvert @@ -0,0 +1,82 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use IO::File; +use IO::Dir; +use File::Basename; +use File::Spec::Functions qw(rel2abs catdir catfile); + +our $mydir = dirname(rel2abs(__FILE__)); +our $basedir = catdir($mydir, '..', 'firmware'); +our $fwtool = catfile($mydir, 'fwtool'); + +my $root = IO::Dir->new($basedir) or die("Can't access $basedir: $!"); +for (my $vendor = $root->read(); defined($vendor); $vendor = $root->read()) { + if ($vendor !~ /^(.|..)$/) { + my $vendordir = catdir($basedir, $vendor); + my $devices = IO::Dir->new($vendordir); + if (defined($devices)) { + for (my $device = $devices->read(); defined($device); $device = $devices->read()) { + if ($device !~ /^(.|..)$/) { + my $devicedir = catdir($vendordir, $device); + if (-d $devicedir) { + print("Processing $vendor/$device...\n"); + my $readme = catfile($devicedir, 'README.md'); + my $sileadts = catfile($devicedir, 'silead_ts.fw'); + if (-e $readme) { + my $overwrite; + if (-e $sileadts) { + print("silead_ts.fw found, overwrite? (y/N)"); + my $answer = readline(); + $overwrite = ($answer =~ /^[yY]/); + } else { + $overwrite = 1; + } + if ($overwrite) { + my $firmware = catfile($devicedir, 'firmware.fw'); + my $model = '1680'; + my $width = 4095; + my $height = 4095; + my $points = 10; + my %flags = ( xflip => 0, yflip => 0, swap => 0, track => 0 ); + + my $table = IO::File->new($readme, 'r') or warn("Error opening README.md"); + while (my $line = <$table>) { + if ($line =~ /Touch controller\s*\|[ \ta-zA-Z]*([0-9]{4})/) { + $model = $1; + } elsif ($line =~ /Extracted firmware\s*\|[^(]*\(([a-zA-Z0-9_.]+)\)/) { + $firmware = catfile($devicedir, $1); + } elsif ($line =~ /Touch panel resolution\s*\|[^0-9]*([0-9]+)[ \t\/xX,]+([0-9]+)/) { + $width = $1; + $height = $2; + } elsif ($line =~ /Multitouch support\s*\|[^0-9]*([0-9]+)/) { + $points = $1; + } elsif ($line =~ /Finger tracking\s*\|\W*[Nn]/) { + $flags{track} = 1; + } elsif ($line =~ /Mirrored horizontally\s*\|\W*[Yy]/) { + $flags{xflip} = 1; + } elsif ($line =~ /Mirrored vertically\s*\|\W*[Yy]/) { + $flags{yflip} = 1; + } elsif ($line =~ /Axes swapped\s*\|\W*[Yy]/) { + $flags{swap} = 1; + } + } + + if (-e $firmware) { + my $flagstring = join(',', map({ $flags{$_} ? "$_" : "no$_" } keys(%flags))); + print("Running: fwtool -c $firmware -1 -m $model -w $width -h $height -t $points -f $flagstring $sileadts\n"); + system($fwtool, '-c', $firmware, '-1', '-m', $model, '-w', $width, '-h', $height, '-t', $points, '-f', $flagstring, $sileadts); + } else { + print("Firmware $firmware found.\n"); + } + } + } else { + print("No README.md found.\n"); + } + } + } + } + } + } +} diff --git a/tools/fw_extractor b/tools/fw_extractor new file mode 100755 index 0000000..6e83cba --- /dev/null +++ b/tools/fw_extractor @@ -0,0 +1,36 @@ +#! /usr/bin/python +from subprocess import * +import sys +import os + +if len(sys.argv) != 2: + print "Firware extractor.\n" + print "Requires elf file (driver) argument" + sys.exit(1) + +filename = sys.argv[1] + +p = Popen(['/bin/sh', '-c', 'readelf -S '+ filename + ' | grep \ \.rodata\ | sed \'s/\\[ *//g\''], stdout=PIPE) + +args = p.stdout.readlines() + +if len(args) != 1: + print "No simple .rodata section found" + sys.exit(1) + +rodata = args[0] + +args = rodata.split(']') +args = args[1].split() + +offset = int(args[3], 16) + +print ".rodata offset is ", offset, "\n" + +p = Popen(['/bin/sh', '-c', 'readelf -s '+ filename +' | grep -i fw'], stdout=PIPE) + +for line in p.stdout: + args = line.split() + + print "Found", args[7], "offset", offset + int(args[1],16), "count", args[2] + call(['dd','if='+filename,'bs=1','count='+args[2], 'skip='+str(offset + int(args[1],16)),'of='+args[7] + ".fw"]) diff --git a/tools/fwtool b/tools/fwtool new file mode 100755 index 0000000..29c6df3 --- /dev/null +++ b/tools/fwtool @@ -0,0 +1,143 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use IO::File; +use Getopt::Long; +use File::Basename; +use lib dirname (__FILE__); +use Firmware::Silead; + +sub usage() { + print STDERR "Usage: fwtool {-i | -c | -s | -x } [ -1 | -2 | -3 ] [-w ] [-h ] [-t ] [-f ] \n"; + print STDERR "-i Prints statistics and information about new-style firmware.fw\n"; + print STDERR "-c Converts any older firmware format into new-style firmware.fw\n"; + print STDERR "-s Sets parameters and flags\n"; + print STDERR "-x Exports a firmware into plain format, to use with other Linux/Android drivers\n"; + print STDERR " The source firmware format can be specified with these parameters:\n"; + print STDERR "-1 Plain firmware, as used with the Android driver (default)\n"; + print STDERR "-2 Windows GSL_TS_CFG.h firmware\n"; + print STDERR "-3 Scrambled Windows SileadTouch.fw firmware\n"; + print STDERR " For the -c and -s modes, the following parameters may be set:\n"; + print STDERR "-m Sets the controller model (4-byte ASCII string, ex.: 1680)\n"; + print STDERR "-w Sets the width parameter\n"; + print STDERR "-h Sets the height parameter\n"; + print STDERR "-t Sets the number of supported touch points parameter\n"; + print STDERR "-f Sets flags, separated by commas (optional, supported flags: xflip, yflip, swap, track)\n"; + print STDERR " xflip enables horizontal flipping\n"; + print STDERR " yflip enables vertical flipping\n"; + print STDERR " swap enables axis swapping\n"; + print STDERR " track enables in-driver finger tracking (use for controllers that don't support it)\n"; + print STDERR " Each flag may be prefixed with 'no' to disable it.\n"; + -1; +} + +my ($mode, $format, $tscfg, $model, $width, $height, $touches, $flags, $plain) = ('info', 'plain'); +GetOptions( + 'info' => sub { $mode = 'info'; }, + 'convert=s' => sub { $mode = 'convert'; $tscfg = $_[1]; }, + 'set' => sub { $mode = 'set'; }, + 'xport=s' => sub { $mode = 'export'; $plain = $_[1]; }, + 'model=s' => \$model, + 'width=i' => \$width, + 'height=i' => \$height, + 'touches=i' => \$touches, + 'flags=s' => \$flags, + '1' => sub { $format = 'plain' }, + '2' => sub { $format = 'tscfg' }, + '3' => sub { $format = 'scrambled' }, +) or exit usage; + +my $fwfile = $ARGV[0] or exit usage; + +sub set_params { + my ($rep) = @_; + if (defined $model) { + $rep->set_model($model); + } + if (defined $width) { + $rep->set_width($width); + } + if (defined $height) { + $rep->set_height($height); + } + if (defined $touches) { + $rep->set_touches($touches); + } + if (defined $flags) { + for my $flag (split /,\s*/, $flags) { + if ($flag =~ /^(no)?xflip$/) { + $rep->set_xmirrored($flag !~ /^no/); + } elsif ($flag =~ /^(no)?yflip$/) { + $rep->set_ymirrored($flag !~ /^no/); + } elsif ($flag =~ /^(no)?swap$/) { + $rep->set_swapped($flag !~ /^no/); + } elsif ($flag =~ /^(no)?track$/) { + $rep->set_tracking($flag !~ /^no/); + } else { + warn "Invalid flag: $flag"; + } + } + } +} + +if ($mode eq 'info') { + print "Loading $fwfile...\n"; + my $rep = Firmware::Silead->load($fwfile) or die "Can't load firmware $fwfile: $@"; + print "Controller model: " . $rep->model . "\n"; + print "Panel width: " . $rep->width . "\n"; + print "Panel height: " . $rep->height . "\n"; + print "Number of touch points: " . $rep->touches . "\n"; + print "X axis flipped: " . ($rep->xmirrored ? "yes" : "no") . "\n"; + print "Y axis flipped: " . ($rep->ymirrored ? "yes" : "no") . "\n"; + print "X and Y axes swapped: " . ($rep->swapped ? "yes" : "no") . "\n"; + print "Software tracking enabled: " . ($rep->tracking ? "yes" : "no") . "\n"; + my @pages = $rep->get_pages; + print "Number of pages: ". scalar(@pages) . "\n"; + print "Page list:"; + for my $page (@pages) { + printf " %02x", $page; + } + print "\n"; +} elsif ($mode eq 'set') { + print "Loading $fwfile...\n"; + my $rep = Firmware::Silead->load($fwfile) or die "Can't load firmware $fwfile: $@"; + print "Setting parameters...\n"; + set_params($rep); + print "Saving $fwfile...\n"; + $rep->save($fwfile); +} elsif ($mode eq 'convert') { + print "Loading $tscfg...\n"; + my $data; + do { + my $in = IO::File->new($tscfg, 'r') or die "Can't open $tscfg: $!"; + $in->binmode; + local $/ = undef; + $data = <$in>; + defined($data) or die "Can't load firmware: $!"; + $in->close(); + }; + + my $rep = Firmware::Silead->new(); + if ($format eq 'plain') { + $rep->import_fw($data) or die "Can't parse firmware: $@"; + } elsif ($format eq 'tscfg') { + $rep->import_tscfg($data) or die "Can't parse firmware: $@"; + } elsif ($format eq 'scrambled') { + $rep->import_scrambled($data) or die "Can't parse firmware: $@"; + } + + print "Setting parameters...\n"; + set_params($rep); + + print "Saving $fwfile...\n"; + $rep->save($fwfile) or die "Can't write firmware: $@"; +} elsif ($mode eq 'export') { + print "Loading $fwfile...\n"; + my $rep = Firmware::Silead->load($fwfile) or die "Can't load firmware $fwfile: $@"; + print "Exporting to $plain...\n"; + my $out = IO::File->new($plain, 'w') or die "Can't open $plain: $!"; + my $data = $rep->export_fw(); + $out->print($data) or die "Can't write firmware: $!"; + $out->close(); +} diff --git a/tools/scanwindrv b/tools/scanwindrv new file mode 100755 index 0000000..e6c7709 --- /dev/null +++ b/tools/scanwindrv @@ -0,0 +1,129 @@ +#!/usr/bin/perl + +use strict; +use warnings; +require 5.018; +use IO::File; + +sub usage() { + print(STDERR "Usage: scanwindrv SileadTouch.sys\n"); + print(STDERR "Scans a Windows driver for sections that look like a firmware image and\n"); + print(STDERR "writes each into sequentially numbered files: firmware_01.fw firmware_02.fw ...\n"); + -1; +} + +my $drvfile = $ARGV[0] or exit usage; + +my $driver = ''; +do { + my $in = IO::File->new($drvfile, 'r') or die "Can't open $drvfile: $!"; + $in->binmode(); + local $/; + $driver = <$in>; + defined $driver or die "Can't read firmware: $!"; + $in->close(); +}; + +my $candidate = 0; + +# find candidates +for (my $offset = 0; $offset + 8 <= length($driver); $offset++) { + + my ($cmd, $page) = unpack('(LL)<', substr($driver, $offset, 8)); + if ($cmd == 0x000000f0 && ($page & 0xffffff00) == 0x00000000) { + printf(STDERR "Found possible candidate at offset 0x%08x\n", $offset); + # possible candidate, start copying pages + + my $firmware = ''; + my $size; + FIRMWARE: for ($size = 0; $offset + $size + 129 * 8 <= length($driver);) { + + #printf(STDERR "offset=0x%08x size=%u[0x%08x]\n", $offset, $size, $size); + my ($cmd, $page) = unpack('(LL)<', substr($driver, $offset + $size, 8)); + #printf(STDERR "Page header at 0x%08x: [0x%02x, 0x%08x]\n", $offset + $size, $cmd, $page); + + # if this doesn't look like a page register - page pair, we're done + if ($cmd != 0x000000f0 || ($page & 0xffffff00) != 0x00000000) { + last FIRMWARE; + } + + for (my $index = 0; $index + 4 <= 128; $index += 4) { + my ($idx, $dat) = unpack('(LL)<', substr($driver, $offset + $size + 8 + $index * 2, 8)); + #printf(STDERR "Data at 0x%08x: [0x%02x, 0x%02x]\n", $offset + $size + 8 + $index * 2, $idx, $dat); + + # if the index is not sequential, this is probably not part of the fw and we're done + if ($idx != $index) { + #printf(STDERR "Expected index 0x%02x, got 0x%02x\n", $index, $idx); + last FIRMWARE; + } + } + + # one page complete, copy + substr($firmware, $size, 33 * 8) = substr($driver, $offset + $size, 33 * 8); + $size += 33 * 8; + } + + # check if we have enough data + if (length($firmware) > 8) { + my $fwname = sprintf("firmware_%02u.fw", $candidate); + printf(STDERR "Writing firmware to %s, size = %u bytes\n", $fwname, length($firmware)); + my $out = IO::File->new($fwname, 'w', 0666) or die "Can't open $fwname: $!"; + $out->binmode(); + print($out $firmware); + $out->close(); + $candidate++; + } else { + printf(STDERR "Not a firmware, ignoring\n"); + } + + # skip ahead + $offset += $size; + } +} + +=cut +export F=SileadTouch.sys +cat $F \ + | hexdump -e '1/1 "0x%8.8_ax "' -e '1/1 "%8._ad "' -e '8/1 "%02X ""\n"""' \ + | grep -i -E "F0 00 00 00 02 00 00 00|7C 00 00 00 .. .. .. .." \ + | grep "F0 00 00 00 02 00 00 00" -B1 \ + ; \ +echo -- \ + ; \ +cat $F \ + | hexdump -e '1/1 "0x%8.8_ax "' -e '1/1 "%8._ad "' -e '8/1 "%02X ""\n"""' \ + | grep -i -E "F0 00 00 00 02 00 00 00|7C 00 00 00 .. .. .. .." \ + | tail -n2 + +cat <new($scrfile, 'r') or die "Can't open $scrfile: $!"; + $in->binmode(); + local $/; + $scrambled = <$in>; + defined $scrambled or die "Can't read firmware: $!"; + $in->close(); +}; + +my $unscrambled = ''; +for my $char (split //, $scrambled) { + $unscrambled .= chr(ord($char) ^ 0x88); +} + +my $out = IO::File->new($fwfile, 'w') or die "Can't open $fwfile: $!"; + +my $cfg = 0; +for my $line (split /\n/, $unscrambled) { + if ($cfg and $line =~ /};/) { + $cfg = 0; + } + if ($line =~ /TS_CFG_DATA/) { + $cfg = 1; + } + if ($cfg) { + $line =~ s/\s//g; + $line = lc($line); + if ($line =~ /{0x([0-9a-f]+),0x([0-9a-f]+)},/) { + my $address = hex($1); + my $data = hex($2); + print $out pack('(LL)<', $address, $data) or die "Can't write to output: $!";; + } + } +} + +$out->close(); diff --git a/tools/untscfg b/tools/untscfg new file mode 100755 index 0000000..c629310 --- /dev/null +++ b/tools/untscfg @@ -0,0 +1,47 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use IO::File; + +sub usage() { + print STDERR "Usage: untscfg GSL_TS_CFG.h gsl_ts.fw\n"; + print STDERR "Converts the GSL_TS_CFG.h from a Silead Windows driver package into legacy binary format.\n"; + -1; +} + +my $tscffile = $ARGV[0] or exit usage; +my $fwfile = $ARGV[1] or exit usage; + +my $unscrambled = ''; +do { + my $in = IO::File->new($tscffile, 'r') or die "Can't open $tscffile: $!"; + $in->binmode(); + local $/; + $unscrambled = <$in>; + defined $unscrambled or die "Can't read firmware: $!"; + $in->close(); +}; + +my $out = IO::File->new($fwfile, 'w') or die "Can't open $fwfile: $!"; + +my $cfg = 0; +for my $line (split /\n/, $unscrambled) { + if ($cfg and $line =~ /};/) { + $cfg = 0; + } + if ($line =~ /TS_CFG_DATA/) { + $cfg = 1; + } + if ($cfg) { + $line =~ s/\s//g; + $line = lc($line); + if ($line =~ /{0x([0-9a-f]+),0x([0-9a-f]+)},/) { + my $address = hex($1); + my $data = hex($2); + print $out pack('(LL)<', $address, $data) or die "Can't write to output: $!";; + } + } +} + +$out->close();