From: "Lourens Naudé" Date: 2019-08-24T23:37:30+01:00 Subject: [ruby-core:94551] Re: [Ruby master Misc#16125] Remove the reserved member from rb_data_type_t as the addition of the compactor callback pushed it over a single cache line --===============1249253956== Content-Type: multipart/alternative; boundary="000000000000195e960590e49280" --000000000000195e960590e49280 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Thanks for the clarification Nobu - pahole reporting wrong size for this case. Sorry for the noise. On Sat, 24 Aug 2019 at 22:51, wrote: > Issue #16125 has been updated by nobu (Nobuyoshi Nakada). > > Description updated > > methodmissing (Lourens Naud=C3=A9) wrote: > > I'm wondering what the `reserved` member was originally intended for, > given introducing the `dcompact` member basically already broke binary > compatibility by changing the struct size from `64` -> `72` bytes when > preserving the `reserved` member as well. > > It is intended for new function pointer like `dcompact`, and the struct > size hasn't changed as `dcompact` consumed an element there. > > ---------------------------------------- > Misc #16125: Remove the reserved member from rb_data_type_t as the > addition of the compactor callback pushed it over a single cache line > https://bugs.ruby-lang.org/issues/16125#change-80979 > > * Author: methodmissing (Lourens Naud=C3=A9) > * Status: Open > * Priority: Normal > * Assignee: > ---------------------------------------- > References PR https://github.com/ruby/ruby/pull/2396 > > I noticed that since the introduction of the `GC.compact` API, struct > `rb_data_type_t` spans multiple cache lines with the introduction of the > `dcompact` function pointer / callback: > > ```C > struct rb_data_type_struct { > const char * wrap_struct_name; /* 0 8 */ > struct { > void (*dmark)(void *); /* 8 8 */ > void (*dfree)(void *); /* 16 8 */ > size_t (*dsize)(const void *); /* 24 8 */ > void (*dcompact)(void *); /* 32 8 */ > <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< > void * reserved[1]; /* 40 8 */ > } function; /* 8 40 */ > const rb_data_type_t * parent; /* 48 8 */ > void * data; /* 56 8 */ > /* --- cacheline 1 boundary (64 bytes) --- */ > VALUE flags; /* 64 8 */ > > /* size: 72, cachelines: 2, members: 5 */ > /* last cacheline: 8 bytes */ > }; > ``` > > I'm wondering what the `reserved` member was originally intended for, > given introducing the `dcompact` member basically already broke binary > compatibility by changing the struct size from `64` -> `72` bytes when > preserving the `reserved` member as well. > > This struct is defined in `include/ruby.h` and used extensively in MRI bu= t > also extensions and thus "public API". If there's the off chance that the= re > isn't a need for the reserved member moving forward (maybe could have bee= n > for compacting or a similar GC feature?), could we remove it and prefer > aligning on cache line boundaries instead? > > Packed with the `reserved` member removed, single cache line: > > ```C > struct rb_data_type_struct { > const char * wrap_struct_name; /* 0 8 */ > struct { > void (*dmark)(void *); /* 8 8 */ > void (*dfree)(void *); /* 16 8 */ > size_t (*dsize)(const void *); /* 24 8 */ > void (*dcompact)(void *); /* 32 8 */ > } function; /* 8 32 */ > const rb_data_type_t * parent; /* 40 8 */ > void * data; /* 48 8 */ > VALUE flags; /* 56 8 */ > > /* size: 64, cachelines: 1, members: 5 */ > }; > ``` > > ### Usage in MRI > > Examples of internal APIs that use it and how the typed data type > declarations does not affect the tail of the function struct with the sty= le > used in MRI (I realize this may not be true for all extensions): > > #### AST > > ```C > static const rb_data_type_t rb_node_type =3D { > "AST/node", > {node_gc_mark, RUBY_TYPED_DEFAULT_FREE, node_memsize,}, > 0, 0, > RUBY_TYPED_FREE_IMMEDIATELY, > }; > ``` > > #### Fiber > > ```C > static const rb_data_type_t fiber_data_type =3D { > "fiber", > {fiber_mark, fiber_free, fiber_memsize, fiber_compact,}, > 0, 0, RUBY_TYPED_FREE_IMMEDIATELY > }; > ``` > > #### Enumerator > > And related generator etc. types. > > ```C > static const rb_data_type_t enumerator_data_type =3D { > "enumerator", > { > enumerator_mark, > enumerator_free, > enumerator_memsize, > enumerator_compact, > }, > 0, 0, RUBY_TYPED_FREE_IMMEDIATELY > }; > ``` > > #### Encoding > > ```C > static const rb_data_type_t encoding_data_type =3D { > "encoding", > {0, 0, 0,}, > 0, 0, RUBY_TYPED_FREE_IMMEDIATELY > }; > ``` > > #### Proc, Binding and methods > > ```C > static const rb_data_type_t proc_data_type =3D { > "proc", > { > proc_mark, > RUBY_TYPED_DEFAULT_FREE, > proc_memsize, > proc_compact, > }, > 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED > }; > ``` > > ```C > const ruby_binding_data_type =3D { > "binding", > { > binding_mark, > binding_free, > binding_memsize, > binding_compact, > }, > 0, 0, RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FREE_IMMEDIATELY > }; > ``` > > ```C > static const rb_data_type_t method_data_type =3D { > "method", > { > bm_mark, > RUBY_TYPED_DEFAULT_FREE, > bm_memsize, > bm_compact, > }, > 0, 0, RUBY_TYPED_FREE_IMMEDIATELY > }; > ``` > > #### Threads > > ```C > #define thread_data_type ruby_threadptr_data_type > const rb_data_type_t ruby_threadptr_data_type =3D { > "VM/thread", > { > thread_mark, > thread_free, > thread_memsize, > thread_compact, > }, > 0, 0, RUBY_TYPED_FREE_IMMEDIATELY > }; > ``` > > And *many* others both internal and in `ext/`. Looking at the definitions > in MRI at least, I don't see: > > * patterns of any typed data definition explicitly initializing the > `reserved` member > * how this would affect "in the wild" extensions negatively as the more > popular ones I referenced also followed the MRI init style. > > ### Benchmarks > > Focused from the standard bench suite on typed data objects as mentioned > above. > > Prelude: > > ``` > lourens@CarbonX1:~/src/ruby/ruby$ make benchmark > COMPARE_RUBY=3D~/src/ruby/trunk/ruby OPTS=3D"-v --repeat-count 10" > ./revision.h unchanged > /usr/local/bin/ruby --disable=3Dgems -rrubygems -I./benchmark/lib > ./benchmark/benchmark-driver/exe/benchmark-driver \ > --executables=3D"compare-ruby::/home/lourens/src/ruby/trunk/r= uby > -I.ext/common --disable-gem" \ > --executables=3D"built-ruby::./miniruby -I./lib -I. > -I.ext/common ./tool/runruby.rb --extout=3D.ext -- --disable-gems > --disable-gem" \ > $(find ./benchmark -maxdepth 1 -name '' -o -name '**.yml' -o > -name '**.rb' | sort) -v --repeat-count 10 > compare-ruby: ruby 2.7.0dev (2019-08-20T13:33:32Z master 235d810c2e) > [x86_64-linux] > built-ruby: ruby 2.7.0dev (2019-08-20T15:03:21Z pack-rb_data_type_t > 92b8641ccd) [x86_64-linux] > ``` > > Left side `compare-ruby` (master), right side `current` (this branch): > > ``` > require_thread 0.035 0.049 i/s - 1.000 times in > 28.932403s 20.426896s > vm1_blockparam_call 18.885M > 18.907M i/s - 30.000M times in 1.588571s 1.586713s > vm1_blockparam_pass > 15.159M 15.434M i/s - 30.000M times in 1.978964s 1.943805s > vm1_blockparam_yield > 20.560M 20.673M i/s - 30.000M times in 1.459127s 1.451188s > vm1_blockparam > 32.733M 33.358M i/s - 30.000M times in 0.916513s 0.899344s > vm1_block > 33.796M 34.215M i/s - 30.000M times in 0.887692s 0.876808s > vm2_fiber_reuse_gc > 98.480 104.688 i/s - 100.000 times in 1.015439s 0.955219s > vm2_fiber_reuse > 364.082 397.878 i/s - 200.000 times in 0.549327s 0.502667s > vm2_fiber_switch > 11.548M 11.730M i/s - 20.000M times in 1.731852s 1.704978s > vm2_proc > 36.025M 36.278M i/s - 6.000M times in 0.166552s 0.165389s > vm_thread_alive_check > 108.273k 109.290k i/s - 50.000k times in 0.461794s 0.457499s > vm_thread_close > 1.415 1.432 i/s - 1.000 times in 0.706720s 0.698509s > vm_thread_condvar1 > 1.287 1.287 i/s - 1.000 times in 0.776782s 0.777074s > vm_thread_condvar2 > 1.653 1.615 i/s - 1.000 times in 0.604922s 0.619380s > vm_thread_create_join > 0.913 0.921 i/s - 1.000 times in 1.094693s 1.085227s > vm_thread_mutex1 > 2.537 2.581 i/s - 1.000 times in 0.394181s 0.387481s > vm_thread_mutex2 > 2.571 2.577 i/s - 1.000 times in 0.388932s 0.388020s > vm_thread_mutex3 > 1.110 1.660 i/s - 1.000 times in 0.900852s 0.602422s > vm_thread_pass_flood > 5.867 9.997 i/s - 1.000 times in 0.170431s 0.100032s > vm_thread_pass > 0.349 0.350 i/s - 1.000 times in 2.865303s 2.854191s > vm_thread_pipe > 6.923 7.093 i/s - 1.000 times in 0.144447s 0.140993s > vm_thread_queue > 1.297 1.287 i/s - 1.000 times in 0.771302s 0.777274s > vm_thread_sized_queue2 > 1.538 1.479 i/s - 1.000 times in 0.650188s 0.676074s > vm_thread_sized_queue3 > 1.421 1.456 i/s - 1.000 times in 0.703753s 0.686595s > vm_thread_sized_queue4 > 1.347 1.342 i/s - 1.000 times in 0.742653s 0.745130s > vm_thread_sized_queue > 5.473 5.377 i/s - 1.000 times in 0.182710s 0.185966s > ``` > > ### Further cache utilization info > > Used `perf stat` on a rails console using the integration session helper > to load the redmine homepage 100 times (removes network roundtrip and oth= er > variance and easier to reproduce for reviewers - less tools). > > Master > > ``` > lourens@CarbonX1:~/src/redmine$ sudo perf stat -d bin/rails c -e > production > Loading production environment (Rails 5.2.3) > irb(main):001:0> 100.times { app.get('/') } > ----- truncated ----- > Processing by WelcomeController#index as HTML > Current user: anonymous > Rendering welcome/index.html.erb within layouts/base > Rendered welcome/index.html.erb within layouts/base (0.5ms) > Completed 200 OK in 13ms (Views: 5.1ms | ActiveRecord: 1.3ms) > =3D> 100 > irb(main):002:0> RUBY_DESCRIPTION > =3D> "ruby 2.7.0dev (2019-08-20T13:33:32Z master 235d810c2e) [x86_64-linu= x]" > irb(main):003:0> exit > > Performance counter stats for 'bin/rails c -e production': > > 4373,155316 task-clock (msec) # 0,093 CPUs > utilized > 819 context-switches # 0,187 K/sec > > 30 cpu-migrations # 0,007 K/sec > > 82376 page-faults # 0,019 M/sec > > 13340422873 cycles # 3,051 GHz > (50,18%) > 17274934973 instructions # 1,29 insn per > cycle (62,74%) > 3558147880 branches # 813,634 M/sec > (62,42%) > 77703222 branch-misses # 2,18% of all > branches (62,39%) > 4625597415 L1-dcache-loads # 1057,725 M/sec > (62,22%) > 216886763 L1-dcache-load-misses # 4,69% of all > L1-dcache hits (62,54%) > 66242477 LLC-loads # 15,148 M/sec > (50,19%) > 13766303 LLC-load-misses # 20,78% of all > LL-cache hits (50,05%) > > 47,171186591 seconds time elapsed > ``` > > This branch: > > ``` > lourens@CarbonX1:~/src/redmine$ sudo perf stat -d bin/rails c -e > production > Loading production environment (Rails 5.2.3) > irb(main):001:0> 100.times { app.get('/') } > ----- truncated ----- > Started GET "/" for 127.0.0.1 at 2019-08-20 23:40:43 +0100 > Processing by WelcomeController#index as HTML > Current user: anonymous > Rendering welcome/index.html.erb within layouts/base > Rendered welcome/index.html.erb within layouts/base (0.6ms) > Completed 200 OK in 13ms (Views: 5.1ms | ActiveRecord: 1.4ms) > =3D> 100 > irb(main):002:0> p RUBY_DESCRIPTION > "ruby 2.7.0dev (2019-08-20T15:03:21Z pack-rb_data_type_t 92b8641ccd) > [x86_64-linux]" > =3D> "ruby 2.7.0dev (2019-08-20T15:03:21Z pack-rb_data_type_t 92b8641ccd) > [x86_64-linux]" > irb(main):003:0> exit > > Performance counter stats for 'bin/rails c -e production': > > 4318,441633 task-clock (msec) # 0,112 CPUs > utilized > 599 context-switches # 0,139 K/sec > > 14 cpu-migrations # 0,003 K/sec > > 81011 page-faults # 0,019 M/sec > > 13241070220 cycles # 3,066 GHz > (49,56%) > 17323594358 instructions # 1,31 insn per > cycle (62,27%) > 3553794043 branches # 822,934 M/sec > (62,89%) > 76390145 branch-misses # 2,15% of all > branches (63,12%) > 4595415722 L1-dcache-loads # 1064,138 M/sec > (62,83%) > 202269349 L1-dcache-load-misses # 4,40% of all > L1-dcache hits (62,66%) > 66193702 LLC-loads # 15,328 M/sec > (49,44%) > 12548399 LLC-load-misses # 18,96% of all > LL-cache hits (49,49%) > > 38,464764876 seconds time elapsed > ``` > > Conclusions: > > * Minor improvement in instructions per cycle > * `L1-dcache-loads`: `1057,725 M/sec` -> `1064,138 M/sec` (higher rate of > L1 cache loads) > * `L1-dcache-load-misses`: `4,69%` -> `4,40%` (reduced L1 cache miss rate= ) > > Thoughts? > > > > -- > https://bugs.ruby-lang.org/ > > Unsubscribe: > > --000000000000195e960590e49280 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdj48ZGl2IGRpcj0iYXV0byI+VGhhbmtzIGZvciB0aGUgY2xhcmlmaWNhdGlvbiBOb2J1IC0g cGFob2xlIHJlcG9ydGluZyB3cm9uZyBzaXplIGZvciB0aGlzIGNhc2UuIFNvcnJ5IGZvciB0aGUg bm9pc2UuPC9kaXY+PC9kaXY+PGRpdiBkaXI9ImF1dG8iPjxicj48L2Rpdj48ZGl2Pjxicj48ZGl2 IGNsYXNzPSJnbWFpbF9xdW90ZSI+PGRpdiBkaXI9Imx0ciIgY2xhc3M9ImdtYWlsX2F0dHIiPk9u IFNhdCwgMjQgQXVnIDIwMTkgYXQgMjI6NTEsICZsdDs8YSBocmVmPSJtYWlsdG86bm9idUBydWJ5 LWxhbmcub3JnIj5ub2J1QHJ1YnktbGFuZy5vcmc8L2E+Jmd0OyB3cm90ZTo8YnI+PC9kaXY+PGJs b2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjAgMCAwIC44ZXg7Ym9y ZGVyLWxlZnQ6MXB4ICNjY2Mgc29saWQ7cGFkZGluZy1sZWZ0OjFleCI+SXNzdWUgIzE2MTI1IGhh cyBiZWVuIHVwZGF0ZWQgYnkgbm9idSAoTm9idXlvc2hpIE5ha2FkYSkuPGJyPg0KPGJyPg0KRGVz Y3JpcHRpb24gdXBkYXRlZDxicj4NCjxicj4NCm1ldGhvZG1pc3NpbmcgKExvdXJlbnMgTmF1ZMOp KSB3cm90ZTo8YnI+DQomZ3Q7IEkmIzM5O20gd29uZGVyaW5nIHdoYXQgdGhlIGByZXNlcnZlZGAg bWVtYmVyIHdhcyBvcmlnaW5hbGx5IGludGVuZGVkIGZvciwgZ2l2ZW4gaW50cm9kdWNpbmcgdGhl IGBkY29tcGFjdGAgbWVtYmVyIGJhc2ljYWxseSBhbHJlYWR5IGJyb2tlIGJpbmFyeSBjb21wYXRp YmlsaXR5IGJ5IGNoYW5naW5nIHRoZSBzdHJ1Y3Qgc2l6ZSBmcm9tIGA2NGAgLSZndDsgYDcyYCBi eXRlcyB3aGVuIHByZXNlcnZpbmcgdGhlIGByZXNlcnZlZGAgbWVtYmVyIGFzIHdlbGwuPGJyPg0K PGJyPg0KSXQgaXMgaW50ZW5kZWQgZm9yIG5ldyBmdW5jdGlvbiBwb2ludGVyIGxpa2UgYGRjb21w YWN0YCwgYW5kIHRoZSBzdHJ1Y3Qgc2l6ZSBoYXNuJiMzOTt0IGNoYW5nZWQgYXMgYGRjb21wYWN0 YCBjb25zdW1lZCBhbiBlbGVtZW50IHRoZXJlLjxicj4NCjxicj4NCi0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08YnI+DQpNaXNjICMxNjEyNTogUmVtb3ZlIHRoZSByZXNl cnZlZCBtZW1iZXIgZnJvbSByYl9kYXRhX3R5cGVfdCBhcyB0aGUgYWRkaXRpb24gb2YgdGhlIGNv bXBhY3RvciBjYWxsYmFjayBwdXNoZWQgaXQgb3ZlciBhIHNpbmdsZSBjYWNoZSBsaW5lPGJyPg0K PGEgaHJlZj0iaHR0cHM6Ly9idWdzLnJ1YnktbGFuZy5vcmcvaXNzdWVzLzE2MTI1I2NoYW5nZS04 MDk3OSIgcmVsPSJub3JlZmVycmVyIiB0YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9idWdzLnJ1Ynkt bGFuZy5vcmcvaXNzdWVzLzE2MTI1I2NoYW5nZS04MDk3OTwvYT48YnI+DQo8YnI+DQoqIEF1dGhv cjogbWV0aG9kbWlzc2luZyAoTG91cmVucyBOYXVkw6kpPGJyPg0KKiBTdGF0dXM6IE9wZW48YnI+ DQoqIFByaW9yaXR5OiBOb3JtYWw8YnI+DQoqIEFzc2lnbmVlOiA8YnI+DQotLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPGJyPg0KUmVmZXJlbmNlcyBQUiA8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vcnVieS9ydWJ5L3B1bGwvMjM5NiIgcmVsPSJub3JlZmVycmVyIiB0 YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9naXRodWIuY29tL3J1YnkvcnVieS9wdWxsLzIzOTY8L2E+ PGJyPg0KPGJyPg0KSSBub3RpY2VkIHRoYXQgc2luY2UgdGhlIGludHJvZHVjdGlvbiBvZiB0aGUg YEdDLmNvbXBhY3RgIEFQSSwgc3RydWN0IGByYl9kYXRhX3R5cGVfdGAgc3BhbnMgbXVsdGlwbGUg Y2FjaGUgbGluZXMgd2l0aCB0aGUgaW50cm9kdWN0aW9uIG9mIHRoZSBgZGNvbXBhY3RgIGZ1bmN0 aW9uIHBvaW50ZXIgLyBjYWxsYmFjazo8YnI+DQo8YnI+DQpgYGBDPGJyPg0Kc3RydWN0IHJiX2Rh dGFfdHlwZV9zdHJ1Y3Qgezxicj4NCsKgIMKgIGNvbnN0IGNoYXLCoCAqwqAgwqAgwqAgwqAgwqAg wqAgwqAgd3JhcF9zdHJ1Y3RfbmFtZTvCoCDCoCDCoC8qwqAgwqAgwqAwwqAgwqAgwqA4ICovPGJy Pg0KwqAgwqAgc3RydWN0IHs8YnI+DQrCoCDCoCDCoCDCoCB2b2lkwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAoKmRtYXJrKSh2b2lkICopO8KgIMKgIMKgLyrCoCDCoCDCoDjCoCDCoCDCoDggKi88YnI+ DQrCoCDCoCDCoCDCoCB2b2lkwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAoKmRmcmVlKSh2b2lkICop O8KgIMKgIMKgLyrCoCDCoCAxNsKgIMKgIMKgOCAqLzxicj4NCsKgIMKgIMKgIMKgIHNpemVfdMKg IMKgIMKgIMKgIMKgIMKgIMKgKCpkc2l6ZSkoY29uc3Qgdm9pZMKgICopOyAvKsKgIMKgIDI0wqAg wqAgwqA4ICovPGJyPg0KwqAgwqAgwqAgwqAgdm9pZMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKCpk Y29tcGFjdCkodm9pZCAqKTvCoCAvKsKgIMKgIDMywqAgwqAgwqA4ICovICZsdDsmbHQ7Jmx0OyZs dDsmbHQ7Jmx0OyZsdDsmbHQ7Jmx0OyZsdDsmbHQ7Jmx0OyZsdDsmbHQ7Jmx0OyZsdDsmbHQ7Jmx0 OyZsdDsmbHQ7Jmx0OyZsdDsmbHQ7Jmx0OyZsdDsmbHQ7Jmx0OyZsdDsmbHQ7Jmx0Ozxicj4NCsKg IMKgIMKgIMKgIHZvaWQgKsKgIMKgIMKgIMKgIMKgIMKgIMKgcmVzZXJ2ZWRbMV07wqAgwqAgwqAg wqAgwqAgLyrCoCDCoCA0MMKgIMKgIMKgOCAqLzxicj4NCsKgIMKgIH0gZnVuY3Rpb247wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLyrCoCDC oCDCoDjCoCDCoCA0MCAqLzxicj4NCsKgIMKgIGNvbnN0IHJiX2RhdGFfdHlwZV90wqAgKsKgIMKg IHBhcmVudDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC8qwqAgwqAgNDjCoCDCoCDCoDggKi88YnI+ DQrCoCDCoCB2b2lkICrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGRhdGE7wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAvKsKgIMKgIDU2wqAgwqAgwqA4ICovPGJyPg0KwqAgwqAgLyog LS0tIGNhY2hlbGluZSAxIGJvdW5kYXJ5ICg2NCBieXRlcykgLS0tICovPGJyPg0KwqAgwqAgVkFM VUXCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBmbGFnczvCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCAvKsKgIMKgIDY0wqAgwqAgwqA4ICovPGJyPg0KPGJyPg0KwqAgwqAgLyogc2l6ZTog NzIsIGNhY2hlbGluZXM6IDIsIG1lbWJlcnM6IDUgKi88YnI+DQrCoCDCoCAvKiBsYXN0IGNhY2hl bGluZTogOCBieXRlcyAqLzxicj4NCn07PGJyPg0KYGBgPGJyPg0KPGJyPg0KSSYjMzk7bSB3b25k ZXJpbmcgd2hhdCB0aGUgYHJlc2VydmVkYCBtZW1iZXIgd2FzIG9yaWdpbmFsbHkgaW50ZW5kZWQg Zm9yLCBnaXZlbiBpbnRyb2R1Y2luZyB0aGUgYGRjb21wYWN0YCBtZW1iZXIgYmFzaWNhbGx5IGFs cmVhZHkgYnJva2UgYmluYXJ5IGNvbXBhdGliaWxpdHkgYnkgY2hhbmdpbmcgdGhlIHN0cnVjdCBz aXplIGZyb20gYDY0YCAtJmd0OyBgNzJgIGJ5dGVzIHdoZW4gcHJlc2VydmluZyB0aGUgYHJlc2Vy dmVkYCBtZW1iZXIgYXMgd2VsbC48YnI+DQo8YnI+DQpUaGlzIHN0cnVjdCBpcyBkZWZpbmVkIGlu IGBpbmNsdWRlL3J1YnkuaGAgYW5kIHVzZWQgZXh0ZW5zaXZlbHkgaW4gTVJJIGJ1dCBhbHNvIGV4 dGVuc2lvbnMgYW5kIHRodXMgJnF1b3Q7cHVibGljIEFQSSZxdW90Oy4gSWYgdGhlcmUmIzM5O3Mg dGhlIG9mZiBjaGFuY2UgdGhhdCB0aGVyZSBpc24mIzM5O3QgYSBuZWVkIGZvciB0aGUgcmVzZXJ2 ZWQgbWVtYmVyIG1vdmluZyBmb3J3YXJkIChtYXliZSBjb3VsZCBoYXZlIGJlZW4gZm9yIGNvbXBh Y3Rpbmcgb3IgYSBzaW1pbGFyIEdDIGZlYXR1cmU/KSwgY291bGQgd2UgcmVtb3ZlIGl0IGFuZCBw cmVmZXIgYWxpZ25pbmcgb24gY2FjaGUgbGluZSBib3VuZGFyaWVzIGluc3RlYWQ/PGJyPg0KPGJy Pg0KUGFja2VkIHdpdGggdGhlIGByZXNlcnZlZGAgbWVtYmVyIHJlbW92ZWQsIHNpbmdsZSBjYWNo ZSBsaW5lOjxicj4NCjxicj4NCmBgYEM8YnI+DQpzdHJ1Y3QgcmJfZGF0YV90eXBlX3N0cnVjdCB7 PGJyPg0KwqAgwqAgY29uc3QgY2hhcsKgICrCoCDCoCDCoCDCoCDCoCDCoCDCoCB3cmFwX3N0cnVj dF9uYW1lO8KgIMKgIMKgLyrCoCDCoCDCoDDCoCDCoCDCoDggKi88YnI+DQrCoCDCoCBzdHJ1Y3Qg ezxicj4NCsKgIMKgIMKgIMKgIHZvaWTCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCgqZG1hcmspKHZv aWQgKik7wqAgwqAgwqAvKsKgIMKgIMKgOMKgIMKgIMKgOCAqLzxicj4NCsKgIMKgIMKgIMKgIHZv aWTCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCgqZGZyZWUpKHZvaWQgKik7wqAgwqAgwqAvKsKgIMKg IDE2wqAgwqAgwqA4ICovPGJyPg0KwqAgwqAgwqAgwqAgc2l6ZV90wqAgwqAgwqAgwqAgwqAgwqAg wqAoKmRzaXplKShjb25zdCB2b2lkwqAgKik7IC8qwqAgwqAgMjTCoCDCoCDCoDggKi88YnI+DQrC oCDCoCDCoCDCoCB2b2lkwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAoKmRjb21wYWN0KSh2b2lkICop O8KgIC8qwqAgwqAgMzLCoCDCoCDCoDggKi88YnI+DQrCoCDCoCB9IGZ1bmN0aW9uO8KgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIC8qwqAgwqAg wqA4wqAgwqAgMzIgKi88YnI+DQrCoCDCoCBjb25zdCByYl9kYXRhX3R5cGVfdMKgICrCoCDCoCBw YXJlbnQ7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAvKsKgIMKgIDQwwqAgwqAgwqA4ICovPGJyPg0K wqAgwqAgdm9pZCAqwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBkYXRhO8KgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgLyrCoCDCoCA0OMKgIMKgIMKgOCAqLzxicj4NCsKgIMKgIFZBTFVF wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZmxhZ3M7wqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgLyrCoCDCoCA1NsKgIMKgIMKgOCAqLzxicj4NCjxicj4NCsKgIMKgIC8qIHNpemU6IDY0 LCBjYWNoZWxpbmVzOiAxLCBtZW1iZXJzOiA1ICovPGJyPg0KfTs8YnI+DQpgYGA8YnI+DQo8YnI+ DQojIyMgVXNhZ2UgaW4gTVJJPGJyPg0KPGJyPg0KRXhhbXBsZXMgb2YgaW50ZXJuYWwgQVBJcyB0 aGF0IHVzZSBpdCBhbmQgaG93IHRoZSB0eXBlZCBkYXRhIHR5cGUgZGVjbGFyYXRpb25zIGRvZXMg bm90IGFmZmVjdCB0aGUgdGFpbCBvZiB0aGUgZnVuY3Rpb24gc3RydWN0IHdpdGggdGhlIHN0eWxl IHVzZWQgaW4gTVJJIChJIHJlYWxpemUgdGhpcyBtYXkgbm90IGJlIHRydWUgZm9yIGFsbCBleHRl bnNpb25zKTo8YnI+DQo8YnI+DQojIyMjIEFTVDxicj4NCjxicj4NCmBgYEM8YnI+DQpzdGF0aWMg Y29uc3QgcmJfZGF0YV90eXBlX3QgcmJfbm9kZV90eXBlID0gezxicj4NCsKgIMKgICZxdW90O0FT VC9ub2RlJnF1b3Q7LDxicj4NCsKgIMKgIHtub2RlX2djX21hcmssIFJVQllfVFlQRURfREVGQVVM VF9GUkVFLCBub2RlX21lbXNpemUsfSw8YnI+DQrCoCDCoCAwLCAwLDxicj4NCsKgIMKgIFJVQllf VFlQRURfRlJFRV9JTU1FRElBVEVMWSw8YnI+DQp9Ozxicj4NCmBgYDxicj4NCjxicj4NCiMjIyMg RmliZXI8YnI+DQo8YnI+DQpgYGBDPGJyPg0Kc3RhdGljIGNvbnN0IHJiX2RhdGFfdHlwZV90IGZp YmVyX2RhdGFfdHlwZSA9IHs8YnI+DQrCoCDCoCAmcXVvdDtmaWJlciZxdW90Oyw8YnI+DQrCoCDC oCB7ZmliZXJfbWFyaywgZmliZXJfZnJlZSwgZmliZXJfbWVtc2l6ZSwgZmliZXJfY29tcGFjdCx9 LDxicj4NCsKgIMKgIDAsIDAsIFJVQllfVFlQRURfRlJFRV9JTU1FRElBVEVMWTxicj4NCn07PGJy Pg0KYGBgPGJyPg0KPGJyPg0KIyMjIyBFbnVtZXJhdG9yPGJyPg0KPGJyPg0KQW5kIHJlbGF0ZWQg Z2VuZXJhdG9yIGV0Yy4gdHlwZXMuPGJyPg0KPGJyPg0KYGBgQzxicj4NCnN0YXRpYyBjb25zdCBy Yl9kYXRhX3R5cGVfdCBlbnVtZXJhdG9yX2RhdGFfdHlwZSA9IHs8YnI+DQrCoCDCoCAmcXVvdDtl bnVtZXJhdG9yJnF1b3Q7LDxicj4NCsKgIMKgIHs8YnI+DQrCoCDCoCDCoCDCoCBlbnVtZXJhdG9y X21hcmssPGJyPg0KwqAgwqAgwqAgwqAgZW51bWVyYXRvcl9mcmVlLDxicj4NCsKgIMKgIMKgIMKg IGVudW1lcmF0b3JfbWVtc2l6ZSw8YnI+DQrCoCDCoCDCoCDCoCBlbnVtZXJhdG9yX2NvbXBhY3Qs PGJyPg0KwqAgwqAgfSw8YnI+DQrCoCDCoCAwLCAwLCBSVUJZX1RZUEVEX0ZSRUVfSU1NRURJQVRF TFk8YnI+DQp9Ozxicj4NCmBgYDxicj4NCjxicj4NCiMjIyMgRW5jb2Rpbmc8YnI+DQo8YnI+DQpg YGBDPGJyPg0Kc3RhdGljIGNvbnN0IHJiX2RhdGFfdHlwZV90IGVuY29kaW5nX2RhdGFfdHlwZSA9 IHs8YnI+DQrCoCDCoCAmcXVvdDtlbmNvZGluZyZxdW90Oyw8YnI+DQrCoCDCoCB7MCwgMCwgMCx9 LDxicj4NCsKgIMKgIDAsIDAsIFJVQllfVFlQRURfRlJFRV9JTU1FRElBVEVMWTxicj4NCn07PGJy Pg0KYGBgPGJyPg0KPGJyPg0KIyMjIyBQcm9jLCBCaW5kaW5nIGFuZCBtZXRob2RzPGJyPg0KPGJy Pg0KYGBgQzxicj4NCnN0YXRpYyBjb25zdCByYl9kYXRhX3R5cGVfdCBwcm9jX2RhdGFfdHlwZSA9 IHs8YnI+DQrCoCDCoCAmcXVvdDtwcm9jJnF1b3Q7LDxicj4NCsKgIMKgIHs8YnI+DQrCoCDCoCDC oCDCoCBwcm9jX21hcmssPGJyPg0KwqAgwqAgwqAgwqAgUlVCWV9UWVBFRF9ERUZBVUxUX0ZSRUUs PGJyPg0KwqAgwqAgwqAgwqAgcHJvY19tZW1zaXplLDxicj4NCsKgIMKgIMKgIMKgIHByb2NfY29t cGFjdCw8YnI+DQrCoCDCoCB9LDxicj4NCsKgIMKgIDAsIDAsIFJVQllfVFlQRURfRlJFRV9JTU1F RElBVEVMWSB8IFJVQllfVFlQRURfV0JfUFJPVEVDVEVEPGJyPg0KfTs8YnI+DQpgYGA8YnI+DQo8 YnI+DQpgYGBDPGJyPg0KY29uc3TCoCBydWJ5X2JpbmRpbmdfZGF0YV90eXBlID0gezxicj4NCsKg IMKgICZxdW90O2JpbmRpbmcmcXVvdDssPGJyPg0KwqAgwqAgezxicj4NCsKgIMKgIMKgIMKgIGJp bmRpbmdfbWFyayw8YnI+DQrCoCDCoCDCoCDCoCBiaW5kaW5nX2ZyZWUsPGJyPg0KwqAgwqAgwqAg wqAgYmluZGluZ19tZW1zaXplLDxicj4NCsKgIMKgIMKgIMKgIGJpbmRpbmdfY29tcGFjdCw8YnI+ DQrCoCDCoCB9LDxicj4NCsKgIMKgIDAsIDAsIFJVQllfVFlQRURfV0JfUFJPVEVDVEVEIHwgUlVC WV9UWVBFRF9GUkVFX0lNTUVESUFURUxZPGJyPg0KfTs8YnI+DQpgYGA8YnI+DQo8YnI+DQpgYGBD PGJyPg0Kc3RhdGljIGNvbnN0IHJiX2RhdGFfdHlwZV90IG1ldGhvZF9kYXRhX3R5cGUgPSB7PGJy Pg0KwqAgwqAgJnF1b3Q7bWV0aG9kJnF1b3Q7LDxicj4NCsKgIMKgIHs8YnI+DQrCoCDCoCDCoCDC oCBibV9tYXJrLDxicj4NCsKgIMKgIMKgIMKgIFJVQllfVFlQRURfREVGQVVMVF9GUkVFLDxicj4N CsKgIMKgIMKgIMKgIGJtX21lbXNpemUsPGJyPg0KwqAgwqAgwqAgwqAgYm1fY29tcGFjdCw8YnI+ DQrCoCDCoCB9LDxicj4NCsKgIMKgIDAsIDAsIFJVQllfVFlQRURfRlJFRV9JTU1FRElBVEVMWTxi cj4NCn07PGJyPg0KYGBgPGJyPg0KPGJyPg0KIyMjIyBUaHJlYWRzPGJyPg0KPGJyPg0KYGBgQzxi cj4NCiNkZWZpbmUgdGhyZWFkX2RhdGFfdHlwZSBydWJ5X3RocmVhZHB0cl9kYXRhX3R5cGU8YnI+ DQpjb25zdCByYl9kYXRhX3R5cGVfdCBydWJ5X3RocmVhZHB0cl9kYXRhX3R5cGUgPSB7PGJyPg0K wqAgwqAgJnF1b3Q7Vk0vdGhyZWFkJnF1b3Q7LDxicj4NCsKgIMKgIHs8YnI+DQrCoCDCoCDCoCDC oCB0aHJlYWRfbWFyayw8YnI+DQrCoCDCoCDCoCDCoCB0aHJlYWRfZnJlZSw8YnI+DQrCoCDCoCDC oCDCoCB0aHJlYWRfbWVtc2l6ZSw8YnI+DQrCoCDCoCDCoCDCoCB0aHJlYWRfY29tcGFjdCw8YnI+ DQrCoCDCoCB9LDxicj4NCsKgIMKgIDAsIDAsIFJVQllfVFlQRURfRlJFRV9JTU1FRElBVEVMWTxi cj4NCn07PGJyPg0KYGBgPGJyPg0KPGJyPg0KQW5kICptYW55KiBvdGhlcnMgYm90aCBpbnRlcm5h bCBhbmQgaW4gYGV4dC9gLiBMb29raW5nIGF0IHRoZSBkZWZpbml0aW9ucyBpbiBNUkkgYXQgbGVh c3QsIEkgZG9uJiMzOTt0IHNlZTo8YnI+DQo8YnI+DQoqIHBhdHRlcm5zIG9mIGFueSB0eXBlZCBk YXRhIGRlZmluaXRpb24gZXhwbGljaXRseSBpbml0aWFsaXppbmcgdGhlIGByZXNlcnZlZGAgbWVt YmVyPGJyPg0KKiBob3cgdGhpcyB3b3VsZCBhZmZlY3QgJnF1b3Q7aW4gdGhlIHdpbGQmcXVvdDsg ZXh0ZW5zaW9ucyBuZWdhdGl2ZWx5IGFzIHRoZSBtb3JlIHBvcHVsYXIgb25lcyBJIHJlZmVyZW5j ZWQgYWxzbyBmb2xsb3dlZCB0aGUgTVJJIGluaXQgc3R5bGUuPGJyPg0KPGJyPg0KIyMjIEJlbmNo bWFya3M8YnI+DQo8YnI+DQpGb2N1c2VkIGZyb20gdGhlIHN0YW5kYXJkIGJlbmNoIHN1aXRlIG9u IHR5cGVkIGRhdGEgb2JqZWN0cyBhcyBtZW50aW9uZWQgYWJvdmUuPGJyPg0KPGJyPg0KUHJlbHVk ZTo8YnI+DQo8YnI+DQpgYGA8YnI+DQpsb3VyZW5zQENhcmJvblgxOn4vc3JjL3J1YnkvcnVieSQg bWFrZSBiZW5jaG1hcmsgQ09NUEFSRV9SVUJZPX4vc3JjL3J1YnkvdHJ1bmsvcnVieSBPUFRTPSZx dW90Oy12IC0tcmVwZWF0LWNvdW50IDEwJnF1b3Q7PGJyPg0KLi9yZXZpc2lvbi5oIHVuY2hhbmdl ZDxicj4NCi91c3IvbG9jYWwvYmluL3J1YnkgLS1kaXNhYmxlPWdlbXMgLXJydWJ5Z2VtcyAtSS4v YmVuY2htYXJrL2xpYiAuL2JlbmNobWFyay9iZW5jaG1hcmstZHJpdmVyL2V4ZS9iZW5jaG1hcmst ZHJpdmVyIFw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCAtLWV4ZWN1dGFibGVzPSZxdW90O2NvbXBh cmUtcnVieTo6L2hvbWUvbG91cmVucy9zcmMvcnVieS90cnVuay9ydWJ5IC1JLmV4dC9jb21tb24g LS1kaXNhYmxlLWdlbSZxdW90OyBcPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgLS1leGVjdXRhYmxl cz0mcXVvdDtidWlsdC1ydWJ5OjouL21pbmlydWJ5IC1JLi9saWIgLUkuIC1JLmV4dC9jb21tb27C oCAuL3Rvb2wvcnVucnVieS5yYiAtLWV4dG91dD0uZXh0wqAgLS0gLS1kaXNhYmxlLWdlbXMgLS1k aXNhYmxlLWdlbSZxdW90OyBcPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgJChmaW5kIC4vYmVuY2ht YXJrIC1tYXhkZXB0aCAxIC1uYW1lICYjMzk7JiMzOTsgLW8gLW5hbWUgJiMzOTsqKi55bWwmIzM5 OyAtbyAtbmFtZSAmIzM5OyoqLnJiJiMzOTsgfCBzb3J0KSAtdiAtLXJlcGVhdC1jb3VudCAxMDxi cj4NCmNvbXBhcmUtcnVieTogcnVieSAyLjcuMGRldiAoMjAxOS0wOC0yMFQxMzozMzozMlogbWFz dGVyIDIzNWQ4MTBjMmUpIFt4ODZfNjQtbGludXhdPGJyPg0KYnVpbHQtcnVieTogcnVieSAyLjcu MGRldiAoMjAxOS0wOC0yMFQxNTowMzoyMVogcGFjay1yYl9kYXRhX3R5cGVfdCA5MmI4NjQxY2Nk KSBbeDg2XzY0LWxpbnV4XTxicj4NCmBgYDxicj4NCjxicj4NCkxlZnQgc2lkZSBgY29tcGFyZS1y dWJ5YCAobWFzdGVyKSwgcmlnaHQgc2lkZSBgY3VycmVudGAgKHRoaXMgYnJhbmNoKTo8YnI+DQo8 YnI+DQpgYGA8YnI+DQpyZXF1aXJlX3RocmVhZMKgIMKgIMKgIMKgIDAuMDM1wqAgwqAgwqAgwqAw LjA0OSBpL3MgLcKgIMKgIMKgIMKgMS4wMDAgdGltZXMgaW4gMjguOTMyNDAzcyAyMC40MjY4OTZz PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqB2bTFfYmxvY2twYXJhbV9jYWxswqAgwqAgwqAgMTguODg1TcKgIMKgIMKgMTgu OTA3TSBpL3MgLcKgIMKgIMKgMzAuMDAwTSB0aW1lcyBpbiAxLjU4ODU3MXMgMS41ODY3MTNzPGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgdm0xX2Jsb2NrcGFyYW1fcGFzc8KgIMKgIMKgIDE1LjE1OU3CoCDCoCDCoDE1LjQz NE0gaS9zIC3CoCDCoCDCoDMwLjAwME0gdGltZXMgaW4gMS45Nzg5NjRzIDEuOTQzODA1czxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgdm0xX2Jsb2NrcGFyYW1feWllbGTCoCDCoCDCoCAyMC41NjBNwqAgwqAgwqAyMC42NzNN IGkvcyAtwqAgwqAgwqAzMC4wMDBNIHRpbWVzIGluIDEuNDU5MTI3cyAxLjQ1MTE4OHM8YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoHZtMV9ibG9ja3BhcmFtwqAgwqAgwqAgMzIuNzMzTcKgIMKgIMKgMzMuMzU4 TSBpL3MgLcKgIMKgIMKgMzAuMDAwTSB0aW1lcyBpbiAwLjkxNjUxM3MgMC44OTkzNDRzPGJyPg0K wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgdm0xX2Jsb2NrwqAgwqAgwqAgMzMuNzk2TcKgIMKgIMKgMzQu MjE1TSBpL3MgLcKgIMKgIMKgMzAuMDAwTSB0aW1lcyBpbiAwLjg4NzY5MnMgMC44NzY4MDhzPGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqB2bTJfZmliZXJfcmV1c2VfZ2PCoCDCoCDCoCDCoDk4LjQ4MMKgIMKgIMKgMTA0 LjY4OCBpL3MgLcKgIMKgIMKgMTAwLjAwMCB0aW1lcyBpbiAxLjAxNTQzOXMgMC45NTUyMTlzPGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgdm0yX2ZpYmVyX3JldXNlwqAgwqAgwqAgMzY0LjA4MsKgIMKgIMKgMzk3 Ljg3OCBpL3MgLcKgIMKgIMKgMjAwLjAwMCB0aW1lcyBpbiAwLjU0OTMyN3MgMC41MDI2NjdzPGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqB2bTJfZmliZXJfc3dpdGNowqAgwqAgwqAgMTEuNTQ4TcKgIMKgIMKgMTEu NzMwTSBpL3MgLcKgIMKgIMKgMjAuMDAwTSB0aW1lcyBpbiAxLjczMTg1MnMgMS43MDQ5NzhzPGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB2bTJfcHJvY8KgIMKgIMKgIDM2LjAyNU3CoCDCoCDC oDM2LjI3OE0gaS9zIC3CoCDCoCDCoCA2LjAwME0gdGltZXMgaW4gMC4xNjY1NTJzIDAuMTY1Mzg5 czxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIHZtX3RocmVhZF9hbGl2ZV9jaGVja8KgIMKgIMKgMTA4LjI3M2vCoCDCoCAxMDku MjkwayBpL3MgLcKgIMKgIMKgNTAuMDAwayB0aW1lcyBpbiAwLjQ2MTc5NHMgMC40NTc0OTlzPGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgdm1fdGhyZWFkX2Nsb3NlwqAgwqAgwqAgwqAgMS40MTXCoCDCoCDCoCDC oDEuNDMyIGkvcyAtwqAgwqAgwqAgwqAxLjAwMCB0aW1lcyBpbiAwLjcwNjcyMHMgMC42OTg1MDlz PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqB2bV90aHJlYWRfY29uZHZhcjHCoCDCoCDCoCDCoCAxLjI4N8KgIMKgIMKg IMKgMS4yODcgaS9zIC3CoCDCoCDCoCDCoDEuMDAwIHRpbWVzIGluIDAuNzc2NzgycyAwLjc3NzA3 NHM8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoHZtX3RocmVhZF9jb25kdmFyMsKgIMKgIMKgIMKgIDEuNjUzwqAgwqAg wqAgwqAxLjYxNSBpL3MgLcKgIMKgIMKgIMKgMS4wMDAgdGltZXMgaW4gMC42MDQ5MjJzIDAuNjE5 Mzgwczxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIHZtX3RocmVhZF9jcmVhdGVfam9pbsKgIMKgIMKgIMKgIDAuOTEzwqAgwqAg wqAgwqAwLjkyMSBpL3MgLcKgIMKgIMKgIMKgMS4wMDAgdGltZXMgaW4gMS4wOTQ2OTNzIDEuMDg1 MjI3czxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgdm1fdGhyZWFkX211dGV4McKgIMKgIMKgIMKgIDIuNTM3wqAg wqAgwqAgwqAyLjU4MSBpL3MgLcKgIMKgIMKgIMKgMS4wMDAgdGltZXMgaW4gMC4zOTQxODFzIDAu Mzg3NDgxczxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdm1fdGhyZWFkX211dGV4MsKgIMKgIMKgIMKgIDIuNTcx wqAgwqAgwqAgwqAyLjU3NyBpL3MgLcKgIMKgIMKgIMKgMS4wMDAgdGltZXMgaW4gMC4zODg5MzJz IDAuMzg4MDIwczxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdm1fdGhyZWFkX211dGV4M8KgIMKgIMKgIMKgIDEu MTEwwqAgwqAgwqAgwqAxLjY2MCBpL3MgLcKgIMKgIMKgIMKgMS4wMDAgdGltZXMgaW4gMC45MDA4 NTJzIDAuNjAyNDIyczxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdm1fdGhyZWFkX3Bhc3NfZmxvb2TCoCDCoCDCoCDCoCA1 Ljg2N8KgIMKgIMKgIMKgOS45OTcgaS9zIC3CoCDCoCDCoCDCoDEuMDAwIHRpbWVzIGluIDAuMTcw NDMxcyAwLjEwMDAzMnM8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHZtX3RocmVhZF9wYXNzwqAgwqAgwqAg wqAgMC4zNDnCoCDCoCDCoCDCoDAuMzUwIGkvcyAtwqAgwqAgwqAgwqAxLjAwMCB0aW1lcyBpbiAy Ljg2NTMwM3MgMi44NTQxOTFzPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB2bV90aHJlYWRfcGlwZcKgIMKg IMKgIMKgIDYuOTIzwqAgwqAgwqAgwqA3LjA5MyBpL3MgLcKgIMKgIMKgIMKgMS4wMDAgdGltZXMg aW4gMC4xNDQ0NDdzIDAuMTQwOTkzczxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHZtX3RocmVhZF9xdWV1ZcKg IMKgIMKgIMKgIDEuMjk3wqAgwqAgwqAgwqAxLjI4NyBpL3MgLcKgIMKgIMKgIMKgMS4wMDAgdGlt ZXMgaW4gMC43NzEzMDJzIDAuNzc3Mjc0czxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdm1fdGhyZWFkX3NpemVkX3F1ZXVlMsKg IMKgIMKgIMKgIDEuNTM4wqAgwqAgwqAgwqAxLjQ3OSBpL3MgLcKgIMKgIMKgIMKgMS4wMDAgdGlt ZXMgaW4gMC42NTAxODhzIDAuNjc2MDc0czxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdm1fdGhyZWFkX3NpemVkX3F1ZXVlM8Kg IMKgIMKgIMKgIDEuNDIxwqAgwqAgwqAgwqAxLjQ1NiBpL3MgLcKgIMKgIMKgIMKgMS4wMDAgdGlt ZXMgaW4gMC43MDM3NTNzIDAuNjg2NTk1czxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdm1fdGhyZWFkX3NpemVkX3F1ZXVlNMKg IMKgIMKgIMKgIDEuMzQ3wqAgwqAgwqAgwqAxLjM0MiBpL3MgLcKgIMKgIMKgIMKgMS4wMDAgdGlt ZXMgaW4gMC43NDI2NTNzIDAuNzQ1MTMwczxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHZtX3RocmVhZF9zaXplZF9xdWV1ZcKg IMKgIMKgIMKgIDUuNDczwqAgwqAgwqAgwqA1LjM3NyBpL3MgLcKgIMKgIMKgIMKgMS4wMDAgdGlt ZXMgaW4gMC4xODI3MTBzIDAuMTg1OTY2czxicj4NCmBgYCA8YnI+DQo8YnI+DQojIyMgRnVydGhl ciBjYWNoZSB1dGlsaXphdGlvbiBpbmZvPGJyPg0KPGJyPg0KVXNlZCBgcGVyZiBzdGF0YCBvbiBh IHJhaWxzIGNvbnNvbGUgdXNpbmcgdGhlIGludGVncmF0aW9uIHNlc3Npb24gaGVscGVyIHRvIGxv YWQgdGhlIHJlZG1pbmUgaG9tZXBhZ2UgMTAwIHRpbWVzIChyZW1vdmVzIG5ldHdvcmsgcm91bmR0 cmlwIGFuZCBvdGhlciB2YXJpYW5jZSBhbmQgZWFzaWVyIHRvIHJlcHJvZHVjZSBmb3IgcmV2aWV3 ZXJzIC0gbGVzcyB0b29scykuPGJyPg0KPGJyPg0KTWFzdGVyPGJyPg0KPGJyPg0KYGBgPGJyPg0K bG91cmVuc0BDYXJib25YMTp+L3NyYy9yZWRtaW5lJCBzdWRvIHBlcmYgc3RhdCAtZCBiaW4vcmFp bHMgYyAtZSBwcm9kdWN0aW9uPGJyPg0KTG9hZGluZyBwcm9kdWN0aW9uIGVudmlyb25tZW50IChS YWlscyA1LjIuMyk8YnI+DQppcmIobWFpbik6MDAxOjAmZ3Q7IDEwMC50aW1lcyB7IGFwcC5nZXQo JiMzOTsvJiMzOTspIH08YnI+DQotLS0tLSB0cnVuY2F0ZWQgLS0tLS08YnI+DQpQcm9jZXNzaW5n IGJ5IFdlbGNvbWVDb250cm9sbGVyI2luZGV4IGFzIEhUTUw8YnI+DQrCoCBDdXJyZW50IHVzZXI6 IGFub255bW91czxicj4NCsKgIFJlbmRlcmluZyB3ZWxjb21lL2luZGV4Lmh0bWwuZXJiIHdpdGhp biBsYXlvdXRzL2Jhc2U8YnI+DQrCoCBSZW5kZXJlZCB3ZWxjb21lL2luZGV4Lmh0bWwuZXJiIHdp dGhpbiBsYXlvdXRzL2Jhc2UgKDAuNW1zKTxicj4NCkNvbXBsZXRlZCAyMDAgT0sgaW4gMTNtcyAo Vmlld3M6IDUuMW1zIHwgQWN0aXZlUmVjb3JkOiAxLjNtcyk8YnI+DQo9Jmd0OyAxMDA8YnI+DQpp cmIobWFpbik6MDAyOjAmZ3Q7IFJVQllfREVTQ1JJUFRJT048YnI+DQo9Jmd0OyAmcXVvdDtydWJ5 IDIuNy4wZGV2ICgyMDE5LTA4LTIwVDEzOjMzOjMyWiBtYXN0ZXIgMjM1ZDgxMGMyZSkgW3g4Nl82 NC1saW51eF0mcXVvdDs8YnI+DQppcmIobWFpbik6MDAzOjAmZ3Q7IGV4aXQ8YnI+DQo8YnI+DQrC oFBlcmZvcm1hbmNlIGNvdW50ZXIgc3RhdHMgZm9yICYjMzk7YmluL3JhaWxzIGMgLWUgcHJvZHVj dGlvbiYjMzk7Ojxicj4NCjxicj4NCsKgIMKgIMKgIMKgNDM3MywxNTUzMTbCoCDCoCDCoCB0YXNr LWNsb2NrIChtc2VjKcKgIMKgIMKgIMKgIMKgI8KgIMKgIDAsMDkzIENQVXMgdXRpbGl6ZWTCoCDC oCDCoCDCoCDCoCA8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDgxOcKgIMKgIMKgIGNvbnRl eHQtc3dpdGNoZXPCoCDCoCDCoCDCoCDCoCAjwqAgwqAgMCwxODcgSy9zZWPCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCA8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAzMMKgIMKgIMKgIGNw dS1taWdyYXRpb25zwqAgwqAgwqAgwqAgwqAgwqAgI8KgIMKgIDAsMDA3IEsvc2VjwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqA4MjM3NsKgIMKgIMKg IHBhZ2UtZmF1bHRzwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAjwqAgwqAgMCwwMTkgTS9zZWPCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA8YnI+DQrCoCDCoCDCoCDCoDEzMzQwNDIyODczwqAgwqAg wqAgY3ljbGVzwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgI8KgIMKgIDMsMDUxIEdIesKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICg1MCwxOCUpPGJyPg0KwqAgwqAgwqAgwqAx NzI3NDkzNDk3M8KgIMKgIMKgIGluc3RydWN0aW9uc8KgIMKgIMKgIMKgIMKgIMKgIMKgICPCoCDC oCAxLDI5wqAgaW5zbiBwZXIgY3ljbGXCoCDCoCDCoCDCoCDCoCDCoCg2Miw3NCUpPGJyPg0KwqAg wqAgwqAgwqAgMzU1ODE0Nzg4MMKgIMKgIMKgIGJyYW5jaGVzwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgI8KgIDgxMyw2MzQgTS9zZWPCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAoNjIs NDIlKTxicj4NCsKgIMKgIMKgIMKgIMKgIDc3NzAzMjIywqAgwqAgwqAgYnJhbmNoLW1pc3Nlc8Kg IMKgIMKgIMKgIMKgIMKgIMKgI8KgIMKgIDIsMTglIG9mIGFsbCBicmFuY2hlc8KgIMKgIMKgIMKg IMKgICg2MiwzOSUpPGJyPg0KwqAgwqAgwqAgwqAgNDYyNTU5NzQxNcKgIMKgIMKgIEwxLWRjYWNo ZS1sb2Fkc8KgIMKgIMKgIMKgIMKgIMKgIyAxMDU3LDcyNSBNL3NlY8KgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgICg2MiwyMiUpPGJyPg0KwqAgwqAgwqAgwqAgwqAyMTY4ODY3NjPCoCDCoCDC oCBMMS1kY2FjaGUtbG9hZC1taXNzZXPCoCDCoCDCoCPCoCDCoCA0LDY5JSBvZiBhbGwgTDEtZGNh Y2hlIGhpdHPCoCDCoCAoNjIsNTQlKTxicj4NCsKgIMKgIMKgIMKgIMKgIDY2MjQyNDc3wqAgwqAg wqAgTExDLWxvYWRzwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAjwqAgwqAxNSwxNDggTS9zZWPC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAoNTAsMTklKTxicj4NCsKgIMKgIMKgIMKgIMKg IDEzNzY2MzAzwqAgwqAgwqAgTExDLWxvYWQtbWlzc2VzwqAgwqAgwqAgwqAgwqAgwqAjwqAgwqAy MCw3OCUgb2YgYWxsIExMLWNhY2hlIGhpdHPCoCDCoCDCoCg1MCwwNSUpPGJyPg0KPGJyPg0KwqAg wqAgwqAgNDcsMTcxMTg2NTkxIHNlY29uZHMgdGltZSBlbGFwc2VkPGJyPg0KYGBgPGJyPg0KPGJy Pg0KVGhpcyBicmFuY2g6PGJyPg0KPGJyPg0KYGBgPGJyPg0KbG91cmVuc0BDYXJib25YMTp+L3Ny Yy9yZWRtaW5lJCBzdWRvIHBlcmYgc3RhdCAtZCBiaW4vcmFpbHMgYyAtZSBwcm9kdWN0aW9uPGJy Pg0KTG9hZGluZyBwcm9kdWN0aW9uIGVudmlyb25tZW50IChSYWlscyA1LjIuMyk8YnI+DQppcmIo bWFpbik6MDAxOjAmZ3Q7IDEwMC50aW1lcyB7IGFwcC5nZXQoJiMzOTsvJiMzOTspIH08YnI+DQot LS0tLSB0cnVuY2F0ZWQgLS0tLS08YnI+DQpTdGFydGVkIEdFVCAmcXVvdDsvJnF1b3Q7IGZvciAx MjcuMC4wLjEgYXQgMjAxOS0wOC0yMCAyMzo0MDo0MyArMDEwMDxicj4NClByb2Nlc3NpbmcgYnkg V2VsY29tZUNvbnRyb2xsZXIjaW5kZXggYXMgSFRNTDxicj4NCsKgIEN1cnJlbnQgdXNlcjogYW5v bnltb3VzPGJyPg0KwqAgUmVuZGVyaW5nIHdlbGNvbWUvaW5kZXguaHRtbC5lcmIgd2l0aGluIGxh eW91dHMvYmFzZTxicj4NCsKgIFJlbmRlcmVkIHdlbGNvbWUvaW5kZXguaHRtbC5lcmIgd2l0aGlu IGxheW91dHMvYmFzZSAoMC42bXMpPGJyPg0KQ29tcGxldGVkIDIwMCBPSyBpbiAxM21zIChWaWV3 czogNS4xbXMgfCBBY3RpdmVSZWNvcmQ6IDEuNG1zKTxicj4NCj0mZ3Q7IDEwMDxicj4NCmlyYiht YWluKTowMDI6MCZndDsgcCBSVUJZX0RFU0NSSVBUSU9OPGJyPg0KJnF1b3Q7cnVieSAyLjcuMGRl diAoMjAxOS0wOC0yMFQxNTowMzoyMVogcGFjay1yYl9kYXRhX3R5cGVfdCA5MmI4NjQxY2NkKSBb eDg2XzY0LWxpbnV4XSZxdW90Ozxicj4NCj0mZ3Q7ICZxdW90O3J1YnkgMi43LjBkZXYgKDIwMTkt MDgtMjBUMTU6MDM6MjFaIHBhY2stcmJfZGF0YV90eXBlX3QgOTJiODY0MWNjZCkgW3g4Nl82NC1s aW51eF0mcXVvdDs8YnI+DQppcmIobWFpbik6MDAzOjAmZ3Q7IGV4aXQ8YnI+DQo8YnI+DQrCoFBl cmZvcm1hbmNlIGNvdW50ZXIgc3RhdHMgZm9yICYjMzk7YmluL3JhaWxzIGMgLWUgcHJvZHVjdGlv biYjMzk7Ojxicj4NCjxicj4NCsKgIMKgIMKgIMKgNDMxOCw0NDE2MzPCoCDCoCDCoCB0YXNrLWNs b2NrIChtc2VjKcKgIMKgIMKgIMKgIMKgI8KgIMKgIDAsMTEyIENQVXMgdXRpbGl6ZWTCoCDCoCDC oCDCoCDCoCA8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDU5OcKgIMKgIMKgIGNvbnRleHQt c3dpdGNoZXPCoCDCoCDCoCDCoCDCoCAjwqAgwqAgMCwxMzkgSy9zZWPCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCA8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAxNMKgIMKgIMKgIGNwdS1t aWdyYXRpb25zwqAgwqAgwqAgwqAgwqAgwqAgI8KgIMKgIDAsMDAzIEsvc2VjwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqA4MTAxMcKgIMKgIMKgIHBh Z2UtZmF1bHRzwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAjwqAgwqAgMCwwMTkgTS9zZWPCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCA8YnI+DQrCoCDCoCDCoCDCoDEzMjQxMDcwMjIwwqAgwqAgwqAg Y3ljbGVzwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgI8KgIMKgIDMsMDY2IEdIesKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICg0OSw1NiUpPGJyPg0KwqAgwqAgwqAgwqAxNzMy MzU5NDM1OMKgIMKgIMKgIGluc3RydWN0aW9uc8KgIMKgIMKgIMKgIMKgIMKgIMKgICPCoCDCoCAx LDMxwqAgaW5zbiBwZXIgY3ljbGXCoCDCoCDCoCDCoCDCoCDCoCg2MiwyNyUpPGJyPg0KwqAgwqAg wqAgwqAgMzU1Mzc5NDA0M8KgIMKgIMKgIGJyYW5jaGVzwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgI8KgIDgyMiw5MzQgTS9zZWPCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAoNjIsODkl KTxicj4NCsKgIMKgIMKgIMKgIMKgIDc2MzkwMTQ1wqAgwqAgwqAgYnJhbmNoLW1pc3Nlc8KgIMKg IMKgIMKgIMKgIMKgIMKgI8KgIMKgIDIsMTUlIG9mIGFsbCBicmFuY2hlc8KgIMKgIMKgIMKgIMKg ICg2MywxMiUpPGJyPg0KwqAgwqAgwqAgwqAgNDU5NTQxNTcyMsKgIMKgIMKgIEwxLWRjYWNoZS1s b2Fkc8KgIMKgIMKgIMKgIMKgIMKgIyAxMDY0LDEzOCBNL3NlY8KgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgICg2Miw4MyUpPGJyPg0KwqAgwqAgwqAgwqAgwqAyMDIyNjkzNDnCoCDCoCDCoCBM MS1kY2FjaGUtbG9hZC1taXNzZXPCoCDCoCDCoCPCoCDCoCA0LDQwJSBvZiBhbGwgTDEtZGNhY2hl IGhpdHPCoCDCoCAoNjIsNjYlKTxicj4NCsKgIMKgIMKgIMKgIMKgIDY2MTkzNzAywqAgwqAgwqAg TExDLWxvYWRzwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAjwqAgwqAxNSwzMjggTS9zZWPCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAoNDksNDQlKTxicj4NCsKgIMKgIMKgIMKgIMKgIDEy NTQ4Mzk5wqAgwqAgwqAgTExDLWxvYWQtbWlzc2VzwqAgwqAgwqAgwqAgwqAgwqAjwqAgwqAxOCw5 NiUgb2YgYWxsIExMLWNhY2hlIGhpdHPCoCDCoCDCoCg0OSw0OSUpPGJyPg0KPGJyPg0KwqAgwqAg wqAgMzgsNDY0NzY0ODc2IHNlY29uZHMgdGltZSBlbGFwc2VkPGJyPg0KYGBgPGJyPg0KPGJyPg0K Q29uY2x1c2lvbnM6PGJyPg0KPGJyPg0KKiBNaW5vciBpbXByb3ZlbWVudCBpbiBpbnN0cnVjdGlv bnMgcGVyIGN5Y2xlPGJyPg0KKiBgTDEtZGNhY2hlLWxvYWRzYDogYDEwNTcsNzI1IE0vc2VjYCAt Jmd0OyBgMTA2NCwxMzggTS9zZWNgIChoaWdoZXIgcmF0ZSBvZiBMMSBjYWNoZSBsb2Fkcyk8YnI+ DQoqIGBMMS1kY2FjaGUtbG9hZC1taXNzZXNgOiBgNCw2OSVgIC0mZ3Q7IGA0LDQwJWAgKHJlZHVj ZWQgTDEgY2FjaGUgbWlzcyByYXRlKTxicj4NCjxicj4NClRob3VnaHRzPzxicj4NCjxicj4NCjxi cj4NCjxicj4NCi0tIDxicj4NCjxhIGhyZWY9Imh0dHBzOi8vYnVncy5ydWJ5LWxhbmcub3JnLyIg cmVsPSJub3JlZmVycmVyIiB0YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9idWdzLnJ1YnktbGFuZy5v cmcvPC9hPjxicj4NCjxicj4NClVuc3Vic2NyaWJlOiAmbHQ7bWFpbHRvOjxhIGhyZWY9Im1haWx0 bzpydWJ5LWNvcmUtcmVxdWVzdEBydWJ5LWxhbmcub3JnIiB0YXJnZXQ9Il9ibGFuayI+cnVieS1j b3JlLXJlcXVlc3RAcnVieS1sYW5nLm9yZzwvYT4/c3ViamVjdD11bnN1YnNjcmliZSZndDs8YnI+ DQombHQ7PGEgaHJlZj0iaHR0cDovL2xpc3RzLnJ1YnktbGFuZy5vcmcvY2dpLWJpbi9tYWlsbWFu L29wdGlvbnMvcnVieS1jb3JlIiByZWw9Im5vcmVmZXJyZXIiIHRhcmdldD0iX2JsYW5rIj5odHRw Oi8vbGlzdHMucnVieS1sYW5nLm9yZy9jZ2ktYmluL21haWxtYW4vb3B0aW9ucy9ydWJ5LWNvcmU8 L2E+Jmd0Ozxicj4NCjwvYmxvY2txdW90ZT48L2Rpdj48L2Rpdj4NCg== --000000000000195e960590e49280-- --===============1249253956== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline Unsubscribe: --===============1249253956==--