From: Mathieu Desnoyers Date: Wed, 1 Apr 2009 02:01:30 +0000 (-0400) Subject: Commit urcu verif results X-Git-Tag: v0.1~263 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=8baf2c9506f8e4bbac913c7ea2a8b2e9a3cd0932;p=urcu.git Commit urcu verif results Use make summary is each dir. Signed-off-by: Mathieu Desnoyers --- diff --git a/formal-model/urcu/result-signal-over-reader/DEFINES b/formal-model/urcu/result-signal-over-reader/DEFINES new file mode 100644 index 0000000..2fcb038 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/DEFINES @@ -0,0 +1,17 @@ + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#define TEST_SIGNAL +#define TEST_SIGNAL_ON_READ +//#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 1 +//#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS diff --git a/formal-model/urcu/result-signal-over-reader/Makefile b/formal-model/urcu/result-signal-over-reader/Makefile new file mode 100644 index 0000000..8af320d --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/Makefile @@ -0,0 +1,172 @@ +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Copyright (C) Mathieu Desnoyers, 2009 +# +# Authors: Mathieu Desnoyers + +#CFLAGS=-DSAFETY +#for multi-core verif, 15.5GB shared mem, use files if full +#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 +#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 + +#liveness +#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 +CFLAGS=-DHASH64 + +SPINFILE=urcu.spin + +default: + make urcu_free | tee urcu_free.log + #nested useless with signal test. + #make urcu_free_nested | tee urcu_free_nested.log + make urcu_free_no_rmb | tee urcu_free_no_rmb.log + make urcu_free_no_wmb | tee urcu_free_no_wmb.log + make urcu_free_no_mb | tee urcu_free_no_mb.log + make urcu_free_single_flip | tee urcu_free_single_flip.log + make urcu_progress_writer | tee urcu_progress_writer.log + make urcu_progress_reader | tee urcu_progress_reader.log + make urcu_progress_writer_error | tee urcu_progress_writer_error.log + make asserts | tee asserts.log + make summary + +#show trail : spin -v -t -N pan.ltl input.spin +# after each individual make. + +summary: + @echo + @echo "Verification summary" + @grep errors: *.log + +asserts: clean + cat DEFINES > .input.spin + cat ${SPINFILE} >> .input.spin + rm -f .input.spin.trail + spin -a -X .input.spin + gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c + ./pan -v -c1 -X -m10000000 -w20 + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free: clean urcu_free_ltl run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_nested_define: + cp urcu_free_nested.define .input.define + +urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_no_rmb_define: + cp urcu_free_no_rmb.define .input.define + +urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_no_wmb_define: + cp urcu_free_no_wmb.define .input.define + +urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_no_mb_define: + cp urcu_free_no_mb.define .input.define + +urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_single_flip_define: + cp urcu_free_single_flip.define .input.define + +urcu_free_ltl: + touch .input.define + cat .input.define >> pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl + +# Progress checks + +urcu_progress_writer: clean urcu_progress_writer_ltl \ + urcu_progress_writer_define run_weak_fair + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_progress_writer_define: + cp urcu_progress_writer.define .input.define + +urcu_progress_writer_ltl: + touch .input.define + cat .input.define > pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl + +urcu_progress_reader: clean urcu_progress_reader_ltl \ + urcu_progress_reader_define run_weak_fair + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_progress_reader_define: + cp urcu_progress_reader.define .input.define + +urcu_progress_reader_ltl: + touch .input.define + cat .input.define > pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl + +urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ + urcu_progress_writer_error_define run_weak_fair + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_progress_writer_error_define: + cp urcu_progress_writer_error.define .input.define + +urcu_progress_writer_error_ltl: + touch .input.define + cat .input.define > pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl + + +run_weak_fair: pan + ./pan -a -f -v -c1 -X -m10000000 -w20 + +run: pan + ./pan -a -v -c1 -X -m10000000 -w20 + +pan: pan.c + gcc -O2 -w ${CFLAGS} -o pan pan.c + +pan.c: pan.ltl ${SPINFILE} + cat .input.define > .input.spin + cat DEFINES >> .input.spin + cat ${SPINFILE} >> .input.spin + rm -f .input.spin.trail + spin -a -X -N pan.ltl .input.spin + +.PHONY: clean default distclean summary +clean: + rm -f pan* trail.out .input.spin* *.spin.trail .input.define +distclean: + rm -f *.trail *.input *.log diff --git a/formal-model/urcu/result-signal-over-reader/asserts.log b/formal-model/urcu/result-signal-over-reader/asserts.log new file mode 100644 index 0000000..d317f57 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/asserts.log @@ -0,0 +1,312 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +cat DEFINES > .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -DSAFETY -o pan pan.c +./pan -v -c1 -X -m10000000 -w20 +Depth= 4926 States= 1e+06 Transitions= 9.03e+06 Memory= 527.287 t= 5.98 R= 2e+05 +Depth= 7228 States= 2e+06 Transitions= 1.88e+07 Memory= 588.322 t= 12.9 R= 2e+05 +Depth= 7228 States= 3e+06 Transitions= 3.14e+07 Memory= 649.358 t= 21.9 R= 1e+05 +pan: resizing hashtable to -w22.. done +Depth= 7228 States= 4e+06 Transitions= 4.3e+07 Memory= 741.416 t= 30.3 R= 1e+05 +Depth= 7228 States= 5e+06 Transitions= 5.65e+07 Memory= 802.451 t= 39.6 R= 1e+05 +Depth= 7228 States= 6e+06 Transitions= 6.78e+07 Memory= 863.486 t= 47.5 R= 1e+05 +Depth= 7228 States= 7e+06 Transitions= 8.05e+07 Memory= 924.522 t= 56.5 R= 1e+05 +Depth= 7228 States= 8e+06 Transitions= 9.49e+07 Memory= 985.557 t= 66.8 R= 1e+05 +Depth= 7228 States= 9e+06 Transitions= 1.06e+08 Memory= 1046.592 t= 74.7 R= 1e+05 +pan: resizing hashtable to -w24.. done +Depth= 7228 States= 1e+07 Transitions= 1.18e+08 Memory= 1231.721 t= 84.9 R= 1e+05 +Depth= 7228 States= 1.1e+07 Transitions= 1.29e+08 Memory= 1292.756 t= 92.8 R= 1e+05 +Depth= 7228 States= 1.2e+07 Transitions= 1.4e+08 Memory= 1353.791 t= 100 R= 1e+05 +Depth= 7228 States= 1.3e+07 Transitions= 1.53e+08 Memory= 1414.826 t= 109 R= 1e+05 +Depth= 7228 States= 1.4e+07 Transitions= 1.65e+08 Memory= 1475.861 t= 117 R= 1e+05 +Depth= 7228 States= 1.5e+07 Transitions= 1.77e+08 Memory= 1536.897 t= 126 R= 1e+05 +Depth= 7228 States= 1.6e+07 Transitions= 1.89e+08 Memory= 1597.932 t= 134 R= 1e+05 +Depth= 7228 States= 1.7e+07 Transitions= 2.02e+08 Memory= 1658.967 t= 143 R= 1e+05 +Depth= 7228 States= 1.8e+07 Transitions= 2.16e+08 Memory= 1720.002 t= 153 R= 1e+05 +Depth= 7228 States= 1.9e+07 Transitions= 2.27e+08 Memory= 1781.037 t= 160 R= 1e+05 +Depth= 7228 States= 2e+07 Transitions= 2.39e+08 Memory= 1842.072 t= 169 R= 1e+05 +Depth= 7228 States= 2.1e+07 Transitions= 2.51e+08 Memory= 1903.108 t= 177 R= 1e+05 +Depth= 7228 States= 2.2e+07 Transitions= 2.62e+08 Memory= 1964.143 t= 185 R= 1e+05 +Depth= 7228 States= 2.3e+07 Transitions= 2.74e+08 Memory= 2025.178 t= 194 R= 1e+05 +Depth= 7228 States= 2.4e+07 Transitions= 2.86e+08 Memory= 2086.213 t= 203 R= 1e+05 +Depth= 7228 States= 2.5e+07 Transitions= 2.99e+08 Memory= 2147.248 t= 212 R= 1e+05 +Depth= 7228 States= 2.6e+07 Transitions= 3.1e+08 Memory= 2208.283 t= 220 R= 1e+05 +Depth= 7228 States= 2.7e+07 Transitions= 3.24e+08 Memory= 2269.318 t= 230 R= 1e+05 +Depth= 7228 States= 2.8e+07 Transitions= 3.37e+08 Memory= 2330.354 t= 239 R= 1e+05 +Depth= 7228 States= 2.9e+07 Transitions= 3.49e+08 Memory= 2391.389 t= 248 R= 1e+05 +Depth= 7228 States= 3e+07 Transitions= 3.6e+08 Memory= 2452.424 t= 256 R= 1e+05 +Depth= 7228 States= 3.1e+07 Transitions= 3.72e+08 Memory= 2513.459 t= 265 R= 1e+05 +Depth= 7228 States= 3.2e+07 Transitions= 3.83e+08 Memory= 2574.494 t= 273 R= 1e+05 +Depth= 7228 States= 3.3e+07 Transitions= 3.95e+08 Memory= 2635.529 t= 282 R= 1e+05 +Depth= 7228 States= 3.4e+07 Transitions= 4.07e+08 Memory= 2696.565 t= 291 R= 1e+05 +pan: resizing hashtable to -w26.. done +Depth= 7228 States= 3.5e+07 Transitions= 4.2e+08 Memory= 3253.682 t= 308 R= 1e+05 +Depth= 7228 States= 3.6e+07 Transitions= 4.32e+08 Memory= 3314.717 t= 316 R= 1e+05 +Depth= 7228 States= 3.7e+07 Transitions= 4.45e+08 Memory= 3375.752 t= 325 R= 1e+05 +Depth= 7228 States= 3.8e+07 Transitions= 4.58e+08 Memory= 3436.787 t= 334 R= 1e+05 +Depth= 7228 States= 3.9e+07 Transitions= 4.71e+08 Memory= 3497.822 t= 343 R= 1e+05 +Depth= 7228 States= 4e+07 Transitions= 4.82e+08 Memory= 3558.858 t= 350 R= 1e+05 +Depth= 7228 States= 4.1e+07 Transitions= 4.94e+08 Memory= 3619.893 t= 359 R= 1e+05 +Depth= 7228 States= 4.2e+07 Transitions= 5.04e+08 Memory= 3680.928 t= 366 R= 1e+05 +Depth= 7228 States= 4.3e+07 Transitions= 5.16e+08 Memory= 3741.963 t= 374 R= 1e+05 +Depth= 7228 States= 4.4e+07 Transitions= 5.29e+08 Memory= 3802.998 t= 383 R= 1e+05 + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim - (none specified) + assertion violations + + cycle checks - (disabled by -DSAFETY) + invalid end states + + +State-vector 56 byte, depth reached 7228, errors: 0 + 44157204 states, stored +4.8641845e+08 states, matched +5.3057565e+08 transitions (= stored+matched) +1.8453582e+09 atomic steps +hash conflicts: 2.8837553e+08 (resolved) + +Stats on memory usage (in Megabytes): + 3537.374 equivalent memory usage for states (stored*(State-vector + overhead)) + 2843.050 actual memory usage for states (compression: 80.37%) + state-vector as stored = 40 byte + 28 byte overhead + 512.000 memory used for hash table (-w26) + 457.764 memory used for DFS stack (-m10000000) + 3812.568 total actual memory usage + +unreached in proctype urcu_reader + line 398, ".input.spin", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, ".input.spin", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, ".input.spin", state 61, "(1)" + line 417, ".input.spin", state 91, "(1)" + line 398, ".input.spin", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, ".input.spin", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, ".input.spin", state 158, "(1)" + line 417, ".input.spin", state 188, "(1)" + line 398, ".input.spin", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, ".input.spin", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, ".input.spin", state 256, "(1)" + line 417, ".input.spin", state 286, "(1)" + line 398, ".input.spin", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, ".input.spin", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, ".input.spin", state 395, "(1)" + line 417, ".input.spin", state 425, "(1)" + line 539, ".input.spin", state 456, "-end-" + (17 of 456 states) +unreached in proctype urcu_reader_sig + line 398, ".input.spin", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, ".input.spin", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, ".input.spin", state 70, "(1)" + line 417, ".input.spin", state 100, "(1)" + line 398, ".input.spin", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, ".input.spin", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, ".input.spin", state 158, "(1)" + line 417, ".input.spin", state 188, "(1)" + line 398, ".input.spin", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, ".input.spin", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, ".input.spin", state 247, "(1)" + line 417, ".input.spin", state 277, "(1)" + line 398, ".input.spin", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, ".input.spin", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, ".input.spin", state 359, "(1)" + line 417, ".input.spin", state 389, "(1)" + line 613, ".input.spin", state 411, "-end-" + (17 of 411 states) +unreached in proctype urcu_writer + line 398, ".input.spin", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 402, ".input.spin", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, ".input.spin", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, ".input.spin", state 59, "(1)" + line 412, ".input.spin", state 72, "(1)" + line 417, ".input.spin", state 89, "(1)" + line 398, ".input.spin", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 402, ".input.spin", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, ".input.spin", state 153, "(1)" + line 412, ".input.spin", state 166, "(1)" + line 651, ".input.spin", state 199, "(1)" + line 174, ".input.spin", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 178, ".input.spin", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 159, ".input.spin", state 240, "(1)" + line 163, ".input.spin", state 248, "(1)" + line 167, ".input.spin", state 260, "(1)" + line 174, ".input.spin", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 178, ".input.spin", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 182, ".input.spin", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 159, ".input.spin", state 370, "(1)" + line 163, ".input.spin", state 378, "(1)" + line 167, ".input.spin", state 390, "(1)" + line 398, ".input.spin", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 402, ".input.spin", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, ".input.spin", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, ".input.spin", state 449, "(1)" + line 412, ".input.spin", state 462, "(1)" + line 417, ".input.spin", state 479, "(1)" + line 398, ".input.spin", state 498, "(1)" + line 402, ".input.spin", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, ".input.spin", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 412, ".input.spin", state 554, "(1)" + line 417, ".input.spin", state 571, "(1)" + line 402, ".input.spin", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, ".input.spin", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 412, ".input.spin", state 647, "(1)" + line 417, ".input.spin", state 664, "(1)" + line 178, ".input.spin", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 182, ".input.spin", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 159, ".input.spin", state 710, "(1)" + line 163, ".input.spin", state 718, "(1)" + line 167, ".input.spin", state 730, "(1)" + line 174, ".input.spin", state 741, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 178, ".input.spin", state 817, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 182, ".input.spin", state 830, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 159, ".input.spin", state 840, "(1)" + line 163, ".input.spin", state 848, "(1)" + line 167, ".input.spin", state 860, "(1)" + line 398, ".input.spin", state 882, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 398, ".input.spin", state 884, "(1)" + line 398, ".input.spin", state 885, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 398, ".input.spin", state 885, "else" + line 398, ".input.spin", state 888, "(1)" + line 402, ".input.spin", state 896, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 402, ".input.spin", state 898, "(1)" + line 402, ".input.spin", state 899, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 402, ".input.spin", state 899, "else" + line 402, ".input.spin", state 902, "(1)" + line 402, ".input.spin", state 903, "(1)" + line 402, ".input.spin", state 903, "(1)" + line 400, ".input.spin", state 908, "((i<1))" + line 400, ".input.spin", state 908, "((i>=1))" + line 407, ".input.spin", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, ".input.spin", state 927, "(1)" + line 408, ".input.spin", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 408, ".input.spin", state 928, "else" + line 408, ".input.spin", state 931, "(1)" + line 408, ".input.spin", state 932, "(1)" + line 408, ".input.spin", state 932, "(1)" + line 412, ".input.spin", state 940, "(1)" + line 412, ".input.spin", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 412, ".input.spin", state 941, "else" + line 412, ".input.spin", state 944, "(1)" + line 412, ".input.spin", state 945, "(1)" + line 412, ".input.spin", state 945, "(1)" + line 410, ".input.spin", state 950, "((i<1))" + line 410, ".input.spin", state 950, "((i>=1))" + line 417, ".input.spin", state 957, "(1)" + line 417, ".input.spin", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 417, ".input.spin", state 958, "else" + line 417, ".input.spin", state 961, "(1)" + line 417, ".input.spin", state 962, "(1)" + line 417, ".input.spin", state 962, "(1)" + line 419, ".input.spin", state 965, "(1)" + line 419, ".input.spin", state 965, "(1)" + line 402, ".input.spin", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, ".input.spin", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 412, ".input.spin", state 1040, "(1)" + line 417, ".input.spin", state 1057, "(1)" + line 402, ".input.spin", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, ".input.spin", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 412, ".input.spin", state 1130, "(1)" + line 417, ".input.spin", state 1147, "(1)" + line 398, ".input.spin", state 1166, "(1)" + line 402, ".input.spin", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, ".input.spin", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 412, ".input.spin", state 1222, "(1)" + line 417, ".input.spin", state 1239, "(1)" + line 402, ".input.spin", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, ".input.spin", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 412, ".input.spin", state 1315, "(1)" + line 417, ".input.spin", state 1332, "(1)" + line 178, ".input.spin", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 182, ".input.spin", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 159, ".input.spin", state 1378, "(1)" + line 163, ".input.spin", state 1386, "(1)" + line 167, ".input.spin", state 1398, "(1)" + line 174, ".input.spin", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 178, ".input.spin", state 1485, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 182, ".input.spin", state 1498, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 159, ".input.spin", state 1508, "(1)" + line 163, ".input.spin", state 1516, "(1)" + line 167, ".input.spin", state 1528, "(1)" + line 398, ".input.spin", state 1550, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 398, ".input.spin", state 1552, "(1)" + line 398, ".input.spin", state 1553, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 398, ".input.spin", state 1553, "else" + line 398, ".input.spin", state 1556, "(1)" + line 402, ".input.spin", state 1564, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 402, ".input.spin", state 1566, "(1)" + line 402, ".input.spin", state 1567, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 402, ".input.spin", state 1567, "else" + line 402, ".input.spin", state 1570, "(1)" + line 402, ".input.spin", state 1571, "(1)" + line 402, ".input.spin", state 1571, "(1)" + line 400, ".input.spin", state 1576, "((i<1))" + line 400, ".input.spin", state 1576, "((i>=1))" + line 407, ".input.spin", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, ".input.spin", state 1595, "(1)" + line 408, ".input.spin", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 408, ".input.spin", state 1596, "else" + line 408, ".input.spin", state 1599, "(1)" + line 408, ".input.spin", state 1600, "(1)" + line 408, ".input.spin", state 1600, "(1)" + line 412, ".input.spin", state 1608, "(1)" + line 412, ".input.spin", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 412, ".input.spin", state 1609, "else" + line 412, ".input.spin", state 1612, "(1)" + line 412, ".input.spin", state 1613, "(1)" + line 412, ".input.spin", state 1613, "(1)" + line 410, ".input.spin", state 1618, "((i<1))" + line 410, ".input.spin", state 1618, "((i>=1))" + line 417, ".input.spin", state 1625, "(1)" + line 417, ".input.spin", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 417, ".input.spin", state 1626, "else" + line 417, ".input.spin", state 1629, "(1)" + line 417, ".input.spin", state 1630, "(1)" + line 417, ".input.spin", state 1630, "(1)" + line 419, ".input.spin", state 1633, "(1)" + line 419, ".input.spin", state 1633, "(1)" + line 178, ".input.spin", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 182, ".input.spin", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 159, ".input.spin", state 1681, "(1)" + line 163, ".input.spin", state 1689, "(1)" + line 167, ".input.spin", state 1701, "(1)" + line 174, ".input.spin", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 178, ".input.spin", state 1788, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 182, ".input.spin", state 1801, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 159, ".input.spin", state 1811, "(1)" + line 163, ".input.spin", state 1819, "(1)" + line 167, ".input.spin", state 1831, "(1)" + line 701, ".input.spin", state 1856, "-end-" + (158 of 1856 states) +unreached in proctype :init: + (0 of 46 states) + +pan: elapsed time 384 seconds +pan: rate 114968.77 states/second +pan: avg transition delay 7.2389e-07 usec +cp .input.spin asserts.spin.input +cp .input.spin.trail asserts.spin.input.trail +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-signal-over-reader/asserts.spin.input b/formal-model/urcu/result-signal-over-reader/asserts.spin.input new file mode 100644 index 0000000..2d7f62d --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/asserts.spin.input @@ -0,0 +1,722 @@ + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#define TEST_SIGNAL +#define TEST_SIGNAL_ON_READ +//#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 1 +//#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-reader/asserts.spin.input.trail b/formal-model/urcu/result-signal-over-reader/asserts.spin.input.trail new file mode 100644 index 0000000..287e52a --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/asserts.spin.input.trail @@ -0,0 +1,6 @@ +-4:-4:-4 +1:0:2673 +2:0:2674 +3:0:2675 +4:0:2676 +5:4:1129 diff --git a/formal-model/urcu/result-signal-over-reader/urcu.sh b/formal-model/urcu/result-signal-over-reader/urcu.sh new file mode 100644 index 0000000..65ff517 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu.sh @@ -0,0 +1,29 @@ +#!/bin/sh +# +# Compiles and runs the urcu.spin Promela model. +# +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Copyright (C) IBM Corporation, 2009 +# Mathieu Desnoyers, 2009 +# +# Authors: Paul E. McKenney +# Mathieu Desnoyers + +# Basic execution, without LTL clauses. See Makefile. + +spin -a urcu.spin +cc -DSAFETY -o pan pan.c +./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu/result-signal-over-reader/urcu.spin b/formal-model/urcu/result-signal-over-reader/urcu.spin new file mode 100644 index 0000000..2cfcb70 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu.spin @@ -0,0 +1,705 @@ +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free.log b/formal-model/urcu/result-signal-over-reader/urcu_free.log new file mode 100644 index 0000000..a6ab537 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_free.log @@ -0,0 +1,326 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 743) +Depth= 6837 States= 1e+06 Transitions= 9.03e+06 Memory= 534.904 t= 7.74 R= 1e+05 +Depth= 8887 States= 2e+06 Transitions= 1.88e+07 Memory= 603.557 t= 16.6 R= 1e+05 +Depth= 8887 States= 3e+06 Transitions= 3.14e+07 Memory= 672.209 t= 28 R= 1e+05 +pan: resizing hashtable to -w22.. done +Depth= 8887 States= 4e+06 Transitions= 4.33e+07 Memory= 771.885 t= 39.1 R= 1e+05 +Depth= 8887 States= 5e+06 Transitions= 5.65e+07 Memory= 840.635 t= 50.7 R= 1e+05 +Depth= 8887 States= 6e+06 Transitions= 6.79e+07 Memory= 909.287 t= 61 R= 1e+05 +Depth= 8887 States= 7e+06 Transitions= 8.08e+07 Memory= 977.940 t= 72.6 R= 1e+05 +Depth= 8887 States= 8e+06 Transitions= 9.5e+07 Memory= 1046.592 t= 85.5 R= 9e+04 +Depth= 8887 States= 9e+06 Transitions= 1.07e+08 Memory= 1115.342 t= 96.7 R= 9e+04 +pan: resizing hashtable to -w24.. done +Depth= 8887 States= 1e+07 Transitions= 1.18e+08 Memory= 1308.088 t= 108 R= 9e+04 +Depth= 8887 States= 1.1e+07 Transitions= 1.3e+08 Memory= 1376.740 t= 119 R= 9e+04 +Depth= 8887 States= 1.2e+07 Transitions= 1.41e+08 Memory= 1445.393 t= 128 R= 9e+04 +Depth= 8887 States= 1.3e+07 Transitions= 1.51e+08 Memory= 1514.045 t= 138 R= 9e+04 +Depth= 8887 States= 1.4e+07 Transitions= 1.64e+08 Memory= 1582.795 t= 149 R= 9e+04 +Depth= 8887 States= 1.5e+07 Transitions= 1.77e+08 Memory= 1651.447 t= 160 R= 9e+04 +Depth= 8887 States= 1.6e+07 Transitions= 1.9e+08 Memory= 1720.100 t= 172 R= 9e+04 +Depth= 8887 States= 1.7e+07 Transitions= 2.02e+08 Memory= 1788.752 t= 183 R= 9e+04 +Depth= 8887 States= 1.8e+07 Transitions= 2.15e+08 Memory= 1857.502 t= 194 R= 9e+04 +Depth= 8887 States= 1.9e+07 Transitions= 2.29e+08 Memory= 1926.154 t= 207 R= 9e+04 +Depth= 8887 States= 2e+07 Transitions= 2.4e+08 Memory= 1994.807 t= 217 R= 9e+04 +Depth= 8887 States= 2.1e+07 Transitions= 2.51e+08 Memory= 2063.459 t= 227 R= 9e+04 +Depth= 8887 States= 2.2e+07 Transitions= 2.63e+08 Memory= 2132.209 t= 238 R= 9e+04 +Depth= 8887 States= 2.3e+07 Transitions= 2.74e+08 Memory= 2200.861 t= 248 R= 9e+04 +Depth= 8887 States= 2.4e+07 Transitions= 2.86e+08 Memory= 2269.514 t= 259 R= 9e+04 +Depth= 8887 States= 2.5e+07 Transitions= 2.98e+08 Memory= 2338.166 t= 270 R= 9e+04 +Depth= 8887 States= 2.6e+07 Transitions= 3.1e+08 Memory= 2406.916 t= 281 R= 9e+04 +Depth= 8887 States= 2.7e+07 Transitions= 3.24e+08 Memory= 2475.568 t= 294 R= 9e+04 +Depth= 8887 States= 2.8e+07 Transitions= 3.36e+08 Memory= 2544.221 t= 305 R= 9e+04 +Depth= 8887 States= 2.9e+07 Transitions= 3.49e+08 Memory= 2612.873 t= 317 R= 9e+04 +Depth= 8887 States= 3e+07 Transitions= 3.63e+08 Memory= 2681.526 t= 329 R= 9e+04 +Depth= 8887 States= 3.1e+07 Transitions= 3.73e+08 Memory= 2750.276 t= 339 R= 9e+04 +Depth= 8887 States= 3.2e+07 Transitions= 3.85e+08 Memory= 2818.928 t= 351 R= 9e+04 +Depth= 8887 States= 3.3e+07 Transitions= 3.97e+08 Memory= 2887.580 t= 362 R= 9e+04 +Depth= 8887 States= 3.4e+07 Transitions= 4.08e+08 Memory= 2956.233 t= 373 R= 9e+04 +pan: resizing hashtable to -w26.. done +Depth= 8887 States= 3.5e+07 Transitions= 4.2e+08 Memory= 3520.967 t= 391 R= 9e+04 +Depth= 8887 States= 3.6e+07 Transitions= 4.32e+08 Memory= 3589.619 t= 402 R= 9e+04 +Depth= 8887 States= 3.7e+07 Transitions= 4.44e+08 Memory= 3658.272 t= 413 R= 9e+04 +Depth= 8887 States= 3.8e+07 Transitions= 4.58e+08 Memory= 3727.022 t= 425 R= 9e+04 +Depth= 8887 States= 3.9e+07 Transitions= 4.7e+08 Memory= 3795.674 t= 435 R= 9e+04 +Depth= 8887 States= 4e+07 Transitions= 4.83e+08 Memory= 3864.326 t= 447 R= 9e+04 +Depth= 8887 States= 4.1e+07 Transitions= 4.97e+08 Memory= 3932.979 t= 459 R= 9e+04 +Depth= 8887 States= 4.2e+07 Transitions= 5.07e+08 Memory= 4001.729 t= 468 R= 9e+04 +Depth= 8887 States= 4.3e+07 Transitions= 5.19e+08 Memory= 4070.381 t= 479 R= 9e+04 +Depth= 8887 States= 4.4e+07 Transitions= 5.31e+08 Memory= 4139.033 t= 489 R= 9e+04 +Depth= 8887 States= 4.5e+07 Transitions= 5.42e+08 Memory= 4207.686 t= 499 R= 9e+04 +Depth= 8887 States= 4.6e+07 Transitions= 5.54e+08 Memory= 4276.338 t= 510 R= 9e+04 +Depth= 8887 States= 4.7e+07 Transitions= 5.67e+08 Memory= 4345.088 t= 521 R= 9e+04 + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 64 byte, depth reached 8887, errors: 0 + 47143033 states, stored +5.2129161e+08 states, matched +5.6843464e+08 transitions (= stored+matched) +1.9783052e+09 atomic steps +hash conflicts: 3.1395137e+08 (resolved) + +Stats on memory usage (in Megabytes): + 4136.237 equivalent memory usage for states (stored*(State-vector + overhead)) + 3385.741 actual memory usage for states (compression: 81.86%) + state-vector as stored = 47 byte + 28 byte overhead + 512.000 memory used for hash table (-w26) + 457.764 memory used for DFS stack (-m10000000) + 4354.854 total actual memory usage + +unreached in proctype urcu_reader + line 398, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 61, "(1)" + line 417, "pan.___", state 91, "(1)" + line 398, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 158, "(1)" + line 417, "pan.___", state 188, "(1)" + line 398, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 256, "(1)" + line 417, "pan.___", state 286, "(1)" + line 398, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 395, "(1)" + line 417, "pan.___", state 425, "(1)" + line 539, "pan.___", state 456, "-end-" + (17 of 456 states) +unreached in proctype urcu_reader_sig + line 398, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 70, "(1)" + line 417, "pan.___", state 100, "(1)" + line 398, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 158, "(1)" + line 417, "pan.___", state 188, "(1)" + line 398, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 247, "(1)" + line 417, "pan.___", state 277, "(1)" + line 398, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 359, "(1)" + line 417, "pan.___", state 389, "(1)" + line 613, "pan.___", state 411, "-end-" + (17 of 411 states) +unreached in proctype urcu_writer + line 398, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 402, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 59, "(1)" + line 412, "pan.___", state 72, "(1)" + line 417, "pan.___", state 89, "(1)" + line 398, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 402, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 153, "(1)" + line 412, "pan.___", state 166, "(1)" + line 651, "pan.___", state 199, "(1)" + line 174, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 178, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 159, "pan.___", state 240, "(1)" + line 163, "pan.___", state 248, "(1)" + line 167, "pan.___", state 260, "(1)" + line 174, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 178, "pan.___", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 182, "pan.___", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 159, "pan.___", state 370, "(1)" + line 163, "pan.___", state 378, "(1)" + line 167, "pan.___", state 390, "(1)" + line 398, "pan.___", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 402, "pan.___", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, "pan.___", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 449, "(1)" + line 412, "pan.___", state 462, "(1)" + line 417, "pan.___", state 479, "(1)" + line 398, "pan.___", state 498, "(1)" + line 402, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 412, "pan.___", state 554, "(1)" + line 417, "pan.___", state 571, "(1)" + line 402, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, "pan.___", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 412, "pan.___", state 647, "(1)" + line 417, "pan.___", state 664, "(1)" + line 178, "pan.___", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 182, "pan.___", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 159, "pan.___", state 710, "(1)" + line 163, "pan.___", state 718, "(1)" + line 167, "pan.___", state 730, "(1)" + line 174, "pan.___", state 741, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 178, "pan.___", state 817, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 182, "pan.___", state 830, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 159, "pan.___", state 840, "(1)" + line 163, "pan.___", state 848, "(1)" + line 167, "pan.___", state 860, "(1)" + line 398, "pan.___", state 882, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 398, "pan.___", state 884, "(1)" + line 398, "pan.___", state 885, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 398, "pan.___", state 885, "else" + line 398, "pan.___", state 888, "(1)" + line 402, "pan.___", state 896, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 402, "pan.___", state 898, "(1)" + line 402, "pan.___", state 899, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 402, "pan.___", state 899, "else" + line 402, "pan.___", state 902, "(1)" + line 402, "pan.___", state 903, "(1)" + line 402, "pan.___", state 903, "(1)" + line 400, "pan.___", state 908, "((i<1))" + line 400, "pan.___", state 908, "((i>=1))" + line 407, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 927, "(1)" + line 408, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 408, "pan.___", state 928, "else" + line 408, "pan.___", state 931, "(1)" + line 408, "pan.___", state 932, "(1)" + line 408, "pan.___", state 932, "(1)" + line 412, "pan.___", state 940, "(1)" + line 412, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 412, "pan.___", state 941, "else" + line 412, "pan.___", state 944, "(1)" + line 412, "pan.___", state 945, "(1)" + line 412, "pan.___", state 945, "(1)" + line 410, "pan.___", state 950, "((i<1))" + line 410, "pan.___", state 950, "((i>=1))" + line 417, "pan.___", state 957, "(1)" + line 417, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 417, "pan.___", state 958, "else" + line 417, "pan.___", state 961, "(1)" + line 417, "pan.___", state 962, "(1)" + line 417, "pan.___", state 962, "(1)" + line 419, "pan.___", state 965, "(1)" + line 419, "pan.___", state 965, "(1)" + line 402, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 412, "pan.___", state 1040, "(1)" + line 417, "pan.___", state 1057, "(1)" + line 402, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 412, "pan.___", state 1130, "(1)" + line 417, "pan.___", state 1147, "(1)" + line 398, "pan.___", state 1166, "(1)" + line 402, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 412, "pan.___", state 1222, "(1)" + line 417, "pan.___", state 1239, "(1)" + line 402, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 407, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 412, "pan.___", state 1315, "(1)" + line 417, "pan.___", state 1332, "(1)" + line 178, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 182, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 159, "pan.___", state 1378, "(1)" + line 163, "pan.___", state 1386, "(1)" + line 167, "pan.___", state 1398, "(1)" + line 174, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 178, "pan.___", state 1485, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 182, "pan.___", state 1498, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 159, "pan.___", state 1508, "(1)" + line 163, "pan.___", state 1516, "(1)" + line 167, "pan.___", state 1528, "(1)" + line 398, "pan.___", state 1550, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 398, "pan.___", state 1552, "(1)" + line 398, "pan.___", state 1553, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 398, "pan.___", state 1553, "else" + line 398, "pan.___", state 1556, "(1)" + line 402, "pan.___", state 1564, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 402, "pan.___", state 1566, "(1)" + line 402, "pan.___", state 1567, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 402, "pan.___", state 1567, "else" + line 402, "pan.___", state 1570, "(1)" + line 402, "pan.___", state 1571, "(1)" + line 402, "pan.___", state 1571, "(1)" + line 400, "pan.___", state 1576, "((i<1))" + line 400, "pan.___", state 1576, "((i>=1))" + line 407, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 1595, "(1)" + line 408, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 408, "pan.___", state 1596, "else" + line 408, "pan.___", state 1599, "(1)" + line 408, "pan.___", state 1600, "(1)" + line 408, "pan.___", state 1600, "(1)" + line 412, "pan.___", state 1608, "(1)" + line 412, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 412, "pan.___", state 1609, "else" + line 412, "pan.___", state 1612, "(1)" + line 412, "pan.___", state 1613, "(1)" + line 412, "pan.___", state 1613, "(1)" + line 410, "pan.___", state 1618, "((i<1))" + line 410, "pan.___", state 1618, "((i>=1))" + line 417, "pan.___", state 1625, "(1)" + line 417, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 417, "pan.___", state 1626, "else" + line 417, "pan.___", state 1629, "(1)" + line 417, "pan.___", state 1630, "(1)" + line 417, "pan.___", state 1630, "(1)" + line 419, "pan.___", state 1633, "(1)" + line 419, "pan.___", state 1633, "(1)" + line 178, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 182, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 159, "pan.___", state 1681, "(1)" + line 163, "pan.___", state 1689, "(1)" + line 167, "pan.___", state 1701, "(1)" + line 174, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 178, "pan.___", state 1788, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 182, "pan.___", state 1801, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 159, "pan.___", state 1811, "(1)" + line 163, "pan.___", state 1819, "(1)" + line 167, "pan.___", state 1831, "(1)" + line 701, "pan.___", state 1856, "-end-" + (158 of 1856 states) +unreached in proctype :init: + (0 of 46 states) +unreached in proctype :never: + line 748, "pan.___", state 8, "-end-" + (1 of 8 states) + +pan: elapsed time 523 seconds +pan: rate 90149.985 states/second +pan: avg transition delay 9.1997e-07 usec +cp .input.spin urcu_free.spin.input +cp .input.spin.trail urcu_free.spin.input.trail +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free.ltl b/formal-model/urcu/result-signal-over-reader/urcu_free.ltl new file mode 100644 index 0000000..1954414 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_free.ltl @@ -0,0 +1 @@ +[] (read_free -> !read_free_race) diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free.spin.input b/formal-model/urcu/result-signal-over-reader/urcu_free.spin.input new file mode 100644 index 0000000..2d7f62d --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_free.spin.input @@ -0,0 +1,722 @@ + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#define TEST_SIGNAL +#define TEST_SIGNAL_ON_READ +//#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 1 +//#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free.spin.input.trail b/formal-model/urcu/result-signal-over-reader/urcu_free.spin.input.trail new file mode 100644 index 0000000..837f3d9 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_free.spin.input.trail @@ -0,0 +1,15043 @@ +-2:4:-2 +-4:-4:-4 +1:0:4365 +2:4:4317 +3:4:4320 +4:4:4320 +5:4:4320 +6:4:4323 +7:4:4331 +8:4:4331 +9:4:4331 +10:4:4334 +11:4:4340 +12:4:4344 +13:4:4344 +14:4:4344 +15:4:4347 +16:4:4340 +17:4:4344 +18:4:4344 +19:4:4344 +20:4:4347 +21:4:4355 +22:4:4359 +23:4:4360 +24:0:4365 +25:4:4362 +26:0:4365 +27:3:2331 +28:0:4365 +29:3:2337 +30:0:4365 +31:3:2338 +32:0:4365 +33:3:2339 +34:3:2343 +35:3:2344 +36:3:2352 +37:3:2353 +38:3:2357 +39:3:2358 +40:3:2352 +41:3:2353 +42:3:2357 +43:3:2358 +44:3:2366 +45:3:2371 +46:3:2375 +47:3:2376 +48:3:2383 +49:3:2384 +50:3:2395 +51:3:2396 +52:3:2397 +53:3:2395 +54:3:2396 +55:3:2397 +56:3:2408 +57:3:2413 +58:3:2414 +59:0:4365 +60:3:2426 +61:0:4365 +62:3:2427 +63:0:4365 +64:2:1162 +65:0:4365 +66:3:2428 +67:0:4365 +68:2:1168 +69:0:4365 +70:2:1169 +71:0:4365 +72:3:2427 +73:0:4365 +74:2:1170 +75:0:4365 +76:3:2428 +77:0:4365 +78:3:2429 +79:0:4365 +80:3:2435 +81:3:2436 +82:0:4365 +83:3:2440 +84:3:2444 +85:3:2445 +86:3:2453 +87:3:2454 +88:3:2458 +89:3:2459 +90:3:2453 +91:3:2454 +92:3:2458 +93:3:2459 +94:3:2467 +95:3:2472 +96:3:2473 +97:3:2484 +98:3:2485 +99:3:2496 +100:3:2497 +101:3:2498 +102:3:2496 +103:3:2497 +104:3:2498 +105:3:2509 +106:3:2514 +107:3:2515 +108:0:4365 +109:3:2527 +110:0:4365 +111:3:2528 +112:0:4365 +113:2:1173 +114:0:4365 +115:3:2529 +116:0:4365 +117:2:1179 +118:0:4365 +119:2:1180 +120:0:4365 +121:3:2528 +122:0:4365 +123:2:1181 +124:2:1185 +125:2:1186 +126:2:1194 +127:2:1195 +128:2:1199 +129:2:1200 +130:2:1194 +131:2:1195 +132:2:1199 +133:2:1200 +134:2:1208 +135:2:1213 +136:2:1217 +137:2:1218 +138:2:1225 +139:2:1226 +140:2:1237 +141:2:1238 +142:2:1239 +143:2:1237 +144:2:1238 +145:2:1239 +146:2:1250 +147:2:1255 +148:2:1256 +149:0:4365 +150:3:2529 +151:0:4365 +152:2:1268 +153:0:4365 +154:3:2528 +155:0:4365 +156:2:1270 +157:0:4365 +158:3:2529 +159:0:4365 +160:2:1271 +161:2:1275 +162:2:1276 +163:2:1284 +164:2:1285 +165:2:1289 +166:2:1290 +167:2:1284 +168:2:1285 +169:2:1289 +170:2:1290 +171:2:1298 +172:2:1303 +173:2:1307 +174:2:1308 +175:2:1315 +176:2:1316 +177:2:1327 +178:2:1328 +179:2:1329 +180:2:1327 +181:2:1328 +182:2:1329 +183:2:1340 +184:2:1345 +185:2:1346 +186:0:4365 +187:2:1358 +188:0:4365 +189:2:1360 +190:0:4365 +191:3:2528 +192:0:4365 +193:2:1361 +194:0:4365 +195:3:2529 +196:0:4365 +197:2:1362 +198:2:1366 +199:2:1367 +200:2:1375 +201:2:1376 +202:2:1380 +203:2:1381 +204:2:1375 +205:2:1376 +206:2:1380 +207:2:1381 +208:2:1389 +209:2:1394 +210:2:1398 +211:2:1399 +212:2:1406 +213:2:1407 +214:2:1418 +215:2:1419 +216:2:1420 +217:2:1418 +218:2:1419 +219:2:1420 +220:2:1431 +221:2:1436 +222:2:1437 +223:0:4365 +224:2:1449 +225:0:4365 +226:3:2528 +227:0:4365 +228:2:1451 +229:0:4365 +230:3:2529 +231:0:4365 +232:2:1652 +233:0:4365 +234:2:1653 +235:0:4365 +236:2:1657 +237:0:4365 +238:2:1180 +239:0:4365 +240:3:2528 +241:0:4365 +242:2:1181 +243:2:1185 +244:2:1186 +245:2:1194 +246:2:1195 +247:2:1199 +248:2:1200 +249:2:1194 +250:2:1195 +251:2:1196 +252:2:1208 +253:2:1213 +254:2:1217 +255:2:1218 +256:2:1225 +257:2:1226 +258:2:1237 +259:2:1238 +260:2:1239 +261:2:1237 +262:2:1238 +263:2:1239 +264:2:1250 +265:2:1255 +266:2:1256 +267:0:4365 +268:3:2529 +269:0:4365 +270:2:1268 +271:0:4365 +272:3:2528 +273:0:4365 +274:2:1270 +275:0:4365 +276:3:2529 +277:0:4365 +278:2:1271 +279:2:1275 +280:2:1276 +281:2:1284 +282:2:1285 +283:2:1289 +284:2:1290 +285:2:1284 +286:2:1285 +287:2:1289 +288:2:1290 +289:2:1298 +290:2:1303 +291:2:1307 +292:2:1308 +293:2:1315 +294:2:1316 +295:2:1327 +296:2:1328 +297:2:1329 +298:2:1327 +299:2:1328 +300:2:1329 +301:2:1340 +302:2:1345 +303:2:1346 +304:0:4365 +305:2:1358 +306:0:4365 +307:2:1454 +308:0:4365 +309:3:2528 +310:0:4365 +311:2:1455 +312:0:4365 +313:3:2529 +314:0:4365 +315:2:1652 +316:0:4365 +317:2:1653 +318:0:4365 +319:2:1657 +320:0:4365 +321:2:1660 +322:0:4365 +323:3:2528 +324:0:4365 +325:2:1665 +326:2:1669 +327:2:1670 +328:2:1678 +329:2:1679 +330:2:1683 +331:2:1684 +332:2:1678 +333:2:1679 +334:2:1680 +335:2:1692 +336:2:1697 +337:2:1701 +338:2:1702 +339:2:1709 +340:2:1710 +341:2:1721 +342:2:1722 +343:2:1723 +344:2:1721 +345:2:1722 +346:2:1723 +347:2:1734 +348:2:1739 +349:2:1740 +350:0:4365 +351:3:2529 +352:0:4365 +353:2:1752 +354:0:4365 +355:3:2528 +356:0:4365 +357:2:1754 +358:0:4365 +359:3:2529 +360:0:4365 +361:2:1755 +362:2:1759 +363:2:1760 +364:2:1768 +365:2:1769 +366:2:1773 +367:2:1774 +368:2:1768 +369:2:1769 +370:2:1773 +371:2:1774 +372:2:1782 +373:2:1787 +374:2:1791 +375:2:1792 +376:2:1799 +377:2:1800 +378:2:1811 +379:2:1812 +380:2:1813 +381:2:1811 +382:2:1812 +383:2:1813 +384:2:1824 +385:2:1829 +386:2:1830 +387:0:4365 +388:2:1842 +389:0:4365 +390:3:2528 +391:0:4365 +392:2:1844 +393:0:4365 +394:3:2529 +395:0:4365 +396:2:1845 +397:2:1849 +398:2:1850 +399:2:1858 +400:2:1859 +401:2:1863 +402:2:1864 +403:2:1858 +404:2:1859 +405:2:1863 +406:2:1864 +407:2:1872 +408:2:1877 +409:2:1881 +410:2:1882 +411:2:1889 +412:2:1890 +413:2:1901 +414:2:1902 +415:2:1903 +416:2:1901 +417:2:1902 +418:2:1903 +419:2:1914 +420:2:1919 +421:2:1920 +422:0:4365 +423:2:1932 +424:0:4365 +425:3:2528 +426:0:4365 +427:2:1934 +428:0:4365 +429:3:2529 +430:0:4365 +431:2:1935 +432:0:4365 +433:2:1936 +434:0:4365 +435:2:2129 +436:0:4365 +437:2:2130 +438:0:4365 +439:2:2134 +440:0:4365 +441:3:2528 +442:0:4365 +443:2:2136 +444:0:4365 +445:3:2529 +446:0:4365 +447:2:2137 +448:2:2141 +449:2:2142 +450:2:2150 +451:2:2151 +452:2:2155 +453:2:2156 +454:2:2150 +455:2:2151 +456:2:2155 +457:2:2156 +458:2:2164 +459:2:2169 +460:2:2173 +461:2:2174 +462:2:2181 +463:2:2182 +464:2:2193 +465:2:2194 +466:2:2195 +467:2:2193 +468:2:2194 +469:2:2195 +470:2:2206 +471:2:2211 +472:2:2212 +473:0:4365 +474:2:2224 +475:0:4365 +476:3:2528 +477:0:4365 +478:2:2226 +479:0:4365 +480:3:2529 +481:0:4365 +482:2:1936 +483:0:4365 +484:2:2129 +485:0:4365 +486:2:2130 +487:0:4365 +488:2:2134 +489:0:4365 +490:3:2528 +491:0:4365 +492:2:2136 +493:0:4365 +494:3:2529 +495:0:4365 +496:2:2137 +497:2:2141 +498:2:2142 +499:2:2150 +500:2:2151 +501:2:2155 +502:2:2156 +503:2:2150 +504:2:2151 +505:2:2152 +506:2:2164 +507:2:2169 +508:2:2173 +509:2:2174 +510:2:2181 +511:2:2182 +512:2:2193 +513:2:2194 +514:2:2195 +515:2:2193 +516:2:2194 +517:2:2195 +518:2:2206 +519:2:2211 +520:2:2212 +521:0:4365 +522:2:2224 +523:0:4365 +524:3:2528 +525:0:4365 +526:2:2226 +527:0:4365 +528:3:2529 +529:0:4365 +530:2:2230 +531:0:4365 +532:3:2528 +533:0:4365 +534:2:2235 +535:2:2239 +536:2:2240 +537:2:2248 +538:2:2249 +539:2:2253 +540:2:2254 +541:2:2248 +542:2:2249 +543:2:2250 +544:2:2262 +545:2:2267 +546:2:2271 +547:2:2272 +548:2:2279 +549:2:2280 +550:2:2291 +551:2:2292 +552:2:2293 +553:2:2291 +554:2:2292 +555:2:2293 +556:2:2304 +557:2:2309 +558:2:2310 +559:0:4365 +560:3:2529 +561:0:4365 +562:2:2322 +563:0:4365 +564:2:1169 +565:0:4365 +566:3:2528 +567:0:4365 +568:2:1170 +569:0:4365 +570:3:2529 +571:0:4365 +572:3:2530 +573:0:4365 +574:3:2536 +575:0:4365 +576:3:2537 +577:0:4365 +578:3:2547 +579:0:4365 +580:3:2548 +581:0:4365 +582:3:2552 +583:3:2553 +584:3:2557 +585:3:2561 +586:3:2562 +587:3:2557 +588:3:2561 +589:3:2562 +590:3:2566 +591:3:2574 +592:3:2575 +593:3:2580 +594:3:2587 +595:3:2588 +596:3:2587 +597:3:2588 +598:3:2595 +599:3:2600 +600:0:4365 +601:3:2611 +602:0:4365 +603:3:2615 +604:3:2616 +605:3:2620 +606:3:2624 +607:3:2625 +608:3:2620 +609:3:2624 +610:3:2625 +611:3:2629 +612:3:2637 +613:3:2638 +614:3:2643 +615:3:2650 +616:3:2651 +617:3:2650 +618:3:2651 +619:3:2658 +620:3:2663 +621:0:4365 +622:3:2611 +623:0:4365 +624:3:2615 +625:3:2616 +626:3:2620 +627:3:2624 +628:3:2625 +629:3:2620 +630:3:2624 +631:3:2625 +632:3:2629 +633:3:2637 +634:3:2638 +635:3:2643 +636:3:2650 +637:3:2651 +638:3:2650 +639:3:2651 +640:3:2658 +641:3:2663 +642:0:4365 +643:3:2674 +644:0:4365 +645:3:2682 +646:3:2683 +647:3:2687 +648:3:2691 +649:3:2692 +650:3:2687 +651:3:2691 +652:3:2692 +653:3:2696 +654:3:2704 +655:3:2705 +656:3:2710 +657:3:2717 +658:3:2718 +659:3:2717 +660:3:2718 +661:3:2725 +662:3:2730 +663:0:4365 +664:3:2745 +665:0:4365 +666:3:2746 +667:0:4365 +668:2:1173 +669:0:4365 +670:3:2747 +671:0:4365 +672:2:1179 +673:0:4365 +674:2:1180 +675:0:4365 +676:3:2746 +677:0:4365 +678:2:1181 +679:2:1185 +680:2:1186 +681:2:1194 +682:2:1195 +683:2:1199 +684:2:1200 +685:2:1194 +686:2:1195 +687:2:1199 +688:2:1200 +689:2:1208 +690:2:1213 +691:2:1217 +692:2:1218 +693:2:1225 +694:2:1226 +695:2:1237 +696:2:1238 +697:2:1239 +698:2:1237 +699:2:1238 +700:2:1239 +701:2:1250 +702:2:1255 +703:2:1256 +704:0:4365 +705:3:2747 +706:0:4365 +707:2:1268 +708:0:4365 +709:3:2746 +710:0:4365 +711:2:1270 +712:0:4365 +713:3:2747 +714:0:4365 +715:2:1271 +716:2:1275 +717:2:1276 +718:2:1284 +719:2:1285 +720:2:1289 +721:2:1290 +722:2:1284 +723:2:1285 +724:2:1289 +725:2:1290 +726:2:1298 +727:2:1303 +728:2:1307 +729:2:1308 +730:2:1315 +731:2:1316 +732:2:1327 +733:2:1328 +734:2:1329 +735:2:1327 +736:2:1328 +737:2:1329 +738:2:1340 +739:2:1345 +740:2:1346 +741:0:4365 +742:2:1358 +743:0:4365 +744:2:1360 +745:0:4365 +746:3:2746 +747:0:4365 +748:2:1361 +749:0:4365 +750:3:2747 +751:0:4365 +752:2:1362 +753:2:1366 +754:2:1367 +755:2:1375 +756:2:1376 +757:2:1380 +758:2:1381 +759:2:1375 +760:2:1376 +761:2:1380 +762:2:1381 +763:2:1389 +764:2:1394 +765:2:1398 +766:2:1399 +767:2:1406 +768:2:1407 +769:2:1418 +770:2:1419 +771:2:1420 +772:2:1418 +773:2:1419 +774:2:1420 +775:2:1431 +776:2:1436 +777:2:1437 +778:0:4365 +779:2:1449 +780:0:4365 +781:3:2746 +782:0:4365 +783:2:1451 +784:0:4365 +785:3:2747 +786:0:4365 +787:2:1652 +788:0:4365 +789:2:1653 +790:0:4365 +791:2:1657 +792:0:4365 +793:2:1180 +794:0:4365 +795:3:2746 +796:0:4365 +797:2:1181 +798:2:1185 +799:2:1186 +800:2:1194 +801:2:1195 +802:2:1199 +803:2:1200 +804:2:1194 +805:2:1195 +806:2:1196 +807:2:1208 +808:2:1213 +809:2:1217 +810:2:1218 +811:2:1225 +812:2:1226 +813:2:1237 +814:2:1238 +815:2:1239 +816:2:1237 +817:2:1238 +818:2:1239 +819:2:1250 +820:2:1255 +821:2:1256 +822:0:4365 +823:3:2747 +824:0:4365 +825:2:1268 +826:0:4365 +827:3:2746 +828:0:4365 +829:2:1270 +830:0:4365 +831:3:2747 +832:0:4365 +833:2:1271 +834:2:1275 +835:2:1276 +836:2:1284 +837:2:1285 +838:2:1289 +839:2:1290 +840:2:1284 +841:2:1285 +842:2:1289 +843:2:1290 +844:2:1298 +845:2:1303 +846:2:1307 +847:2:1308 +848:2:1315 +849:2:1316 +850:2:1327 +851:2:1328 +852:2:1329 +853:2:1327 +854:2:1328 +855:2:1329 +856:2:1340 +857:2:1345 +858:2:1346 +859:0:4365 +860:2:1358 +861:0:4365 +862:2:1454 +863:0:4365 +864:3:2746 +865:0:4365 +866:2:1455 +867:0:4365 +868:3:2747 +869:0:4365 +870:2:1652 +871:0:4365 +872:2:1653 +873:0:4365 +874:2:1657 +875:0:4365 +876:2:1660 +877:0:4365 +878:3:2746 +879:0:4365 +880:2:1665 +881:2:1669 +882:2:1670 +883:2:1678 +884:2:1679 +885:2:1683 +886:2:1684 +887:2:1678 +888:2:1679 +889:2:1680 +890:2:1692 +891:2:1697 +892:2:1701 +893:2:1702 +894:2:1709 +895:2:1710 +896:2:1721 +897:2:1722 +898:2:1723 +899:2:1721 +900:2:1722 +901:2:1723 +902:2:1734 +903:2:1739 +904:2:1740 +905:0:4365 +906:3:2747 +907:0:4365 +908:2:1752 +909:0:4365 +910:3:2746 +911:0:4365 +912:2:1754 +913:0:4365 +914:3:2747 +915:0:4365 +916:2:1755 +917:2:1759 +918:2:1760 +919:2:1768 +920:2:1769 +921:2:1773 +922:2:1774 +923:2:1768 +924:2:1769 +925:2:1773 +926:2:1774 +927:2:1782 +928:2:1787 +929:2:1791 +930:2:1792 +931:2:1799 +932:2:1800 +933:2:1811 +934:2:1812 +935:2:1813 +936:2:1811 +937:2:1812 +938:2:1813 +939:2:1824 +940:2:1829 +941:2:1830 +942:0:4365 +943:2:1842 +944:0:4365 +945:3:2746 +946:0:4365 +947:2:1844 +948:0:4365 +949:3:2747 +950:0:4365 +951:2:1845 +952:2:1849 +953:2:1850 +954:2:1858 +955:2:1859 +956:2:1863 +957:2:1864 +958:2:1858 +959:2:1859 +960:2:1863 +961:2:1864 +962:2:1872 +963:2:1877 +964:2:1881 +965:2:1882 +966:2:1889 +967:2:1890 +968:2:1901 +969:2:1902 +970:2:1903 +971:2:1901 +972:2:1902 +973:2:1903 +974:2:1914 +975:2:1919 +976:2:1920 +977:0:4365 +978:2:1932 +979:0:4365 +980:3:2746 +981:0:4365 +982:2:1934 +983:0:4365 +984:3:2747 +985:0:4365 +986:2:1935 +987:0:4365 +988:2:1936 +989:0:4365 +990:2:2129 +991:0:4365 +992:2:2130 +993:0:4365 +994:2:2134 +995:0:4365 +996:3:2746 +997:0:4365 +998:2:2136 +999:0:4365 +1000:3:2747 +1001:0:4365 +1002:2:2137 +1003:2:2141 +1004:2:2142 +1005:2:2150 +1006:2:2151 +1007:2:2155 +1008:2:2156 +1009:2:2150 +1010:2:2151 +1011:2:2155 +1012:2:2156 +1013:2:2164 +1014:2:2169 +1015:2:2173 +1016:2:2174 +1017:2:2181 +1018:2:2182 +1019:2:2193 +1020:2:2194 +1021:2:2195 +1022:2:2193 +1023:2:2194 +1024:2:2195 +1025:2:2206 +1026:2:2211 +1027:2:2212 +1028:0:4365 +1029:2:2224 +1030:0:4365 +1031:3:2746 +1032:0:4365 +1033:2:2226 +1034:0:4365 +1035:3:2747 +1036:0:4365 +1037:2:1936 +1038:0:4365 +1039:2:2129 +1040:0:4365 +1041:2:2130 +1042:0:4365 +1043:2:2134 +1044:0:4365 +1045:3:2746 +1046:0:4365 +1047:2:2136 +1048:0:4365 +1049:3:2747 +1050:0:4365 +1051:2:2137 +1052:2:2141 +1053:2:2142 +1054:2:2150 +1055:2:2151 +1056:2:2155 +1057:2:2156 +1058:2:2150 +1059:2:2151 +1060:2:2152 +1061:2:2164 +1062:2:2169 +1063:2:2173 +1064:2:2174 +1065:2:2181 +1066:2:2182 +1067:2:2193 +1068:2:2194 +1069:2:2195 +1070:2:2193 +1071:2:2194 +1072:2:2195 +1073:2:2206 +1074:2:2211 +1075:2:2212 +1076:0:4365 +1077:2:2224 +1078:0:4365 +1079:3:2746 +1080:0:4365 +1081:2:2226 +1082:0:4365 +1083:3:2747 +1084:0:4365 +1085:2:2230 +1086:0:4365 +1087:3:2746 +1088:0:4365 +1089:2:2235 +1090:2:2239 +1091:2:2240 +1092:2:2248 +1093:2:2249 +1094:2:2253 +1095:2:2254 +1096:2:2248 +1097:2:2249 +1098:2:2250 +1099:2:2262 +1100:2:2267 +1101:2:2271 +1102:2:2272 +1103:2:2279 +1104:2:2280 +1105:2:2291 +1106:2:2292 +1107:2:2293 +1108:2:2291 +1109:2:2292 +1110:2:2293 +1111:2:2304 +1112:2:2309 +1113:2:2310 +1114:0:4365 +1115:3:2747 +1116:0:4365 +1117:2:2322 +1118:0:4365 +1119:2:1169 +1120:0:4365 +1121:3:2746 +1122:0:4365 +1123:2:1170 +1124:0:4365 +1125:3:2747 +1126:0:4365 +1127:3:2748 +1128:0:4365 +1129:3:2754 +1130:0:4365 +1131:3:2755 +1132:3:2759 +1133:3:2760 +1134:3:2768 +1135:3:2769 +1136:3:2773 +1137:3:2774 +1138:3:2768 +1139:3:2769 +1140:3:2773 +1141:3:2774 +1142:3:2782 +1143:3:2787 +1144:3:2791 +1145:3:2792 +1146:3:2799 +1147:3:2800 +1148:3:2811 +1149:3:2812 +1150:3:2813 +1151:3:2811 +1152:3:2812 +1153:3:2813 +1154:3:2824 +1155:3:2829 +1156:3:2830 +1157:0:4365 +1158:3:2842 +1159:0:4365 +1160:3:2843 +1161:0:4365 +1162:2:1173 +1163:0:4365 +1164:3:2844 +1165:0:4365 +1166:2:1179 +1167:0:4365 +1168:2:1180 +1169:0:4365 +1170:3:2843 +1171:0:4365 +1172:2:1181 +1173:2:1185 +1174:2:1186 +1175:2:1194 +1176:2:1195 +1177:2:1199 +1178:2:1200 +1179:2:1194 +1180:2:1195 +1181:2:1199 +1182:2:1200 +1183:2:1208 +1184:2:1213 +1185:2:1217 +1186:2:1218 +1187:2:1225 +1188:2:1226 +1189:2:1237 +1190:2:1238 +1191:2:1239 +1192:2:1237 +1193:2:1238 +1194:2:1239 +1195:2:1250 +1196:2:1255 +1197:2:1256 +1198:0:4365 +1199:3:2844 +1200:0:4365 +1201:2:1268 +1202:0:4365 +1203:3:2843 +1204:0:4365 +1205:2:1270 +1206:0:4365 +1207:3:2844 +1208:0:4365 +1209:2:1271 +1210:2:1275 +1211:2:1276 +1212:2:1284 +1213:2:1285 +1214:2:1289 +1215:2:1290 +1216:2:1284 +1217:2:1285 +1218:2:1289 +1219:2:1290 +1220:2:1298 +1221:2:1303 +1222:2:1307 +1223:2:1308 +1224:2:1315 +1225:2:1316 +1226:2:1327 +1227:2:1328 +1228:2:1329 +1229:2:1327 +1230:2:1328 +1231:2:1329 +1232:2:1340 +1233:2:1345 +1234:2:1346 +1235:0:4365 +1236:2:1358 +1237:0:4365 +1238:2:1360 +1239:0:4365 +1240:3:2843 +1241:0:4365 +1242:2:1361 +1243:0:4365 +1244:3:2844 +1245:0:4365 +1246:2:1362 +1247:2:1366 +1248:2:1367 +1249:2:1375 +1250:2:1376 +1251:2:1380 +1252:2:1381 +1253:2:1375 +1254:2:1376 +1255:2:1380 +1256:2:1381 +1257:2:1389 +1258:2:1394 +1259:2:1398 +1260:2:1399 +1261:2:1406 +1262:2:1407 +1263:2:1418 +1264:2:1419 +1265:2:1420 +1266:2:1418 +1267:2:1419 +1268:2:1420 +1269:2:1431 +1270:2:1436 +1271:2:1437 +1272:0:4365 +1273:2:1449 +1274:0:4365 +1275:3:2843 +1276:0:4365 +1277:2:1451 +1278:0:4365 +1279:3:2844 +1280:0:4365 +1281:2:1652 +1282:0:4365 +1283:2:1653 +1284:0:4365 +1285:2:1657 +1286:0:4365 +1287:2:1180 +1288:0:4365 +1289:3:2843 +1290:0:4365 +1291:2:1181 +1292:2:1185 +1293:2:1186 +1294:2:1194 +1295:2:1195 +1296:2:1199 +1297:2:1200 +1298:2:1194 +1299:2:1195 +1300:2:1196 +1301:2:1208 +1302:2:1213 +1303:2:1217 +1304:2:1218 +1305:2:1225 +1306:2:1226 +1307:2:1237 +1308:2:1238 +1309:2:1239 +1310:2:1237 +1311:2:1238 +1312:2:1239 +1313:2:1250 +1314:2:1255 +1315:2:1256 +1316:0:4365 +1317:3:2844 +1318:0:4365 +1319:2:1268 +1320:0:4365 +1321:3:2843 +1322:0:4365 +1323:2:1270 +1324:0:4365 +1325:3:2844 +1326:0:4365 +1327:2:1271 +1328:2:1275 +1329:2:1276 +1330:2:1284 +1331:2:1285 +1332:2:1289 +1333:2:1290 +1334:2:1284 +1335:2:1285 +1336:2:1289 +1337:2:1290 +1338:2:1298 +1339:2:1303 +1340:2:1307 +1341:2:1308 +1342:2:1315 +1343:2:1316 +1344:2:1327 +1345:2:1328 +1346:2:1329 +1347:2:1327 +1348:2:1328 +1349:2:1329 +1350:2:1340 +1351:2:1345 +1352:2:1346 +1353:0:4365 +1354:2:1358 +1355:0:4365 +1356:2:1454 +1357:0:4365 +1358:3:2843 +1359:0:4365 +1360:2:1455 +1361:0:4365 +1362:3:2844 +1363:0:4365 +1364:2:1652 +1365:0:4365 +1366:2:1653 +1367:0:4365 +1368:2:1657 +1369:0:4365 +1370:2:1660 +1371:0:4365 +1372:3:2843 +1373:0:4365 +1374:2:1665 +1375:2:1669 +1376:2:1670 +1377:2:1678 +1378:2:1679 +1379:2:1683 +1380:2:1684 +1381:2:1678 +1382:2:1679 +1383:2:1680 +1384:2:1692 +1385:2:1697 +1386:2:1701 +1387:2:1702 +1388:2:1709 +1389:2:1710 +1390:2:1721 +1391:2:1722 +1392:2:1723 +1393:2:1721 +1394:2:1722 +1395:2:1723 +1396:2:1734 +1397:2:1739 +1398:2:1740 +1399:0:4365 +1400:3:2844 +1401:0:4365 +1402:2:1752 +1403:0:4365 +1404:3:2843 +1405:0:4365 +1406:2:1754 +1407:0:4365 +1408:3:2844 +1409:0:4365 +1410:2:1755 +1411:2:1759 +1412:2:1760 +1413:2:1768 +1414:2:1769 +1415:2:1773 +1416:2:1774 +1417:2:1768 +1418:2:1769 +1419:2:1773 +1420:2:1774 +1421:2:1782 +1422:2:1787 +1423:2:1791 +1424:2:1792 +1425:2:1799 +1426:2:1800 +1427:2:1811 +1428:2:1812 +1429:2:1813 +1430:2:1811 +1431:2:1812 +1432:2:1813 +1433:2:1824 +1434:2:1829 +1435:2:1830 +1436:0:4365 +1437:2:1842 +1438:0:4365 +1439:3:2843 +1440:0:4365 +1441:2:1844 +1442:0:4365 +1443:3:2844 +1444:0:4365 +1445:2:1845 +1446:2:1849 +1447:2:1850 +1448:2:1858 +1449:2:1859 +1450:2:1863 +1451:2:1864 +1452:2:1858 +1453:2:1859 +1454:2:1863 +1455:2:1864 +1456:2:1872 +1457:2:1877 +1458:2:1881 +1459:2:1882 +1460:2:1889 +1461:2:1890 +1462:2:1901 +1463:2:1902 +1464:2:1903 +1465:2:1901 +1466:2:1902 +1467:2:1903 +1468:2:1914 +1469:2:1919 +1470:2:1920 +1471:0:4365 +1472:2:1932 +1473:0:4365 +1474:3:2843 +1475:0:4365 +1476:2:1934 +1477:0:4365 +1478:3:2844 +1479:0:4365 +1480:2:1935 +1481:0:4365 +1482:2:1936 +1483:0:4365 +1484:2:2129 +1485:0:4365 +1486:2:2130 +1487:0:4365 +1488:2:2134 +1489:0:4365 +1490:3:2843 +1491:0:4365 +1492:2:2136 +1493:0:4365 +1494:3:2844 +1495:0:4365 +1496:2:2137 +1497:2:2141 +1498:2:2142 +1499:2:2150 +1500:2:2151 +1501:2:2155 +1502:2:2156 +1503:2:2150 +1504:2:2151 +1505:2:2155 +1506:2:2156 +1507:2:2164 +1508:2:2169 +1509:2:2173 +1510:2:2174 +1511:2:2181 +1512:2:2182 +1513:2:2193 +1514:2:2194 +1515:2:2195 +1516:2:2193 +1517:2:2194 +1518:2:2195 +1519:2:2206 +1520:2:2211 +1521:2:2212 +1522:0:4365 +1523:2:2224 +1524:0:4365 +1525:3:2843 +1526:0:4365 +1527:2:2226 +1528:0:4365 +1529:3:2844 +1530:0:4365 +1531:2:1936 +1532:0:4365 +1533:2:2129 +1534:0:4365 +1535:2:2130 +1536:0:4365 +1537:2:2134 +1538:0:4365 +1539:3:2843 +1540:0:4365 +1541:2:2136 +1542:0:4365 +1543:3:2844 +1544:0:4365 +1545:2:2137 +1546:2:2141 +1547:2:2142 +1548:2:2150 +1549:2:2151 +1550:2:2155 +1551:2:2156 +1552:2:2150 +1553:2:2151 +1554:2:2152 +1555:2:2164 +1556:2:2169 +1557:2:2173 +1558:2:2174 +1559:2:2181 +1560:2:2182 +1561:2:2193 +1562:2:2194 +1563:2:2195 +1564:2:2193 +1565:2:2194 +1566:2:2195 +1567:2:2206 +1568:2:2211 +1569:2:2212 +1570:0:4365 +1571:2:2224 +1572:0:4365 +1573:3:2843 +1574:0:4365 +1575:2:2226 +1576:0:4365 +1577:3:2844 +1578:0:4365 +1579:2:2230 +1580:0:4365 +1581:3:2843 +1582:0:4365 +1583:2:2235 +1584:2:2239 +1585:2:2240 +1586:2:2248 +1587:2:2249 +1588:2:2253 +1589:2:2254 +1590:2:2248 +1591:2:2249 +1592:2:2250 +1593:2:2262 +1594:2:2267 +1595:2:2271 +1596:2:2272 +1597:2:2279 +1598:2:2280 +1599:2:2291 +1600:2:2292 +1601:2:2293 +1602:2:2291 +1603:2:2292 +1604:2:2293 +1605:2:2304 +1606:2:2309 +1607:2:2310 +1608:0:4365 +1609:3:2844 +1610:0:4365 +1611:2:2322 +1612:0:4365 +1613:2:1169 +1614:0:4365 +1615:3:2843 +1616:0:4365 +1617:2:1170 +1618:0:4365 +1619:3:2844 +1620:0:4365 +1621:3:2845 +1622:0:4365 +1623:3:2851 +1624:0:4365 +1625:3:2854 +1626:3:2855 +1627:3:2867 +1628:3:2868 +1629:3:2872 +1630:3:2873 +1631:3:2867 +1632:3:2868 +1633:3:2872 +1634:3:2873 +1635:3:2881 +1636:3:2886 +1637:3:2890 +1638:3:2891 +1639:3:2898 +1640:3:2899 +1641:3:2910 +1642:3:2911 +1643:3:2912 +1644:3:2910 +1645:3:2911 +1646:3:2912 +1647:3:2923 +1648:3:2928 +1649:3:2929 +1650:0:4365 +1651:3:2941 +1652:0:4365 +1653:3:2942 +1654:0:4365 +1655:2:1173 +1656:0:4365 +1657:3:2943 +1658:0:4365 +1659:2:1179 +1660:0:4365 +1661:2:1180 +1662:0:4365 +1663:3:2942 +1664:0:4365 +1665:2:1181 +1666:2:1185 +1667:2:1186 +1668:2:1194 +1669:2:1195 +1670:2:1199 +1671:2:1200 +1672:2:1194 +1673:2:1195 +1674:2:1199 +1675:2:1200 +1676:2:1208 +1677:2:1213 +1678:2:1217 +1679:2:1218 +1680:2:1225 +1681:2:1226 +1682:2:1237 +1683:2:1238 +1684:2:1239 +1685:2:1237 +1686:2:1238 +1687:2:1239 +1688:2:1250 +1689:2:1255 +1690:2:1256 +1691:0:4365 +1692:3:2943 +1693:0:4365 +1694:2:1268 +1695:0:4365 +1696:3:2942 +1697:0:4365 +1698:2:1270 +1699:0:4365 +1700:3:2943 +1701:0:4365 +1702:2:1271 +1703:2:1275 +1704:2:1276 +1705:2:1284 +1706:2:1285 +1707:2:1289 +1708:2:1290 +1709:2:1284 +1710:2:1285 +1711:2:1289 +1712:2:1290 +1713:2:1298 +1714:2:1303 +1715:2:1307 +1716:2:1308 +1717:2:1315 +1718:2:1316 +1719:2:1327 +1720:2:1328 +1721:2:1329 +1722:2:1327 +1723:2:1328 +1724:2:1329 +1725:2:1340 +1726:2:1345 +1727:2:1346 +1728:0:4365 +1729:2:1358 +1730:0:4365 +1731:2:1360 +1732:0:4365 +1733:3:2942 +1734:0:4365 +1735:2:1361 +1736:0:4365 +1737:3:2943 +1738:0:4365 +1739:2:1362 +1740:2:1366 +1741:2:1367 +1742:2:1375 +1743:2:1376 +1744:2:1380 +1745:2:1381 +1746:2:1375 +1747:2:1376 +1748:2:1380 +1749:2:1381 +1750:2:1389 +1751:2:1394 +1752:2:1398 +1753:2:1399 +1754:2:1406 +1755:2:1407 +1756:2:1418 +1757:2:1419 +1758:2:1420 +1759:2:1418 +1760:2:1419 +1761:2:1420 +1762:2:1431 +1763:2:1436 +1764:2:1437 +1765:0:4365 +1766:2:1449 +1767:0:4365 +1768:3:2942 +1769:0:4365 +1770:2:1451 +1771:0:4365 +1772:3:2943 +1773:0:4365 +1774:2:1652 +1775:0:4365 +1776:2:1653 +1777:0:4365 +1778:2:1657 +1779:0:4365 +1780:2:1180 +1781:0:4365 +1782:3:2942 +1783:0:4365 +1784:2:1181 +1785:2:1185 +1786:2:1186 +1787:2:1194 +1788:2:1195 +1789:2:1199 +1790:2:1200 +1791:2:1194 +1792:2:1195 +1793:2:1196 +1794:2:1208 +1795:2:1213 +1796:2:1217 +1797:2:1218 +1798:2:1225 +1799:2:1226 +1800:2:1237 +1801:2:1238 +1802:2:1239 +1803:2:1237 +1804:2:1238 +1805:2:1239 +1806:2:1250 +1807:2:1255 +1808:2:1256 +1809:0:4365 +1810:3:2943 +1811:0:4365 +1812:2:1268 +1813:0:4365 +1814:3:2942 +1815:0:4365 +1816:2:1270 +1817:0:4365 +1818:3:2943 +1819:0:4365 +1820:2:1271 +1821:2:1275 +1822:2:1276 +1823:2:1284 +1824:2:1285 +1825:2:1289 +1826:2:1290 +1827:2:1284 +1828:2:1285 +1829:2:1289 +1830:2:1290 +1831:2:1298 +1832:2:1303 +1833:2:1307 +1834:2:1308 +1835:2:1315 +1836:2:1316 +1837:2:1327 +1838:2:1328 +1839:2:1329 +1840:2:1327 +1841:2:1328 +1842:2:1329 +1843:2:1340 +1844:2:1345 +1845:2:1346 +1846:0:4365 +1847:2:1358 +1848:0:4365 +1849:2:1454 +1850:0:4365 +1851:3:2942 +1852:0:4365 +1853:2:1455 +1854:0:4365 +1855:3:2943 +1856:0:4365 +1857:2:1652 +1858:0:4365 +1859:2:1653 +1860:0:4365 +1861:2:1657 +1862:0:4365 +1863:2:1660 +1864:0:4365 +1865:3:2942 +1866:0:4365 +1867:2:1665 +1868:2:1669 +1869:2:1670 +1870:2:1678 +1871:2:1679 +1872:2:1683 +1873:2:1684 +1874:2:1678 +1875:2:1679 +1876:2:1680 +1877:2:1692 +1878:2:1697 +1879:2:1701 +1880:2:1702 +1881:2:1709 +1882:2:1710 +1883:2:1721 +1884:2:1722 +1885:2:1723 +1886:2:1721 +1887:2:1722 +1888:2:1723 +1889:2:1734 +1890:2:1739 +1891:2:1740 +1892:0:4365 +1893:3:2943 +1894:0:4365 +1895:2:1752 +1896:0:4365 +1897:3:2942 +1898:0:4365 +1899:2:1754 +1900:0:4365 +1901:3:2943 +1902:0:4365 +1903:2:1755 +1904:2:1759 +1905:2:1760 +1906:2:1768 +1907:2:1769 +1908:2:1773 +1909:2:1774 +1910:2:1768 +1911:2:1769 +1912:2:1773 +1913:2:1774 +1914:2:1782 +1915:2:1787 +1916:2:1791 +1917:2:1792 +1918:2:1799 +1919:2:1800 +1920:2:1811 +1921:2:1812 +1922:2:1813 +1923:2:1811 +1924:2:1812 +1925:2:1813 +1926:2:1824 +1927:2:1829 +1928:2:1830 +1929:0:4365 +1930:2:1842 +1931:0:4365 +1932:3:2942 +1933:0:4365 +1934:2:1844 +1935:0:4365 +1936:3:2943 +1937:0:4365 +1938:2:1845 +1939:2:1849 +1940:2:1850 +1941:2:1858 +1942:2:1859 +1943:2:1863 +1944:2:1864 +1945:2:1858 +1946:2:1859 +1947:2:1863 +1948:2:1864 +1949:2:1872 +1950:2:1877 +1951:2:1881 +1952:2:1882 +1953:2:1889 +1954:2:1890 +1955:2:1901 +1956:2:1902 +1957:2:1903 +1958:2:1901 +1959:2:1902 +1960:2:1903 +1961:2:1914 +1962:2:1919 +1963:2:1920 +1964:0:4365 +1965:2:1932 +1966:0:4365 +1967:3:2942 +1968:0:4365 +1969:2:1934 +1970:0:4365 +1971:3:2943 +1972:0:4365 +1973:2:1935 +1974:0:4365 +1975:2:1936 +1976:0:4365 +1977:2:2129 +1978:0:4365 +1979:2:2130 +1980:0:4365 +1981:2:2134 +1982:0:4365 +1983:3:2942 +1984:0:4365 +1985:2:2136 +1986:0:4365 +1987:3:2943 +1988:0:4365 +1989:2:2137 +1990:2:2141 +1991:2:2142 +1992:2:2150 +1993:2:2151 +1994:2:2155 +1995:2:2156 +1996:2:2150 +1997:2:2151 +1998:2:2155 +1999:2:2156 +2000:2:2164 +2001:2:2169 +2002:2:2173 +2003:2:2174 +2004:2:2181 +2005:2:2182 +2006:2:2193 +2007:2:2194 +2008:2:2195 +2009:2:2193 +2010:2:2194 +2011:2:2195 +2012:2:2206 +2013:2:2211 +2014:2:2212 +2015:0:4365 +2016:2:2224 +2017:0:4365 +2018:3:2942 +2019:0:4365 +2020:2:2226 +2021:0:4365 +2022:3:2943 +2023:0:4365 +2024:2:1936 +2025:0:4365 +2026:2:2129 +2027:0:4365 +2028:2:2130 +2029:0:4365 +2030:2:2134 +2031:0:4365 +2032:3:2942 +2033:0:4365 +2034:2:2136 +2035:0:4365 +2036:3:2943 +2037:0:4365 +2038:2:2137 +2039:2:2141 +2040:2:2142 +2041:2:2150 +2042:2:2151 +2043:2:2155 +2044:2:2156 +2045:2:2150 +2046:2:2151 +2047:2:2152 +2048:2:2164 +2049:2:2169 +2050:2:2173 +2051:2:2174 +2052:2:2181 +2053:2:2182 +2054:2:2193 +2055:2:2194 +2056:2:2195 +2057:2:2193 +2058:2:2194 +2059:2:2195 +2060:2:2206 +2061:2:2211 +2062:2:2212 +2063:0:4365 +2064:2:2224 +2065:0:4365 +2066:3:2942 +2067:0:4365 +2068:2:2226 +2069:0:4365 +2070:3:2943 +2071:0:4365 +2072:2:2230 +2073:0:4365 +2074:3:2942 +2075:0:4365 +2076:2:2235 +2077:2:2239 +2078:2:2240 +2079:2:2248 +2080:2:2249 +2081:2:2253 +2082:2:2254 +2083:2:2248 +2084:2:2249 +2085:2:2250 +2086:2:2262 +2087:2:2267 +2088:2:2271 +2089:2:2272 +2090:2:2279 +2091:2:2280 +2092:2:2291 +2093:2:2292 +2094:2:2293 +2095:2:2291 +2096:2:2292 +2097:2:2293 +2098:2:2304 +2099:2:2309 +2100:2:2310 +2101:0:4365 +2102:3:2943 +2103:0:4365 +2104:2:2322 +2105:0:4365 +2106:2:1169 +2107:0:4365 +2108:3:2942 +2109:0:4365 +2110:2:1170 +2111:0:4365 +2112:3:2943 +2113:0:4365 +2114:3:2944 +2115:0:4365 +2116:3:2950 +2117:0:4365 +2118:3:2951 +2119:0:4365 +2120:3:2952 +2121:0:4365 +2122:3:2953 +2123:0:4365 +2124:3:2954 +2125:3:2958 +2126:3:2959 +2127:3:2967 +2128:3:2968 +2129:3:2972 +2130:3:2973 +2131:3:2967 +2132:3:2968 +2133:3:2972 +2134:3:2973 +2135:3:2981 +2136:3:2986 +2137:3:2990 +2138:3:2991 +2139:3:2998 +2140:3:2999 +2141:3:3010 +2142:3:3011 +2143:3:3012 +2144:3:3010 +2145:3:3011 +2146:3:3012 +2147:3:3023 +2148:3:3028 +2149:3:3029 +2150:0:4365 +2151:3:3041 +2152:0:4365 +2153:3:3042 +2154:0:4365 +2155:2:1173 +2156:0:4365 +2157:3:3043 +2158:0:4365 +2159:2:1179 +2160:0:4365 +2161:2:1180 +2162:0:4365 +2163:3:3042 +2164:0:4365 +2165:2:1181 +2166:2:1185 +2167:2:1186 +2168:2:1194 +2169:2:1195 +2170:2:1199 +2171:2:1200 +2172:2:1194 +2173:2:1195 +2174:2:1199 +2175:2:1200 +2176:2:1208 +2177:2:1213 +2178:2:1217 +2179:2:1218 +2180:2:1225 +2181:2:1226 +2182:2:1237 +2183:2:1238 +2184:2:1239 +2185:2:1237 +2186:2:1238 +2187:2:1239 +2188:2:1250 +2189:2:1255 +2190:2:1256 +2191:0:4365 +2192:3:3043 +2193:0:4365 +2194:2:1268 +2195:0:4365 +2196:3:3042 +2197:0:4365 +2198:2:1270 +2199:0:4365 +2200:3:3043 +2201:0:4365 +2202:2:1271 +2203:2:1275 +2204:2:1276 +2205:2:1284 +2206:2:1285 +2207:2:1289 +2208:2:1290 +2209:2:1284 +2210:2:1285 +2211:2:1289 +2212:2:1290 +2213:2:1298 +2214:2:1303 +2215:2:1307 +2216:2:1308 +2217:2:1315 +2218:2:1316 +2219:2:1327 +2220:2:1328 +2221:2:1329 +2222:2:1327 +2223:2:1328 +2224:2:1329 +2225:2:1340 +2226:2:1345 +2227:2:1346 +2228:0:4365 +2229:2:1358 +2230:0:4365 +2231:2:1360 +2232:0:4365 +2233:3:3042 +2234:0:4365 +2235:2:1361 +2236:0:4365 +2237:3:3043 +2238:0:4365 +2239:2:1362 +2240:2:1366 +2241:2:1367 +2242:2:1375 +2243:2:1376 +2244:2:1380 +2245:2:1381 +2246:2:1375 +2247:2:1376 +2248:2:1380 +2249:2:1381 +2250:2:1389 +2251:2:1394 +2252:2:1398 +2253:2:1399 +2254:2:1406 +2255:2:1407 +2256:2:1418 +2257:2:1419 +2258:2:1420 +2259:2:1418 +2260:2:1419 +2261:2:1420 +2262:2:1431 +2263:2:1436 +2264:2:1437 +2265:0:4365 +2266:2:1449 +2267:0:4365 +2268:3:3042 +2269:0:4365 +2270:2:1451 +2271:0:4365 +2272:3:3043 +2273:0:4365 +2274:2:1652 +2275:0:4365 +2276:2:1653 +2277:0:4365 +2278:2:1657 +2279:0:4365 +2280:2:1180 +2281:0:4365 +2282:3:3042 +2283:0:4365 +2284:2:1181 +2285:2:1185 +2286:2:1186 +2287:2:1194 +2288:2:1195 +2289:2:1199 +2290:2:1200 +2291:2:1194 +2292:2:1195 +2293:2:1196 +2294:2:1208 +2295:2:1213 +2296:2:1217 +2297:2:1218 +2298:2:1225 +2299:2:1226 +2300:2:1237 +2301:2:1238 +2302:2:1239 +2303:2:1237 +2304:2:1238 +2305:2:1239 +2306:2:1250 +2307:2:1255 +2308:2:1256 +2309:0:4365 +2310:3:3043 +2311:0:4365 +2312:2:1268 +2313:0:4365 +2314:3:3042 +2315:0:4365 +2316:2:1270 +2317:0:4365 +2318:3:3043 +2319:0:4365 +2320:2:1271 +2321:2:1275 +2322:2:1276 +2323:2:1284 +2324:2:1285 +2325:2:1289 +2326:2:1290 +2327:2:1284 +2328:2:1285 +2329:2:1289 +2330:2:1290 +2331:2:1298 +2332:2:1303 +2333:2:1307 +2334:2:1308 +2335:2:1315 +2336:2:1316 +2337:2:1327 +2338:2:1328 +2339:2:1329 +2340:2:1327 +2341:2:1328 +2342:2:1329 +2343:2:1340 +2344:2:1345 +2345:2:1346 +2346:0:4365 +2347:2:1358 +2348:0:4365 +2349:2:1454 +2350:0:4365 +2351:3:3042 +2352:0:4365 +2353:2:1455 +2354:0:4365 +2355:3:3043 +2356:0:4365 +2357:2:1652 +2358:0:4365 +2359:2:1653 +2360:0:4365 +2361:2:1657 +2362:0:4365 +2363:2:1660 +2364:0:4365 +2365:3:3042 +2366:0:4365 +2367:2:1665 +2368:2:1669 +2369:2:1670 +2370:2:1678 +2371:2:1679 +2372:2:1683 +2373:2:1684 +2374:2:1678 +2375:2:1679 +2376:2:1680 +2377:2:1692 +2378:2:1697 +2379:2:1701 +2380:2:1702 +2381:2:1709 +2382:2:1710 +2383:2:1721 +2384:2:1722 +2385:2:1723 +2386:2:1721 +2387:2:1722 +2388:2:1723 +2389:2:1734 +2390:2:1739 +2391:2:1740 +2392:0:4365 +2393:3:3043 +2394:0:4365 +2395:2:1752 +2396:0:4365 +2397:3:3042 +2398:0:4365 +2399:2:1754 +2400:0:4365 +2401:3:3043 +2402:0:4365 +2403:2:1755 +2404:2:1759 +2405:2:1760 +2406:2:1768 +2407:2:1769 +2408:2:1773 +2409:2:1774 +2410:2:1768 +2411:2:1769 +2412:2:1773 +2413:2:1774 +2414:2:1782 +2415:2:1787 +2416:2:1791 +2417:2:1792 +2418:2:1799 +2419:2:1800 +2420:2:1811 +2421:2:1812 +2422:2:1813 +2423:2:1811 +2424:2:1812 +2425:2:1813 +2426:2:1824 +2427:2:1829 +2428:2:1830 +2429:0:4365 +2430:2:1842 +2431:0:4365 +2432:3:3042 +2433:0:4365 +2434:2:1844 +2435:0:4365 +2436:3:3043 +2437:0:4365 +2438:2:1845 +2439:2:1849 +2440:2:1850 +2441:2:1858 +2442:2:1859 +2443:2:1863 +2444:2:1864 +2445:2:1858 +2446:2:1859 +2447:2:1863 +2448:2:1864 +2449:2:1872 +2450:2:1877 +2451:2:1881 +2452:2:1882 +2453:2:1889 +2454:2:1890 +2455:2:1901 +2456:2:1902 +2457:2:1903 +2458:2:1901 +2459:2:1902 +2460:2:1903 +2461:2:1914 +2462:2:1919 +2463:2:1920 +2464:0:4365 +2465:2:1932 +2466:0:4365 +2467:3:3042 +2468:0:4365 +2469:2:1934 +2470:0:4365 +2471:3:3043 +2472:0:4365 +2473:2:1935 +2474:0:4365 +2475:2:1936 +2476:0:4365 +2477:2:2129 +2478:0:4365 +2479:2:2130 +2480:0:4365 +2481:2:2134 +2482:0:4365 +2483:3:3042 +2484:0:4365 +2485:2:2136 +2486:0:4365 +2487:3:3043 +2488:0:4365 +2489:2:2137 +2490:2:2141 +2491:2:2142 +2492:2:2150 +2493:2:2151 +2494:2:2155 +2495:2:2156 +2496:2:2150 +2497:2:2151 +2498:2:2155 +2499:2:2156 +2500:2:2164 +2501:2:2169 +2502:2:2173 +2503:2:2174 +2504:2:2181 +2505:2:2182 +2506:2:2193 +2507:2:2194 +2508:2:2195 +2509:2:2193 +2510:2:2194 +2511:2:2195 +2512:2:2206 +2513:2:2211 +2514:2:2212 +2515:0:4365 +2516:2:2224 +2517:0:4365 +2518:3:3042 +2519:0:4365 +2520:2:2226 +2521:0:4365 +2522:3:3043 +2523:0:4365 +2524:2:1936 +2525:0:4365 +2526:2:2129 +2527:0:4365 +2528:2:2130 +2529:0:4365 +2530:2:2134 +2531:0:4365 +2532:3:3042 +2533:0:4365 +2534:2:2136 +2535:0:4365 +2536:3:3043 +2537:0:4365 +2538:2:2137 +2539:2:2141 +2540:2:2142 +2541:2:2150 +2542:2:2151 +2543:2:2155 +2544:2:2156 +2545:2:2150 +2546:2:2151 +2547:2:2152 +2548:2:2164 +2549:2:2169 +2550:2:2173 +2551:2:2174 +2552:2:2181 +2553:2:2182 +2554:2:2193 +2555:2:2194 +2556:2:2195 +2557:2:2193 +2558:2:2194 +2559:2:2195 +2560:2:2206 +2561:2:2211 +2562:2:2212 +2563:0:4365 +2564:2:2224 +2565:0:4365 +2566:3:3042 +2567:0:4365 +2568:2:2226 +2569:0:4365 +2570:3:3043 +2571:0:4365 +2572:2:2230 +2573:0:4365 +2574:3:3042 +2575:0:4365 +2576:2:2235 +2577:2:2239 +2578:2:2240 +2579:2:2248 +2580:2:2249 +2581:2:2253 +2582:2:2254 +2583:2:2248 +2584:2:2249 +2585:2:2250 +2586:2:2262 +2587:2:2267 +2588:2:2271 +2589:2:2272 +2590:2:2279 +2591:2:2280 +2592:2:2291 +2593:2:2292 +2594:2:2293 +2595:2:2291 +2596:2:2292 +2597:2:2293 +2598:2:2304 +2599:2:2309 +2600:2:2310 +2601:0:4365 +2602:3:3043 +2603:0:4365 +2604:2:2322 +2605:0:4365 +2606:2:1169 +2607:0:4365 +2608:3:3042 +2609:0:4365 +2610:2:1170 +2611:0:4365 +2612:3:3043 +2613:0:4365 +2614:3:3044 +2615:0:4365 +2616:3:3257 +2617:0:4365 +2618:3:3265 +2619:0:4365 +2620:3:3266 +2621:3:3270 +2622:3:3271 +2623:3:3279 +2624:3:3280 +2625:3:3284 +2626:3:3285 +2627:3:3279 +2628:3:3280 +2629:3:3284 +2630:3:3285 +2631:3:3293 +2632:3:3298 +2633:3:3302 +2634:3:3303 +2635:3:3310 +2636:3:3311 +2637:3:3322 +2638:3:3323 +2639:3:3324 +2640:3:3322 +2641:3:3323 +2642:3:3324 +2643:3:3335 +2644:3:3340 +2645:3:3341 +2646:0:4365 +2647:3:3353 +2648:0:4365 +2649:3:3354 +2650:0:4365 +2651:2:1173 +2652:0:4365 +2653:3:3355 +2654:0:4365 +2655:2:1179 +2656:0:4365 +2657:2:1180 +2658:0:4365 +2659:3:3354 +2660:0:4365 +2661:2:1181 +2662:2:1185 +2663:2:1186 +2664:2:1194 +2665:2:1195 +2666:2:1199 +2667:2:1200 +2668:2:1194 +2669:2:1195 +2670:2:1199 +2671:2:1200 +2672:2:1208 +2673:2:1213 +2674:2:1217 +2675:2:1218 +2676:2:1225 +2677:2:1226 +2678:2:1237 +2679:2:1238 +2680:2:1239 +2681:2:1237 +2682:2:1238 +2683:2:1239 +2684:2:1250 +2685:2:1255 +2686:2:1256 +2687:0:4365 +2688:3:3355 +2689:0:4365 +2690:2:1268 +2691:0:4365 +2692:3:3354 +2693:0:4365 +2694:2:1270 +2695:0:4365 +2696:3:3355 +2697:0:4365 +2698:2:1271 +2699:2:1275 +2700:2:1276 +2701:2:1284 +2702:2:1285 +2703:2:1289 +2704:2:1290 +2705:2:1284 +2706:2:1285 +2707:2:1289 +2708:2:1290 +2709:2:1298 +2710:2:1303 +2711:2:1307 +2712:2:1308 +2713:2:1315 +2714:2:1316 +2715:2:1327 +2716:2:1328 +2717:2:1329 +2718:2:1327 +2719:2:1328 +2720:2:1329 +2721:2:1340 +2722:2:1345 +2723:2:1346 +2724:0:4365 +2725:2:1358 +2726:0:4365 +2727:2:1360 +2728:0:4365 +2729:3:3354 +2730:0:4365 +2731:2:1361 +2732:0:4365 +2733:3:3355 +2734:0:4365 +2735:2:1362 +2736:2:1366 +2737:2:1367 +2738:2:1375 +2739:2:1376 +2740:2:1380 +2741:2:1381 +2742:2:1375 +2743:2:1376 +2744:2:1380 +2745:2:1381 +2746:2:1389 +2747:2:1394 +2748:2:1398 +2749:2:1399 +2750:2:1406 +2751:2:1407 +2752:2:1418 +2753:2:1419 +2754:2:1420 +2755:2:1418 +2756:2:1419 +2757:2:1420 +2758:2:1431 +2759:2:1436 +2760:2:1437 +2761:0:4365 +2762:2:1449 +2763:0:4365 +2764:3:3354 +2765:0:4365 +2766:2:1451 +2767:0:4365 +2768:3:3355 +2769:0:4365 +2770:2:1652 +2771:0:4365 +2772:2:1653 +2773:0:4365 +2774:2:1657 +2775:0:4365 +2776:2:1180 +2777:0:4365 +2778:3:3354 +2779:0:4365 +2780:2:1181 +2781:2:1185 +2782:2:1186 +2783:2:1194 +2784:2:1195 +2785:2:1199 +2786:2:1200 +2787:2:1194 +2788:2:1195 +2789:2:1196 +2790:2:1208 +2791:2:1213 +2792:2:1217 +2793:2:1218 +2794:2:1225 +2795:2:1226 +2796:2:1237 +2797:2:1238 +2798:2:1239 +2799:2:1237 +2800:2:1238 +2801:2:1239 +2802:2:1250 +2803:2:1255 +2804:2:1256 +2805:0:4365 +2806:3:3355 +2807:0:4365 +2808:2:1268 +2809:0:4365 +2810:3:3354 +2811:0:4365 +2812:2:1270 +2813:0:4365 +2814:3:3355 +2815:0:4365 +2816:2:1271 +2817:2:1275 +2818:2:1276 +2819:2:1284 +2820:2:1285 +2821:2:1289 +2822:2:1290 +2823:2:1284 +2824:2:1285 +2825:2:1289 +2826:2:1290 +2827:2:1298 +2828:2:1303 +2829:2:1307 +2830:2:1308 +2831:2:1315 +2832:2:1316 +2833:2:1327 +2834:2:1328 +2835:2:1329 +2836:2:1327 +2837:2:1328 +2838:2:1329 +2839:2:1340 +2840:2:1345 +2841:2:1346 +2842:0:4365 +2843:2:1358 +2844:0:4365 +2845:2:1454 +2846:0:4365 +2847:3:3354 +2848:0:4365 +2849:2:1455 +2850:0:4365 +2851:3:3355 +2852:0:4365 +2853:2:1652 +2854:0:4365 +2855:2:1653 +2856:0:4365 +2857:2:1657 +2858:0:4365 +2859:2:1660 +2860:0:4365 +2861:3:3354 +2862:0:4365 +2863:2:1665 +2864:2:1669 +2865:2:1670 +2866:2:1678 +2867:2:1679 +2868:2:1683 +2869:2:1684 +2870:2:1678 +2871:2:1679 +2872:2:1680 +2873:2:1692 +2874:2:1697 +2875:2:1701 +2876:2:1702 +2877:2:1709 +2878:2:1710 +2879:2:1721 +2880:2:1722 +2881:2:1723 +2882:2:1721 +2883:2:1722 +2884:2:1723 +2885:2:1734 +2886:2:1739 +2887:2:1740 +2888:0:4365 +2889:3:3355 +2890:0:4365 +2891:2:1752 +2892:0:4365 +2893:3:3354 +2894:0:4365 +2895:2:1754 +2896:0:4365 +2897:3:3355 +2898:0:4365 +2899:2:1755 +2900:2:1759 +2901:2:1760 +2902:2:1768 +2903:2:1769 +2904:2:1773 +2905:2:1774 +2906:2:1768 +2907:2:1769 +2908:2:1773 +2909:2:1774 +2910:2:1782 +2911:2:1787 +2912:2:1791 +2913:2:1792 +2914:2:1799 +2915:2:1800 +2916:2:1811 +2917:2:1812 +2918:2:1813 +2919:2:1811 +2920:2:1812 +2921:2:1813 +2922:2:1824 +2923:2:1829 +2924:2:1830 +2925:0:4365 +2926:2:1842 +2927:0:4365 +2928:3:3354 +2929:0:4365 +2930:2:1844 +2931:0:4365 +2932:3:3355 +2933:0:4365 +2934:2:1845 +2935:2:1849 +2936:2:1850 +2937:2:1858 +2938:2:1859 +2939:2:1863 +2940:2:1864 +2941:2:1858 +2942:2:1859 +2943:2:1863 +2944:2:1864 +2945:2:1872 +2946:2:1877 +2947:2:1881 +2948:2:1882 +2949:2:1889 +2950:2:1890 +2951:2:1901 +2952:2:1902 +2953:2:1903 +2954:2:1901 +2955:2:1902 +2956:2:1903 +2957:2:1914 +2958:2:1919 +2959:2:1920 +2960:0:4365 +2961:2:1932 +2962:0:4365 +2963:3:3354 +2964:0:4365 +2965:2:1934 +2966:0:4365 +2967:3:3355 +2968:0:4365 +2969:2:1935 +2970:0:4365 +2971:2:1936 +2972:0:4365 +2973:2:2129 +2974:0:4365 +2975:2:2130 +2976:0:4365 +2977:2:2134 +2978:0:4365 +2979:3:3354 +2980:0:4365 +2981:2:2136 +2982:0:4365 +2983:3:3355 +2984:0:4365 +2985:2:2137 +2986:2:2141 +2987:2:2142 +2988:2:2150 +2989:2:2151 +2990:2:2155 +2991:2:2156 +2992:2:2150 +2993:2:2151 +2994:2:2155 +2995:2:2156 +2996:2:2164 +2997:2:2169 +2998:2:2173 +2999:2:2174 +3000:2:2181 +3001:2:2182 +3002:2:2193 +3003:2:2194 +3004:2:2195 +3005:2:2193 +3006:2:2194 +3007:2:2195 +3008:2:2206 +3009:2:2211 +3010:2:2212 +3011:0:4365 +3012:2:2224 +3013:0:4365 +3014:3:3354 +3015:0:4365 +3016:2:2226 +3017:0:4365 +3018:3:3355 +3019:0:4365 +3020:2:1936 +3021:0:4365 +3022:2:2129 +3023:0:4365 +3024:2:2130 +3025:0:4365 +3026:2:2134 +3027:0:4365 +3028:3:3354 +3029:0:4365 +3030:2:2136 +3031:0:4365 +3032:3:3355 +3033:0:4365 +3034:2:2137 +3035:2:2141 +3036:2:2142 +3037:2:2150 +3038:2:2151 +3039:2:2155 +3040:2:2156 +3041:2:2150 +3042:2:2151 +3043:2:2152 +3044:2:2164 +3045:2:2169 +3046:2:2173 +3047:2:2174 +3048:2:2181 +3049:2:2182 +3050:2:2193 +3051:2:2194 +3052:2:2195 +3053:2:2193 +3054:2:2194 +3055:2:2195 +3056:2:2206 +3057:2:2211 +3058:2:2212 +3059:0:4365 +3060:2:2224 +3061:0:4365 +3062:3:3354 +3063:0:4365 +3064:2:2226 +3065:0:4365 +3066:3:3355 +3067:0:4365 +3068:2:2230 +3069:0:4365 +3070:3:3354 +3071:0:4365 +3072:2:2235 +3073:2:2239 +3074:2:2240 +3075:2:2248 +3076:2:2249 +3077:2:2253 +3078:2:2254 +3079:2:2248 +3080:2:2249 +3081:2:2250 +3082:2:2262 +3083:2:2267 +3084:2:2271 +3085:2:2272 +3086:2:2279 +3087:2:2280 +3088:2:2291 +3089:2:2292 +3090:2:2293 +3091:2:2291 +3092:2:2292 +3093:2:2293 +3094:2:2304 +3095:2:2309 +3096:2:2310 +3097:0:4365 +3098:3:3355 +3099:0:4365 +3100:2:2322 +3101:0:4365 +3102:2:1169 +3103:0:4365 +3104:3:3354 +3105:0:4365 +3106:2:1170 +3107:0:4365 +3108:3:3355 +3109:0:4365 +3110:3:3356 +3111:0:4365 +3112:3:3366 +3113:0:4365 +3114:3:2951 +3115:0:4365 +3116:3:2952 +3117:0:4365 +3118:3:2953 +3119:0:4365 +3120:3:2954 +3121:3:2958 +3122:3:2959 +3123:3:2967 +3124:3:2968 +3125:3:2972 +3126:3:2973 +3127:3:2967 +3128:3:2968 +3129:3:2972 +3130:3:2973 +3131:3:2981 +3132:3:2986 +3133:3:2990 +3134:3:2991 +3135:3:2998 +3136:3:2999 +3137:3:3010 +3138:3:3011 +3139:3:3012 +3140:3:3010 +3141:3:3011 +3142:3:3012 +3143:3:3023 +3144:3:3028 +3145:3:3029 +3146:0:4365 +3147:3:3041 +3148:0:4365 +3149:3:3042 +3150:0:4365 +3151:2:1173 +3152:0:4365 +3153:3:3043 +3154:0:4365 +3155:2:1179 +3156:0:4365 +3157:2:1180 +3158:0:4365 +3159:3:3042 +3160:0:4365 +3161:2:1181 +3162:2:1185 +3163:2:1186 +3164:2:1194 +3165:2:1195 +3166:2:1199 +3167:2:1200 +3168:2:1194 +3169:2:1195 +3170:2:1199 +3171:2:1200 +3172:2:1208 +3173:2:1213 +3174:2:1217 +3175:2:1218 +3176:2:1225 +3177:2:1226 +3178:2:1237 +3179:2:1238 +3180:2:1239 +3181:2:1237 +3182:2:1238 +3183:2:1239 +3184:2:1250 +3185:2:1255 +3186:2:1256 +3187:0:4365 +3188:3:3043 +3189:0:4365 +3190:2:1268 +3191:0:4365 +3192:3:3042 +3193:0:4365 +3194:2:1270 +3195:0:4365 +3196:3:3043 +3197:0:4365 +3198:2:1271 +3199:2:1275 +3200:2:1276 +3201:2:1284 +3202:2:1285 +3203:2:1289 +3204:2:1290 +3205:2:1284 +3206:2:1285 +3207:2:1289 +3208:2:1290 +3209:2:1298 +3210:2:1303 +3211:2:1307 +3212:2:1308 +3213:2:1315 +3214:2:1316 +3215:2:1327 +3216:2:1328 +3217:2:1329 +3218:2:1327 +3219:2:1328 +3220:2:1329 +3221:2:1340 +3222:2:1345 +3223:2:1346 +3224:0:4365 +3225:2:1358 +3226:0:4365 +3227:2:1360 +3228:0:4365 +3229:3:3042 +3230:0:4365 +3231:2:1361 +3232:0:4365 +3233:3:3043 +3234:0:4365 +3235:2:1362 +3236:2:1366 +3237:2:1367 +3238:2:1375 +3239:2:1376 +3240:2:1380 +3241:2:1381 +3242:2:1375 +3243:2:1376 +3244:2:1380 +3245:2:1381 +3246:2:1389 +3247:2:1394 +3248:2:1398 +3249:2:1399 +3250:2:1406 +3251:2:1407 +3252:2:1418 +3253:2:1419 +3254:2:1420 +3255:2:1418 +3256:2:1419 +3257:2:1420 +3258:2:1431 +3259:2:1436 +3260:2:1437 +3261:0:4365 +3262:2:1449 +3263:0:4365 +3264:3:3042 +3265:0:4365 +3266:2:1451 +3267:0:4365 +3268:3:3043 +3269:0:4365 +3270:2:1652 +3271:0:4365 +3272:2:1653 +3273:0:4365 +3274:2:1657 +3275:0:4365 +3276:2:1180 +3277:0:4365 +3278:3:3042 +3279:0:4365 +3280:2:1181 +3281:2:1185 +3282:2:1186 +3283:2:1194 +3284:2:1195 +3285:2:1199 +3286:2:1200 +3287:2:1194 +3288:2:1195 +3289:2:1196 +3290:2:1208 +3291:2:1213 +3292:2:1217 +3293:2:1218 +3294:2:1225 +3295:2:1226 +3296:2:1237 +3297:2:1238 +3298:2:1239 +3299:2:1237 +3300:2:1238 +3301:2:1239 +3302:2:1250 +3303:2:1255 +3304:2:1256 +3305:0:4365 +3306:3:3043 +3307:0:4365 +3308:2:1268 +3309:0:4365 +3310:3:3042 +3311:0:4365 +3312:2:1270 +3313:0:4365 +3314:3:3043 +3315:0:4365 +3316:2:1271 +3317:2:1275 +3318:2:1276 +3319:2:1284 +3320:2:1285 +3321:2:1289 +3322:2:1290 +3323:2:1284 +3324:2:1285 +3325:2:1289 +3326:2:1290 +3327:2:1298 +3328:2:1303 +3329:2:1307 +3330:2:1308 +3331:2:1315 +3332:2:1316 +3333:2:1327 +3334:2:1328 +3335:2:1329 +3336:2:1327 +3337:2:1328 +3338:2:1329 +3339:2:1340 +3340:2:1345 +3341:2:1346 +3342:0:4365 +3343:2:1358 +3344:0:4365 +3345:2:1454 +3346:0:4365 +3347:3:3042 +3348:0:4365 +3349:2:1455 +3350:0:4365 +3351:3:3043 +3352:0:4365 +3353:2:1652 +3354:0:4365 +3355:2:1653 +3356:0:4365 +3357:2:1657 +3358:0:4365 +3359:2:1660 +3360:0:4365 +3361:3:3042 +3362:0:4365 +3363:2:1665 +3364:2:1669 +3365:2:1670 +3366:2:1678 +3367:2:1679 +3368:2:1683 +3369:2:1684 +3370:2:1678 +3371:2:1679 +3372:2:1680 +3373:2:1692 +3374:2:1697 +3375:2:1701 +3376:2:1702 +3377:2:1709 +3378:2:1710 +3379:2:1721 +3380:2:1722 +3381:2:1723 +3382:2:1721 +3383:2:1722 +3384:2:1723 +3385:2:1734 +3386:2:1739 +3387:2:1740 +3388:0:4365 +3389:3:3043 +3390:0:4365 +3391:2:1752 +3392:0:4365 +3393:3:3042 +3394:0:4365 +3395:2:1754 +3396:0:4365 +3397:3:3043 +3398:0:4365 +3399:2:1755 +3400:2:1759 +3401:2:1760 +3402:2:1768 +3403:2:1769 +3404:2:1773 +3405:2:1774 +3406:2:1768 +3407:2:1769 +3408:2:1773 +3409:2:1774 +3410:2:1782 +3411:2:1787 +3412:2:1791 +3413:2:1792 +3414:2:1799 +3415:2:1800 +3416:2:1811 +3417:2:1812 +3418:2:1813 +3419:2:1811 +3420:2:1812 +3421:2:1813 +3422:2:1824 +3423:2:1829 +3424:2:1830 +3425:0:4365 +3426:2:1842 +3427:0:4365 +3428:3:3042 +3429:0:4365 +3430:2:1844 +3431:0:4365 +3432:3:3043 +3433:0:4365 +3434:2:1845 +3435:2:1849 +3436:2:1850 +3437:2:1858 +3438:2:1859 +3439:2:1863 +3440:2:1864 +3441:2:1858 +3442:2:1859 +3443:2:1863 +3444:2:1864 +3445:2:1872 +3446:2:1877 +3447:2:1881 +3448:2:1882 +3449:2:1889 +3450:2:1890 +3451:2:1901 +3452:2:1902 +3453:2:1903 +3454:2:1901 +3455:2:1902 +3456:2:1903 +3457:2:1914 +3458:2:1919 +3459:2:1920 +3460:0:4365 +3461:2:1932 +3462:0:4365 +3463:3:3042 +3464:0:4365 +3465:2:1934 +3466:0:4365 +3467:3:3043 +3468:0:4365 +3469:2:1935 +3470:0:4365 +3471:2:1936 +3472:0:4365 +3473:2:2129 +3474:0:4365 +3475:2:2130 +3476:0:4365 +3477:2:2134 +3478:0:4365 +3479:3:3042 +3480:0:4365 +3481:2:2136 +3482:0:4365 +3483:3:3043 +3484:0:4365 +3485:2:2137 +3486:2:2141 +3487:2:2142 +3488:2:2150 +3489:2:2151 +3490:2:2155 +3491:2:2156 +3492:2:2150 +3493:2:2151 +3494:2:2155 +3495:2:2156 +3496:2:2164 +3497:2:2169 +3498:2:2173 +3499:2:2174 +3500:2:2181 +3501:2:2182 +3502:2:2193 +3503:2:2194 +3504:2:2195 +3505:2:2193 +3506:2:2194 +3507:2:2195 +3508:2:2206 +3509:2:2211 +3510:2:2212 +3511:0:4365 +3512:2:2224 +3513:0:4365 +3514:3:3042 +3515:0:4365 +3516:2:2226 +3517:0:4365 +3518:3:3043 +3519:0:4365 +3520:2:1936 +3521:0:4365 +3522:2:2129 +3523:0:4365 +3524:2:2130 +3525:0:4365 +3526:2:2134 +3527:0:4365 +3528:3:3042 +3529:0:4365 +3530:2:2136 +3531:0:4365 +3532:3:3043 +3533:0:4365 +3534:2:2137 +3535:2:2141 +3536:2:2142 +3537:2:2150 +3538:2:2151 +3539:2:2155 +3540:2:2156 +3541:2:2150 +3542:2:2151 +3543:2:2152 +3544:2:2164 +3545:2:2169 +3546:2:2173 +3547:2:2174 +3548:2:2181 +3549:2:2182 +3550:2:2193 +3551:2:2194 +3552:2:2195 +3553:2:2193 +3554:2:2194 +3555:2:2195 +3556:2:2206 +3557:2:2211 +3558:2:2212 +3559:0:4365 +3560:2:2224 +3561:0:4365 +3562:3:3042 +3563:0:4365 +3564:2:2226 +3565:0:4365 +3566:3:3043 +3567:0:4365 +3568:2:2230 +3569:0:4365 +3570:3:3042 +3571:0:4365 +3572:2:2235 +3573:2:2239 +3574:2:2240 +3575:2:2248 +3576:2:2249 +3577:2:2253 +3578:2:2254 +3579:2:2248 +3580:2:2249 +3581:2:2250 +3582:2:2262 +3583:2:2267 +3584:2:2271 +3585:2:2272 +3586:2:2279 +3587:2:2280 +3588:2:2291 +3589:2:2292 +3590:2:2293 +3591:2:2291 +3592:2:2292 +3593:2:2293 +3594:2:2304 +3595:2:2309 +3596:2:2310 +3597:0:4365 +3598:3:3043 +3599:0:4365 +3600:2:2322 +3601:0:4365 +3602:2:1169 +3603:0:4365 +3604:3:3042 +3605:0:4365 +3606:2:1170 +3607:0:4365 +3608:3:3043 +3609:0:4365 +3610:3:3044 +3611:0:4365 +3612:3:3257 +3613:0:4365 +3614:3:3362 +3615:0:4365 +3616:3:3363 +3617:0:4365 +3618:3:3367 +3619:0:4365 +3620:3:3373 +3621:3:3377 +3622:3:3378 +3623:3:3386 +3624:3:3387 +3625:3:3391 +3626:3:3392 +3627:3:3386 +3628:3:3387 +3629:3:3391 +3630:3:3392 +3631:3:3400 +3632:3:3405 +3633:3:3409 +3634:3:3410 +3635:3:3417 +3636:3:3418 +3637:3:3429 +3638:3:3430 +3639:3:3431 +3640:3:3429 +3641:3:3430 +3642:3:3431 +3643:3:3442 +3644:3:3447 +3645:3:3448 +3646:0:4365 +3647:3:3460 +3648:0:4365 +3649:3:3461 +3650:0:4365 +3651:2:1173 +3652:0:4365 +3653:3:3462 +3654:0:4365 +3655:2:1179 +3656:0:4365 +3657:2:1180 +3658:0:4365 +3659:3:3461 +3660:0:4365 +3661:2:1181 +3662:2:1185 +3663:2:1186 +3664:2:1194 +3665:2:1195 +3666:2:1199 +3667:2:1200 +3668:2:1194 +3669:2:1195 +3670:2:1199 +3671:2:1200 +3672:2:1208 +3673:2:1213 +3674:2:1217 +3675:2:1218 +3676:2:1225 +3677:2:1226 +3678:2:1237 +3679:2:1238 +3680:2:1239 +3681:2:1237 +3682:2:1238 +3683:2:1239 +3684:2:1250 +3685:2:1255 +3686:2:1256 +3687:0:4365 +3688:3:3462 +3689:0:4365 +3690:2:1268 +3691:0:4365 +3692:3:3461 +3693:0:4365 +3694:2:1270 +3695:0:4365 +3696:3:3462 +3697:0:4365 +3698:2:1271 +3699:2:1275 +3700:2:1276 +3701:2:1284 +3702:2:1285 +3703:2:1289 +3704:2:1290 +3705:2:1284 +3706:2:1285 +3707:2:1289 +3708:2:1290 +3709:2:1298 +3710:2:1303 +3711:2:1307 +3712:2:1308 +3713:2:1315 +3714:2:1316 +3715:2:1327 +3716:2:1328 +3717:2:1329 +3718:2:1327 +3719:2:1328 +3720:2:1329 +3721:2:1340 +3722:2:1345 +3723:2:1346 +3724:0:4365 +3725:2:1358 +3726:0:4365 +3727:2:1360 +3728:0:4365 +3729:3:3461 +3730:0:4365 +3731:2:1361 +3732:0:4365 +3733:3:3462 +3734:0:4365 +3735:2:1362 +3736:2:1366 +3737:2:1367 +3738:2:1375 +3739:2:1376 +3740:2:1380 +3741:2:1381 +3742:2:1375 +3743:2:1376 +3744:2:1380 +3745:2:1381 +3746:2:1389 +3747:2:1394 +3748:2:1398 +3749:2:1399 +3750:2:1406 +3751:2:1407 +3752:2:1418 +3753:2:1419 +3754:2:1420 +3755:2:1418 +3756:2:1419 +3757:2:1420 +3758:2:1431 +3759:2:1436 +3760:2:1437 +3761:0:4365 +3762:2:1449 +3763:0:4365 +3764:3:3461 +3765:0:4365 +3766:2:1451 +3767:0:4365 +3768:3:3462 +3769:0:4365 +3770:2:1652 +3771:0:4365 +3772:2:1653 +3773:0:4365 +3774:2:1657 +3775:0:4365 +3776:2:1180 +3777:0:4365 +3778:3:3461 +3779:0:4365 +3780:2:1181 +3781:2:1185 +3782:2:1186 +3783:2:1194 +3784:2:1195 +3785:2:1199 +3786:2:1200 +3787:2:1194 +3788:2:1195 +3789:2:1196 +3790:2:1208 +3791:2:1213 +3792:2:1217 +3793:2:1218 +3794:2:1225 +3795:2:1226 +3796:2:1237 +3797:2:1238 +3798:2:1239 +3799:2:1237 +3800:2:1238 +3801:2:1239 +3802:2:1250 +3803:2:1255 +3804:2:1256 +3805:0:4365 +3806:3:3462 +3807:0:4365 +3808:2:1268 +3809:0:4365 +3810:3:3461 +3811:0:4365 +3812:2:1270 +3813:0:4365 +3814:3:3462 +3815:0:4365 +3816:2:1271 +3817:2:1275 +3818:2:1276 +3819:2:1284 +3820:2:1285 +3821:2:1289 +3822:2:1290 +3823:2:1284 +3824:2:1285 +3825:2:1289 +3826:2:1290 +3827:2:1298 +3828:2:1303 +3829:2:1307 +3830:2:1308 +3831:2:1315 +3832:2:1316 +3833:2:1327 +3834:2:1328 +3835:2:1329 +3836:2:1327 +3837:2:1328 +3838:2:1329 +3839:2:1340 +3840:2:1345 +3841:2:1346 +3842:0:4365 +3843:2:1358 +3844:0:4365 +3845:2:1454 +3846:0:4365 +3847:3:3461 +3848:0:4365 +3849:2:1455 +3850:0:4365 +3851:3:3462 +3852:0:4365 +3853:2:1652 +3854:0:4365 +3855:2:1653 +3856:0:4365 +3857:2:1657 +3858:0:4365 +3859:2:1660 +3860:0:4365 +3861:3:3461 +3862:0:4365 +3863:2:1665 +3864:2:1669 +3865:2:1670 +3866:2:1678 +3867:2:1679 +3868:2:1683 +3869:2:1684 +3870:2:1678 +3871:2:1679 +3872:2:1680 +3873:2:1692 +3874:2:1697 +3875:2:1701 +3876:2:1702 +3877:2:1709 +3878:2:1710 +3879:2:1721 +3880:2:1722 +3881:2:1723 +3882:2:1721 +3883:2:1722 +3884:2:1723 +3885:2:1734 +3886:2:1739 +3887:2:1740 +3888:0:4365 +3889:3:3462 +3890:0:4365 +3891:2:1752 +3892:0:4365 +3893:3:3461 +3894:0:4365 +3895:2:1754 +3896:0:4365 +3897:3:3462 +3898:0:4365 +3899:2:1755 +3900:2:1759 +3901:2:1760 +3902:2:1768 +3903:2:1769 +3904:2:1773 +3905:2:1774 +3906:2:1768 +3907:2:1769 +3908:2:1773 +3909:2:1774 +3910:2:1782 +3911:2:1787 +3912:2:1791 +3913:2:1792 +3914:2:1799 +3915:2:1800 +3916:2:1811 +3917:2:1812 +3918:2:1813 +3919:2:1811 +3920:2:1812 +3921:2:1813 +3922:2:1824 +3923:2:1829 +3924:2:1830 +3925:0:4365 +3926:2:1842 +3927:0:4365 +3928:3:3461 +3929:0:4365 +3930:2:1844 +3931:0:4365 +3932:3:3462 +3933:0:4365 +3934:2:1845 +3935:2:1849 +3936:2:1850 +3937:2:1858 +3938:2:1859 +3939:2:1863 +3940:2:1864 +3941:2:1858 +3942:2:1859 +3943:2:1863 +3944:2:1864 +3945:2:1872 +3946:2:1877 +3947:2:1881 +3948:2:1882 +3949:2:1889 +3950:2:1890 +3951:2:1901 +3952:2:1902 +3953:2:1903 +3954:2:1901 +3955:2:1902 +3956:2:1903 +3957:2:1914 +3958:2:1919 +3959:2:1920 +3960:0:4365 +3961:2:1932 +3962:0:4365 +3963:3:3461 +3964:0:4365 +3965:2:1934 +3966:0:4365 +3967:3:3462 +3968:0:4365 +3969:2:1935 +3970:0:4365 +3971:2:1936 +3972:0:4365 +3973:2:2129 +3974:0:4365 +3975:2:2130 +3976:0:4365 +3977:2:2134 +3978:0:4365 +3979:3:3461 +3980:0:4365 +3981:2:2136 +3982:0:4365 +3983:3:3462 +3984:0:4365 +3985:2:2137 +3986:2:2141 +3987:2:2142 +3988:2:2150 +3989:2:2151 +3990:2:2155 +3991:2:2156 +3992:2:2150 +3993:2:2151 +3994:2:2155 +3995:2:2156 +3996:2:2164 +3997:2:2169 +3998:2:2173 +3999:2:2174 +4000:2:2181 +4001:2:2182 +4002:2:2193 +4003:2:2194 +4004:2:2195 +4005:2:2193 +4006:2:2194 +4007:2:2195 +4008:2:2206 +4009:2:2211 +4010:2:2212 +4011:0:4365 +4012:2:2224 +4013:0:4365 +4014:3:3461 +4015:0:4365 +4016:2:2226 +4017:0:4365 +4018:3:3462 +4019:0:4365 +4020:2:1936 +4021:0:4365 +4022:2:2129 +4023:0:4365 +4024:2:2130 +4025:0:4365 +4026:2:2134 +4027:0:4365 +4028:3:3461 +4029:0:4365 +4030:2:2136 +4031:0:4365 +4032:3:3462 +4033:0:4365 +4034:2:2137 +4035:2:2141 +4036:2:2142 +4037:2:2150 +4038:2:2151 +4039:2:2155 +4040:2:2156 +4041:2:2150 +4042:2:2151 +4043:2:2152 +4044:2:2164 +4045:2:2169 +4046:2:2173 +4047:2:2174 +4048:2:2181 +4049:2:2182 +4050:2:2193 +4051:2:2194 +4052:2:2195 +4053:2:2193 +4054:2:2194 +4055:2:2195 +4056:2:2206 +4057:2:2211 +4058:2:2212 +4059:0:4365 +4060:2:2224 +4061:0:4365 +4062:3:3461 +4063:0:4365 +4064:2:2226 +4065:0:4365 +4066:3:3462 +4067:0:4365 +4068:2:2230 +4069:0:4365 +4070:3:3461 +4071:0:4365 +4072:2:2235 +4073:2:2239 +4074:2:2240 +4075:2:2248 +4076:2:2249 +4077:2:2253 +4078:2:2254 +4079:2:2248 +4080:2:2249 +4081:2:2250 +4082:2:2262 +4083:2:2267 +4084:2:2271 +4085:2:2272 +4086:2:2279 +4087:2:2280 +4088:2:2291 +4089:2:2292 +4090:2:2293 +4091:2:2291 +4092:2:2292 +4093:2:2293 +4094:2:2304 +4095:2:2309 +4096:2:2310 +4097:0:4365 +4098:3:3462 +4099:0:4365 +4100:2:2322 +4101:0:4365 +4102:2:1169 +4103:0:4365 +4104:3:3461 +4105:0:4365 +4106:2:1170 +4107:0:4365 +4108:3:3462 +4109:0:4365 +4110:3:3463 +4111:0:4365 +4112:3:3469 +4113:0:4365 +4114:3:3470 +4115:3:3474 +4116:3:3475 +4117:3:3483 +4118:3:3484 +4119:3:3488 +4120:3:3489 +4121:3:3483 +4122:3:3484 +4123:3:3488 +4124:3:3489 +4125:3:3497 +4126:3:3502 +4127:3:3506 +4128:3:3507 +4129:3:3514 +4130:3:3515 +4131:3:3526 +4132:3:3527 +4133:3:3528 +4134:3:3526 +4135:3:3527 +4136:3:3528 +4137:3:3539 +4138:3:3544 +4139:3:3545 +4140:0:4365 +4141:3:3557 +4142:0:4365 +4143:3:3558 +4144:0:4365 +4145:2:1173 +4146:0:4365 +4147:3:3559 +4148:0:4365 +4149:2:1179 +4150:0:4365 +4151:2:1180 +4152:0:4365 +4153:3:3558 +4154:0:4365 +4155:2:1181 +4156:2:1185 +4157:2:1186 +4158:2:1194 +4159:2:1195 +4160:2:1199 +4161:2:1200 +4162:2:1194 +4163:2:1195 +4164:2:1199 +4165:2:1200 +4166:2:1208 +4167:2:1213 +4168:2:1217 +4169:2:1218 +4170:2:1225 +4171:2:1226 +4172:2:1237 +4173:2:1238 +4174:2:1239 +4175:2:1237 +4176:2:1238 +4177:2:1239 +4178:2:1250 +4179:2:1255 +4180:2:1256 +4181:0:4365 +4182:3:3559 +4183:0:4365 +4184:2:1268 +4185:0:4365 +4186:3:3558 +4187:0:4365 +4188:2:1270 +4189:0:4365 +4190:3:3559 +4191:0:4365 +4192:2:1271 +4193:2:1275 +4194:2:1276 +4195:2:1284 +4196:2:1285 +4197:2:1289 +4198:2:1290 +4199:2:1284 +4200:2:1285 +4201:2:1289 +4202:2:1290 +4203:2:1298 +4204:2:1303 +4205:2:1307 +4206:2:1308 +4207:2:1315 +4208:2:1316 +4209:2:1327 +4210:2:1328 +4211:2:1329 +4212:2:1327 +4213:2:1328 +4214:2:1329 +4215:2:1340 +4216:2:1345 +4217:2:1346 +4218:0:4365 +4219:2:1358 +4220:0:4365 +4221:2:1360 +4222:0:4365 +4223:3:3558 +4224:0:4365 +4225:2:1361 +4226:0:4365 +4227:3:3559 +4228:0:4365 +4229:2:1362 +4230:2:1366 +4231:2:1367 +4232:2:1375 +4233:2:1376 +4234:2:1380 +4235:2:1381 +4236:2:1375 +4237:2:1376 +4238:2:1380 +4239:2:1381 +4240:2:1389 +4241:2:1394 +4242:2:1398 +4243:2:1399 +4244:2:1406 +4245:2:1407 +4246:2:1418 +4247:2:1419 +4248:2:1420 +4249:2:1418 +4250:2:1419 +4251:2:1420 +4252:2:1431 +4253:2:1436 +4254:2:1437 +4255:0:4365 +4256:2:1449 +4257:0:4365 +4258:3:3558 +4259:0:4365 +4260:2:1451 +4261:0:4365 +4262:3:3559 +4263:0:4365 +4264:2:1652 +4265:0:4365 +4266:2:1653 +4267:0:4365 +4268:2:1657 +4269:0:4365 +4270:2:1180 +4271:0:4365 +4272:3:3558 +4273:0:4365 +4274:2:1181 +4275:2:1185 +4276:2:1186 +4277:2:1194 +4278:2:1195 +4279:2:1199 +4280:2:1200 +4281:2:1194 +4282:2:1195 +4283:2:1196 +4284:2:1208 +4285:2:1213 +4286:2:1217 +4287:2:1218 +4288:2:1225 +4289:2:1226 +4290:2:1237 +4291:2:1238 +4292:2:1239 +4293:2:1237 +4294:2:1238 +4295:2:1239 +4296:2:1250 +4297:2:1255 +4298:2:1256 +4299:0:4365 +4300:3:3559 +4301:0:4365 +4302:2:1268 +4303:0:4365 +4304:3:3558 +4305:0:4365 +4306:2:1270 +4307:0:4365 +4308:3:3559 +4309:0:4365 +4310:2:1271 +4311:2:1275 +4312:2:1276 +4313:2:1284 +4314:2:1285 +4315:2:1289 +4316:2:1290 +4317:2:1284 +4318:2:1285 +4319:2:1289 +4320:2:1290 +4321:2:1298 +4322:2:1303 +4323:2:1307 +4324:2:1308 +4325:2:1315 +4326:2:1316 +4327:2:1327 +4328:2:1328 +4329:2:1329 +4330:2:1327 +4331:2:1328 +4332:2:1329 +4333:2:1340 +4334:2:1345 +4335:2:1346 +4336:0:4365 +4337:2:1358 +4338:0:4365 +4339:2:1454 +4340:0:4365 +4341:3:3558 +4342:0:4365 +4343:2:1455 +4344:0:4365 +4345:3:3559 +4346:0:4365 +4347:2:1652 +4348:0:4365 +4349:2:1653 +4350:0:4365 +4351:2:1657 +4352:0:4365 +4353:2:1660 +4354:0:4365 +4355:3:3558 +4356:0:4365 +4357:2:1665 +4358:2:1669 +4359:2:1670 +4360:2:1678 +4361:2:1679 +4362:2:1683 +4363:2:1684 +4364:2:1678 +4365:2:1679 +4366:2:1680 +4367:2:1692 +4368:2:1697 +4369:2:1701 +4370:2:1702 +4371:2:1709 +4372:2:1710 +4373:2:1721 +4374:2:1722 +4375:2:1723 +4376:2:1721 +4377:2:1722 +4378:2:1723 +4379:2:1734 +4380:2:1739 +4381:2:1740 +4382:0:4365 +4383:3:3559 +4384:0:4365 +4385:2:1752 +4386:0:4365 +4387:3:3558 +4388:0:4365 +4389:2:1754 +4390:0:4365 +4391:3:3559 +4392:0:4365 +4393:2:1755 +4394:2:1759 +4395:2:1760 +4396:2:1768 +4397:2:1769 +4398:2:1773 +4399:2:1774 +4400:2:1768 +4401:2:1769 +4402:2:1773 +4403:2:1774 +4404:2:1782 +4405:2:1787 +4406:2:1791 +4407:2:1792 +4408:2:1799 +4409:2:1800 +4410:2:1811 +4411:2:1812 +4412:2:1813 +4413:2:1811 +4414:2:1812 +4415:2:1813 +4416:2:1824 +4417:2:1829 +4418:2:1830 +4419:0:4365 +4420:2:1842 +4421:0:4365 +4422:3:3558 +4423:0:4365 +4424:2:1844 +4425:0:4365 +4426:3:3559 +4427:0:4365 +4428:2:1845 +4429:2:1849 +4430:2:1850 +4431:2:1858 +4432:2:1859 +4433:2:1863 +4434:2:1864 +4435:2:1858 +4436:2:1859 +4437:2:1863 +4438:2:1864 +4439:2:1872 +4440:2:1877 +4441:2:1881 +4442:2:1882 +4443:2:1889 +4444:2:1890 +4445:2:1901 +4446:2:1902 +4447:2:1903 +4448:2:1901 +4449:2:1902 +4450:2:1903 +4451:2:1914 +4452:2:1919 +4453:2:1920 +4454:0:4365 +4455:2:1932 +4456:0:4365 +4457:3:3558 +4458:0:4365 +4459:2:1934 +4460:0:4365 +4461:3:3559 +4462:0:4365 +4463:2:1935 +4464:0:4365 +4465:2:1936 +4466:0:4365 +4467:2:2129 +4468:0:4365 +4469:2:2130 +4470:0:4365 +4471:2:2134 +4472:0:4365 +4473:3:3558 +4474:0:4365 +4475:2:2136 +4476:0:4365 +4477:3:3559 +4478:0:4365 +4479:2:2137 +4480:2:2141 +4481:2:2142 +4482:2:2150 +4483:2:2151 +4484:2:2155 +4485:2:2156 +4486:2:2150 +4487:2:2151 +4488:2:2155 +4489:2:2156 +4490:2:2164 +4491:2:2169 +4492:2:2173 +4493:2:2174 +4494:2:2181 +4495:2:2182 +4496:2:2193 +4497:2:2194 +4498:2:2195 +4499:2:2193 +4500:2:2194 +4501:2:2195 +4502:2:2206 +4503:2:2211 +4504:2:2212 +4505:0:4365 +4506:2:2224 +4507:0:4365 +4508:3:3558 +4509:0:4365 +4510:2:2226 +4511:0:4365 +4512:3:3559 +4513:0:4365 +4514:2:1936 +4515:0:4365 +4516:2:2129 +4517:0:4365 +4518:2:2130 +4519:0:4365 +4520:2:2134 +4521:0:4365 +4522:3:3558 +4523:0:4365 +4524:2:2136 +4525:0:4365 +4526:3:3559 +4527:0:4365 +4528:2:2137 +4529:2:2141 +4530:2:2142 +4531:2:2150 +4532:2:2151 +4533:2:2155 +4534:2:2156 +4535:2:2150 +4536:2:2151 +4537:2:2152 +4538:2:2164 +4539:2:2169 +4540:2:2173 +4541:2:2174 +4542:2:2181 +4543:2:2182 +4544:2:2193 +4545:2:2194 +4546:2:2195 +4547:2:2193 +4548:2:2194 +4549:2:2195 +4550:2:2206 +4551:2:2211 +4552:2:2212 +4553:0:4365 +4554:2:2224 +4555:0:4365 +4556:3:3558 +4557:0:4365 +4558:2:2226 +4559:0:4365 +4560:3:3559 +4561:0:4365 +4562:2:2230 +4563:0:4365 +4564:3:3558 +4565:0:4365 +4566:2:2235 +4567:2:2239 +4568:2:2240 +4569:2:2248 +4570:2:2249 +4571:2:2253 +4572:2:2254 +4573:2:2248 +4574:2:2249 +4575:2:2250 +4576:2:2262 +4577:2:2267 +4578:2:2271 +4579:2:2272 +4580:2:2279 +4581:2:2280 +4582:2:2291 +4583:2:2292 +4584:2:2293 +4585:2:2291 +4586:2:2292 +4587:2:2293 +4588:2:2304 +4589:2:2309 +4590:2:2310 +4591:0:4365 +4592:3:3559 +4593:0:4365 +4594:2:2322 +4595:0:4365 +4596:2:1169 +4597:0:4365 +4598:3:3558 +4599:0:4365 +4600:2:1170 +4601:0:4365 +4602:3:3559 +4603:0:4365 +4604:3:3560 +4605:0:4365 +4606:3:3566 +4607:0:4365 +4608:3:3569 +4609:3:3570 +4610:3:3582 +4611:3:3583 +4612:3:3587 +4613:3:3588 +4614:3:3582 +4615:3:3583 +4616:3:3587 +4617:3:3588 +4618:3:3596 +4619:3:3601 +4620:3:3605 +4621:3:3606 +4622:3:3613 +4623:3:3614 +4624:3:3625 +4625:3:3626 +4626:3:3627 +4627:3:3625 +4628:3:3626 +4629:3:3627 +4630:3:3638 +4631:3:3643 +4632:3:3644 +4633:0:4365 +4634:3:3656 +4635:0:4365 +4636:3:3657 +4637:0:4365 +4638:2:1173 +4639:0:4365 +4640:3:3658 +4641:0:4365 +4642:2:1179 +4643:0:4365 +4644:2:1180 +4645:0:4365 +4646:3:3657 +4647:0:4365 +4648:2:1181 +4649:2:1185 +4650:2:1186 +4651:2:1194 +4652:2:1195 +4653:2:1199 +4654:2:1200 +4655:2:1194 +4656:2:1195 +4657:2:1199 +4658:2:1200 +4659:2:1208 +4660:2:1213 +4661:2:1217 +4662:2:1218 +4663:2:1225 +4664:2:1226 +4665:2:1237 +4666:2:1238 +4667:2:1239 +4668:2:1237 +4669:2:1238 +4670:2:1239 +4671:2:1250 +4672:2:1255 +4673:2:1256 +4674:0:4365 +4675:3:3658 +4676:0:4365 +4677:2:1268 +4678:0:4365 +4679:3:3657 +4680:0:4365 +4681:2:1270 +4682:0:4365 +4683:3:3658 +4684:0:4365 +4685:2:1271 +4686:2:1275 +4687:2:1276 +4688:2:1284 +4689:2:1285 +4690:2:1289 +4691:2:1290 +4692:2:1284 +4693:2:1285 +4694:2:1289 +4695:2:1290 +4696:2:1298 +4697:2:1303 +4698:2:1307 +4699:2:1308 +4700:2:1315 +4701:2:1316 +4702:2:1327 +4703:2:1328 +4704:2:1329 +4705:2:1327 +4706:2:1328 +4707:2:1329 +4708:2:1340 +4709:2:1345 +4710:2:1346 +4711:0:4365 +4712:2:1358 +4713:0:4365 +4714:2:1360 +4715:0:4365 +4716:3:3657 +4717:0:4365 +4718:2:1361 +4719:0:4365 +4720:3:3658 +4721:0:4365 +4722:2:1362 +4723:2:1366 +4724:2:1367 +4725:2:1375 +4726:2:1376 +4727:2:1380 +4728:2:1381 +4729:2:1375 +4730:2:1376 +4731:2:1380 +4732:2:1381 +4733:2:1389 +4734:2:1394 +4735:2:1398 +4736:2:1399 +4737:2:1406 +4738:2:1407 +4739:2:1418 +4740:2:1419 +4741:2:1420 +4742:2:1418 +4743:2:1419 +4744:2:1420 +4745:2:1431 +4746:2:1436 +4747:2:1437 +4748:0:4365 +4749:2:1449 +4750:0:4365 +4751:3:3657 +4752:0:4365 +4753:2:1451 +4754:0:4365 +4755:3:3658 +4756:0:4365 +4757:2:1652 +4758:0:4365 +4759:2:1653 +4760:0:4365 +4761:2:1657 +4762:0:4365 +4763:2:1180 +4764:0:4365 +4765:3:3657 +4766:0:4365 +4767:2:1181 +4768:2:1185 +4769:2:1186 +4770:2:1194 +4771:2:1195 +4772:2:1199 +4773:2:1200 +4774:2:1194 +4775:2:1195 +4776:2:1196 +4777:2:1208 +4778:2:1213 +4779:2:1217 +4780:2:1218 +4781:2:1225 +4782:2:1226 +4783:2:1237 +4784:2:1238 +4785:2:1239 +4786:2:1237 +4787:2:1238 +4788:2:1239 +4789:2:1250 +4790:2:1255 +4791:2:1256 +4792:0:4365 +4793:3:3658 +4794:0:4365 +4795:2:1268 +4796:0:4365 +4797:3:3657 +4798:0:4365 +4799:2:1270 +4800:0:4365 +4801:3:3658 +4802:0:4365 +4803:2:1271 +4804:2:1275 +4805:2:1276 +4806:2:1284 +4807:2:1285 +4808:2:1289 +4809:2:1290 +4810:2:1284 +4811:2:1285 +4812:2:1289 +4813:2:1290 +4814:2:1298 +4815:2:1303 +4816:2:1307 +4817:2:1308 +4818:2:1315 +4819:2:1316 +4820:2:1327 +4821:2:1328 +4822:2:1329 +4823:2:1327 +4824:2:1328 +4825:2:1329 +4826:2:1340 +4827:2:1345 +4828:2:1346 +4829:0:4365 +4830:2:1358 +4831:0:4365 +4832:2:1454 +4833:0:4365 +4834:3:3657 +4835:0:4365 +4836:2:1455 +4837:0:4365 +4838:3:3658 +4839:0:4365 +4840:2:1652 +4841:0:4365 +4842:2:1653 +4843:0:4365 +4844:2:1657 +4845:0:4365 +4846:2:1660 +4847:0:4365 +4848:3:3657 +4849:0:4365 +4850:2:1665 +4851:2:1669 +4852:2:1670 +4853:2:1678 +4854:2:1679 +4855:2:1683 +4856:2:1684 +4857:2:1678 +4858:2:1679 +4859:2:1680 +4860:2:1692 +4861:2:1697 +4862:2:1701 +4863:2:1702 +4864:2:1709 +4865:2:1710 +4866:2:1721 +4867:2:1722 +4868:2:1723 +4869:2:1721 +4870:2:1722 +4871:2:1723 +4872:2:1734 +4873:2:1739 +4874:2:1740 +4875:0:4365 +4876:3:3658 +4877:0:4365 +4878:2:1752 +4879:0:4365 +4880:3:3657 +4881:0:4365 +4882:2:1754 +4883:0:4365 +4884:3:3658 +4885:0:4365 +4886:2:1755 +4887:2:1759 +4888:2:1760 +4889:2:1768 +4890:2:1769 +4891:2:1773 +4892:2:1774 +4893:2:1768 +4894:2:1769 +4895:2:1773 +4896:2:1774 +4897:2:1782 +4898:2:1787 +4899:2:1791 +4900:2:1792 +4901:2:1799 +4902:2:1800 +4903:2:1811 +4904:2:1812 +4905:2:1813 +4906:2:1811 +4907:2:1812 +4908:2:1813 +4909:2:1824 +4910:2:1829 +4911:2:1830 +4912:0:4365 +4913:2:1842 +4914:0:4365 +4915:3:3657 +4916:0:4365 +4917:2:1844 +4918:0:4365 +4919:3:3658 +4920:0:4365 +4921:2:1845 +4922:2:1849 +4923:2:1850 +4924:2:1858 +4925:2:1859 +4926:2:1863 +4927:2:1864 +4928:2:1858 +4929:2:1859 +4930:2:1863 +4931:2:1864 +4932:2:1872 +4933:2:1877 +4934:2:1881 +4935:2:1882 +4936:2:1889 +4937:2:1890 +4938:2:1901 +4939:2:1902 +4940:2:1903 +4941:2:1901 +4942:2:1902 +4943:2:1903 +4944:2:1914 +4945:2:1919 +4946:2:1920 +4947:0:4365 +4948:2:1932 +4949:0:4365 +4950:3:3657 +4951:0:4365 +4952:2:1934 +4953:0:4365 +4954:3:3658 +4955:0:4365 +4956:2:1935 +4957:0:4365 +4958:2:1936 +4959:0:4365 +4960:2:2129 +4961:0:4365 +4962:2:2130 +4963:0:4365 +4964:2:2134 +4965:0:4365 +4966:3:3657 +4967:0:4365 +4968:2:2136 +4969:0:4365 +4970:3:3658 +4971:0:4365 +4972:2:2137 +4973:2:2141 +4974:2:2142 +4975:2:2150 +4976:2:2151 +4977:2:2155 +4978:2:2156 +4979:2:2150 +4980:2:2151 +4981:2:2155 +4982:2:2156 +4983:2:2164 +4984:2:2169 +4985:2:2173 +4986:2:2174 +4987:2:2181 +4988:2:2182 +4989:2:2193 +4990:2:2194 +4991:2:2195 +4992:2:2193 +4993:2:2194 +4994:2:2195 +4995:2:2206 +4996:2:2211 +4997:2:2212 +4998:0:4365 +4999:2:2224 +5000:0:4365 +5001:3:3657 +5002:0:4365 +5003:2:2226 +5004:0:4365 +5005:3:3658 +5006:0:4365 +5007:2:1936 +5008:0:4365 +5009:2:2129 +5010:0:4365 +5011:2:2130 +5012:0:4365 +5013:2:2134 +5014:0:4365 +5015:3:3657 +5016:0:4365 +5017:2:2136 +5018:0:4365 +5019:3:3658 +5020:0:4365 +5021:2:2137 +5022:2:2141 +5023:2:2142 +5024:2:2150 +5025:2:2151 +5026:2:2155 +5027:2:2156 +5028:2:2150 +5029:2:2151 +5030:2:2152 +5031:2:2164 +5032:2:2169 +5033:2:2173 +5034:2:2174 +5035:2:2181 +5036:2:2182 +5037:2:2193 +5038:2:2194 +5039:2:2195 +5040:2:2193 +5041:2:2194 +5042:2:2195 +5043:2:2206 +5044:2:2211 +5045:2:2212 +5046:0:4365 +5047:2:2224 +5048:0:4365 +5049:3:3657 +5050:0:4365 +5051:2:2226 +5052:0:4365 +5053:3:3658 +5054:0:4365 +5055:2:2230 +5056:0:4365 +5057:3:3657 +5058:0:4365 +5059:2:2235 +5060:2:2239 +5061:2:2240 +5062:2:2248 +5063:2:2249 +5064:2:2253 +5065:2:2254 +5066:2:2248 +5067:2:2249 +5068:2:2250 +5069:2:2262 +5070:2:2267 +5071:2:2271 +5072:2:2272 +5073:2:2279 +5074:2:2280 +5075:2:2291 +5076:2:2292 +5077:2:2293 +5078:2:2291 +5079:2:2292 +5080:2:2293 +5081:2:2304 +5082:2:2309 +5083:2:2310 +5084:0:4365 +5085:3:3658 +5086:0:4365 +5087:2:2322 +5088:0:4365 +5089:2:1169 +5090:0:4365 +5091:3:3657 +5092:0:4365 +5093:2:1170 +5094:0:4365 +5095:3:3658 +5096:0:4365 +5097:3:3659 +5098:0:4365 +5099:3:3665 +5100:0:4365 +5101:3:3666 +5102:0:4365 +5103:3:3667 +5104:0:4365 +5105:3:3668 +5106:0:4365 +5107:3:3669 +5108:3:3673 +5109:3:3674 +5110:3:3682 +5111:3:3683 +5112:3:3687 +5113:3:3688 +5114:3:3682 +5115:3:3683 +5116:3:3687 +5117:3:3688 +5118:3:3696 +5119:3:3701 +5120:3:3705 +5121:3:3706 +5122:3:3713 +5123:3:3714 +5124:3:3725 +5125:3:3726 +5126:3:3727 +5127:3:3725 +5128:3:3726 +5129:3:3727 +5130:3:3738 +5131:3:3743 +5132:3:3744 +5133:0:4365 +5134:3:3756 +5135:0:4365 +5136:3:3757 +5137:0:4365 +5138:2:1173 +5139:0:4365 +5140:3:3758 +5141:0:4365 +5142:2:1179 +5143:0:4365 +5144:2:1180 +5145:0:4365 +5146:3:3757 +5147:0:4365 +5148:2:1181 +5149:2:1185 +5150:2:1186 +5151:2:1194 +5152:2:1195 +5153:2:1199 +5154:2:1200 +5155:2:1194 +5156:2:1195 +5157:2:1199 +5158:2:1200 +5159:2:1208 +5160:2:1213 +5161:2:1217 +5162:2:1218 +5163:2:1225 +5164:2:1226 +5165:2:1237 +5166:2:1238 +5167:2:1239 +5168:2:1237 +5169:2:1238 +5170:2:1239 +5171:2:1250 +5172:2:1255 +5173:2:1256 +5174:0:4365 +5175:3:3758 +5176:0:4365 +5177:2:1268 +5178:0:4365 +5179:3:3757 +5180:0:4365 +5181:2:1270 +5182:0:4365 +5183:3:3758 +5184:0:4365 +5185:2:1271 +5186:2:1275 +5187:2:1276 +5188:2:1284 +5189:2:1285 +5190:2:1289 +5191:2:1290 +5192:2:1284 +5193:2:1285 +5194:2:1289 +5195:2:1290 +5196:2:1298 +5197:2:1303 +5198:2:1307 +5199:2:1308 +5200:2:1315 +5201:2:1316 +5202:2:1327 +5203:2:1328 +5204:2:1329 +5205:2:1327 +5206:2:1328 +5207:2:1329 +5208:2:1340 +5209:2:1345 +5210:2:1346 +5211:0:4365 +5212:2:1358 +5213:0:4365 +5214:2:1360 +5215:0:4365 +5216:3:3757 +5217:0:4365 +5218:2:1361 +5219:0:4365 +5220:3:3758 +5221:0:4365 +5222:2:1362 +5223:2:1366 +5224:2:1367 +5225:2:1375 +5226:2:1376 +5227:2:1380 +5228:2:1381 +5229:2:1375 +5230:2:1376 +5231:2:1380 +5232:2:1381 +5233:2:1389 +5234:2:1394 +5235:2:1398 +5236:2:1399 +5237:2:1406 +5238:2:1407 +5239:2:1418 +5240:2:1419 +5241:2:1420 +5242:2:1418 +5243:2:1419 +5244:2:1420 +5245:2:1431 +5246:2:1436 +5247:2:1437 +5248:0:4365 +5249:2:1449 +5250:0:4365 +5251:3:3757 +5252:0:4365 +5253:2:1451 +5254:0:4365 +5255:3:3758 +5256:0:4365 +5257:2:1652 +5258:0:4365 +5259:2:1653 +5260:0:4365 +5261:2:1657 +5262:0:4365 +5263:2:1180 +5264:0:4365 +5265:3:3757 +5266:0:4365 +5267:2:1181 +5268:2:1185 +5269:2:1186 +5270:2:1194 +5271:2:1195 +5272:2:1199 +5273:2:1200 +5274:2:1194 +5275:2:1195 +5276:2:1196 +5277:2:1208 +5278:2:1213 +5279:2:1217 +5280:2:1218 +5281:2:1225 +5282:2:1226 +5283:2:1237 +5284:2:1238 +5285:2:1239 +5286:2:1237 +5287:2:1238 +5288:2:1239 +5289:2:1250 +5290:2:1255 +5291:2:1256 +5292:0:4365 +5293:3:3758 +5294:0:4365 +5295:2:1268 +5296:0:4365 +5297:3:3757 +5298:0:4365 +5299:2:1270 +5300:0:4365 +5301:3:3758 +5302:0:4365 +5303:2:1271 +5304:2:1275 +5305:2:1276 +5306:2:1284 +5307:2:1285 +5308:2:1289 +5309:2:1290 +5310:2:1284 +5311:2:1285 +5312:2:1289 +5313:2:1290 +5314:2:1298 +5315:2:1303 +5316:2:1307 +5317:2:1308 +5318:2:1315 +5319:2:1316 +5320:2:1327 +5321:2:1328 +5322:2:1329 +5323:2:1327 +5324:2:1328 +5325:2:1329 +5326:2:1340 +5327:2:1345 +5328:2:1346 +5329:0:4365 +5330:2:1358 +5331:0:4365 +5332:2:1454 +5333:0:4365 +5334:3:3757 +5335:0:4365 +5336:2:1455 +5337:0:4365 +5338:3:3758 +5339:0:4365 +5340:2:1652 +5341:0:4365 +5342:2:1653 +5343:0:4365 +5344:2:1657 +5345:0:4365 +5346:2:1660 +5347:0:4365 +5348:3:3757 +5349:0:4365 +5350:2:1665 +5351:2:1669 +5352:2:1670 +5353:2:1678 +5354:2:1679 +5355:2:1683 +5356:2:1684 +5357:2:1678 +5358:2:1679 +5359:2:1680 +5360:2:1692 +5361:2:1697 +5362:2:1701 +5363:2:1702 +5364:2:1709 +5365:2:1710 +5366:2:1721 +5367:2:1722 +5368:2:1723 +5369:2:1721 +5370:2:1722 +5371:2:1723 +5372:2:1734 +5373:2:1739 +5374:2:1740 +5375:0:4365 +5376:3:3758 +5377:0:4365 +5378:2:1752 +5379:0:4365 +5380:3:3757 +5381:0:4365 +5382:2:1754 +5383:0:4365 +5384:3:3758 +5385:0:4365 +5386:2:1755 +5387:2:1759 +5388:2:1760 +5389:2:1768 +5390:2:1769 +5391:2:1773 +5392:2:1774 +5393:2:1768 +5394:2:1769 +5395:2:1773 +5396:2:1774 +5397:2:1782 +5398:2:1787 +5399:2:1791 +5400:2:1792 +5401:2:1799 +5402:2:1800 +5403:2:1811 +5404:2:1812 +5405:2:1813 +5406:2:1811 +5407:2:1812 +5408:2:1813 +5409:2:1824 +5410:2:1829 +5411:2:1830 +5412:0:4365 +5413:2:1842 +5414:0:4365 +5415:3:3757 +5416:0:4365 +5417:2:1844 +5418:0:4365 +5419:3:3758 +5420:0:4365 +5421:2:1845 +5422:2:1849 +5423:2:1850 +5424:2:1858 +5425:2:1859 +5426:2:1863 +5427:2:1864 +5428:2:1858 +5429:2:1859 +5430:2:1863 +5431:2:1864 +5432:2:1872 +5433:2:1877 +5434:2:1881 +5435:2:1882 +5436:2:1889 +5437:2:1890 +5438:2:1901 +5439:2:1902 +5440:2:1903 +5441:2:1901 +5442:2:1902 +5443:2:1903 +5444:2:1914 +5445:2:1919 +5446:2:1920 +5447:0:4365 +5448:2:1932 +5449:0:4365 +5450:3:3757 +5451:0:4365 +5452:2:1934 +5453:0:4365 +5454:3:3758 +5455:0:4365 +5456:2:1935 +5457:0:4365 +5458:2:1936 +5459:0:4365 +5460:2:2129 +5461:0:4365 +5462:2:2130 +5463:0:4365 +5464:2:2134 +5465:0:4365 +5466:3:3757 +5467:0:4365 +5468:2:2136 +5469:0:4365 +5470:3:3758 +5471:0:4365 +5472:2:2137 +5473:2:2141 +5474:2:2142 +5475:2:2150 +5476:2:2151 +5477:2:2155 +5478:2:2156 +5479:2:2150 +5480:2:2151 +5481:2:2155 +5482:2:2156 +5483:2:2164 +5484:2:2169 +5485:2:2173 +5486:2:2174 +5487:2:2181 +5488:2:2182 +5489:2:2193 +5490:2:2194 +5491:2:2195 +5492:2:2193 +5493:2:2194 +5494:2:2195 +5495:2:2206 +5496:2:2211 +5497:2:2212 +5498:0:4365 +5499:2:2224 +5500:0:4365 +5501:3:3757 +5502:0:4365 +5503:2:2226 +5504:0:4365 +5505:3:3758 +5506:0:4365 +5507:2:1936 +5508:0:4365 +5509:2:2129 +5510:0:4365 +5511:2:2130 +5512:0:4365 +5513:2:2134 +5514:0:4365 +5515:3:3757 +5516:0:4365 +5517:2:2136 +5518:0:4365 +5519:3:3758 +5520:0:4365 +5521:2:2137 +5522:2:2141 +5523:2:2142 +5524:2:2150 +5525:2:2151 +5526:2:2155 +5527:2:2156 +5528:2:2150 +5529:2:2151 +5530:2:2152 +5531:2:2164 +5532:2:2169 +5533:2:2173 +5534:2:2174 +5535:2:2181 +5536:2:2182 +5537:2:2193 +5538:2:2194 +5539:2:2195 +5540:2:2193 +5541:2:2194 +5542:2:2195 +5543:2:2206 +5544:2:2211 +5545:2:2212 +5546:0:4365 +5547:2:2224 +5548:0:4365 +5549:3:3757 +5550:0:4365 +5551:2:2226 +5552:0:4365 +5553:3:3758 +5554:0:4365 +5555:2:2230 +5556:0:4365 +5557:3:3757 +5558:0:4365 +5559:2:2235 +5560:2:2239 +5561:2:2240 +5562:2:2248 +5563:2:2249 +5564:2:2253 +5565:2:2254 +5566:2:2248 +5567:2:2249 +5568:2:2250 +5569:2:2262 +5570:2:2267 +5571:2:2271 +5572:2:2272 +5573:2:2279 +5574:2:2280 +5575:2:2291 +5576:2:2292 +5577:2:2293 +5578:2:2291 +5579:2:2292 +5580:2:2293 +5581:2:2304 +5582:2:2309 +5583:2:2310 +5584:0:4365 +5585:3:3758 +5586:0:4365 +5587:2:2322 +5588:0:4365 +5589:2:1169 +5590:0:4365 +5591:3:3757 +5592:0:4365 +5593:2:1170 +5594:0:4365 +5595:3:3758 +5596:0:4365 +5597:3:3759 +5598:0:4365 +5599:3:3972 +5600:0:4365 +5601:3:3980 +5602:0:4365 +5603:3:3981 +5604:3:3985 +5605:3:3986 +5606:3:3994 +5607:3:3995 +5608:3:3999 +5609:3:4000 +5610:3:3994 +5611:3:3995 +5612:3:3999 +5613:3:4000 +5614:3:4008 +5615:3:4013 +5616:3:4017 +5617:3:4018 +5618:3:4025 +5619:3:4026 +5620:3:4037 +5621:3:4038 +5622:3:4039 +5623:3:4037 +5624:3:4038 +5625:3:4039 +5626:3:4050 +5627:3:4055 +5628:3:4056 +5629:0:4365 +5630:3:4068 +5631:0:4365 +5632:3:4069 +5633:0:4365 +5634:2:1173 +5635:0:4365 +5636:3:4070 +5637:0:4365 +5638:2:1179 +5639:0:4365 +5640:2:1180 +5641:0:4365 +5642:3:4069 +5643:0:4365 +5644:2:1181 +5645:2:1185 +5646:2:1186 +5647:2:1194 +5648:2:1195 +5649:2:1199 +5650:2:1200 +5651:2:1194 +5652:2:1195 +5653:2:1199 +5654:2:1200 +5655:2:1208 +5656:2:1213 +5657:2:1217 +5658:2:1218 +5659:2:1225 +5660:2:1226 +5661:2:1237 +5662:2:1238 +5663:2:1239 +5664:2:1237 +5665:2:1238 +5666:2:1239 +5667:2:1250 +5668:2:1255 +5669:2:1256 +5670:0:4365 +5671:3:4070 +5672:0:4365 +5673:2:1268 +5674:0:4365 +5675:3:4069 +5676:0:4365 +5677:2:1270 +5678:0:4365 +5679:3:4070 +5680:0:4365 +5681:2:1271 +5682:2:1275 +5683:2:1276 +5684:2:1284 +5685:2:1285 +5686:2:1289 +5687:2:1290 +5688:2:1284 +5689:2:1285 +5690:2:1289 +5691:2:1290 +5692:2:1298 +5693:2:1303 +5694:2:1307 +5695:2:1308 +5696:2:1315 +5697:2:1316 +5698:2:1327 +5699:2:1328 +5700:2:1329 +5701:2:1327 +5702:2:1328 +5703:2:1329 +5704:2:1340 +5705:2:1345 +5706:2:1346 +5707:0:4365 +5708:2:1358 +5709:0:4365 +5710:2:1360 +5711:0:4365 +5712:3:4069 +5713:0:4365 +5714:2:1361 +5715:0:4365 +5716:3:4070 +5717:0:4365 +5718:2:1362 +5719:2:1366 +5720:2:1367 +5721:2:1375 +5722:2:1376 +5723:2:1380 +5724:2:1381 +5725:2:1375 +5726:2:1376 +5727:2:1380 +5728:2:1381 +5729:2:1389 +5730:2:1394 +5731:2:1398 +5732:2:1399 +5733:2:1406 +5734:2:1407 +5735:2:1418 +5736:2:1419 +5737:2:1420 +5738:2:1418 +5739:2:1419 +5740:2:1420 +5741:2:1431 +5742:2:1436 +5743:2:1437 +5744:0:4365 +5745:2:1449 +5746:0:4365 +5747:3:4069 +5748:0:4365 +5749:2:1451 +5750:0:4365 +5751:3:4070 +5752:0:4365 +5753:2:1652 +5754:0:4365 +5755:2:1653 +5756:0:4365 +5757:2:1657 +5758:0:4365 +5759:2:1180 +5760:0:4365 +5761:3:4069 +5762:0:4365 +5763:2:1181 +5764:2:1185 +5765:2:1186 +5766:2:1194 +5767:2:1195 +5768:2:1199 +5769:2:1200 +5770:2:1194 +5771:2:1195 +5772:2:1196 +5773:2:1208 +5774:2:1213 +5775:2:1217 +5776:2:1218 +5777:2:1225 +5778:2:1226 +5779:2:1237 +5780:2:1238 +5781:2:1239 +5782:2:1237 +5783:2:1238 +5784:2:1239 +5785:2:1250 +5786:2:1255 +5787:2:1256 +5788:0:4365 +5789:3:4070 +5790:0:4365 +5791:2:1268 +5792:0:4365 +5793:3:4069 +5794:0:4365 +5795:2:1270 +5796:0:4365 +5797:3:4070 +5798:0:4365 +5799:2:1271 +5800:2:1275 +5801:2:1276 +5802:2:1284 +5803:2:1285 +5804:2:1289 +5805:2:1290 +5806:2:1284 +5807:2:1285 +5808:2:1289 +5809:2:1290 +5810:2:1298 +5811:2:1303 +5812:2:1307 +5813:2:1308 +5814:2:1315 +5815:2:1316 +5816:2:1327 +5817:2:1328 +5818:2:1329 +5819:2:1327 +5820:2:1328 +5821:2:1329 +5822:2:1340 +5823:2:1345 +5824:2:1346 +5825:0:4365 +5826:2:1358 +5827:0:4365 +5828:2:1454 +5829:0:4365 +5830:3:4069 +5831:0:4365 +5832:2:1455 +5833:0:4365 +5834:3:4070 +5835:0:4365 +5836:2:1652 +5837:0:4365 +5838:2:1653 +5839:0:4365 +5840:2:1657 +5841:0:4365 +5842:2:1660 +5843:0:4365 +5844:3:4069 +5845:0:4365 +5846:2:1665 +5847:2:1669 +5848:2:1670 +5849:2:1678 +5850:2:1679 +5851:2:1683 +5852:2:1684 +5853:2:1678 +5854:2:1679 +5855:2:1680 +5856:2:1692 +5857:2:1697 +5858:2:1701 +5859:2:1702 +5860:2:1709 +5861:2:1710 +5862:2:1721 +5863:2:1722 +5864:2:1723 +5865:2:1721 +5866:2:1722 +5867:2:1723 +5868:2:1734 +5869:2:1739 +5870:2:1740 +5871:0:4365 +5872:3:4070 +5873:0:4365 +5874:2:1752 +5875:0:4365 +5876:3:4069 +5877:0:4365 +5878:2:1754 +5879:0:4365 +5880:3:4070 +5881:0:4365 +5882:2:1755 +5883:2:1759 +5884:2:1760 +5885:2:1768 +5886:2:1769 +5887:2:1773 +5888:2:1774 +5889:2:1768 +5890:2:1769 +5891:2:1773 +5892:2:1774 +5893:2:1782 +5894:2:1787 +5895:2:1791 +5896:2:1792 +5897:2:1799 +5898:2:1800 +5899:2:1811 +5900:2:1812 +5901:2:1813 +5902:2:1811 +5903:2:1812 +5904:2:1813 +5905:2:1824 +5906:2:1829 +5907:2:1830 +5908:0:4365 +5909:2:1842 +5910:0:4365 +5911:3:4069 +5912:0:4365 +5913:2:1844 +5914:0:4365 +5915:3:4070 +5916:0:4365 +5917:2:1845 +5918:2:1849 +5919:2:1850 +5920:2:1858 +5921:2:1859 +5922:2:1863 +5923:2:1864 +5924:2:1858 +5925:2:1859 +5926:2:1863 +5927:2:1864 +5928:2:1872 +5929:2:1877 +5930:2:1881 +5931:2:1882 +5932:2:1889 +5933:2:1890 +5934:2:1901 +5935:2:1902 +5936:2:1903 +5937:2:1901 +5938:2:1902 +5939:2:1903 +5940:2:1914 +5941:2:1919 +5942:2:1920 +5943:0:4365 +5944:2:1932 +5945:0:4365 +5946:3:4069 +5947:0:4365 +5948:2:1934 +5949:0:4365 +5950:3:4070 +5951:0:4365 +5952:2:1935 +5953:0:4365 +5954:2:1936 +5955:0:4365 +5956:2:2129 +5957:0:4365 +5958:2:2130 +5959:0:4365 +5960:2:2134 +5961:0:4365 +5962:3:4069 +5963:0:4365 +5964:2:2136 +5965:0:4365 +5966:3:4070 +5967:0:4365 +5968:2:2137 +5969:2:2141 +5970:2:2142 +5971:2:2150 +5972:2:2151 +5973:2:2155 +5974:2:2156 +5975:2:2150 +5976:2:2151 +5977:2:2155 +5978:2:2156 +5979:2:2164 +5980:2:2169 +5981:2:2173 +5982:2:2174 +5983:2:2181 +5984:2:2182 +5985:2:2193 +5986:2:2194 +5987:2:2195 +5988:2:2193 +5989:2:2194 +5990:2:2195 +5991:2:2206 +5992:2:2211 +5993:2:2212 +5994:0:4365 +5995:2:2224 +5996:0:4365 +5997:3:4069 +5998:0:4365 +5999:2:2226 +6000:0:4365 +6001:3:4070 +6002:0:4365 +6003:2:1936 +6004:0:4365 +6005:2:2129 +6006:0:4365 +6007:2:2130 +6008:0:4365 +6009:2:2134 +6010:0:4365 +6011:3:4069 +6012:0:4365 +6013:2:2136 +6014:0:4365 +6015:3:4070 +6016:0:4365 +6017:2:2137 +6018:2:2141 +6019:2:2142 +6020:2:2150 +6021:2:2151 +6022:2:2155 +6023:2:2156 +6024:2:2150 +6025:2:2151 +6026:2:2152 +6027:2:2164 +6028:2:2169 +6029:2:2173 +6030:2:2174 +6031:2:2181 +6032:2:2182 +6033:2:2193 +6034:2:2194 +6035:2:2195 +6036:2:2193 +6037:2:2194 +6038:2:2195 +6039:2:2206 +6040:2:2211 +6041:2:2212 +6042:0:4365 +6043:2:2224 +6044:0:4365 +6045:3:4069 +6046:0:4365 +6047:2:2226 +6048:0:4365 +6049:3:4070 +6050:0:4365 +6051:2:2230 +6052:0:4365 +6053:3:4069 +6054:0:4365 +6055:2:2235 +6056:2:2239 +6057:2:2240 +6058:2:2248 +6059:2:2249 +6060:2:2253 +6061:2:2254 +6062:2:2248 +6063:2:2249 +6064:2:2250 +6065:2:2262 +6066:2:2267 +6067:2:2271 +6068:2:2272 +6069:2:2279 +6070:2:2280 +6071:2:2291 +6072:2:2292 +6073:2:2293 +6074:2:2291 +6075:2:2292 +6076:2:2293 +6077:2:2304 +6078:2:2309 +6079:2:2310 +6080:0:4365 +6081:3:4070 +6082:0:4365 +6083:2:2322 +6084:0:4365 +6085:2:1169 +6086:0:4365 +6087:3:4069 +6088:0:4365 +6089:2:1170 +6090:0:4365 +6091:3:4070 +6092:0:4365 +6093:3:4071 +6094:0:4365 +6095:3:4081 +6096:0:4365 +6097:3:3666 +6098:0:4365 +6099:3:3667 +6100:0:4365 +6101:3:3668 +6102:0:4365 +6103:3:3669 +6104:3:3673 +6105:3:3674 +6106:3:3682 +6107:3:3683 +6108:3:3687 +6109:3:3688 +6110:3:3682 +6111:3:3683 +6112:3:3687 +6113:3:3688 +6114:3:3696 +6115:3:3701 +6116:3:3705 +6117:3:3706 +6118:3:3713 +6119:3:3714 +6120:3:3725 +6121:3:3726 +6122:3:3727 +6123:3:3725 +6124:3:3726 +6125:3:3727 +6126:3:3738 +6127:3:3743 +6128:3:3744 +6129:0:4365 +6130:3:3756 +6131:0:4365 +6132:3:3757 +6133:0:4365 +6134:2:1173 +6135:0:4365 +6136:3:3758 +6137:0:4365 +6138:2:1179 +6139:0:4365 +6140:2:1180 +6141:0:4365 +6142:3:3757 +6143:0:4365 +6144:2:1181 +6145:2:1185 +6146:2:1186 +6147:2:1194 +6148:2:1195 +6149:2:1199 +6150:2:1200 +6151:2:1194 +6152:2:1195 +6153:2:1199 +6154:2:1200 +6155:2:1208 +6156:2:1213 +6157:2:1217 +6158:2:1218 +6159:2:1225 +6160:2:1226 +6161:2:1237 +6162:2:1238 +6163:2:1239 +6164:2:1237 +6165:2:1238 +6166:2:1239 +6167:2:1250 +6168:2:1255 +6169:2:1256 +6170:0:4365 +6171:3:3758 +6172:0:4365 +6173:2:1268 +6174:0:4365 +6175:3:3757 +6176:0:4365 +6177:2:1270 +6178:0:4365 +6179:3:3758 +6180:0:4365 +6181:2:1271 +6182:2:1275 +6183:2:1276 +6184:2:1284 +6185:2:1285 +6186:2:1289 +6187:2:1290 +6188:2:1284 +6189:2:1285 +6190:2:1289 +6191:2:1290 +6192:2:1298 +6193:2:1303 +6194:2:1307 +6195:2:1308 +6196:2:1315 +6197:2:1316 +6198:2:1327 +6199:2:1328 +6200:2:1329 +6201:2:1327 +6202:2:1328 +6203:2:1329 +6204:2:1340 +6205:2:1345 +6206:2:1346 +6207:0:4365 +6208:2:1358 +6209:0:4365 +6210:2:1360 +6211:0:4365 +6212:3:3757 +6213:0:4365 +6214:2:1361 +6215:0:4365 +6216:3:3758 +6217:0:4365 +6218:2:1362 +6219:2:1366 +6220:2:1367 +6221:2:1375 +6222:2:1376 +6223:2:1380 +6224:2:1381 +6225:2:1375 +6226:2:1376 +6227:2:1380 +6228:2:1381 +6229:2:1389 +6230:2:1394 +6231:2:1398 +6232:2:1399 +6233:2:1406 +6234:2:1407 +6235:2:1418 +6236:2:1419 +6237:2:1420 +6238:2:1418 +6239:2:1419 +6240:2:1420 +6241:2:1431 +6242:2:1436 +6243:2:1437 +6244:0:4365 +6245:2:1449 +6246:0:4365 +6247:3:3757 +6248:0:4365 +6249:2:1451 +6250:0:4365 +6251:3:3758 +6252:0:4365 +6253:2:1652 +6254:0:4365 +6255:2:1653 +6256:0:4365 +6257:2:1657 +6258:0:4365 +6259:2:1180 +6260:0:4365 +6261:3:3757 +6262:0:4365 +6263:2:1181 +6264:2:1185 +6265:2:1186 +6266:2:1194 +6267:2:1195 +6268:2:1199 +6269:2:1200 +6270:2:1194 +6271:2:1195 +6272:2:1196 +6273:2:1208 +6274:2:1213 +6275:2:1217 +6276:2:1218 +6277:2:1225 +6278:2:1226 +6279:2:1237 +6280:2:1238 +6281:2:1239 +6282:2:1237 +6283:2:1238 +6284:2:1239 +6285:2:1250 +6286:2:1255 +6287:2:1256 +6288:0:4365 +6289:3:3758 +6290:0:4365 +6291:2:1268 +6292:0:4365 +6293:3:3757 +6294:0:4365 +6295:2:1270 +6296:0:4365 +6297:3:3758 +6298:0:4365 +6299:2:1271 +6300:2:1275 +6301:2:1276 +6302:2:1284 +6303:2:1285 +6304:2:1289 +6305:2:1290 +6306:2:1284 +6307:2:1285 +6308:2:1289 +6309:2:1290 +6310:2:1298 +6311:2:1303 +6312:2:1307 +6313:2:1308 +6314:2:1315 +6315:2:1316 +6316:2:1327 +6317:2:1328 +6318:2:1329 +6319:2:1327 +6320:2:1328 +6321:2:1329 +6322:2:1340 +6323:2:1345 +6324:2:1346 +6325:0:4365 +6326:2:1358 +6327:0:4365 +6328:2:1454 +6329:0:4365 +6330:3:3757 +6331:0:4365 +6332:2:1455 +6333:0:4365 +6334:3:3758 +6335:0:4365 +6336:2:1652 +6337:0:4365 +6338:2:1653 +6339:0:4365 +6340:2:1657 +6341:0:4365 +6342:2:1660 +6343:0:4365 +6344:3:3757 +6345:0:4365 +6346:2:1665 +6347:2:1669 +6348:2:1670 +6349:2:1678 +6350:2:1679 +6351:2:1683 +6352:2:1684 +6353:2:1678 +6354:2:1679 +6355:2:1680 +6356:2:1692 +6357:2:1697 +6358:2:1701 +6359:2:1702 +6360:2:1709 +6361:2:1710 +6362:2:1721 +6363:2:1722 +6364:2:1723 +6365:2:1721 +6366:2:1722 +6367:2:1723 +6368:2:1734 +6369:2:1739 +6370:2:1740 +6371:0:4365 +6372:3:3758 +6373:0:4365 +6374:2:1752 +6375:0:4365 +6376:3:3757 +6377:0:4365 +6378:2:1754 +6379:0:4365 +6380:3:3758 +6381:0:4365 +6382:2:1755 +6383:2:1759 +6384:2:1760 +6385:2:1768 +6386:2:1769 +6387:2:1773 +6388:2:1774 +6389:2:1768 +6390:2:1769 +6391:2:1773 +6392:2:1774 +6393:2:1782 +6394:2:1787 +6395:2:1791 +6396:2:1792 +6397:2:1799 +6398:2:1800 +6399:2:1811 +6400:2:1812 +6401:2:1813 +6402:2:1811 +6403:2:1812 +6404:2:1813 +6405:2:1824 +6406:2:1829 +6407:2:1830 +6408:0:4365 +6409:2:1842 +6410:0:4365 +6411:3:3757 +6412:0:4365 +6413:2:1844 +6414:0:4365 +6415:3:3758 +6416:0:4365 +6417:2:1845 +6418:2:1849 +6419:2:1850 +6420:2:1858 +6421:2:1859 +6422:2:1863 +6423:2:1864 +6424:2:1858 +6425:2:1859 +6426:2:1863 +6427:2:1864 +6428:2:1872 +6429:2:1877 +6430:2:1881 +6431:2:1882 +6432:2:1889 +6433:2:1890 +6434:2:1901 +6435:2:1902 +6436:2:1903 +6437:2:1901 +6438:2:1902 +6439:2:1903 +6440:2:1914 +6441:2:1919 +6442:2:1920 +6443:0:4365 +6444:2:1932 +6445:0:4365 +6446:3:3757 +6447:0:4365 +6448:2:1934 +6449:0:4365 +6450:3:3758 +6451:0:4365 +6452:2:1935 +6453:0:4365 +6454:2:1936 +6455:0:4365 +6456:2:2129 +6457:0:4365 +6458:2:2130 +6459:0:4365 +6460:2:2134 +6461:0:4365 +6462:3:3757 +6463:0:4365 +6464:2:2136 +6465:0:4365 +6466:3:3758 +6467:0:4365 +6468:2:2137 +6469:2:2141 +6470:2:2142 +6471:2:2150 +6472:2:2151 +6473:2:2155 +6474:2:2156 +6475:2:2150 +6476:2:2151 +6477:2:2155 +6478:2:2156 +6479:2:2164 +6480:2:2169 +6481:2:2173 +6482:2:2174 +6483:2:2181 +6484:2:2182 +6485:2:2193 +6486:2:2194 +6487:2:2195 +6488:2:2193 +6489:2:2194 +6490:2:2195 +6491:2:2206 +6492:2:2211 +6493:2:2212 +6494:0:4365 +6495:2:2224 +6496:0:4365 +6497:3:3757 +6498:0:4365 +6499:2:2226 +6500:0:4365 +6501:3:3758 +6502:0:4365 +6503:2:1936 +6504:0:4365 +6505:2:2129 +6506:0:4365 +6507:2:2130 +6508:0:4365 +6509:2:2134 +6510:0:4365 +6511:3:3757 +6512:0:4365 +6513:2:2136 +6514:0:4365 +6515:3:3758 +6516:0:4365 +6517:2:2137 +6518:2:2141 +6519:2:2142 +6520:2:2150 +6521:2:2151 +6522:2:2155 +6523:2:2156 +6524:2:2150 +6525:2:2151 +6526:2:2152 +6527:2:2164 +6528:2:2169 +6529:2:2173 +6530:2:2174 +6531:2:2181 +6532:2:2182 +6533:2:2193 +6534:2:2194 +6535:2:2195 +6536:2:2193 +6537:2:2194 +6538:2:2195 +6539:2:2206 +6540:2:2211 +6541:2:2212 +6542:0:4365 +6543:2:2224 +6544:0:4365 +6545:3:3757 +6546:0:4365 +6547:2:2226 +6548:0:4365 +6549:3:3758 +6550:0:4365 +6551:2:2230 +6552:0:4365 +6553:3:3757 +6554:0:4365 +6555:2:2235 +6556:2:2239 +6557:2:2240 +6558:2:2248 +6559:2:2249 +6560:2:2253 +6561:2:2254 +6562:2:2248 +6563:2:2249 +6564:2:2250 +6565:2:2262 +6566:2:2267 +6567:2:2271 +6568:2:2272 +6569:2:2279 +6570:2:2280 +6571:2:2291 +6572:2:2292 +6573:2:2293 +6574:2:2291 +6575:2:2292 +6576:2:2293 +6577:2:2304 +6578:2:2309 +6579:2:2310 +6580:0:4365 +6581:3:3758 +6582:0:4365 +6583:2:2322 +6584:0:4365 +6585:2:1169 +6586:0:4365 +6587:3:3757 +6588:0:4365 +6589:2:1170 +6590:0:4365 +6591:3:3758 +6592:0:4365 +6593:3:3759 +6594:0:4365 +6595:3:3972 +6596:0:4365 +6597:3:4077 +6598:0:4365 +6599:3:4078 +6600:0:4365 +6601:3:4082 +6602:0:4365 +6603:3:4088 +6604:0:4365 +6605:3:4092 +6606:3:4093 +6607:3:4097 +6608:3:4101 +6609:3:4102 +6610:3:4097 +6611:3:4101 +6612:3:4102 +6613:3:4106 +6614:3:4114 +6615:3:4115 +6616:3:4120 +6617:3:4127 +6618:3:4128 +6619:3:4127 +6620:3:4128 +6621:3:4135 +6622:3:4140 +6623:0:4365 +6624:3:4151 +6625:0:4365 +6626:3:4155 +6627:3:4156 +6628:3:4160 +6629:3:4164 +6630:3:4165 +6631:3:4160 +6632:3:4164 +6633:3:4165 +6634:3:4169 +6635:3:4177 +6636:3:4178 +6637:3:4183 +6638:3:4190 +6639:3:4191 +6640:3:4190 +6641:3:4191 +6642:3:4198 +6643:3:4203 +6644:0:4365 +6645:3:4151 +6646:0:4365 +6647:3:4155 +6648:3:4156 +6649:3:4160 +6650:3:4164 +6651:3:4165 +6652:3:4160 +6653:3:4164 +6654:3:4165 +6655:3:4169 +6656:3:4177 +6657:3:4178 +6658:3:4183 +6659:3:4190 +6660:3:4191 +6661:3:4190 +6662:3:4191 +6663:3:4198 +6664:3:4203 +6665:0:4365 +6666:3:4214 +6667:0:4365 +6668:3:4222 +6669:3:4223 +6670:3:4227 +6671:3:4231 +6672:3:4232 +6673:3:4227 +6674:3:4231 +6675:3:4232 +6676:3:4236 +6677:3:4244 +6678:3:4245 +6679:3:4250 +6680:3:4257 +6681:3:4258 +6682:3:4257 +6683:3:4258 +6684:3:4265 +6685:3:4270 +6686:0:4365 +6687:3:4285 +6688:0:4365 +6689:3:4286 +6690:0:4365 +6691:2:1173 +6692:0:4365 +6693:3:4287 +6694:0:4365 +6695:2:1179 +6696:0:4365 +6697:2:1180 +6698:0:4365 +6699:3:4286 +6700:0:4365 +6701:2:1181 +6702:2:1185 +6703:2:1186 +6704:2:1194 +6705:2:1195 +6706:2:1199 +6707:2:1200 +6708:2:1194 +6709:2:1195 +6710:2:1199 +6711:2:1200 +6712:2:1208 +6713:2:1213 +6714:2:1217 +6715:2:1218 +6716:2:1225 +6717:2:1226 +6718:2:1237 +6719:2:1238 +6720:2:1239 +6721:2:1237 +6722:2:1238 +6723:2:1239 +6724:2:1250 +6725:2:1255 +6726:2:1256 +6727:0:4365 +6728:3:4287 +6729:0:4365 +6730:2:1268 +6731:0:4365 +6732:3:4286 +6733:0:4365 +6734:2:1270 +6735:0:4365 +6736:3:4287 +6737:0:4365 +6738:2:1271 +6739:2:1275 +6740:2:1276 +6741:2:1284 +6742:2:1285 +6743:2:1289 +6744:2:1290 +6745:2:1284 +6746:2:1285 +6747:2:1289 +6748:2:1290 +6749:2:1298 +6750:2:1303 +6751:2:1307 +6752:2:1308 +6753:2:1315 +6754:2:1316 +6755:2:1327 +6756:2:1328 +6757:2:1329 +6758:2:1327 +6759:2:1328 +6760:2:1329 +6761:2:1340 +6762:2:1345 +6763:2:1346 +6764:0:4365 +6765:2:1358 +6766:0:4365 +6767:2:1360 +6768:0:4365 +6769:3:4286 +6770:0:4365 +6771:2:1361 +6772:0:4365 +6773:3:4287 +6774:0:4365 +6775:2:1362 +6776:2:1366 +6777:2:1367 +6778:2:1375 +6779:2:1376 +6780:2:1380 +6781:2:1381 +6782:2:1375 +6783:2:1376 +6784:2:1380 +6785:2:1381 +6786:2:1389 +6787:2:1394 +6788:2:1398 +6789:2:1399 +6790:2:1406 +6791:2:1407 +6792:2:1418 +6793:2:1419 +6794:2:1420 +6795:2:1418 +6796:2:1419 +6797:2:1420 +6798:2:1431 +6799:2:1436 +6800:2:1437 +6801:0:4365 +6802:2:1449 +6803:0:4365 +6804:3:4286 +6805:0:4365 +6806:2:1451 +6807:0:4365 +6808:3:4287 +6809:0:4365 +6810:2:1652 +6811:0:4365 +6812:2:1653 +6813:0:4365 +6814:2:1657 +6815:0:4365 +6816:2:1180 +6817:0:4365 +6818:3:4286 +6819:0:4365 +6820:2:1181 +6821:2:1185 +6822:2:1186 +6823:2:1194 +6824:2:1195 +6825:2:1199 +6826:2:1200 +6827:2:1194 +6828:2:1195 +6829:2:1196 +6830:2:1208 +6831:2:1213 +6832:2:1217 +6833:2:1218 +6834:2:1225 +6835:2:1226 +6836:2:1237 +6837:2:1238 +6838:2:1239 +6839:2:1237 +6840:2:1238 +6841:2:1239 +6842:2:1250 +6843:2:1255 +6844:2:1256 +6845:0:4365 +6846:3:4287 +6847:0:4365 +6848:2:1268 +6849:0:4365 +6850:3:4286 +6851:0:4365 +6852:2:1270 +6853:0:4365 +6854:3:4287 +6855:0:4365 +6856:2:1271 +6857:2:1275 +6858:2:1276 +6859:2:1284 +6860:2:1285 +6861:2:1289 +6862:2:1290 +6863:2:1284 +6864:2:1285 +6865:2:1289 +6866:2:1290 +6867:2:1298 +6868:2:1303 +6869:2:1307 +6870:2:1308 +6871:2:1315 +6872:2:1316 +6873:2:1327 +6874:2:1328 +6875:2:1329 +6876:2:1327 +6877:2:1328 +6878:2:1329 +6879:2:1340 +6880:2:1345 +6881:2:1346 +6882:0:4365 +6883:2:1358 +6884:0:4365 +6885:2:1454 +6886:0:4365 +6887:3:4286 +6888:0:4365 +6889:2:1455 +6890:0:4365 +6891:3:4287 +6892:0:4365 +6893:2:1652 +6894:0:4365 +6895:2:1653 +6896:0:4365 +6897:2:1657 +6898:0:4365 +6899:2:1660 +6900:0:4365 +6901:3:4286 +6902:0:4365 +6903:2:1665 +6904:2:1669 +6905:2:1670 +6906:2:1678 +6907:2:1679 +6908:2:1683 +6909:2:1684 +6910:2:1678 +6911:2:1679 +6912:2:1680 +6913:2:1692 +6914:2:1697 +6915:2:1701 +6916:2:1702 +6917:2:1709 +6918:2:1710 +6919:2:1721 +6920:2:1722 +6921:2:1723 +6922:2:1721 +6923:2:1722 +6924:2:1723 +6925:2:1734 +6926:2:1739 +6927:2:1740 +6928:0:4365 +6929:3:4287 +6930:0:4365 +6931:2:1752 +6932:0:4365 +6933:3:4286 +6934:0:4365 +6935:2:1754 +6936:0:4365 +6937:3:4287 +6938:0:4365 +6939:2:1755 +6940:2:1759 +6941:2:1760 +6942:2:1768 +6943:2:1769 +6944:2:1773 +6945:2:1774 +6946:2:1768 +6947:2:1769 +6948:2:1773 +6949:2:1774 +6950:2:1782 +6951:2:1787 +6952:2:1791 +6953:2:1792 +6954:2:1799 +6955:2:1800 +6956:2:1811 +6957:2:1812 +6958:2:1813 +6959:2:1811 +6960:2:1812 +6961:2:1813 +6962:2:1824 +6963:2:1829 +6964:2:1830 +6965:0:4365 +6966:2:1842 +6967:0:4365 +6968:3:4286 +6969:0:4365 +6970:2:1844 +6971:0:4365 +6972:3:4287 +6973:0:4365 +6974:2:1845 +6975:2:1849 +6976:2:1850 +6977:2:1858 +6978:2:1859 +6979:2:1863 +6980:2:1864 +6981:2:1858 +6982:2:1859 +6983:2:1863 +6984:2:1864 +6985:2:1872 +6986:2:1877 +6987:2:1881 +6988:2:1882 +6989:2:1889 +6990:2:1890 +6991:2:1901 +6992:2:1902 +6993:2:1903 +6994:2:1901 +6995:2:1902 +6996:2:1903 +6997:2:1914 +6998:2:1919 +6999:2:1920 +7000:0:4365 +7001:2:1932 +7002:0:4365 +7003:3:4286 +7004:0:4365 +7005:2:1934 +7006:0:4365 +7007:3:4287 +7008:0:4365 +7009:2:1935 +7010:0:4365 +7011:2:1936 +7012:0:4365 +7013:2:2129 +7014:0:4365 +7015:2:2130 +7016:0:4365 +7017:2:2134 +7018:0:4365 +7019:3:4286 +7020:0:4365 +7021:2:2136 +7022:0:4365 +7023:3:4287 +7024:0:4365 +7025:2:2137 +7026:2:2141 +7027:2:2142 +7028:2:2150 +7029:2:2151 +7030:2:2155 +7031:2:2156 +7032:2:2150 +7033:2:2151 +7034:2:2155 +7035:2:2156 +7036:2:2164 +7037:2:2169 +7038:2:2173 +7039:2:2174 +7040:2:2181 +7041:2:2182 +7042:2:2193 +7043:2:2194 +7044:2:2195 +7045:2:2193 +7046:2:2194 +7047:2:2195 +7048:2:2206 +7049:2:2211 +7050:2:2212 +7051:0:4365 +7052:2:2224 +7053:0:4365 +7054:3:4286 +7055:0:4365 +7056:2:2226 +7057:0:4365 +7058:3:4287 +7059:0:4365 +7060:2:1936 +7061:0:4365 +7062:2:2129 +7063:0:4365 +7064:2:2130 +7065:0:4365 +7066:2:2134 +7067:0:4365 +7068:3:4286 +7069:0:4365 +7070:2:2136 +7071:0:4365 +7072:3:4287 +7073:0:4365 +7074:2:2137 +7075:2:2141 +7076:2:2142 +7077:2:2150 +7078:2:2151 +7079:2:2155 +7080:2:2156 +7081:2:2150 +7082:2:2151 +7083:2:2152 +7084:2:2164 +7085:2:2169 +7086:2:2173 +7087:2:2174 +7088:2:2181 +7089:2:2182 +7090:2:2193 +7091:2:2194 +7092:2:2195 +7093:2:2193 +7094:2:2194 +7095:2:2195 +7096:2:2206 +7097:2:2211 +7098:2:2212 +7099:0:4365 +7100:2:2224 +7101:0:4365 +7102:3:4286 +7103:0:4365 +7104:2:2226 +7105:0:4365 +7106:3:4287 +7107:0:4365 +7108:2:2230 +7109:0:4365 +7110:3:4286 +7111:0:4365 +7112:2:2235 +7113:2:2239 +7114:2:2240 +7115:2:2248 +7116:2:2249 +7117:2:2253 +7118:2:2254 +7119:2:2248 +7120:2:2249 +7121:2:2250 +7122:2:2262 +7123:2:2267 +7124:2:2271 +7125:2:2272 +7126:2:2279 +7127:2:2280 +7128:2:2291 +7129:2:2292 +7130:2:2293 +7131:2:2291 +7132:2:2292 +7133:2:2293 +7134:2:2304 +7135:2:2309 +7136:2:2310 +7137:0:4365 +7138:3:4287 +7139:0:4365 +7140:2:2322 +7141:0:4365 +7142:2:1169 +7143:0:4365 +7144:3:4286 +7145:0:4365 +7146:2:1170 +7147:0:4365 +7148:3:4287 +7149:0:4365 +7150:3:4288 +7151:0:4365 +7152:3:4294 +7153:0:4365 +7154:3:4295 +7155:0:4365 +7156:3:2338 +7157:0:4365 +7158:3:2339 +7159:3:2343 +7160:3:2344 +7161:3:2352 +7162:3:2353 +7163:3:2357 +7164:3:2358 +7165:3:2352 +7166:3:2353 +7167:3:2357 +7168:3:2358 +7169:3:2366 +7170:3:2371 +7171:3:2375 +7172:3:2376 +7173:3:2383 +7174:3:2384 +7175:3:2395 +7176:3:2396 +7177:3:2397 +7178:3:2395 +7179:3:2396 +7180:3:2397 +7181:3:2408 +7182:3:2413 +7183:3:2414 +7184:0:4365 +7185:3:2426 +7186:0:4365 +7187:3:2427 +7188:0:4365 +7189:2:1173 +7190:0:4365 +7191:3:2428 +7192:0:4365 +7193:2:1179 +7194:0:4365 +7195:2:1180 +7196:0:4365 +7197:3:2427 +7198:0:4365 +7199:2:1181 +7200:2:1185 +7201:2:1186 +7202:2:1194 +7203:2:1195 +7204:2:1199 +7205:2:1200 +7206:2:1194 +7207:2:1195 +7208:2:1199 +7209:2:1200 +7210:2:1208 +7211:2:1213 +7212:2:1217 +7213:2:1218 +7214:2:1225 +7215:2:1226 +7216:2:1237 +7217:2:1238 +7218:2:1239 +7219:2:1237 +7220:2:1238 +7221:2:1239 +7222:2:1250 +7223:2:1255 +7224:2:1256 +7225:0:4365 +7226:3:2428 +7227:0:4365 +7228:2:1268 +7229:0:4365 +7230:3:2427 +7231:0:4365 +7232:2:1270 +7233:0:4365 +7234:3:2428 +7235:0:4365 +7236:2:1271 +7237:2:1275 +7238:2:1276 +7239:2:1284 +7240:2:1285 +7241:2:1289 +7242:2:1290 +7243:2:1284 +7244:2:1285 +7245:2:1289 +7246:2:1290 +7247:2:1298 +7248:2:1303 +7249:2:1307 +7250:2:1308 +7251:2:1315 +7252:2:1316 +7253:2:1327 +7254:2:1328 +7255:2:1329 +7256:2:1327 +7257:2:1328 +7258:2:1329 +7259:2:1340 +7260:2:1345 +7261:2:1346 +7262:0:4365 +7263:2:1358 +7264:0:4365 +7265:2:1360 +7266:0:4365 +7267:3:2427 +7268:0:4365 +7269:2:1361 +7270:0:4365 +7271:3:2428 +7272:0:4365 +7273:2:1362 +7274:2:1366 +7275:2:1367 +7276:2:1375 +7277:2:1376 +7278:2:1380 +7279:2:1381 +7280:2:1375 +7281:2:1376 +7282:2:1380 +7283:2:1381 +7284:2:1389 +7285:2:1394 +7286:2:1398 +7287:2:1399 +7288:2:1406 +7289:2:1407 +7290:2:1418 +7291:2:1419 +7292:2:1420 +7293:2:1418 +7294:2:1419 +7295:2:1420 +7296:2:1431 +7297:2:1436 +7298:2:1437 +7299:0:4365 +7300:2:1449 +7301:0:4365 +7302:3:2427 +7303:0:4365 +7304:2:1451 +7305:0:4365 +7306:3:2428 +7307:0:4365 +7308:2:1652 +7309:0:4365 +7310:2:1653 +7311:0:4365 +7312:2:1657 +7313:0:4365 +7314:2:1180 +7315:0:4365 +7316:3:2427 +7317:0:4365 +7318:2:1181 +7319:2:1185 +7320:2:1186 +7321:2:1194 +7322:2:1195 +7323:2:1199 +7324:2:1200 +7325:2:1194 +7326:2:1195 +7327:2:1196 +7328:2:1208 +7329:2:1213 +7330:2:1217 +7331:2:1218 +7332:2:1225 +7333:2:1226 +7334:2:1237 +7335:2:1238 +7336:2:1239 +7337:2:1237 +7338:2:1238 +7339:2:1239 +7340:2:1250 +7341:2:1255 +7342:2:1256 +7343:0:4365 +7344:3:2428 +7345:0:4365 +7346:2:1268 +7347:0:4365 +7348:3:2427 +7349:0:4365 +7350:2:1270 +7351:0:4365 +7352:3:2428 +7353:0:4365 +7354:2:1271 +7355:2:1275 +7356:2:1276 +7357:2:1284 +7358:2:1285 +7359:2:1289 +7360:2:1290 +7361:2:1284 +7362:2:1285 +7363:2:1289 +7364:2:1290 +7365:2:1298 +7366:2:1303 +7367:2:1307 +7368:2:1308 +7369:2:1315 +7370:2:1316 +7371:2:1327 +7372:2:1328 +7373:2:1329 +7374:2:1327 +7375:2:1328 +7376:2:1329 +7377:2:1340 +7378:2:1345 +7379:2:1346 +7380:0:4365 +7381:2:1358 +7382:0:4365 +7383:2:1454 +7384:0:4365 +7385:3:2427 +7386:0:4365 +7387:2:1455 +7388:0:4365 +7389:3:2428 +7390:0:4365 +7391:2:1652 +7392:0:4365 +7393:2:1653 +7394:0:4365 +7395:2:1657 +7396:0:4365 +7397:2:1660 +7398:0:4365 +7399:3:2427 +7400:0:4365 +7401:2:1665 +7402:2:1669 +7403:2:1670 +7404:2:1678 +7405:2:1679 +7406:2:1683 +7407:2:1684 +7408:2:1678 +7409:2:1679 +7410:2:1680 +7411:2:1692 +7412:2:1697 +7413:2:1701 +7414:2:1702 +7415:2:1709 +7416:2:1710 +7417:2:1721 +7418:2:1722 +7419:2:1723 +7420:2:1721 +7421:2:1722 +7422:2:1723 +7423:2:1734 +7424:2:1739 +7425:2:1740 +7426:0:4365 +7427:3:2428 +7428:0:4365 +7429:2:1752 +7430:0:4365 +7431:3:2427 +7432:0:4365 +7433:2:1754 +7434:0:4365 +7435:3:2428 +7436:0:4365 +7437:2:1755 +7438:2:1759 +7439:2:1760 +7440:2:1768 +7441:2:1769 +7442:2:1773 +7443:2:1774 +7444:2:1768 +7445:2:1769 +7446:2:1773 +7447:2:1774 +7448:2:1782 +7449:2:1787 +7450:2:1791 +7451:2:1792 +7452:2:1799 +7453:2:1800 +7454:2:1811 +7455:2:1812 +7456:2:1813 +7457:2:1811 +7458:2:1812 +7459:2:1813 +7460:2:1824 +7461:2:1829 +7462:2:1830 +7463:0:4365 +7464:2:1842 +7465:0:4365 +7466:3:2427 +7467:0:4365 +7468:2:1844 +7469:0:4365 +7470:3:2428 +7471:0:4365 +7472:2:1845 +7473:2:1849 +7474:2:1850 +7475:2:1858 +7476:2:1859 +7477:2:1863 +7478:2:1864 +7479:2:1858 +7480:2:1859 +7481:2:1863 +7482:2:1864 +7483:2:1872 +7484:2:1877 +7485:2:1881 +7486:2:1882 +7487:2:1889 +7488:2:1890 +7489:2:1901 +7490:2:1902 +7491:2:1903 +7492:2:1901 +7493:2:1902 +7494:2:1903 +7495:2:1914 +7496:2:1919 +7497:2:1920 +7498:0:4365 +7499:2:1932 +7500:0:4365 +7501:3:2427 +7502:0:4365 +7503:2:1934 +7504:0:4365 +7505:3:2428 +7506:0:4365 +7507:2:1935 +7508:0:4365 +7509:2:1936 +7510:0:4365 +7511:2:2129 +7512:0:4365 +7513:2:2130 +7514:0:4365 +7515:2:2134 +7516:0:4365 +7517:3:2427 +7518:0:4365 +7519:2:2136 +7520:0:4365 +7521:3:2428 +7522:0:4365 +7523:2:2137 +7524:2:2141 +7525:2:2142 +7526:2:2150 +7527:2:2151 +7528:2:2155 +7529:2:2156 +7530:2:2150 +7531:2:2151 +7532:2:2155 +7533:2:2156 +7534:2:2164 +7535:2:2169 +7536:2:2173 +7537:2:2174 +7538:2:2181 +7539:2:2182 +7540:2:2193 +7541:2:2194 +7542:2:2195 +7543:2:2193 +7544:2:2194 +7545:2:2195 +7546:2:2206 +7547:2:2211 +7548:2:2212 +7549:0:4365 +7550:2:2224 +7551:0:4365 +7552:3:2427 +7553:0:4365 +7554:2:2226 +7555:0:4365 +7556:3:2428 +7557:0:4365 +7558:2:1936 +7559:0:4365 +7560:2:2129 +7561:0:4365 +7562:2:2130 +7563:0:4365 +7564:2:2134 +7565:0:4365 +7566:3:2427 +7567:0:4365 +7568:2:2136 +7569:0:4365 +7570:3:2428 +7571:0:4365 +7572:2:2137 +7573:2:2141 +7574:2:2142 +7575:2:2150 +7576:2:2151 +7577:2:2155 +7578:2:2156 +7579:2:2150 +7580:2:2151 +7581:2:2152 +7582:2:2164 +7583:2:2169 +7584:2:2173 +7585:2:2174 +7586:2:2181 +7587:2:2182 +7588:2:2193 +7589:2:2194 +7590:2:2195 +7591:2:2193 +7592:2:2194 +7593:2:2195 +7594:2:2206 +7595:2:2211 +7596:2:2212 +7597:0:4365 +7598:2:2224 +7599:0:4365 +7600:3:2427 +7601:0:4365 +7602:2:2226 +7603:0:4365 +7604:3:2428 +7605:0:4365 +7606:2:2230 +7607:0:4365 +7608:3:2427 +7609:0:4365 +7610:2:2235 +7611:2:2239 +7612:2:2240 +7613:2:2248 +7614:2:2249 +7615:2:2253 +7616:2:2254 +7617:2:2248 +7618:2:2249 +7619:2:2250 +7620:2:2262 +7621:2:2267 +7622:2:2271 +7623:2:2272 +7624:2:2279 +7625:2:2280 +7626:2:2291 +7627:2:2292 +7628:2:2293 +7629:2:2291 +7630:2:2292 +7631:2:2293 +7632:2:2304 +7633:2:2309 +7634:2:2310 +7635:0:4365 +7636:3:2428 +7637:0:4365 +7638:2:2322 +7639:0:4365 +7640:2:1169 +7641:0:4365 +7642:3:2427 +7643:0:4365 +7644:2:1170 +7645:0:4365 +7646:3:2428 +7647:0:4365 +7648:3:2429 +7649:0:4365 +7650:3:2435 +7651:3:2436 +7652:0:4365 +7653:3:2440 +7654:3:2444 +7655:3:2445 +7656:3:2453 +7657:3:2454 +7658:3:2458 +7659:3:2459 +7660:3:2453 +7661:3:2454 +7662:3:2458 +7663:3:2459 +7664:3:2467 +7665:3:2472 +7666:3:2473 +7667:3:2484 +7668:3:2485 +7669:3:2496 +7670:3:2497 +7671:3:2498 +7672:3:2496 +7673:3:2497 +7674:3:2498 +7675:3:2509 +7676:3:2514 +7677:3:2515 +7678:0:4365 +7679:3:2527 +7680:0:4365 +7681:3:2528 +7682:0:4365 +7683:2:1173 +7684:0:4365 +7685:3:2529 +7686:0:4365 +7687:2:1179 +7688:0:4365 +7689:2:1180 +7690:0:4365 +7691:3:2528 +7692:0:4365 +7693:2:1181 +7694:2:1185 +7695:2:1186 +7696:2:1194 +7697:2:1195 +7698:2:1199 +7699:2:1200 +7700:2:1194 +7701:2:1195 +7702:2:1199 +7703:2:1200 +7704:2:1208 +7705:2:1213 +7706:2:1217 +7707:2:1218 +7708:2:1225 +7709:2:1226 +7710:2:1237 +7711:2:1238 +7712:2:1239 +7713:2:1237 +7714:2:1238 +7715:2:1239 +7716:2:1250 +7717:2:1255 +7718:2:1256 +7719:0:4365 +7720:3:2529 +7721:0:4365 +7722:2:1268 +7723:0:4365 +7724:3:2528 +7725:0:4365 +7726:2:1270 +7727:0:4365 +7728:3:2529 +7729:0:4365 +7730:2:1271 +7731:2:1275 +7732:2:1276 +7733:2:1284 +7734:2:1285 +7735:2:1289 +7736:2:1290 +7737:2:1284 +7738:2:1285 +7739:2:1289 +7740:2:1290 +7741:2:1298 +7742:2:1303 +7743:2:1307 +7744:2:1308 +7745:2:1315 +7746:2:1316 +7747:2:1327 +7748:2:1328 +7749:2:1329 +7750:2:1327 +7751:2:1328 +7752:2:1329 +7753:2:1340 +7754:2:1345 +7755:2:1346 +7756:0:4365 +7757:2:1358 +7758:0:4365 +7759:2:1360 +7760:0:4365 +7761:3:2528 +7762:0:4365 +7763:2:1361 +7764:0:4365 +7765:3:2529 +7766:0:4365 +7767:2:1362 +7768:2:1366 +7769:2:1367 +7770:2:1375 +7771:2:1376 +7772:2:1380 +7773:2:1381 +7774:2:1375 +7775:2:1376 +7776:2:1380 +7777:2:1381 +7778:2:1389 +7779:2:1394 +7780:2:1398 +7781:2:1399 +7782:2:1406 +7783:2:1407 +7784:2:1418 +7785:2:1419 +7786:2:1420 +7787:2:1418 +7788:2:1419 +7789:2:1420 +7790:2:1431 +7791:2:1436 +7792:2:1437 +7793:0:4365 +7794:2:1449 +7795:0:4365 +7796:3:2528 +7797:0:4365 +7798:2:1451 +7799:0:4365 +7800:3:2529 +7801:0:4365 +7802:2:1652 +7803:0:4365 +7804:2:1653 +7805:0:4365 +7806:2:1657 +7807:0:4365 +7808:2:1180 +7809:0:4365 +7810:3:2528 +7811:0:4365 +7812:2:1181 +7813:2:1185 +7814:2:1186 +7815:2:1194 +7816:2:1195 +7817:2:1199 +7818:2:1200 +7819:2:1194 +7820:2:1195 +7821:2:1196 +7822:2:1208 +7823:2:1213 +7824:2:1217 +7825:2:1218 +7826:2:1225 +7827:2:1226 +7828:2:1237 +7829:2:1238 +7830:2:1239 +7831:2:1237 +7832:2:1238 +7833:2:1239 +7834:2:1250 +7835:2:1255 +7836:2:1256 +7837:0:4365 +7838:3:2529 +7839:0:4365 +7840:2:1268 +7841:0:4365 +7842:3:2528 +7843:0:4365 +7844:2:1270 +7845:0:4365 +7846:3:2529 +7847:0:4365 +7848:2:1271 +7849:2:1275 +7850:2:1276 +7851:2:1284 +7852:2:1285 +7853:2:1289 +7854:2:1290 +7855:2:1284 +7856:2:1285 +7857:2:1289 +7858:2:1290 +7859:2:1298 +7860:2:1303 +7861:2:1307 +7862:2:1308 +7863:2:1315 +7864:2:1316 +7865:2:1327 +7866:2:1328 +7867:2:1329 +7868:2:1327 +7869:2:1328 +7870:2:1329 +7871:2:1340 +7872:2:1345 +7873:2:1346 +7874:0:4365 +7875:2:1358 +7876:0:4365 +7877:2:1454 +7878:0:4365 +7879:3:2528 +7880:0:4365 +7881:2:1455 +7882:0:4365 +7883:3:2529 +7884:0:4365 +7885:2:1652 +7886:0:4365 +7887:2:1653 +7888:0:4365 +7889:2:1657 +7890:0:4365 +7891:2:1660 +7892:0:4365 +7893:3:2528 +7894:0:4365 +7895:2:1665 +7896:2:1669 +7897:2:1670 +7898:2:1678 +7899:2:1679 +7900:2:1683 +7901:2:1684 +7902:2:1678 +7903:2:1679 +7904:2:1680 +7905:2:1692 +7906:2:1697 +7907:2:1701 +7908:2:1702 +7909:2:1709 +7910:2:1710 +7911:2:1721 +7912:2:1722 +7913:2:1723 +7914:2:1721 +7915:2:1722 +7916:2:1723 +7917:2:1734 +7918:2:1739 +7919:2:1740 +7920:0:4365 +7921:3:2529 +7922:0:4365 +7923:2:1752 +7924:0:4365 +7925:3:2528 +7926:0:4365 +7927:2:1754 +7928:0:4365 +7929:3:2529 +7930:0:4365 +7931:2:1755 +7932:2:1759 +7933:2:1760 +7934:2:1768 +7935:2:1769 +7936:2:1773 +7937:2:1774 +7938:2:1768 +7939:2:1769 +7940:2:1773 +7941:2:1774 +7942:2:1782 +7943:2:1787 +7944:2:1791 +7945:2:1792 +7946:2:1799 +7947:2:1800 +7948:2:1811 +7949:2:1812 +7950:2:1813 +7951:2:1811 +7952:2:1812 +7953:2:1813 +7954:2:1824 +7955:2:1829 +7956:2:1830 +7957:0:4365 +7958:2:1842 +7959:0:4365 +7960:3:2528 +7961:0:4365 +7962:2:1844 +7963:0:4365 +7964:3:2529 +7965:0:4365 +7966:2:1845 +7967:2:1849 +7968:2:1850 +7969:2:1858 +7970:2:1859 +7971:2:1863 +7972:2:1864 +7973:2:1858 +7974:2:1859 +7975:2:1863 +7976:2:1864 +7977:2:1872 +7978:2:1877 +7979:2:1881 +7980:2:1882 +7981:2:1889 +7982:2:1890 +7983:2:1901 +7984:2:1902 +7985:2:1903 +7986:2:1901 +7987:2:1902 +7988:2:1903 +7989:2:1914 +7990:2:1919 +7991:2:1920 +7992:0:4365 +7993:2:1932 +7994:0:4365 +7995:3:2528 +7996:0:4365 +7997:2:1934 +7998:0:4365 +7999:3:2529 +8000:0:4365 +8001:2:1935 +8002:0:4365 +8003:2:1936 +8004:0:4365 +8005:2:2129 +8006:0:4365 +8007:2:2130 +8008:0:4365 +8009:2:2134 +8010:0:4365 +8011:3:2528 +8012:0:4365 +8013:2:2136 +8014:0:4365 +8015:3:2529 +8016:0:4365 +8017:2:2137 +8018:2:2141 +8019:2:2142 +8020:2:2150 +8021:2:2151 +8022:2:2155 +8023:2:2156 +8024:2:2150 +8025:2:2151 +8026:2:2155 +8027:2:2156 +8028:2:2164 +8029:2:2169 +8030:2:2173 +8031:2:2174 +8032:2:2181 +8033:2:2182 +8034:2:2193 +8035:2:2194 +8036:2:2195 +8037:2:2193 +8038:2:2194 +8039:2:2195 +8040:2:2206 +8041:2:2211 +8042:2:2212 +8043:0:4365 +8044:2:2224 +8045:0:4365 +8046:3:2528 +8047:0:4365 +8048:2:2226 +8049:0:4365 +8050:3:2529 +8051:0:4365 +8052:2:1936 +8053:0:4365 +8054:2:2129 +8055:0:4365 +8056:2:2130 +8057:0:4365 +8058:2:2134 +8059:0:4365 +8060:3:2528 +8061:0:4365 +8062:2:2136 +8063:0:4365 +8064:3:2529 +8065:0:4365 +8066:2:2137 +8067:2:2141 +8068:2:2142 +8069:2:2150 +8070:2:2151 +8071:2:2155 +8072:2:2156 +8073:2:2150 +8074:2:2151 +8075:2:2152 +8076:2:2164 +8077:2:2169 +8078:2:2173 +8079:2:2174 +8080:2:2181 +8081:2:2182 +8082:2:2193 +8083:2:2194 +8084:2:2195 +8085:2:2193 +8086:2:2194 +8087:2:2195 +8088:2:2206 +8089:2:2211 +8090:2:2212 +8091:0:4365 +8092:2:2224 +8093:0:4365 +8094:3:2528 +8095:0:4365 +8096:2:2226 +8097:0:4365 +8098:3:2529 +8099:0:4365 +8100:2:2230 +8101:0:4365 +8102:3:2528 +8103:0:4365 +8104:2:2235 +8105:2:2239 +8106:2:2240 +8107:2:2248 +8108:2:2249 +8109:2:2253 +8110:2:2254 +8111:2:2248 +8112:2:2249 +8113:2:2250 +8114:2:2262 +8115:2:2267 +8116:2:2271 +8117:2:2272 +8118:2:2279 +8119:2:2280 +8120:2:2291 +8121:2:2292 +8122:2:2293 +8123:2:2291 +8124:2:2292 +8125:2:2293 +8126:2:2304 +8127:2:2309 +8128:2:2310 +8129:0:4365 +8130:3:2529 +8131:0:4365 +8132:2:2322 +8133:0:4365 +8134:2:1169 +8135:0:4365 +8136:3:2528 +8137:0:4365 +8138:2:1170 +8139:0:4365 +8140:3:2529 +8141:0:4365 +8142:3:2530 +8143:0:4365 +8144:3:2536 +8145:0:4365 +8146:3:2537 +8147:0:4365 +8148:3:2547 +8149:0:4365 +8150:3:2548 +8151:0:4365 +8152:3:2552 +8153:3:2553 +8154:3:2557 +8155:3:2561 +8156:3:2562 +8157:3:2557 +8158:3:2561 +8159:3:2562 +8160:3:2566 +8161:3:2574 +8162:3:2575 +8163:3:2580 +8164:3:2587 +8165:3:2588 +8166:3:2587 +8167:3:2588 +8168:3:2595 +8169:3:2600 +8170:0:4365 +8171:3:2611 +8172:0:4365 +8173:3:2615 +8174:3:2616 +8175:3:2620 +8176:3:2624 +8177:3:2625 +8178:3:2620 +8179:3:2624 +8180:3:2625 +8181:3:2629 +8182:3:2637 +8183:3:2638 +8184:3:2643 +8185:3:2650 +8186:3:2651 +8187:3:2650 +8188:3:2651 +8189:3:2658 +8190:3:2663 +8191:0:4365 +8192:3:2611 +8193:0:4365 +8194:3:2615 +8195:3:2616 +8196:3:2620 +8197:3:2624 +8198:3:2625 +8199:3:2620 +8200:3:2624 +8201:3:2625 +8202:3:2629 +8203:3:2637 +8204:3:2638 +8205:3:2643 +8206:3:2650 +8207:3:2651 +8208:3:2650 +8209:3:2651 +8210:3:2658 +8211:3:2663 +8212:0:4365 +8213:3:2674 +8214:0:4365 +8215:3:2682 +8216:3:2683 +8217:3:2687 +8218:3:2691 +8219:3:2692 +8220:3:2687 +8221:3:2691 +8222:3:2692 +8223:3:2696 +8224:3:2704 +8225:3:2705 +8226:3:2710 +8227:3:2717 +8228:3:2718 +8229:3:2717 +8230:3:2718 +8231:3:2725 +8232:3:2730 +8233:0:4365 +8234:3:2745 +8235:0:4365 +8236:3:2746 +8237:0:4365 +8238:2:1173 +8239:0:4365 +8240:3:2747 +8241:0:4365 +8242:2:1179 +8243:0:4365 +8244:2:1180 +8245:0:4365 +8246:3:2746 +8247:0:4365 +8248:2:1181 +8249:2:1185 +8250:2:1186 +8251:2:1194 +8252:2:1195 +8253:2:1199 +8254:2:1200 +8255:2:1194 +8256:2:1195 +8257:2:1199 +8258:2:1200 +8259:2:1208 +8260:2:1213 +8261:2:1217 +8262:2:1218 +8263:2:1225 +8264:2:1226 +8265:2:1237 +8266:2:1238 +8267:2:1239 +8268:2:1237 +8269:2:1238 +8270:2:1239 +8271:2:1250 +8272:2:1255 +8273:2:1256 +8274:0:4365 +8275:3:2747 +8276:0:4365 +8277:2:1268 +8278:0:4365 +8279:3:2746 +8280:0:4365 +8281:2:1270 +8282:0:4365 +8283:3:2747 +8284:0:4365 +8285:2:1271 +8286:2:1275 +8287:2:1276 +8288:2:1284 +8289:2:1285 +8290:2:1289 +8291:2:1290 +8292:2:1284 +8293:2:1285 +8294:2:1289 +8295:2:1290 +8296:2:1298 +8297:2:1303 +8298:2:1307 +8299:2:1308 +8300:2:1315 +8301:2:1316 +8302:2:1327 +8303:2:1328 +8304:2:1329 +8305:2:1327 +8306:2:1328 +8307:2:1329 +8308:2:1340 +8309:2:1345 +8310:2:1346 +8311:0:4365 +8312:2:1358 +8313:0:4365 +8314:2:1360 +8315:0:4365 +8316:3:2746 +8317:0:4365 +8318:2:1361 +8319:0:4365 +8320:3:2747 +8321:0:4365 +8322:2:1362 +8323:2:1366 +8324:2:1367 +8325:2:1375 +8326:2:1376 +8327:2:1380 +8328:2:1381 +8329:2:1375 +8330:2:1376 +8331:2:1380 +8332:2:1381 +8333:2:1389 +8334:2:1394 +8335:2:1398 +8336:2:1399 +8337:2:1406 +8338:2:1407 +8339:2:1418 +8340:2:1419 +8341:2:1420 +8342:2:1418 +8343:2:1419 +8344:2:1420 +8345:2:1431 +8346:2:1436 +8347:2:1437 +8348:0:4365 +8349:2:1449 +8350:0:4365 +8351:3:2746 +8352:0:4365 +8353:2:1451 +8354:0:4365 +8355:3:2747 +8356:0:4365 +8357:2:1652 +8358:0:4365 +8359:2:1653 +8360:0:4365 +8361:2:1657 +8362:0:4365 +8363:2:1180 +8364:0:4365 +8365:3:2746 +8366:0:4365 +8367:2:1181 +8368:2:1185 +8369:2:1186 +8370:2:1194 +8371:2:1195 +8372:2:1199 +8373:2:1200 +8374:2:1194 +8375:2:1195 +8376:2:1196 +8377:2:1208 +8378:2:1213 +8379:2:1217 +8380:2:1218 +8381:2:1225 +8382:2:1226 +8383:2:1237 +8384:2:1238 +8385:2:1239 +8386:2:1237 +8387:2:1238 +8388:2:1239 +8389:2:1250 +8390:2:1255 +8391:2:1256 +8392:0:4365 +8393:3:2747 +8394:0:4365 +8395:2:1268 +8396:0:4365 +8397:3:2746 +8398:0:4365 +8399:2:1270 +8400:0:4365 +8401:3:2747 +8402:0:4365 +8403:2:1271 +8404:2:1275 +8405:2:1276 +8406:2:1284 +8407:2:1285 +8408:2:1289 +8409:2:1290 +8410:2:1284 +8411:2:1285 +8412:2:1289 +8413:2:1290 +8414:2:1298 +8415:2:1303 +8416:2:1307 +8417:2:1308 +8418:2:1315 +8419:2:1316 +8420:2:1327 +8421:2:1328 +8422:2:1329 +8423:2:1327 +8424:2:1328 +8425:2:1329 +8426:2:1340 +8427:2:1345 +8428:2:1346 +8429:0:4365 +8430:2:1358 +8431:0:4365 +8432:2:1454 +8433:0:4365 +8434:3:2746 +8435:0:4365 +8436:2:1455 +8437:0:4365 +8438:3:2747 +8439:0:4365 +8440:2:1652 +8441:0:4365 +8442:2:1653 +8443:0:4365 +8444:2:1657 +8445:0:4365 +8446:2:1660 +8447:0:4365 +8448:3:2746 +8449:0:4365 +8450:2:1665 +8451:2:1669 +8452:2:1670 +8453:2:1678 +8454:2:1679 +8455:2:1683 +8456:2:1684 +8457:2:1678 +8458:2:1679 +8459:2:1680 +8460:2:1692 +8461:2:1697 +8462:2:1701 +8463:2:1702 +8464:2:1709 +8465:2:1710 +8466:2:1721 +8467:2:1722 +8468:2:1723 +8469:2:1721 +8470:2:1722 +8471:2:1723 +8472:2:1734 +8473:2:1739 +8474:2:1740 +8475:0:4365 +8476:3:2747 +8477:0:4365 +8478:2:1752 +8479:0:4365 +8480:3:2746 +8481:0:4365 +8482:2:1754 +8483:0:4365 +8484:3:2747 +8485:0:4365 +8486:2:1755 +8487:2:1759 +8488:2:1760 +8489:2:1768 +8490:2:1769 +8491:2:1773 +8492:2:1774 +8493:2:1768 +8494:2:1769 +8495:2:1773 +8496:2:1774 +8497:2:1782 +8498:2:1787 +8499:2:1791 +8500:2:1792 +8501:2:1799 +8502:2:1800 +8503:2:1811 +8504:2:1812 +8505:2:1813 +8506:2:1811 +8507:2:1812 +8508:2:1813 +8509:2:1824 +8510:2:1829 +8511:2:1830 +8512:0:4365 +8513:2:1842 +8514:0:4365 +8515:3:2746 +8516:0:4365 +8517:2:1844 +8518:0:4365 +8519:3:2747 +8520:0:4365 +8521:2:1845 +8522:2:1849 +8523:2:1850 +8524:2:1858 +8525:2:1859 +8526:2:1863 +8527:2:1864 +8528:2:1858 +8529:2:1859 +8530:2:1863 +8531:2:1864 +8532:2:1872 +8533:2:1877 +8534:2:1881 +8535:2:1882 +8536:2:1889 +8537:2:1890 +8538:2:1901 +8539:2:1902 +8540:2:1903 +8541:2:1901 +8542:2:1902 +8543:2:1903 +8544:2:1914 +8545:2:1919 +8546:2:1920 +8547:0:4365 +8548:2:1932 +8549:0:4365 +8550:3:2746 +8551:0:4365 +8552:2:1934 +8553:0:4365 +8554:3:2747 +8555:0:4365 +8556:2:1935 +8557:0:4365 +8558:2:1936 +8559:0:4365 +8560:2:2129 +8561:0:4365 +8562:2:2130 +8563:0:4365 +8564:2:2134 +8565:0:4365 +8566:3:2746 +8567:0:4365 +8568:2:2136 +8569:0:4365 +8570:3:2747 +8571:0:4365 +8572:2:2137 +8573:2:2141 +8574:2:2142 +8575:2:2150 +8576:2:2151 +8577:2:2155 +8578:2:2156 +8579:2:2150 +8580:2:2151 +8581:2:2155 +8582:2:2156 +8583:2:2164 +8584:2:2169 +8585:2:2173 +8586:2:2174 +8587:2:2181 +8588:2:2182 +8589:2:2193 +8590:2:2194 +8591:2:2195 +8592:2:2193 +8593:2:2194 +8594:2:2195 +8595:2:2206 +8596:2:2211 +8597:2:2212 +8598:0:4365 +8599:2:2224 +8600:0:4365 +8601:3:2746 +8602:0:4365 +8603:2:2226 +8604:0:4365 +8605:3:2747 +8606:0:4365 +8607:2:1936 +8608:0:4365 +8609:2:2129 +8610:0:4365 +8611:2:2130 +8612:0:4365 +8613:2:2134 +8614:0:4365 +8615:3:2746 +8616:0:4365 +8617:2:2136 +8618:0:4365 +8619:3:2747 +8620:0:4365 +8621:2:2137 +8622:2:2141 +8623:2:2142 +8624:2:2150 +8625:2:2151 +8626:2:2155 +8627:2:2156 +8628:2:2150 +8629:2:2151 +8630:2:2152 +8631:2:2164 +8632:2:2169 +8633:2:2173 +8634:2:2174 +8635:2:2181 +8636:2:2182 +8637:2:2193 +8638:2:2194 +8639:2:2195 +8640:2:2193 +8641:2:2194 +8642:2:2195 +8643:2:2206 +8644:2:2211 +8645:2:2212 +8646:0:4365 +8647:2:2224 +8648:0:4365 +8649:3:2746 +8650:0:4365 +8651:2:2226 +8652:0:4365 +8653:3:2747 +8654:0:4365 +8655:2:2230 +8656:0:4365 +8657:3:2746 +8658:0:4365 +8659:2:2235 +8660:2:2239 +8661:2:2240 +8662:2:2248 +8663:2:2249 +8664:2:2253 +8665:2:2254 +8666:2:2248 +8667:2:2249 +8668:2:2250 +8669:2:2262 +8670:2:2267 +8671:2:2271 +8672:2:2272 +8673:2:2279 +8674:2:2280 +8675:2:2291 +8676:2:2292 +8677:2:2293 +8678:2:2291 +8679:2:2292 +8680:2:2293 +8681:2:2304 +8682:2:2309 +8683:2:2310 +8684:0:4365 +8685:3:2747 +8686:0:4365 +8687:2:2322 +8688:0:4365 +8689:2:1169 +8690:0:4365 +8691:3:2746 +8692:0:4365 +8693:2:1170 +8694:0:4365 +8695:3:2747 +8696:0:4365 +8697:3:2748 +8698:0:4365 +8699:3:2754 +8700:0:4365 +8701:3:2755 +8702:3:2759 +8703:3:2760 +8704:3:2768 +8705:3:2769 +8706:3:2773 +8707:3:2774 +8708:3:2768 +8709:3:2769 +8710:3:2773 +8711:3:2774 +8712:3:2782 +8713:3:2787 +8714:3:2791 +8715:3:2792 +8716:3:2799 +8717:3:2800 +8718:3:2811 +8719:3:2812 +8720:3:2813 +8721:3:2811 +8722:3:2812 +8723:3:2813 +8724:3:2824 +8725:3:2829 +8726:3:2830 +8727:0:4365 +8728:3:2842 +8729:0:4365 +8730:3:2843 +8731:0:4365 +8732:2:1173 +8733:0:4365 +8734:3:2844 +8735:0:4365 +8736:2:1179 +8737:0:4365 +8738:2:1180 +8739:0:4365 +8740:3:2843 +8741:0:4365 +8742:2:1181 +8743:2:1185 +8744:2:1186 +8745:2:1194 +8746:2:1195 +8747:2:1199 +8748:2:1200 +8749:2:1194 +8750:2:1195 +8751:2:1199 +8752:2:1200 +8753:2:1208 +8754:2:1213 +8755:2:1217 +8756:2:1218 +8757:2:1225 +8758:2:1226 +8759:2:1237 +8760:2:1238 +8761:2:1239 +8762:2:1237 +8763:2:1238 +8764:2:1239 +8765:2:1250 +8766:2:1255 +8767:2:1256 +8768:0:4365 +8769:3:2844 +8770:0:4365 +8771:2:1268 +8772:0:4365 +8773:3:2843 +8774:0:4365 +8775:2:1270 +8776:0:4365 +8777:3:2844 +8778:0:4365 +8779:2:1271 +8780:2:1275 +8781:2:1276 +8782:2:1284 +8783:2:1285 +8784:2:1289 +8785:2:1290 +8786:2:1284 +8787:2:1285 +8788:2:1289 +8789:2:1290 +8790:2:1298 +8791:2:1303 +8792:2:1307 +8793:2:1308 +8794:2:1315 +8795:2:1316 +8796:2:1327 +8797:2:1328 +8798:2:1329 +8799:2:1327 +8800:2:1328 +8801:2:1329 +8802:2:1340 +8803:2:1345 +8804:2:1346 +8805:0:4365 +8806:2:1358 +8807:0:4365 +8808:2:1360 +8809:0:4365 +8810:3:2843 +8811:0:4365 +8812:2:1361 +8813:0:4365 +8814:3:2844 +8815:0:4365 +8816:2:1362 +8817:2:1366 +8818:2:1367 +8819:2:1375 +8820:2:1376 +8821:2:1380 +8822:2:1381 +8823:2:1375 +8824:2:1376 +8825:2:1380 +8826:2:1381 +8827:2:1389 +8828:2:1394 +8829:2:1398 +8830:2:1399 +8831:2:1406 +8832:2:1407 +8833:2:1418 +8834:2:1419 +8835:2:1420 +8836:2:1418 +8837:2:1419 +8838:2:1420 +8839:2:1431 +8840:2:1436 +8841:2:1437 +8842:0:4365 +8843:2:1449 +8844:0:4365 +8845:3:2843 +8846:0:4365 +8847:2:1451 +8848:0:4365 +8849:3:2844 +8850:0:4365 +8851:2:1652 +8852:0:4365 +8853:2:1653 +8854:0:4365 +8855:2:1657 +8856:0:4365 +8857:2:1180 +8858:0:4365 +8859:3:2843 +8860:0:4365 +8861:2:1181 +8862:2:1185 +8863:2:1186 +8864:2:1194 +8865:2:1195 +8866:2:1199 +8867:2:1200 +8868:2:1194 +8869:2:1195 +8870:2:1196 +8871:2:1208 +8872:2:1213 +8873:2:1217 +8874:2:1218 +8875:2:1225 +8876:2:1226 +8877:2:1237 +8878:2:1238 +8879:2:1239 +8880:2:1237 +8881:2:1238 +8882:2:1239 +8883:2:1250 +8884:2:1255 +8885:2:1256 +8886:0:4365 +8887:3:2844 +8888:0:4365 +8889:2:1268 +8890:0:4365 +8891:3:2843 +8892:0:4365 +8893:2:1270 +8894:0:4365 +8895:3:2844 +8896:0:4365 +8897:2:1271 +8898:2:1275 +8899:2:1276 +8900:2:1284 +8901:2:1285 +8902:2:1289 +8903:2:1290 +8904:2:1284 +8905:2:1285 +8906:2:1289 +8907:2:1290 +8908:2:1298 +8909:2:1303 +8910:2:1307 +8911:2:1308 +8912:2:1315 +8913:2:1316 +8914:2:1327 +8915:2:1328 +8916:2:1329 +8917:2:1327 +8918:2:1328 +8919:2:1329 +8920:2:1340 +8921:2:1345 +8922:2:1346 +8923:0:4365 +8924:2:1358 +8925:0:4365 +8926:2:1454 +8927:0:4365 +8928:3:2843 +8929:0:4365 +8930:2:1455 +8931:0:4365 +8932:3:2844 +8933:0:4365 +8934:2:1652 +8935:0:4365 +8936:2:1653 +8937:0:4365 +8938:2:1657 +8939:0:4365 +8940:2:1660 +8941:0:4365 +8942:3:2843 +8943:0:4365 +8944:2:1665 +8945:2:1669 +8946:2:1670 +8947:2:1678 +8948:2:1679 +8949:2:1683 +8950:2:1684 +8951:2:1678 +8952:2:1679 +8953:2:1680 +8954:2:1692 +8955:2:1697 +8956:2:1701 +8957:2:1702 +8958:2:1709 +8959:2:1710 +8960:2:1721 +8961:2:1722 +8962:2:1723 +8963:2:1721 +8964:2:1722 +8965:2:1723 +8966:2:1734 +8967:2:1739 +8968:2:1740 +8969:0:4365 +8970:3:2844 +8971:0:4365 +8972:2:1752 +8973:0:4365 +8974:3:2843 +8975:0:4365 +8976:2:1754 +8977:0:4365 +8978:3:2844 +8979:0:4365 +8980:2:1755 +8981:2:1759 +8982:2:1760 +8983:2:1768 +8984:2:1769 +8985:2:1773 +8986:2:1774 +8987:2:1768 +8988:2:1769 +8989:2:1773 +8990:2:1774 +8991:2:1782 +8992:2:1787 +8993:2:1791 +8994:2:1792 +8995:2:1799 +8996:2:1800 +8997:2:1811 +8998:2:1812 +8999:2:1813 +9000:2:1811 +9001:2:1812 +9002:2:1813 +9003:2:1824 +9004:2:1829 +9005:2:1830 +9006:0:4365 +9007:2:1842 +9008:0:4365 +9009:3:2843 +9010:0:4365 +9011:2:1844 +9012:0:4365 +9013:3:2844 +9014:0:4365 +9015:2:1845 +9016:2:1849 +9017:2:1850 +9018:2:1858 +9019:2:1859 +9020:2:1863 +9021:2:1864 +9022:2:1858 +9023:2:1859 +9024:2:1863 +9025:2:1864 +9026:2:1872 +9027:2:1877 +9028:2:1881 +9029:2:1882 +9030:2:1889 +9031:2:1890 +9032:2:1901 +9033:2:1902 +9034:2:1903 +9035:2:1901 +9036:2:1902 +9037:2:1903 +9038:2:1914 +9039:2:1919 +9040:2:1920 +9041:0:4365 +9042:2:1932 +9043:0:4365 +9044:3:2843 +9045:0:4365 +9046:2:1934 +9047:0:4365 +9048:3:2844 +9049:0:4365 +9050:2:1935 +9051:0:4365 +9052:2:1936 +9053:0:4365 +9054:2:2129 +9055:0:4365 +9056:2:2130 +9057:0:4365 +9058:2:2134 +9059:0:4365 +9060:3:2843 +9061:0:4365 +9062:2:2136 +9063:0:4365 +9064:3:2844 +9065:0:4365 +9066:2:2137 +9067:2:2141 +9068:2:2142 +9069:2:2150 +9070:2:2151 +9071:2:2155 +9072:2:2156 +9073:2:2150 +9074:2:2151 +9075:2:2155 +9076:2:2156 +9077:2:2164 +9078:2:2169 +9079:2:2173 +9080:2:2174 +9081:2:2181 +9082:2:2182 +9083:2:2193 +9084:2:2194 +9085:2:2195 +9086:2:2193 +9087:2:2194 +9088:2:2195 +9089:2:2206 +9090:2:2211 +9091:2:2212 +9092:0:4365 +9093:2:2224 +9094:0:4365 +9095:3:2843 +9096:0:4365 +9097:2:2226 +9098:0:4365 +9099:3:2844 +9100:0:4365 +9101:2:1936 +9102:0:4365 +9103:2:2129 +9104:0:4365 +9105:2:2130 +9106:0:4365 +9107:2:2134 +9108:0:4365 +9109:3:2843 +9110:0:4365 +9111:2:2136 +9112:0:4365 +9113:3:2844 +9114:0:4365 +9115:2:2137 +9116:2:2141 +9117:2:2142 +9118:2:2150 +9119:2:2151 +9120:2:2155 +9121:2:2156 +9122:2:2150 +9123:2:2151 +9124:2:2152 +9125:2:2164 +9126:2:2169 +9127:2:2173 +9128:2:2174 +9129:2:2181 +9130:2:2182 +9131:2:2193 +9132:2:2194 +9133:2:2195 +9134:2:2193 +9135:2:2194 +9136:2:2195 +9137:2:2206 +9138:2:2211 +9139:2:2212 +9140:0:4365 +9141:2:2224 +9142:0:4365 +9143:3:2843 +9144:0:4365 +9145:2:2226 +9146:0:4365 +9147:3:2844 +9148:0:4365 +9149:2:2230 +9150:0:4365 +9151:3:2843 +9152:0:4365 +9153:2:2235 +9154:2:2239 +9155:2:2240 +9156:2:2248 +9157:2:2249 +9158:2:2253 +9159:2:2254 +9160:2:2248 +9161:2:2249 +9162:2:2250 +9163:2:2262 +9164:2:2267 +9165:2:2271 +9166:2:2272 +9167:2:2279 +9168:2:2280 +9169:2:2291 +9170:2:2292 +9171:2:2293 +9172:2:2291 +9173:2:2292 +9174:2:2293 +9175:2:2304 +9176:2:2309 +9177:2:2310 +9178:0:4365 +9179:3:2844 +9180:0:4365 +9181:2:2322 +9182:0:4365 +9183:2:1169 +9184:0:4365 +9185:3:2843 +9186:0:4365 +9187:2:1170 +9188:0:4365 +9189:3:2844 +9190:0:4365 +9191:3:2845 +9192:0:4365 +9193:3:2851 +9194:0:4365 +9195:3:2854 +9196:3:2855 +9197:3:2867 +9198:3:2868 +9199:3:2872 +9200:3:2873 +9201:3:2867 +9202:3:2868 +9203:3:2872 +9204:3:2873 +9205:3:2881 +9206:3:2886 +9207:3:2890 +9208:3:2891 +9209:3:2898 +9210:3:2899 +9211:3:2910 +9212:3:2911 +9213:3:2912 +9214:3:2910 +9215:3:2911 +9216:3:2912 +9217:3:2923 +9218:3:2928 +9219:3:2929 +9220:0:4365 +9221:3:2941 +9222:0:4365 +9223:3:2942 +9224:0:4365 +9225:2:1173 +9226:0:4365 +9227:3:2943 +9228:0:4365 +9229:2:1179 +9230:0:4365 +9231:2:1180 +9232:0:4365 +9233:3:2942 +9234:0:4365 +9235:2:1181 +9236:2:1185 +9237:2:1186 +9238:2:1194 +9239:2:1195 +9240:2:1199 +9241:2:1200 +9242:2:1194 +9243:2:1195 +9244:2:1199 +9245:2:1200 +9246:2:1208 +9247:2:1213 +9248:2:1217 +9249:2:1218 +9250:2:1225 +9251:2:1226 +9252:2:1237 +9253:2:1238 +9254:2:1239 +9255:2:1237 +9256:2:1238 +9257:2:1239 +9258:2:1250 +9259:2:1255 +9260:2:1256 +9261:0:4365 +9262:3:2943 +9263:0:4365 +9264:2:1268 +9265:0:4365 +9266:3:2942 +9267:0:4365 +9268:2:1270 +9269:0:4365 +9270:3:2943 +9271:0:4365 +9272:2:1271 +9273:2:1275 +9274:2:1276 +9275:2:1284 +9276:2:1285 +9277:2:1289 +9278:2:1290 +9279:2:1284 +9280:2:1285 +9281:2:1289 +9282:2:1290 +9283:2:1298 +9284:2:1303 +9285:2:1307 +9286:2:1308 +9287:2:1315 +9288:2:1316 +9289:2:1327 +9290:2:1328 +9291:2:1329 +9292:2:1327 +9293:2:1328 +9294:2:1329 +9295:2:1340 +9296:2:1345 +9297:2:1346 +9298:0:4365 +9299:2:1358 +9300:0:4365 +9301:2:1360 +9302:0:4365 +9303:3:2942 +9304:0:4365 +9305:2:1361 +9306:0:4365 +9307:3:2943 +9308:0:4365 +9309:2:1362 +9310:2:1366 +9311:2:1367 +9312:2:1375 +9313:2:1376 +9314:2:1380 +9315:2:1381 +9316:2:1375 +9317:2:1376 +9318:2:1380 +9319:2:1381 +9320:2:1389 +9321:2:1394 +9322:2:1398 +9323:2:1399 +9324:2:1406 +9325:2:1407 +9326:2:1418 +9327:2:1419 +9328:2:1420 +9329:2:1418 +9330:2:1419 +9331:2:1420 +9332:2:1431 +9333:2:1436 +9334:2:1437 +9335:0:4365 +9336:2:1449 +9337:0:4365 +9338:3:2942 +9339:0:4365 +9340:2:1451 +9341:0:4365 +9342:3:2943 +9343:0:4365 +9344:2:1652 +9345:0:4365 +9346:2:1653 +9347:0:4365 +9348:2:1657 +9349:0:4365 +9350:2:1180 +9351:0:4365 +9352:3:2942 +9353:0:4365 +9354:2:1181 +9355:2:1185 +9356:2:1186 +9357:2:1194 +9358:2:1195 +9359:2:1199 +9360:2:1200 +9361:2:1194 +9362:2:1195 +9363:2:1196 +9364:2:1208 +9365:2:1213 +9366:2:1217 +9367:2:1218 +9368:2:1225 +9369:2:1226 +9370:2:1237 +9371:2:1238 +9372:2:1239 +9373:2:1237 +9374:2:1238 +9375:2:1239 +9376:2:1250 +9377:2:1255 +9378:2:1256 +9379:0:4365 +9380:3:2943 +9381:0:4365 +9382:2:1268 +9383:0:4365 +9384:3:2942 +9385:0:4365 +9386:2:1270 +9387:0:4365 +9388:3:2943 +9389:0:4365 +9390:2:1271 +9391:2:1275 +9392:2:1276 +9393:2:1284 +9394:2:1285 +9395:2:1289 +9396:2:1290 +9397:2:1284 +9398:2:1285 +9399:2:1289 +9400:2:1290 +9401:2:1298 +9402:2:1303 +9403:2:1307 +9404:2:1308 +9405:2:1315 +9406:2:1316 +9407:2:1327 +9408:2:1328 +9409:2:1329 +9410:2:1327 +9411:2:1328 +9412:2:1329 +9413:2:1340 +9414:2:1345 +9415:2:1346 +9416:0:4365 +9417:2:1358 +9418:0:4365 +9419:2:1454 +9420:0:4365 +9421:3:2942 +9422:0:4365 +9423:2:1455 +9424:0:4365 +9425:3:2943 +9426:0:4365 +9427:2:1652 +9428:0:4365 +9429:2:1653 +9430:0:4365 +9431:2:1657 +9432:0:4365 +9433:2:1660 +9434:0:4365 +9435:3:2942 +9436:0:4365 +9437:2:1665 +9438:2:1669 +9439:2:1670 +9440:2:1678 +9441:2:1679 +9442:2:1683 +9443:2:1684 +9444:2:1678 +9445:2:1679 +9446:2:1680 +9447:2:1692 +9448:2:1697 +9449:2:1701 +9450:2:1702 +9451:2:1709 +9452:2:1710 +9453:2:1721 +9454:2:1722 +9455:2:1723 +9456:2:1721 +9457:2:1722 +9458:2:1723 +9459:2:1734 +9460:2:1739 +9461:2:1740 +9462:0:4365 +9463:3:2943 +9464:0:4365 +9465:2:1752 +9466:0:4365 +9467:3:2942 +9468:0:4365 +9469:2:1754 +9470:0:4365 +9471:3:2943 +9472:0:4365 +9473:2:1755 +9474:2:1759 +9475:2:1760 +9476:2:1768 +9477:2:1769 +9478:2:1773 +9479:2:1774 +9480:2:1768 +9481:2:1769 +9482:2:1773 +9483:2:1774 +9484:2:1782 +9485:2:1787 +9486:2:1791 +9487:2:1792 +9488:2:1799 +9489:2:1800 +9490:2:1811 +9491:2:1812 +9492:2:1813 +9493:2:1811 +9494:2:1812 +9495:2:1813 +9496:2:1824 +9497:2:1829 +9498:2:1830 +9499:0:4365 +9500:2:1842 +9501:0:4365 +9502:3:2942 +9503:0:4365 +9504:2:1844 +9505:0:4365 +9506:3:2943 +9507:0:4365 +9508:2:1845 +9509:2:1849 +9510:2:1850 +9511:2:1858 +9512:2:1859 +9513:2:1863 +9514:2:1864 +9515:2:1858 +9516:2:1859 +9517:2:1863 +9518:2:1864 +9519:2:1872 +9520:2:1877 +9521:2:1881 +9522:2:1882 +9523:2:1889 +9524:2:1890 +9525:2:1901 +9526:2:1902 +9527:2:1903 +9528:2:1901 +9529:2:1902 +9530:2:1903 +9531:2:1914 +9532:2:1919 +9533:2:1920 +9534:0:4365 +9535:2:1932 +9536:0:4365 +9537:3:2942 +9538:0:4365 +9539:2:1934 +9540:0:4365 +9541:3:2943 +9542:0:4365 +9543:2:1935 +9544:0:4365 +9545:2:1936 +9546:0:4365 +9547:2:2129 +9548:0:4365 +9549:2:2130 +9550:0:4365 +9551:2:2134 +9552:0:4365 +9553:3:2942 +9554:0:4365 +9555:2:2136 +9556:0:4365 +9557:3:2943 +9558:0:4365 +9559:2:2137 +9560:2:2141 +9561:2:2142 +9562:2:2150 +9563:2:2151 +9564:2:2155 +9565:2:2156 +9566:2:2150 +9567:2:2151 +9568:2:2155 +9569:2:2156 +9570:2:2164 +9571:2:2169 +9572:2:2173 +9573:2:2174 +9574:2:2181 +9575:2:2182 +9576:2:2193 +9577:2:2194 +9578:2:2195 +9579:2:2193 +9580:2:2194 +9581:2:2195 +9582:2:2206 +9583:2:2211 +9584:2:2212 +9585:0:4365 +9586:2:2224 +9587:0:4365 +9588:3:2942 +9589:0:4365 +9590:2:2226 +9591:0:4365 +9592:3:2943 +9593:0:4365 +9594:2:1936 +9595:0:4365 +9596:2:2129 +9597:0:4365 +9598:2:2130 +9599:0:4365 +9600:2:2134 +9601:0:4365 +9602:3:2942 +9603:0:4365 +9604:2:2136 +9605:0:4365 +9606:3:2943 +9607:0:4365 +9608:2:2137 +9609:2:2141 +9610:2:2142 +9611:2:2150 +9612:2:2151 +9613:2:2155 +9614:2:2156 +9615:2:2150 +9616:2:2151 +9617:2:2152 +9618:2:2164 +9619:2:2169 +9620:2:2173 +9621:2:2174 +9622:2:2181 +9623:2:2182 +9624:2:2193 +9625:2:2194 +9626:2:2195 +9627:2:2193 +9628:2:2194 +9629:2:2195 +9630:2:2206 +9631:2:2211 +9632:2:2212 +9633:0:4365 +9634:2:2224 +9635:0:4365 +9636:3:2942 +9637:0:4365 +9638:2:2226 +9639:0:4365 +9640:3:2943 +9641:0:4365 +9642:2:2230 +9643:0:4365 +9644:3:2942 +9645:0:4365 +9646:2:2235 +9647:2:2239 +9648:2:2240 +9649:2:2248 +9650:2:2249 +9651:2:2253 +9652:2:2254 +9653:2:2248 +9654:2:2249 +9655:2:2250 +9656:2:2262 +9657:2:2267 +9658:2:2271 +9659:2:2272 +9660:2:2279 +9661:2:2280 +9662:2:2291 +9663:2:2292 +9664:2:2293 +9665:2:2291 +9666:2:2292 +9667:2:2293 +9668:2:2304 +9669:2:2309 +9670:2:2310 +9671:0:4365 +9672:3:2943 +9673:0:4365 +9674:2:2322 +9675:0:4365 +9676:2:1169 +9677:0:4365 +9678:3:2942 +9679:0:4365 +9680:2:1170 +9681:0:4365 +9682:3:2943 +9683:0:4365 +9684:3:2944 +9685:0:4365 +9686:3:2950 +9687:0:4365 +9688:3:2951 +9689:0:4365 +9690:3:2952 +9691:0:4365 +9692:3:2953 +9693:0:4365 +9694:3:2954 +9695:3:2958 +9696:3:2959 +9697:3:2967 +9698:3:2968 +9699:3:2972 +9700:3:2973 +9701:3:2967 +9702:3:2968 +9703:3:2972 +9704:3:2973 +9705:3:2981 +9706:3:2986 +9707:3:2990 +9708:3:2991 +9709:3:2998 +9710:3:2999 +9711:3:3010 +9712:3:3011 +9713:3:3012 +9714:3:3010 +9715:3:3011 +9716:3:3012 +9717:3:3023 +9718:3:3028 +9719:3:3029 +9720:0:4365 +9721:3:3041 +9722:0:4365 +9723:3:3042 +9724:0:4365 +9725:2:1173 +9726:0:4365 +9727:3:3043 +9728:0:4365 +9729:2:1179 +9730:0:4365 +9731:2:1180 +9732:0:4365 +9733:3:3042 +9734:0:4365 +9735:2:1181 +9736:2:1185 +9737:2:1186 +9738:2:1194 +9739:2:1195 +9740:2:1199 +9741:2:1200 +9742:2:1194 +9743:2:1195 +9744:2:1199 +9745:2:1200 +9746:2:1208 +9747:2:1213 +9748:2:1217 +9749:2:1218 +9750:2:1225 +9751:2:1226 +9752:2:1237 +9753:2:1238 +9754:2:1239 +9755:2:1237 +9756:2:1238 +9757:2:1239 +9758:2:1250 +9759:2:1255 +9760:2:1256 +9761:0:4365 +9762:3:3043 +9763:0:4365 +9764:2:1268 +9765:0:4365 +9766:3:3042 +9767:0:4365 +9768:2:1270 +9769:0:4365 +9770:3:3043 +9771:0:4365 +9772:2:1271 +9773:2:1275 +9774:2:1276 +9775:2:1284 +9776:2:1285 +9777:2:1289 +9778:2:1290 +9779:2:1284 +9780:2:1285 +9781:2:1289 +9782:2:1290 +9783:2:1298 +9784:2:1303 +9785:2:1307 +9786:2:1308 +9787:2:1315 +9788:2:1316 +9789:2:1327 +9790:2:1328 +9791:2:1329 +9792:2:1327 +9793:2:1328 +9794:2:1329 +9795:2:1340 +9796:2:1345 +9797:2:1346 +9798:0:4365 +9799:2:1358 +9800:0:4365 +9801:2:1360 +9802:0:4365 +9803:3:3042 +9804:0:4365 +9805:2:1361 +9806:0:4365 +9807:3:3043 +9808:0:4365 +9809:2:1362 +9810:2:1366 +9811:2:1367 +9812:2:1375 +9813:2:1376 +9814:2:1380 +9815:2:1381 +9816:2:1375 +9817:2:1376 +9818:2:1380 +9819:2:1381 +9820:2:1389 +9821:2:1394 +9822:2:1398 +9823:2:1399 +9824:2:1406 +9825:2:1407 +9826:2:1418 +9827:2:1419 +9828:2:1420 +9829:2:1418 +9830:2:1419 +9831:2:1420 +9832:2:1431 +9833:2:1436 +9834:2:1437 +9835:0:4365 +9836:2:1449 +9837:0:4365 +9838:3:3042 +9839:0:4365 +9840:2:1451 +9841:0:4365 +9842:3:3043 +9843:0:4365 +9844:2:1652 +9845:0:4365 +9846:2:1653 +9847:0:4365 +9848:2:1657 +9849:0:4365 +9850:2:1180 +9851:0:4365 +9852:3:3042 +9853:0:4365 +9854:2:1181 +9855:2:1185 +9856:2:1186 +9857:2:1194 +9858:2:1195 +9859:2:1199 +9860:2:1200 +9861:2:1194 +9862:2:1195 +9863:2:1196 +9864:2:1208 +9865:2:1213 +9866:2:1217 +9867:2:1218 +9868:2:1225 +9869:2:1226 +9870:2:1237 +9871:2:1238 +9872:2:1239 +9873:2:1237 +9874:2:1238 +9875:2:1239 +9876:2:1250 +9877:2:1255 +9878:2:1256 +9879:0:4365 +9880:3:3043 +9881:0:4365 +9882:2:1268 +9883:0:4365 +9884:3:3042 +9885:0:4365 +9886:2:1270 +9887:0:4365 +9888:3:3043 +9889:0:4365 +9890:2:1271 +9891:2:1275 +9892:2:1276 +9893:2:1284 +9894:2:1285 +9895:2:1289 +9896:2:1290 +9897:2:1284 +9898:2:1285 +9899:2:1289 +9900:2:1290 +9901:2:1298 +9902:2:1303 +9903:2:1307 +9904:2:1308 +9905:2:1315 +9906:2:1316 +9907:2:1327 +9908:2:1328 +9909:2:1329 +9910:2:1327 +9911:2:1328 +9912:2:1329 +9913:2:1340 +9914:2:1345 +9915:2:1346 +9916:0:4365 +9917:2:1358 +9918:0:4365 +9919:2:1454 +9920:0:4365 +9921:3:3042 +9922:0:4365 +9923:2:1455 +9924:0:4365 +9925:3:3043 +9926:0:4365 +9927:2:1652 +9928:0:4365 +9929:2:1653 +9930:0:4365 +9931:2:1657 +9932:0:4365 +9933:2:1660 +9934:0:4365 +9935:3:3042 +9936:0:4365 +9937:2:1665 +9938:2:1669 +9939:2:1670 +9940:2:1678 +9941:2:1679 +9942:2:1683 +9943:2:1684 +9944:2:1678 +9945:2:1679 +9946:2:1680 +9947:2:1692 +9948:2:1697 +9949:2:1701 +9950:2:1702 +9951:2:1709 +9952:2:1710 +9953:2:1721 +9954:2:1722 +9955:2:1723 +9956:2:1721 +9957:2:1722 +9958:2:1723 +9959:2:1734 +9960:2:1739 +9961:2:1740 +9962:0:4365 +9963:3:3043 +9964:0:4365 +9965:2:1752 +9966:0:4365 +9967:3:3042 +9968:0:4365 +9969:2:1754 +9970:0:4365 +9971:3:3043 +9972:0:4365 +9973:2:1755 +9974:2:1759 +9975:2:1760 +9976:2:1768 +9977:2:1769 +9978:2:1773 +9979:2:1774 +9980:2:1768 +9981:2:1769 +9982:2:1773 +9983:2:1774 +9984:2:1782 +9985:2:1787 +9986:2:1791 +9987:2:1792 +9988:2:1799 +9989:2:1800 +9990:2:1811 +9991:2:1812 +9992:2:1813 +9993:2:1811 +9994:2:1812 +9995:2:1813 +9996:2:1824 +9997:2:1829 +9998:2:1830 +9999:0:4365 +10000:2:1842 +10001:0:4365 +10002:3:3042 +10003:0:4365 +10004:2:1844 +10005:0:4365 +10006:3:3043 +10007:0:4365 +10008:2:1845 +10009:2:1849 +10010:2:1850 +10011:2:1858 +10012:2:1859 +10013:2:1863 +10014:2:1864 +10015:2:1858 +10016:2:1859 +10017:2:1863 +10018:2:1864 +10019:2:1872 +10020:2:1877 +10021:2:1881 +10022:2:1882 +10023:2:1889 +10024:2:1890 +10025:2:1901 +10026:2:1902 +10027:2:1903 +10028:2:1901 +10029:2:1902 +10030:2:1903 +10031:2:1914 +10032:2:1919 +10033:2:1920 +10034:0:4365 +10035:2:1932 +10036:0:4365 +10037:3:3042 +10038:0:4365 +10039:2:1934 +10040:0:4365 +10041:3:3043 +10042:0:4365 +10043:2:1935 +10044:0:4365 +10045:2:1936 +10046:0:4365 +10047:2:2129 +10048:0:4365 +10049:2:2130 +10050:0:4365 +10051:2:2134 +10052:0:4365 +10053:3:3042 +10054:0:4365 +10055:2:2136 +10056:0:4365 +10057:3:3043 +10058:0:4365 +10059:2:2137 +10060:2:2141 +10061:2:2142 +10062:2:2150 +10063:2:2151 +10064:2:2155 +10065:2:2156 +10066:2:2150 +10067:2:2151 +10068:2:2155 +10069:2:2156 +10070:2:2164 +10071:2:2169 +10072:2:2173 +10073:2:2174 +10074:2:2181 +10075:2:2182 +10076:2:2193 +10077:2:2194 +10078:2:2195 +10079:2:2193 +10080:2:2194 +10081:2:2195 +10082:2:2206 +10083:2:2211 +10084:2:2212 +10085:0:4365 +10086:2:2224 +10087:0:4365 +10088:3:3042 +10089:0:4365 +10090:2:2226 +10091:0:4365 +10092:3:3043 +10093:0:4365 +10094:2:1936 +10095:0:4365 +10096:2:2129 +10097:0:4365 +10098:2:2130 +10099:0:4365 +10100:2:2134 +10101:0:4365 +10102:3:3042 +10103:0:4365 +10104:2:2136 +10105:0:4365 +10106:3:3043 +10107:0:4365 +10108:2:2137 +10109:2:2141 +10110:2:2142 +10111:2:2150 +10112:2:2151 +10113:2:2155 +10114:2:2156 +10115:2:2150 +10116:2:2151 +10117:2:2152 +10118:2:2164 +10119:2:2169 +10120:2:2173 +10121:2:2174 +10122:2:2181 +10123:2:2182 +10124:2:2193 +10125:2:2194 +10126:2:2195 +10127:2:2193 +10128:2:2194 +10129:2:2195 +10130:2:2206 +10131:2:2211 +10132:2:2212 +10133:0:4365 +10134:2:2224 +10135:0:4365 +10136:3:3042 +10137:0:4365 +10138:2:2226 +10139:0:4365 +10140:3:3043 +10141:0:4365 +10142:2:2230 +10143:0:4365 +10144:3:3042 +10145:0:4365 +10146:2:2235 +10147:2:2239 +10148:2:2240 +10149:2:2248 +10150:2:2249 +10151:2:2253 +10152:2:2254 +10153:2:2248 +10154:2:2249 +10155:2:2250 +10156:2:2262 +10157:2:2267 +10158:2:2271 +10159:2:2272 +10160:2:2279 +10161:2:2280 +10162:2:2291 +10163:2:2292 +10164:2:2293 +10165:2:2291 +10166:2:2292 +10167:2:2293 +10168:2:2304 +10169:2:2309 +10170:2:2310 +10171:0:4365 +10172:3:3043 +10173:0:4365 +10174:2:2322 +10175:0:4365 +10176:2:1169 +10177:0:4365 +10178:3:3042 +10179:0:4365 +10180:2:1170 +10181:0:4365 +10182:3:3043 +10183:0:4365 +10184:3:3044 +10185:0:4365 +10186:3:3257 +10187:0:4365 +10188:3:3265 +10189:0:4365 +10190:3:3266 +10191:3:3270 +10192:3:3271 +10193:3:3279 +10194:3:3280 +10195:3:3284 +10196:3:3285 +10197:3:3279 +10198:3:3280 +10199:3:3284 +10200:3:3285 +10201:3:3293 +10202:3:3298 +10203:3:3302 +10204:3:3303 +10205:3:3310 +10206:3:3311 +10207:3:3322 +10208:3:3323 +10209:3:3324 +10210:3:3322 +10211:3:3323 +10212:3:3324 +10213:3:3335 +10214:3:3340 +10215:3:3341 +10216:0:4365 +10217:3:3353 +10218:0:4365 +10219:3:3354 +10220:0:4365 +10221:2:1173 +10222:0:4365 +10223:3:3355 +10224:0:4365 +10225:2:1179 +10226:0:4365 +10227:2:1180 +10228:0:4365 +10229:3:3354 +10230:0:4365 +10231:2:1181 +10232:2:1185 +10233:2:1186 +10234:2:1194 +10235:2:1195 +10236:2:1199 +10237:2:1200 +10238:2:1194 +10239:2:1195 +10240:2:1199 +10241:2:1200 +10242:2:1208 +10243:2:1213 +10244:2:1217 +10245:2:1218 +10246:2:1225 +10247:2:1226 +10248:2:1237 +10249:2:1238 +10250:2:1239 +10251:2:1237 +10252:2:1238 +10253:2:1239 +10254:2:1250 +10255:2:1255 +10256:2:1256 +10257:0:4365 +10258:3:3355 +10259:0:4365 +10260:2:1268 +10261:0:4365 +10262:3:3354 +10263:0:4365 +10264:2:1270 +10265:0:4365 +10266:3:3355 +10267:0:4365 +10268:2:1271 +10269:2:1275 +10270:2:1276 +10271:2:1284 +10272:2:1285 +10273:2:1289 +10274:2:1290 +10275:2:1284 +10276:2:1285 +10277:2:1289 +10278:2:1290 +10279:2:1298 +10280:2:1303 +10281:2:1307 +10282:2:1308 +10283:2:1315 +10284:2:1316 +10285:2:1327 +10286:2:1328 +10287:2:1329 +10288:2:1327 +10289:2:1328 +10290:2:1329 +10291:2:1340 +10292:2:1345 +10293:2:1346 +10294:0:4365 +10295:2:1358 +10296:0:4365 +10297:2:1360 +10298:0:4365 +10299:3:3354 +10300:0:4365 +10301:2:1361 +10302:0:4365 +10303:3:3355 +10304:0:4365 +10305:2:1362 +10306:2:1366 +10307:2:1367 +10308:2:1375 +10309:2:1376 +10310:2:1380 +10311:2:1381 +10312:2:1375 +10313:2:1376 +10314:2:1380 +10315:2:1381 +10316:2:1389 +10317:2:1394 +10318:2:1398 +10319:2:1399 +10320:2:1406 +10321:2:1407 +10322:2:1418 +10323:2:1419 +10324:2:1420 +10325:2:1418 +10326:2:1419 +10327:2:1420 +10328:2:1431 +10329:2:1436 +10330:2:1437 +10331:0:4365 +10332:2:1449 +10333:0:4365 +10334:3:3354 +10335:0:4365 +10336:2:1451 +10337:0:4365 +10338:3:3355 +10339:0:4365 +10340:2:1652 +10341:0:4365 +10342:2:1653 +10343:0:4365 +10344:2:1657 +10345:0:4365 +10346:2:1180 +10347:0:4365 +10348:3:3354 +10349:0:4365 +10350:2:1181 +10351:2:1185 +10352:2:1186 +10353:2:1194 +10354:2:1195 +10355:2:1199 +10356:2:1200 +10357:2:1194 +10358:2:1195 +10359:2:1196 +10360:2:1208 +10361:2:1213 +10362:2:1217 +10363:2:1218 +10364:2:1225 +10365:2:1226 +10366:2:1237 +10367:2:1238 +10368:2:1239 +10369:2:1237 +10370:2:1238 +10371:2:1239 +10372:2:1250 +10373:2:1255 +10374:2:1256 +10375:0:4365 +10376:3:3355 +10377:0:4365 +10378:2:1268 +10379:0:4365 +10380:3:3354 +10381:0:4365 +10382:2:1270 +10383:0:4365 +10384:3:3355 +10385:0:4365 +10386:2:1271 +10387:2:1275 +10388:2:1276 +10389:2:1284 +10390:2:1285 +10391:2:1289 +10392:2:1290 +10393:2:1284 +10394:2:1285 +10395:2:1289 +10396:2:1290 +10397:2:1298 +10398:2:1303 +10399:2:1307 +10400:2:1308 +10401:2:1315 +10402:2:1316 +10403:2:1327 +10404:2:1328 +10405:2:1329 +10406:2:1327 +10407:2:1328 +10408:2:1329 +10409:2:1340 +10410:2:1345 +10411:2:1346 +10412:0:4365 +10413:2:1358 +10414:0:4365 +10415:2:1454 +10416:0:4365 +10417:3:3354 +10418:0:4365 +10419:2:1455 +10420:0:4365 +10421:3:3355 +10422:0:4365 +10423:2:1652 +10424:0:4365 +10425:2:1653 +10426:0:4365 +10427:2:1657 +10428:0:4365 +10429:2:1660 +10430:0:4365 +10431:3:3354 +10432:0:4365 +10433:2:1665 +10434:2:1669 +10435:2:1670 +10436:2:1678 +10437:2:1679 +10438:2:1683 +10439:2:1684 +10440:2:1678 +10441:2:1679 +10442:2:1680 +10443:2:1692 +10444:2:1697 +10445:2:1701 +10446:2:1702 +10447:2:1709 +10448:2:1710 +10449:2:1721 +10450:2:1722 +10451:2:1723 +10452:2:1721 +10453:2:1722 +10454:2:1723 +10455:2:1734 +10456:2:1739 +10457:2:1740 +10458:0:4365 +10459:3:3355 +10460:0:4365 +10461:2:1752 +10462:0:4365 +10463:3:3354 +10464:0:4365 +10465:2:1754 +10466:0:4365 +10467:3:3355 +10468:0:4365 +10469:2:1755 +10470:2:1759 +10471:2:1760 +10472:2:1768 +10473:2:1769 +10474:2:1773 +10475:2:1774 +10476:2:1768 +10477:2:1769 +10478:2:1773 +10479:2:1774 +10480:2:1782 +10481:2:1787 +10482:2:1791 +10483:2:1792 +10484:2:1799 +10485:2:1800 +10486:2:1811 +10487:2:1812 +10488:2:1813 +10489:2:1811 +10490:2:1812 +10491:2:1813 +10492:2:1824 +10493:2:1829 +10494:2:1830 +10495:0:4365 +10496:2:1842 +10497:0:4365 +10498:3:3354 +10499:0:4365 +10500:2:1844 +10501:0:4365 +10502:3:3355 +10503:0:4365 +10504:2:1845 +10505:2:1849 +10506:2:1850 +10507:2:1858 +10508:2:1859 +10509:2:1863 +10510:2:1864 +10511:2:1858 +10512:2:1859 +10513:2:1863 +10514:2:1864 +10515:2:1872 +10516:2:1877 +10517:2:1881 +10518:2:1882 +10519:2:1889 +10520:2:1890 +10521:2:1901 +10522:2:1902 +10523:2:1903 +10524:2:1901 +10525:2:1902 +10526:2:1903 +10527:2:1914 +10528:2:1919 +10529:2:1920 +10530:0:4365 +10531:2:1932 +10532:0:4365 +10533:3:3354 +10534:0:4365 +10535:2:1934 +10536:0:4365 +10537:3:3355 +10538:0:4365 +10539:2:1935 +10540:0:4365 +10541:2:1936 +10542:0:4365 +10543:2:2129 +10544:0:4365 +10545:2:2130 +10546:0:4365 +10547:2:2134 +10548:0:4365 +10549:3:3354 +10550:0:4365 +10551:2:2136 +10552:0:4365 +10553:3:3355 +10554:0:4365 +10555:2:2137 +10556:2:2141 +10557:2:2142 +10558:2:2150 +10559:2:2151 +10560:2:2155 +10561:2:2156 +10562:2:2150 +10563:2:2151 +10564:2:2155 +10565:2:2156 +10566:2:2164 +10567:2:2169 +10568:2:2173 +10569:2:2174 +10570:2:2181 +10571:2:2182 +10572:2:2193 +10573:2:2194 +10574:2:2195 +10575:2:2193 +10576:2:2194 +10577:2:2195 +10578:2:2206 +10579:2:2211 +10580:2:2212 +10581:0:4365 +10582:2:2224 +10583:0:4365 +10584:3:3354 +10585:0:4365 +10586:2:2226 +10587:0:4365 +10588:3:3355 +10589:0:4365 +10590:2:1936 +10591:0:4365 +10592:2:2129 +10593:0:4365 +10594:2:2130 +10595:0:4365 +10596:2:2134 +10597:0:4365 +10598:3:3354 +10599:0:4365 +10600:2:2136 +10601:0:4365 +10602:3:3355 +10603:0:4365 +10604:2:2137 +10605:2:2141 +10606:2:2142 +10607:2:2150 +10608:2:2151 +10609:2:2155 +10610:2:2156 +10611:2:2150 +10612:2:2151 +10613:2:2152 +10614:2:2164 +10615:2:2169 +10616:2:2173 +10617:2:2174 +10618:2:2181 +10619:2:2182 +10620:2:2193 +10621:2:2194 +10622:2:2195 +10623:2:2193 +10624:2:2194 +10625:2:2195 +10626:2:2206 +10627:2:2211 +10628:2:2212 +10629:0:4365 +10630:2:2224 +10631:0:4365 +10632:3:3354 +10633:0:4365 +10634:2:2226 +10635:0:4365 +10636:3:3355 +10637:0:4365 +10638:2:2230 +10639:0:4365 +10640:3:3354 +10641:0:4365 +10642:2:2235 +10643:2:2239 +10644:2:2240 +10645:2:2248 +10646:2:2249 +10647:2:2253 +10648:2:2254 +10649:2:2248 +10650:2:2249 +10651:2:2250 +10652:2:2262 +10653:2:2267 +10654:2:2271 +10655:2:2272 +10656:2:2279 +10657:2:2280 +10658:2:2291 +10659:2:2292 +10660:2:2293 +10661:2:2291 +10662:2:2292 +10663:2:2293 +10664:2:2304 +10665:2:2309 +10666:2:2310 +10667:0:4365 +10668:3:3355 +10669:0:4365 +10670:2:2322 +10671:0:4365 +10672:2:1169 +10673:0:4365 +10674:3:3354 +10675:0:4365 +10676:2:1170 +10677:0:4365 +10678:3:3355 +10679:0:4365 +10680:3:3356 +10681:0:4365 +10682:3:3366 +10683:0:4365 +10684:3:2951 +10685:0:4365 +10686:3:2952 +10687:0:4365 +10688:3:2953 +10689:0:4365 +10690:3:2954 +10691:3:2958 +10692:3:2959 +10693:3:2967 +10694:3:2968 +10695:3:2972 +10696:3:2973 +10697:3:2967 +10698:3:2968 +10699:3:2972 +10700:3:2973 +10701:3:2981 +10702:3:2986 +10703:3:2990 +10704:3:2991 +10705:3:2998 +10706:3:2999 +10707:3:3010 +10708:3:3011 +10709:3:3012 +10710:3:3010 +10711:3:3011 +10712:3:3012 +10713:3:3023 +10714:3:3028 +10715:3:3029 +10716:0:4365 +10717:3:3041 +10718:0:4365 +10719:3:3042 +10720:0:4365 +10721:2:1173 +10722:0:4365 +10723:3:3043 +10724:0:4365 +10725:2:1179 +10726:0:4365 +10727:2:1180 +10728:0:4365 +10729:3:3042 +10730:0:4365 +10731:2:1181 +10732:2:1185 +10733:2:1186 +10734:2:1194 +10735:2:1195 +10736:2:1199 +10737:2:1200 +10738:2:1194 +10739:2:1195 +10740:2:1199 +10741:2:1200 +10742:2:1208 +10743:2:1213 +10744:2:1217 +10745:2:1218 +10746:2:1225 +10747:2:1226 +10748:2:1237 +10749:2:1238 +10750:2:1239 +10751:2:1237 +10752:2:1238 +10753:2:1239 +10754:2:1250 +10755:2:1255 +10756:2:1256 +10757:0:4365 +10758:3:3043 +10759:0:4365 +10760:2:1268 +10761:0:4365 +10762:3:3042 +10763:0:4365 +10764:2:1270 +10765:0:4365 +10766:3:3043 +10767:0:4365 +10768:2:1271 +10769:2:1275 +10770:2:1276 +10771:2:1284 +10772:2:1285 +10773:2:1289 +10774:2:1290 +10775:2:1284 +10776:2:1285 +10777:2:1289 +10778:2:1290 +10779:2:1298 +10780:2:1303 +10781:2:1307 +10782:2:1308 +10783:2:1315 +10784:2:1316 +10785:2:1327 +10786:2:1328 +10787:2:1329 +10788:2:1327 +10789:2:1328 +10790:2:1329 +10791:2:1340 +10792:2:1345 +10793:2:1346 +10794:0:4365 +10795:2:1358 +10796:0:4365 +10797:2:1360 +10798:0:4365 +10799:3:3042 +10800:0:4365 +10801:2:1361 +10802:0:4365 +10803:3:3043 +10804:0:4365 +10805:2:1362 +10806:2:1366 +10807:2:1367 +10808:2:1375 +10809:2:1376 +10810:2:1380 +10811:2:1381 +10812:2:1375 +10813:2:1376 +10814:2:1380 +10815:2:1381 +10816:2:1389 +10817:2:1394 +10818:2:1398 +10819:2:1399 +10820:2:1406 +10821:2:1407 +10822:2:1418 +10823:2:1419 +10824:2:1420 +10825:2:1418 +10826:2:1419 +10827:2:1420 +10828:2:1431 +10829:2:1436 +10830:2:1437 +10831:0:4365 +10832:2:1449 +10833:0:4365 +10834:3:3042 +10835:0:4365 +10836:2:1451 +10837:0:4365 +10838:3:3043 +10839:0:4365 +10840:2:1652 +10841:0:4365 +10842:2:1653 +10843:0:4365 +10844:2:1657 +10845:0:4365 +10846:2:1180 +10847:0:4365 +10848:3:3042 +10849:0:4365 +10850:2:1181 +10851:2:1185 +10852:2:1186 +10853:2:1194 +10854:2:1195 +10855:2:1199 +10856:2:1200 +10857:2:1194 +10858:2:1195 +10859:2:1196 +10860:2:1208 +10861:2:1213 +10862:2:1217 +10863:2:1218 +10864:2:1225 +10865:2:1226 +10866:2:1237 +10867:2:1238 +10868:2:1239 +10869:2:1237 +10870:2:1238 +10871:2:1239 +10872:2:1250 +10873:2:1255 +10874:2:1256 +10875:0:4365 +10876:3:3043 +10877:0:4365 +10878:2:1268 +10879:0:4365 +10880:3:3042 +10881:0:4365 +10882:2:1270 +10883:0:4365 +10884:3:3043 +10885:0:4365 +10886:2:1271 +10887:2:1275 +10888:2:1276 +10889:2:1284 +10890:2:1285 +10891:2:1289 +10892:2:1290 +10893:2:1284 +10894:2:1285 +10895:2:1289 +10896:2:1290 +10897:2:1298 +10898:2:1303 +10899:2:1307 +10900:2:1308 +10901:2:1315 +10902:2:1316 +10903:2:1327 +10904:2:1328 +10905:2:1329 +10906:2:1327 +10907:2:1328 +10908:2:1329 +10909:2:1340 +10910:2:1345 +10911:2:1346 +10912:0:4365 +10913:2:1358 +10914:0:4365 +10915:2:1454 +10916:0:4365 +10917:3:3042 +10918:0:4365 +10919:2:1455 +10920:0:4365 +10921:3:3043 +10922:0:4365 +10923:2:1652 +10924:0:4365 +10925:2:1653 +10926:0:4365 +10927:2:1657 +10928:0:4365 +10929:2:1660 +10930:0:4365 +10931:3:3042 +10932:0:4365 +10933:2:1665 +10934:2:1669 +10935:2:1670 +10936:2:1678 +10937:2:1679 +10938:2:1683 +10939:2:1684 +10940:2:1678 +10941:2:1679 +10942:2:1680 +10943:2:1692 +10944:2:1697 +10945:2:1701 +10946:2:1702 +10947:2:1709 +10948:2:1710 +10949:2:1721 +10950:2:1722 +10951:2:1723 +10952:2:1721 +10953:2:1722 +10954:2:1723 +10955:2:1734 +10956:2:1739 +10957:2:1740 +10958:0:4365 +10959:3:3043 +10960:0:4365 +10961:2:1752 +10962:0:4365 +10963:3:3042 +10964:0:4365 +10965:2:1754 +10966:0:4365 +10967:3:3043 +10968:0:4365 +10969:2:1755 +10970:2:1759 +10971:2:1760 +10972:2:1768 +10973:2:1769 +10974:2:1773 +10975:2:1774 +10976:2:1768 +10977:2:1769 +10978:2:1773 +10979:2:1774 +10980:2:1782 +10981:2:1787 +10982:2:1791 +10983:2:1792 +10984:2:1799 +10985:2:1800 +10986:2:1811 +10987:2:1812 +10988:2:1813 +10989:2:1811 +10990:2:1812 +10991:2:1813 +10992:2:1824 +10993:2:1829 +10994:2:1830 +10995:0:4365 +10996:2:1842 +10997:0:4365 +10998:3:3042 +10999:0:4365 +11000:2:1844 +11001:0:4365 +11002:3:3043 +11003:0:4365 +11004:2:1845 +11005:2:1849 +11006:2:1850 +11007:2:1858 +11008:2:1859 +11009:2:1863 +11010:2:1864 +11011:2:1858 +11012:2:1859 +11013:2:1863 +11014:2:1864 +11015:2:1872 +11016:2:1877 +11017:2:1881 +11018:2:1882 +11019:2:1889 +11020:2:1890 +11021:2:1901 +11022:2:1902 +11023:2:1903 +11024:2:1901 +11025:2:1902 +11026:2:1903 +11027:2:1914 +11028:2:1919 +11029:2:1920 +11030:0:4365 +11031:2:1932 +11032:0:4365 +11033:3:3042 +11034:0:4365 +11035:2:1934 +11036:0:4365 +11037:3:3043 +11038:0:4365 +11039:2:1935 +11040:0:4365 +11041:2:1936 +11042:0:4365 +11043:2:2129 +11044:0:4365 +11045:2:2130 +11046:0:4365 +11047:2:2134 +11048:0:4365 +11049:3:3042 +11050:0:4365 +11051:2:2136 +11052:0:4365 +11053:3:3043 +11054:0:4365 +11055:2:2137 +11056:2:2141 +11057:2:2142 +11058:2:2150 +11059:2:2151 +11060:2:2155 +11061:2:2156 +11062:2:2150 +11063:2:2151 +11064:2:2155 +11065:2:2156 +11066:2:2164 +11067:2:2169 +11068:2:2173 +11069:2:2174 +11070:2:2181 +11071:2:2182 +11072:2:2193 +11073:2:2194 +11074:2:2195 +11075:2:2193 +11076:2:2194 +11077:2:2195 +11078:2:2206 +11079:2:2211 +11080:2:2212 +11081:0:4365 +11082:2:2224 +11083:0:4365 +11084:3:3042 +11085:0:4365 +11086:2:2226 +11087:0:4365 +11088:3:3043 +11089:0:4365 +11090:2:1936 +11091:0:4365 +11092:2:2129 +11093:0:4365 +11094:2:2130 +11095:0:4365 +11096:2:2134 +11097:0:4365 +11098:3:3042 +11099:0:4365 +11100:2:2136 +11101:0:4365 +11102:3:3043 +11103:0:4365 +11104:2:2137 +11105:2:2141 +11106:2:2142 +11107:2:2150 +11108:2:2151 +11109:2:2155 +11110:2:2156 +11111:2:2150 +11112:2:2151 +11113:2:2152 +11114:2:2164 +11115:2:2169 +11116:2:2173 +11117:2:2174 +11118:2:2181 +11119:2:2182 +11120:2:2193 +11121:2:2194 +11122:2:2195 +11123:2:2193 +11124:2:2194 +11125:2:2195 +11126:2:2206 +11127:2:2211 +11128:2:2212 +11129:0:4365 +11130:2:2224 +11131:0:4365 +11132:3:3042 +11133:0:4365 +11134:2:2226 +11135:0:4365 +11136:3:3043 +11137:0:4365 +11138:2:2230 +11139:0:4365 +11140:3:3042 +11141:0:4365 +11142:2:2235 +11143:2:2239 +11144:2:2240 +11145:2:2248 +11146:2:2249 +11147:2:2253 +11148:2:2254 +11149:2:2248 +11150:2:2249 +11151:2:2250 +11152:2:2262 +11153:2:2267 +11154:2:2271 +11155:2:2272 +11156:2:2279 +11157:2:2280 +11158:2:2291 +11159:2:2292 +11160:2:2293 +11161:2:2291 +11162:2:2292 +11163:2:2293 +11164:2:2304 +11165:2:2309 +11166:2:2310 +11167:0:4365 +11168:3:3043 +11169:0:4365 +11170:2:2322 +11171:0:4365 +11172:2:1169 +11173:0:4365 +11174:3:3042 +11175:0:4365 +11176:2:1170 +11177:0:4365 +11178:3:3043 +11179:0:4365 +11180:3:3044 +11181:0:4365 +11182:3:3257 +11183:0:4365 +11184:3:3362 +11185:0:4365 +11186:3:3363 +11187:0:4365 +11188:3:3367 +11189:0:4365 +11190:3:3373 +11191:3:3377 +11192:3:3378 +11193:3:3386 +11194:3:3387 +11195:3:3391 +11196:3:3392 +11197:3:3386 +11198:3:3387 +11199:3:3391 +11200:3:3392 +11201:3:3400 +11202:3:3405 +11203:3:3409 +11204:3:3410 +11205:3:3417 +11206:3:3418 +11207:3:3429 +11208:3:3430 +11209:3:3431 +11210:3:3429 +11211:3:3430 +11212:3:3431 +11213:3:3442 +11214:3:3447 +11215:3:3448 +11216:0:4365 +11217:3:3460 +11218:0:4365 +11219:3:3461 +11220:0:4365 +11221:2:1173 +11222:0:4365 +11223:3:3462 +11224:0:4365 +11225:2:1179 +11226:0:4365 +11227:2:1180 +11228:0:4365 +11229:3:3461 +11230:0:4365 +11231:2:1181 +11232:2:1185 +11233:2:1186 +11234:2:1194 +11235:2:1195 +11236:2:1199 +11237:2:1200 +11238:2:1194 +11239:2:1195 +11240:2:1199 +11241:2:1200 +11242:2:1208 +11243:2:1213 +11244:2:1217 +11245:2:1218 +11246:2:1225 +11247:2:1226 +11248:2:1237 +11249:2:1238 +11250:2:1239 +11251:2:1237 +11252:2:1238 +11253:2:1239 +11254:2:1250 +11255:2:1255 +11256:2:1256 +11257:0:4365 +11258:3:3462 +11259:0:4365 +11260:2:1268 +11261:0:4365 +11262:3:3461 +11263:0:4365 +11264:2:1270 +11265:0:4365 +11266:3:3462 +11267:0:4365 +11268:2:1271 +11269:2:1275 +11270:2:1276 +11271:2:1284 +11272:2:1285 +11273:2:1289 +11274:2:1290 +11275:2:1284 +11276:2:1285 +11277:2:1289 +11278:2:1290 +11279:2:1298 +11280:2:1303 +11281:2:1307 +11282:2:1308 +11283:2:1315 +11284:2:1316 +11285:2:1327 +11286:2:1328 +11287:2:1329 +11288:2:1327 +11289:2:1328 +11290:2:1329 +11291:2:1340 +11292:2:1345 +11293:2:1346 +11294:0:4365 +11295:2:1358 +11296:0:4365 +11297:2:1360 +11298:0:4365 +11299:3:3461 +11300:0:4365 +11301:2:1361 +11302:0:4365 +11303:3:3462 +11304:0:4365 +11305:2:1362 +11306:2:1366 +11307:2:1367 +11308:2:1375 +11309:2:1376 +11310:2:1380 +11311:2:1381 +11312:2:1375 +11313:2:1376 +11314:2:1380 +11315:2:1381 +11316:2:1389 +11317:2:1394 +11318:2:1398 +11319:2:1399 +11320:2:1406 +11321:2:1407 +11322:2:1418 +11323:2:1419 +11324:2:1420 +11325:2:1418 +11326:2:1419 +11327:2:1420 +11328:2:1431 +11329:2:1436 +11330:2:1437 +11331:0:4365 +11332:2:1449 +11333:0:4365 +11334:3:3461 +11335:0:4365 +11336:2:1451 +11337:0:4365 +11338:3:3462 +11339:0:4365 +11340:2:1652 +11341:0:4365 +11342:2:1653 +11343:0:4365 +11344:2:1657 +11345:0:4365 +11346:2:1180 +11347:0:4365 +11348:3:3461 +11349:0:4365 +11350:2:1181 +11351:2:1185 +11352:2:1186 +11353:2:1194 +11354:2:1195 +11355:2:1199 +11356:2:1200 +11357:2:1194 +11358:2:1195 +11359:2:1196 +11360:2:1208 +11361:2:1213 +11362:2:1217 +11363:2:1218 +11364:2:1225 +11365:2:1226 +11366:2:1237 +11367:2:1238 +11368:2:1239 +11369:2:1237 +11370:2:1238 +11371:2:1239 +11372:2:1250 +11373:2:1255 +11374:2:1256 +11375:0:4365 +11376:3:3462 +11377:0:4365 +11378:2:1268 +11379:0:4365 +11380:3:3461 +11381:0:4365 +11382:2:1270 +11383:0:4365 +11384:3:3462 +11385:0:4365 +11386:2:1271 +11387:2:1275 +11388:2:1276 +11389:2:1284 +11390:2:1285 +11391:2:1289 +11392:2:1290 +11393:2:1284 +11394:2:1285 +11395:2:1289 +11396:2:1290 +11397:2:1298 +11398:2:1303 +11399:2:1307 +11400:2:1308 +11401:2:1315 +11402:2:1316 +11403:2:1327 +11404:2:1328 +11405:2:1329 +11406:2:1327 +11407:2:1328 +11408:2:1329 +11409:2:1340 +11410:2:1345 +11411:2:1346 +11412:0:4365 +11413:2:1358 +11414:0:4365 +11415:2:1454 +11416:0:4365 +11417:3:3461 +11418:0:4365 +11419:2:1455 +11420:0:4365 +11421:3:3462 +11422:0:4365 +11423:2:1652 +11424:0:4365 +11425:2:1653 +11426:0:4365 +11427:2:1657 +11428:0:4365 +11429:2:1660 +11430:0:4365 +11431:3:3461 +11432:0:4365 +11433:2:1665 +11434:2:1669 +11435:2:1670 +11436:2:1678 +11437:2:1679 +11438:2:1683 +11439:2:1684 +11440:2:1678 +11441:2:1679 +11442:2:1680 +11443:2:1692 +11444:2:1697 +11445:2:1701 +11446:2:1702 +11447:2:1709 +11448:2:1710 +11449:2:1721 +11450:2:1722 +11451:2:1723 +11452:2:1721 +11453:2:1722 +11454:2:1723 +11455:2:1734 +11456:2:1739 +11457:2:1740 +11458:0:4365 +11459:3:3462 +11460:0:4365 +11461:2:1752 +11462:0:4365 +11463:3:3461 +11464:0:4365 +11465:2:1754 +11466:0:4365 +11467:3:3462 +11468:0:4365 +11469:2:1755 +11470:2:1759 +11471:2:1760 +11472:2:1768 +11473:2:1769 +11474:2:1773 +11475:2:1774 +11476:2:1768 +11477:2:1769 +11478:2:1773 +11479:2:1774 +11480:2:1782 +11481:2:1787 +11482:2:1791 +11483:2:1792 +11484:2:1799 +11485:2:1800 +11486:2:1811 +11487:2:1812 +11488:2:1813 +11489:2:1811 +11490:2:1812 +11491:2:1813 +11492:2:1824 +11493:2:1829 +11494:2:1830 +11495:0:4365 +11496:2:1842 +11497:0:4365 +11498:3:3461 +11499:0:4365 +11500:2:1844 +11501:0:4365 +11502:3:3462 +11503:0:4365 +11504:2:1845 +11505:2:1849 +11506:2:1850 +11507:2:1858 +11508:2:1859 +11509:2:1863 +11510:2:1864 +11511:2:1858 +11512:2:1859 +11513:2:1863 +11514:2:1864 +11515:2:1872 +11516:2:1877 +11517:2:1881 +11518:2:1882 +11519:2:1889 +11520:2:1890 +11521:2:1901 +11522:2:1902 +11523:2:1903 +11524:2:1901 +11525:2:1902 +11526:2:1903 +11527:2:1914 +11528:2:1919 +11529:2:1920 +11530:0:4365 +11531:2:1932 +11532:0:4365 +11533:3:3461 +11534:0:4365 +11535:2:1934 +11536:0:4365 +11537:3:3462 +11538:0:4365 +11539:2:1935 +11540:0:4365 +11541:2:1936 +11542:0:4365 +11543:2:2129 +11544:0:4365 +11545:2:2130 +11546:0:4365 +11547:2:2134 +11548:0:4365 +11549:3:3461 +11550:0:4365 +11551:2:2136 +11552:0:4365 +11553:3:3462 +11554:0:4365 +11555:2:2137 +11556:2:2141 +11557:2:2142 +11558:2:2150 +11559:2:2151 +11560:2:2155 +11561:2:2156 +11562:2:2150 +11563:2:2151 +11564:2:2155 +11565:2:2156 +11566:2:2164 +11567:2:2169 +11568:2:2173 +11569:2:2174 +11570:2:2181 +11571:2:2182 +11572:2:2193 +11573:2:2194 +11574:2:2195 +11575:2:2193 +11576:2:2194 +11577:2:2195 +11578:2:2206 +11579:2:2211 +11580:2:2212 +11581:0:4365 +11582:2:2224 +11583:0:4365 +11584:3:3461 +11585:0:4365 +11586:2:2226 +11587:0:4365 +11588:3:3462 +11589:0:4365 +11590:2:1936 +11591:0:4365 +11592:2:2129 +11593:0:4365 +11594:2:2130 +11595:0:4365 +11596:2:2134 +11597:0:4365 +11598:3:3461 +11599:0:4365 +11600:2:2136 +11601:0:4365 +11602:3:3462 +11603:0:4365 +11604:2:2137 +11605:2:2141 +11606:2:2142 +11607:2:2150 +11608:2:2151 +11609:2:2155 +11610:2:2156 +11611:2:2150 +11612:2:2151 +11613:2:2152 +11614:2:2164 +11615:2:2169 +11616:2:2173 +11617:2:2174 +11618:2:2181 +11619:2:2182 +11620:2:2193 +11621:2:2194 +11622:2:2195 +11623:2:2193 +11624:2:2194 +11625:2:2195 +11626:2:2206 +11627:2:2211 +11628:2:2212 +11629:0:4365 +11630:2:2224 +11631:0:4365 +11632:3:3461 +11633:0:4365 +11634:2:2226 +11635:0:4365 +11636:3:3462 +11637:0:4365 +11638:2:2230 +11639:0:4365 +11640:3:3461 +11641:0:4365 +11642:2:2235 +11643:2:2239 +11644:2:2240 +11645:2:2248 +11646:2:2249 +11647:2:2253 +11648:2:2254 +11649:2:2248 +11650:2:2249 +11651:2:2250 +11652:2:2262 +11653:2:2267 +11654:2:2271 +11655:2:2272 +11656:2:2279 +11657:2:2280 +11658:2:2291 +11659:2:2292 +11660:2:2293 +11661:2:2291 +11662:2:2292 +11663:2:2293 +11664:2:2304 +11665:2:2309 +11666:2:2310 +11667:0:4365 +11668:3:3462 +11669:0:4365 +11670:2:2322 +11671:0:4365 +11672:2:1169 +11673:0:4365 +11674:3:3461 +11675:0:4365 +11676:2:1170 +11677:0:4365 +11678:3:3462 +11679:0:4365 +11680:3:3463 +11681:0:4365 +11682:3:3469 +11683:0:4365 +11684:3:3470 +11685:3:3474 +11686:3:3475 +11687:3:3483 +11688:3:3484 +11689:3:3488 +11690:3:3489 +11691:3:3483 +11692:3:3484 +11693:3:3488 +11694:3:3489 +11695:3:3497 +11696:3:3502 +11697:3:3506 +11698:3:3507 +11699:3:3514 +11700:3:3515 +11701:3:3526 +11702:3:3527 +11703:3:3528 +11704:3:3526 +11705:3:3527 +11706:3:3528 +11707:3:3539 +11708:3:3544 +11709:3:3545 +11710:0:4365 +11711:3:3557 +11712:0:4365 +11713:3:3558 +11714:0:4365 +11715:2:1173 +11716:0:4365 +11717:3:3559 +11718:0:4365 +11719:2:1179 +11720:0:4365 +11721:2:1180 +11722:0:4365 +11723:3:3558 +11724:0:4365 +11725:2:1181 +11726:2:1185 +11727:2:1186 +11728:2:1194 +11729:2:1195 +11730:2:1199 +11731:2:1200 +11732:2:1194 +11733:2:1195 +11734:2:1199 +11735:2:1200 +11736:2:1208 +11737:2:1213 +11738:2:1217 +11739:2:1218 +11740:2:1225 +11741:2:1226 +11742:2:1237 +11743:2:1238 +11744:2:1239 +11745:2:1237 +11746:2:1238 +11747:2:1239 +11748:2:1250 +11749:2:1255 +11750:2:1256 +11751:0:4365 +11752:3:3559 +11753:0:4365 +11754:2:1268 +11755:0:4365 +11756:3:3558 +11757:0:4365 +11758:2:1270 +11759:0:4365 +11760:3:3559 +11761:0:4365 +11762:2:1271 +11763:2:1275 +11764:2:1276 +11765:2:1284 +11766:2:1285 +11767:2:1289 +11768:2:1290 +11769:2:1284 +11770:2:1285 +11771:2:1289 +11772:2:1290 +11773:2:1298 +11774:2:1303 +11775:2:1307 +11776:2:1308 +11777:2:1315 +11778:2:1316 +11779:2:1327 +11780:2:1328 +11781:2:1329 +11782:2:1327 +11783:2:1328 +11784:2:1329 +11785:2:1340 +11786:2:1345 +11787:2:1346 +11788:0:4365 +11789:2:1358 +11790:0:4365 +11791:2:1360 +11792:0:4365 +11793:3:3558 +11794:0:4365 +11795:2:1361 +11796:0:4365 +11797:3:3559 +11798:0:4365 +11799:2:1362 +11800:2:1366 +11801:2:1367 +11802:2:1375 +11803:2:1376 +11804:2:1380 +11805:2:1381 +11806:2:1375 +11807:2:1376 +11808:2:1380 +11809:2:1381 +11810:2:1389 +11811:2:1394 +11812:2:1398 +11813:2:1399 +11814:2:1406 +11815:2:1407 +11816:2:1418 +11817:2:1419 +11818:2:1420 +11819:2:1418 +11820:2:1419 +11821:2:1420 +11822:2:1431 +11823:2:1436 +11824:2:1437 +11825:0:4365 +11826:2:1449 +11827:0:4365 +11828:3:3558 +11829:0:4365 +11830:2:1451 +11831:0:4365 +11832:3:3559 +11833:0:4365 +11834:2:1652 +11835:0:4365 +11836:2:1653 +11837:0:4365 +11838:2:1657 +11839:0:4365 +11840:2:1180 +11841:0:4365 +11842:3:3558 +11843:0:4365 +11844:2:1181 +11845:2:1185 +11846:2:1186 +11847:2:1194 +11848:2:1195 +11849:2:1199 +11850:2:1200 +11851:2:1194 +11852:2:1195 +11853:2:1196 +11854:2:1208 +11855:2:1213 +11856:2:1217 +11857:2:1218 +11858:2:1225 +11859:2:1226 +11860:2:1237 +11861:2:1238 +11862:2:1239 +11863:2:1237 +11864:2:1238 +11865:2:1239 +11866:2:1250 +11867:2:1255 +11868:2:1256 +11869:0:4365 +11870:3:3559 +11871:0:4365 +11872:2:1268 +11873:0:4365 +11874:3:3558 +11875:0:4365 +11876:2:1270 +11877:0:4365 +11878:3:3559 +11879:0:4365 +11880:2:1271 +11881:2:1275 +11882:2:1276 +11883:2:1284 +11884:2:1285 +11885:2:1289 +11886:2:1290 +11887:2:1284 +11888:2:1285 +11889:2:1289 +11890:2:1290 +11891:2:1298 +11892:2:1303 +11893:2:1307 +11894:2:1308 +11895:2:1315 +11896:2:1316 +11897:2:1327 +11898:2:1328 +11899:2:1329 +11900:2:1327 +11901:2:1328 +11902:2:1329 +11903:2:1340 +11904:2:1345 +11905:2:1346 +11906:0:4365 +11907:2:1358 +11908:0:4365 +11909:2:1454 +11910:0:4365 +11911:3:3558 +11912:0:4365 +11913:2:1455 +11914:0:4365 +11915:3:3559 +11916:0:4365 +11917:2:1652 +11918:0:4365 +11919:2:1653 +11920:0:4365 +11921:2:1657 +11922:0:4365 +11923:2:1660 +11924:0:4365 +11925:3:3558 +11926:0:4365 +11927:2:1665 +11928:2:1669 +11929:2:1670 +11930:2:1678 +11931:2:1679 +11932:2:1683 +11933:2:1684 +11934:2:1678 +11935:2:1679 +11936:2:1680 +11937:2:1692 +11938:2:1697 +11939:2:1701 +11940:2:1702 +11941:2:1709 +11942:2:1710 +11943:2:1721 +11944:2:1722 +11945:2:1723 +11946:2:1721 +11947:2:1722 +11948:2:1723 +11949:2:1734 +11950:2:1739 +11951:2:1740 +11952:0:4365 +11953:3:3559 +11954:0:4365 +11955:2:1752 +11956:0:4365 +11957:3:3558 +11958:0:4365 +11959:2:1754 +11960:0:4365 +11961:3:3559 +11962:0:4365 +11963:2:1755 +11964:2:1759 +11965:2:1760 +11966:2:1768 +11967:2:1769 +11968:2:1773 +11969:2:1774 +11970:2:1768 +11971:2:1769 +11972:2:1773 +11973:2:1774 +11974:2:1782 +11975:2:1787 +11976:2:1791 +11977:2:1792 +11978:2:1799 +11979:2:1800 +11980:2:1811 +11981:2:1812 +11982:2:1813 +11983:2:1811 +11984:2:1812 +11985:2:1813 +11986:2:1824 +11987:2:1829 +11988:2:1830 +11989:0:4365 +11990:2:1842 +11991:0:4365 +11992:3:3558 +11993:0:4365 +11994:2:1844 +11995:0:4365 +11996:3:3559 +11997:0:4365 +11998:2:1845 +11999:2:1849 +12000:2:1850 +12001:2:1858 +12002:2:1859 +12003:2:1863 +12004:2:1864 +12005:2:1858 +12006:2:1859 +12007:2:1863 +12008:2:1864 +12009:2:1872 +12010:2:1877 +12011:2:1881 +12012:2:1882 +12013:2:1889 +12014:2:1890 +12015:2:1901 +12016:2:1902 +12017:2:1903 +12018:2:1901 +12019:2:1902 +12020:2:1903 +12021:2:1914 +12022:2:1919 +12023:2:1920 +12024:0:4365 +12025:2:1932 +12026:0:4365 +12027:3:3558 +12028:0:4365 +12029:2:1934 +12030:0:4365 +12031:3:3559 +12032:0:4365 +12033:2:1935 +12034:0:4365 +12035:2:1936 +12036:0:4365 +12037:2:2129 +12038:0:4365 +12039:2:2130 +12040:0:4365 +12041:2:2134 +12042:0:4365 +12043:3:3558 +12044:0:4365 +12045:2:2136 +12046:0:4365 +12047:3:3559 +12048:0:4365 +12049:2:2137 +12050:2:2141 +12051:2:2142 +12052:2:2150 +12053:2:2151 +12054:2:2155 +12055:2:2156 +12056:2:2150 +12057:2:2151 +12058:2:2155 +12059:2:2156 +12060:2:2164 +12061:2:2169 +12062:2:2173 +12063:2:2174 +12064:2:2181 +12065:2:2182 +12066:2:2193 +12067:2:2194 +12068:2:2195 +12069:2:2193 +12070:2:2194 +12071:2:2195 +12072:2:2206 +12073:2:2211 +12074:2:2212 +12075:0:4365 +12076:2:2224 +12077:0:4365 +12078:3:3558 +12079:0:4365 +12080:2:2226 +12081:0:4365 +12082:3:3559 +12083:0:4365 +12084:2:1936 +12085:0:4365 +12086:2:2129 +12087:0:4365 +12088:2:2130 +12089:0:4365 +12090:2:2134 +12091:0:4365 +12092:3:3558 +12093:0:4365 +12094:2:2136 +12095:0:4365 +12096:3:3559 +12097:0:4365 +12098:2:2137 +12099:2:2141 +12100:2:2142 +12101:2:2150 +12102:2:2151 +12103:2:2155 +12104:2:2156 +12105:2:2150 +12106:2:2151 +12107:2:2152 +12108:2:2164 +12109:2:2169 +12110:2:2173 +12111:2:2174 +12112:2:2181 +12113:2:2182 +12114:2:2193 +12115:2:2194 +12116:2:2195 +12117:2:2193 +12118:2:2194 +12119:2:2195 +12120:2:2206 +12121:2:2211 +12122:2:2212 +12123:0:4365 +12124:2:2224 +12125:0:4365 +12126:3:3558 +12127:0:4365 +12128:2:2226 +12129:0:4365 +12130:3:3559 +12131:0:4365 +12132:2:2230 +12133:0:4365 +12134:3:3558 +12135:0:4365 +12136:2:2235 +12137:2:2239 +12138:2:2240 +12139:2:2248 +12140:2:2249 +12141:2:2253 +12142:2:2254 +12143:2:2248 +12144:2:2249 +12145:2:2250 +12146:2:2262 +12147:2:2267 +12148:2:2271 +12149:2:2272 +12150:2:2279 +12151:2:2280 +12152:2:2291 +12153:2:2292 +12154:2:2293 +12155:2:2291 +12156:2:2292 +12157:2:2293 +12158:2:2304 +12159:2:2309 +12160:2:2310 +12161:0:4365 +12162:3:3559 +12163:0:4365 +12164:2:2322 +12165:0:4365 +12166:2:1169 +12167:0:4365 +12168:3:3558 +12169:0:4365 +12170:2:1170 +12171:0:4365 +12172:3:3559 +12173:0:4365 +12174:3:3560 +12175:0:4365 +12176:3:3566 +12177:0:4365 +12178:3:3569 +12179:3:3570 +12180:3:3582 +12181:3:3583 +12182:3:3587 +12183:3:3588 +12184:3:3582 +12185:3:3583 +12186:3:3587 +12187:3:3588 +12188:3:3596 +12189:3:3601 +12190:3:3605 +12191:3:3606 +12192:3:3613 +12193:3:3614 +12194:3:3625 +12195:3:3626 +12196:3:3627 +12197:3:3625 +12198:3:3626 +12199:3:3627 +12200:3:3638 +12201:3:3643 +12202:3:3644 +12203:0:4365 +12204:3:3656 +12205:0:4365 +12206:3:3657 +12207:0:4365 +12208:2:1173 +12209:0:4365 +12210:3:3658 +12211:0:4365 +12212:2:1179 +12213:0:4365 +12214:2:1180 +12215:0:4365 +12216:3:3657 +12217:0:4365 +12218:2:1181 +12219:2:1185 +12220:2:1186 +12221:2:1194 +12222:2:1195 +12223:2:1199 +12224:2:1200 +12225:2:1194 +12226:2:1195 +12227:2:1199 +12228:2:1200 +12229:2:1208 +12230:2:1213 +12231:2:1217 +12232:2:1218 +12233:2:1225 +12234:2:1226 +12235:2:1237 +12236:2:1238 +12237:2:1239 +12238:2:1237 +12239:2:1238 +12240:2:1239 +12241:2:1250 +12242:2:1255 +12243:2:1256 +12244:0:4365 +12245:3:3658 +12246:0:4365 +12247:2:1268 +12248:0:4365 +12249:3:3657 +12250:0:4365 +12251:2:1270 +12252:0:4365 +12253:3:3658 +12254:0:4365 +12255:2:1271 +12256:2:1275 +12257:2:1276 +12258:2:1284 +12259:2:1285 +12260:2:1289 +12261:2:1290 +12262:2:1284 +12263:2:1285 +12264:2:1289 +12265:2:1290 +12266:2:1298 +12267:2:1303 +12268:2:1307 +12269:2:1308 +12270:2:1315 +12271:2:1316 +12272:2:1327 +12273:2:1328 +12274:2:1329 +12275:2:1327 +12276:2:1328 +12277:2:1329 +12278:2:1340 +12279:2:1345 +12280:2:1346 +12281:0:4365 +12282:2:1358 +12283:0:4365 +12284:2:1360 +12285:0:4365 +12286:3:3657 +12287:0:4365 +12288:2:1361 +12289:0:4365 +12290:3:3658 +12291:0:4365 +12292:2:1362 +12293:2:1366 +12294:2:1367 +12295:2:1375 +12296:2:1376 +12297:2:1380 +12298:2:1381 +12299:2:1375 +12300:2:1376 +12301:2:1380 +12302:2:1381 +12303:2:1389 +12304:2:1394 +12305:2:1398 +12306:2:1399 +12307:2:1406 +12308:2:1407 +12309:2:1418 +12310:2:1419 +12311:2:1420 +12312:2:1418 +12313:2:1419 +12314:2:1420 +12315:2:1431 +12316:2:1436 +12317:2:1437 +12318:0:4365 +12319:2:1449 +12320:0:4365 +12321:3:3657 +12322:0:4365 +12323:2:1451 +12324:0:4365 +12325:3:3658 +12326:0:4365 +12327:2:1652 +12328:0:4365 +12329:2:1653 +12330:0:4365 +12331:2:1657 +12332:0:4365 +12333:2:1180 +12334:0:4365 +12335:3:3657 +12336:0:4365 +12337:2:1181 +12338:2:1185 +12339:2:1186 +12340:2:1194 +12341:2:1195 +12342:2:1199 +12343:2:1200 +12344:2:1194 +12345:2:1195 +12346:2:1196 +12347:2:1208 +12348:2:1213 +12349:2:1217 +12350:2:1218 +12351:2:1225 +12352:2:1226 +12353:2:1237 +12354:2:1238 +12355:2:1239 +12356:2:1237 +12357:2:1238 +12358:2:1239 +12359:2:1250 +12360:2:1255 +12361:2:1256 +12362:0:4365 +12363:3:3658 +12364:0:4365 +12365:2:1268 +12366:0:4365 +12367:3:3657 +12368:0:4365 +12369:2:1270 +12370:0:4365 +12371:3:3658 +12372:0:4365 +12373:2:1271 +12374:2:1275 +12375:2:1276 +12376:2:1284 +12377:2:1285 +12378:2:1289 +12379:2:1290 +12380:2:1284 +12381:2:1285 +12382:2:1289 +12383:2:1290 +12384:2:1298 +12385:2:1303 +12386:2:1307 +12387:2:1308 +12388:2:1315 +12389:2:1316 +12390:2:1327 +12391:2:1328 +12392:2:1329 +12393:2:1327 +12394:2:1328 +12395:2:1329 +12396:2:1340 +12397:2:1345 +12398:2:1346 +12399:0:4365 +12400:2:1358 +12401:0:4365 +12402:2:1454 +12403:0:4365 +12404:3:3657 +12405:0:4365 +12406:2:1455 +12407:0:4365 +12408:3:3658 +12409:0:4365 +12410:2:1652 +12411:0:4365 +12412:2:1653 +12413:0:4365 +12414:2:1657 +12415:0:4365 +12416:2:1660 +12417:0:4365 +12418:3:3657 +12419:0:4365 +12420:2:1665 +12421:2:1669 +12422:2:1670 +12423:2:1678 +12424:2:1679 +12425:2:1683 +12426:2:1684 +12427:2:1678 +12428:2:1679 +12429:2:1680 +12430:2:1692 +12431:2:1697 +12432:2:1701 +12433:2:1702 +12434:2:1709 +12435:2:1710 +12436:2:1721 +12437:2:1722 +12438:2:1723 +12439:2:1721 +12440:2:1722 +12441:2:1723 +12442:2:1734 +12443:2:1739 +12444:2:1740 +12445:0:4365 +12446:3:3658 +12447:0:4365 +12448:2:1752 +12449:0:4365 +12450:3:3657 +12451:0:4365 +12452:2:1754 +12453:0:4365 +12454:3:3658 +12455:0:4365 +12456:2:1755 +12457:2:1759 +12458:2:1760 +12459:2:1768 +12460:2:1769 +12461:2:1773 +12462:2:1774 +12463:2:1768 +12464:2:1769 +12465:2:1773 +12466:2:1774 +12467:2:1782 +12468:2:1787 +12469:2:1791 +12470:2:1792 +12471:2:1799 +12472:2:1800 +12473:2:1811 +12474:2:1812 +12475:2:1813 +12476:2:1811 +12477:2:1812 +12478:2:1813 +12479:2:1824 +12480:2:1829 +12481:2:1830 +12482:0:4365 +12483:2:1842 +12484:0:4365 +12485:3:3657 +12486:0:4365 +12487:2:1844 +12488:0:4365 +12489:3:3658 +12490:0:4365 +12491:2:1845 +12492:2:1849 +12493:2:1850 +12494:2:1858 +12495:2:1859 +12496:2:1863 +12497:2:1864 +12498:2:1858 +12499:2:1859 +12500:2:1863 +12501:2:1864 +12502:2:1872 +12503:2:1877 +12504:2:1881 +12505:2:1882 +12506:2:1889 +12507:2:1890 +12508:2:1901 +12509:2:1902 +12510:2:1903 +12511:2:1901 +12512:2:1902 +12513:2:1903 +12514:2:1914 +12515:2:1919 +12516:2:1920 +12517:0:4365 +12518:2:1932 +12519:0:4365 +12520:3:3657 +12521:0:4365 +12522:2:1934 +12523:0:4365 +12524:3:3658 +12525:0:4365 +12526:2:1935 +12527:0:4365 +12528:2:1936 +12529:0:4365 +12530:2:2129 +12531:0:4365 +12532:2:2130 +12533:0:4365 +12534:2:2134 +12535:0:4365 +12536:3:3657 +12537:0:4365 +12538:2:2136 +12539:0:4365 +12540:3:3658 +12541:0:4365 +12542:2:2137 +12543:2:2141 +12544:2:2142 +12545:2:2150 +12546:2:2151 +12547:2:2155 +12548:2:2156 +12549:2:2150 +12550:2:2151 +12551:2:2155 +12552:2:2156 +12553:2:2164 +12554:2:2169 +12555:2:2173 +12556:2:2174 +12557:2:2181 +12558:2:2182 +12559:2:2193 +12560:2:2194 +12561:2:2195 +12562:2:2193 +12563:2:2194 +12564:2:2195 +12565:2:2206 +12566:2:2211 +12567:2:2212 +12568:0:4365 +12569:2:2224 +12570:0:4365 +12571:3:3657 +12572:0:4365 +12573:2:2226 +12574:0:4365 +12575:3:3658 +12576:0:4365 +12577:2:1936 +12578:0:4365 +12579:2:2129 +12580:0:4365 +12581:2:2130 +12582:0:4365 +12583:2:2134 +12584:0:4365 +12585:3:3657 +12586:0:4365 +12587:2:2136 +12588:0:4365 +12589:3:3658 +12590:0:4365 +12591:2:2137 +12592:2:2141 +12593:2:2142 +12594:2:2150 +12595:2:2151 +12596:2:2155 +12597:2:2156 +12598:2:2150 +12599:2:2151 +12600:2:2152 +12601:2:2164 +12602:2:2169 +12603:2:2173 +12604:2:2174 +12605:2:2181 +12606:2:2182 +12607:2:2193 +12608:2:2194 +12609:2:2195 +12610:2:2193 +12611:2:2194 +12612:2:2195 +12613:2:2206 +12614:2:2211 +12615:2:2212 +12616:0:4365 +12617:2:2224 +12618:0:4365 +12619:3:3657 +12620:0:4365 +12621:2:2226 +12622:0:4365 +12623:3:3658 +12624:0:4365 +12625:2:2230 +12626:0:4365 +12627:3:3657 +12628:0:4365 +12629:2:2235 +12630:2:2239 +12631:2:2240 +12632:2:2248 +12633:2:2249 +12634:2:2253 +12635:2:2254 +12636:2:2248 +12637:2:2249 +12638:2:2250 +12639:2:2262 +12640:2:2267 +12641:2:2271 +12642:2:2272 +12643:2:2279 +12644:2:2280 +12645:2:2291 +12646:2:2292 +12647:2:2293 +12648:2:2291 +12649:2:2292 +12650:2:2293 +12651:2:2304 +12652:2:2309 +12653:2:2310 +12654:0:4365 +12655:3:3658 +12656:0:4365 +12657:2:2322 +12658:0:4365 +12659:2:1169 +12660:0:4365 +12661:3:3657 +12662:0:4365 +12663:2:1170 +12664:0:4365 +12665:3:3658 +12666:0:4365 +12667:3:3659 +12668:0:4365 +12669:3:3665 +12670:0:4365 +12671:3:3666 +12672:0:4365 +12673:3:3667 +12674:0:4365 +12675:3:3668 +12676:0:4365 +12677:3:3669 +12678:3:3673 +12679:3:3674 +12680:3:3682 +12681:3:3683 +12682:3:3687 +12683:3:3688 +12684:3:3682 +12685:3:3683 +12686:3:3687 +12687:3:3688 +12688:3:3696 +12689:3:3701 +12690:3:3705 +12691:3:3706 +12692:3:3713 +12693:3:3714 +12694:3:3725 +12695:3:3726 +12696:3:3727 +12697:3:3725 +12698:3:3726 +12699:3:3727 +12700:3:3738 +12701:3:3743 +12702:3:3744 +12703:0:4365 +12704:3:3756 +12705:0:4365 +12706:3:3757 +12707:0:4365 +12708:2:1173 +12709:0:4365 +12710:3:3758 +12711:0:4365 +12712:2:1179 +12713:0:4365 +12714:2:1180 +12715:0:4365 +12716:3:3757 +12717:0:4365 +12718:2:1181 +12719:2:1185 +12720:2:1186 +12721:2:1194 +12722:2:1195 +12723:2:1199 +12724:2:1200 +12725:2:1194 +12726:2:1195 +12727:2:1199 +12728:2:1200 +12729:2:1208 +12730:2:1213 +12731:2:1217 +12732:2:1218 +12733:2:1225 +12734:2:1226 +12735:2:1237 +12736:2:1238 +12737:2:1239 +12738:2:1237 +12739:2:1238 +12740:2:1239 +12741:2:1250 +12742:2:1255 +12743:2:1256 +12744:0:4365 +12745:3:3758 +12746:0:4365 +12747:2:1268 +12748:0:4365 +12749:3:3757 +12750:0:4365 +12751:2:1270 +12752:0:4365 +12753:3:3758 +12754:0:4365 +12755:2:1271 +12756:2:1275 +12757:2:1276 +12758:2:1284 +12759:2:1285 +12760:2:1289 +12761:2:1290 +12762:2:1284 +12763:2:1285 +12764:2:1289 +12765:2:1290 +12766:2:1298 +12767:2:1303 +12768:2:1307 +12769:2:1308 +12770:2:1315 +12771:2:1316 +12772:2:1327 +12773:2:1328 +12774:2:1329 +12775:2:1327 +12776:2:1328 +12777:2:1329 +12778:2:1340 +12779:2:1345 +12780:2:1346 +12781:0:4365 +12782:2:1358 +12783:0:4365 +12784:2:1360 +12785:0:4365 +12786:3:3757 +12787:0:4365 +12788:2:1361 +12789:0:4365 +12790:3:3758 +12791:0:4365 +12792:2:1362 +12793:2:1366 +12794:2:1367 +12795:2:1375 +12796:2:1376 +12797:2:1380 +12798:2:1381 +12799:2:1375 +12800:2:1376 +12801:2:1380 +12802:2:1381 +12803:2:1389 +12804:2:1394 +12805:2:1398 +12806:2:1399 +12807:2:1406 +12808:2:1407 +12809:2:1418 +12810:2:1419 +12811:2:1420 +12812:2:1418 +12813:2:1419 +12814:2:1420 +12815:2:1431 +12816:2:1436 +12817:2:1437 +12818:0:4365 +12819:2:1449 +12820:0:4365 +12821:3:3757 +12822:0:4365 +12823:2:1451 +12824:0:4365 +12825:3:3758 +12826:0:4365 +12827:2:1652 +12828:0:4365 +12829:2:1653 +12830:0:4365 +12831:2:1657 +12832:0:4365 +12833:2:1180 +12834:0:4365 +12835:3:3757 +12836:0:4365 +12837:2:1181 +12838:2:1185 +12839:2:1186 +12840:2:1194 +12841:2:1195 +12842:2:1199 +12843:2:1200 +12844:2:1194 +12845:2:1195 +12846:2:1196 +12847:2:1208 +12848:2:1213 +12849:2:1217 +12850:2:1218 +12851:2:1225 +12852:2:1226 +12853:2:1237 +12854:2:1238 +12855:2:1239 +12856:2:1237 +12857:2:1238 +12858:2:1239 +12859:2:1250 +12860:2:1255 +12861:2:1256 +12862:0:4365 +12863:3:3758 +12864:0:4365 +12865:2:1268 +12866:0:4365 +12867:3:3757 +12868:0:4365 +12869:2:1270 +12870:0:4365 +12871:3:3758 +12872:0:4365 +12873:2:1271 +12874:2:1275 +12875:2:1276 +12876:2:1284 +12877:2:1285 +12878:2:1289 +12879:2:1290 +12880:2:1284 +12881:2:1285 +12882:2:1289 +12883:2:1290 +12884:2:1298 +12885:2:1303 +12886:2:1307 +12887:2:1308 +12888:2:1315 +12889:2:1316 +12890:2:1327 +12891:2:1328 +12892:2:1329 +12893:2:1327 +12894:2:1328 +12895:2:1329 +12896:2:1340 +12897:2:1345 +12898:2:1346 +12899:0:4365 +12900:2:1358 +12901:0:4365 +12902:2:1454 +12903:0:4365 +12904:3:3757 +12905:0:4365 +12906:2:1455 +12907:0:4365 +12908:3:3758 +12909:0:4365 +12910:2:1652 +12911:0:4365 +12912:2:1653 +12913:0:4365 +12914:2:1657 +12915:0:4365 +12916:2:1660 +12917:0:4365 +12918:3:3757 +12919:0:4365 +12920:2:1665 +12921:2:1669 +12922:2:1670 +12923:2:1678 +12924:2:1679 +12925:2:1683 +12926:2:1684 +12927:2:1678 +12928:2:1679 +12929:2:1680 +12930:2:1692 +12931:2:1697 +12932:2:1701 +12933:2:1702 +12934:2:1709 +12935:2:1710 +12936:2:1721 +12937:2:1722 +12938:2:1723 +12939:2:1721 +12940:2:1722 +12941:2:1723 +12942:2:1734 +12943:2:1739 +12944:2:1740 +12945:0:4365 +12946:3:3758 +12947:0:4365 +12948:2:1752 +12949:0:4365 +12950:3:3757 +12951:0:4365 +12952:2:1754 +12953:0:4365 +12954:3:3758 +12955:0:4365 +12956:2:1755 +12957:2:1759 +12958:2:1760 +12959:2:1768 +12960:2:1769 +12961:2:1773 +12962:2:1774 +12963:2:1768 +12964:2:1769 +12965:2:1773 +12966:2:1774 +12967:2:1782 +12968:2:1787 +12969:2:1791 +12970:2:1792 +12971:2:1799 +12972:2:1800 +12973:2:1811 +12974:2:1812 +12975:2:1813 +12976:2:1811 +12977:2:1812 +12978:2:1813 +12979:2:1824 +12980:2:1829 +12981:2:1830 +12982:0:4365 +12983:2:1842 +12984:0:4365 +12985:3:3757 +12986:0:4365 +12987:2:1844 +12988:0:4365 +12989:3:3758 +12990:0:4365 +12991:2:1845 +12992:2:1849 +12993:2:1850 +12994:2:1858 +12995:2:1859 +12996:2:1863 +12997:2:1864 +12998:2:1858 +12999:2:1859 +13000:2:1863 +13001:2:1864 +13002:2:1872 +13003:2:1877 +13004:2:1881 +13005:2:1882 +13006:2:1889 +13007:2:1890 +13008:2:1901 +13009:2:1902 +13010:2:1903 +13011:2:1901 +13012:2:1902 +13013:2:1903 +13014:2:1914 +13015:2:1919 +13016:2:1920 +13017:0:4365 +13018:2:1932 +13019:0:4365 +13020:3:3757 +13021:0:4365 +13022:2:1934 +13023:0:4365 +13024:3:3758 +13025:0:4365 +13026:2:1935 +13027:0:4365 +13028:2:1936 +13029:0:4365 +13030:2:2129 +13031:0:4365 +13032:2:2130 +13033:0:4365 +13034:2:2134 +13035:0:4365 +13036:3:3757 +13037:0:4365 +13038:2:2136 +13039:0:4365 +13040:3:3758 +13041:0:4365 +13042:2:2137 +13043:2:2141 +13044:2:2142 +13045:2:2150 +13046:2:2151 +13047:2:2155 +13048:2:2156 +13049:2:2150 +13050:2:2151 +13051:2:2155 +13052:2:2156 +13053:2:2164 +13054:2:2169 +13055:2:2173 +13056:2:2174 +13057:2:2181 +13058:2:2182 +13059:2:2193 +13060:2:2194 +13061:2:2195 +13062:2:2193 +13063:2:2194 +13064:2:2195 +13065:2:2206 +13066:2:2211 +13067:2:2212 +13068:0:4365 +13069:2:2224 +13070:0:4365 +13071:3:3757 +13072:0:4365 +13073:2:2226 +13074:0:4365 +13075:3:3758 +13076:0:4365 +13077:2:1936 +13078:0:4365 +13079:2:2129 +13080:0:4365 +13081:2:2130 +13082:0:4365 +13083:2:2134 +13084:0:4365 +13085:3:3757 +13086:0:4365 +13087:2:2136 +13088:0:4365 +13089:3:3758 +13090:0:4365 +13091:2:2137 +13092:2:2141 +13093:2:2142 +13094:2:2150 +13095:2:2151 +13096:2:2155 +13097:2:2156 +13098:2:2150 +13099:2:2151 +13100:2:2152 +13101:2:2164 +13102:2:2169 +13103:2:2173 +13104:2:2174 +13105:2:2181 +13106:2:2182 +13107:2:2193 +13108:2:2194 +13109:2:2195 +13110:2:2193 +13111:2:2194 +13112:2:2195 +13113:2:2206 +13114:2:2211 +13115:2:2212 +13116:0:4365 +13117:2:2224 +13118:0:4365 +13119:3:3757 +13120:0:4365 +13121:2:2226 +13122:0:4365 +13123:3:3758 +13124:0:4365 +13125:2:2230 +13126:0:4365 +13127:3:3757 +13128:0:4365 +13129:2:2235 +13130:2:2239 +13131:2:2240 +13132:2:2248 +13133:2:2249 +13134:2:2253 +13135:2:2254 +13136:2:2248 +13137:2:2249 +13138:2:2250 +13139:2:2262 +13140:2:2267 +13141:2:2271 +13142:2:2272 +13143:2:2279 +13144:2:2280 +13145:2:2291 +13146:2:2292 +13147:2:2293 +13148:2:2291 +13149:2:2292 +13150:2:2293 +13151:2:2304 +13152:2:2309 +13153:2:2310 +13154:0:4365 +13155:3:3758 +13156:0:4365 +13157:2:2322 +13158:0:4365 +13159:2:1169 +13160:0:4365 +13161:3:3757 +13162:0:4365 +13163:2:1170 +13164:0:4365 +13165:3:3758 +13166:0:4365 +13167:3:3759 +13168:0:4365 +13169:3:3972 +13170:0:4365 +13171:3:3980 +13172:0:4365 +13173:3:3981 +13174:3:3985 +13175:3:3986 +13176:3:3994 +13177:3:3995 +13178:3:3999 +13179:3:4000 +13180:3:3994 +13181:3:3995 +13182:3:3999 +13183:3:4000 +13184:3:4008 +13185:3:4013 +13186:3:4017 +13187:3:4018 +13188:3:4025 +13189:3:4026 +13190:3:4037 +13191:3:4038 +13192:3:4039 +13193:3:4037 +13194:3:4038 +13195:3:4039 +13196:3:4050 +13197:3:4055 +13198:3:4056 +13199:0:4365 +13200:3:4068 +13201:0:4365 +13202:3:4069 +13203:0:4365 +13204:2:1173 +13205:0:4365 +13206:3:4070 +13207:0:4365 +13208:2:1179 +13209:0:4365 +13210:2:1180 +13211:0:4365 +13212:3:4069 +13213:0:4365 +13214:2:1181 +13215:2:1185 +13216:2:1186 +13217:2:1194 +13218:2:1195 +13219:2:1199 +13220:2:1200 +13221:2:1194 +13222:2:1195 +13223:2:1199 +13224:2:1200 +13225:2:1208 +13226:2:1213 +13227:2:1217 +13228:2:1218 +13229:2:1225 +13230:2:1226 +13231:2:1237 +13232:2:1238 +13233:2:1239 +13234:2:1237 +13235:2:1238 +13236:2:1239 +13237:2:1250 +13238:2:1255 +13239:2:1256 +13240:0:4365 +13241:3:4070 +13242:0:4365 +13243:2:1268 +13244:0:4365 +13245:3:4069 +13246:0:4365 +13247:2:1270 +13248:0:4365 +13249:3:4070 +13250:0:4365 +13251:2:1271 +13252:2:1275 +13253:2:1276 +13254:2:1284 +13255:2:1285 +13256:2:1289 +13257:2:1290 +13258:2:1284 +13259:2:1285 +13260:2:1289 +13261:2:1290 +13262:2:1298 +13263:2:1303 +13264:2:1307 +13265:2:1308 +13266:2:1315 +13267:2:1316 +13268:2:1327 +13269:2:1328 +13270:2:1329 +13271:2:1327 +13272:2:1328 +13273:2:1329 +13274:2:1340 +13275:2:1345 +13276:2:1346 +13277:0:4365 +13278:2:1358 +13279:0:4365 +13280:2:1360 +13281:0:4365 +13282:3:4069 +13283:0:4365 +13284:2:1361 +13285:0:4365 +13286:3:4070 +13287:0:4365 +13288:2:1362 +13289:2:1366 +13290:2:1367 +13291:2:1375 +13292:2:1376 +13293:2:1380 +13294:2:1381 +13295:2:1375 +13296:2:1376 +13297:2:1380 +13298:2:1381 +13299:2:1389 +13300:2:1394 +13301:2:1398 +13302:2:1399 +13303:2:1406 +13304:2:1407 +13305:2:1418 +13306:2:1419 +13307:2:1420 +13308:2:1418 +13309:2:1419 +13310:2:1420 +13311:2:1431 +13312:2:1436 +13313:2:1437 +13314:0:4365 +13315:2:1449 +13316:0:4365 +13317:3:4069 +13318:0:4365 +13319:2:1451 +13320:0:4365 +13321:3:4070 +13322:0:4365 +13323:2:1652 +13324:0:4365 +13325:2:1653 +13326:0:4365 +13327:2:1657 +13328:0:4365 +13329:2:1180 +13330:0:4365 +13331:3:4069 +13332:0:4365 +13333:2:1181 +13334:2:1185 +13335:2:1186 +13336:2:1194 +13337:2:1195 +13338:2:1199 +13339:2:1200 +13340:2:1194 +13341:2:1195 +13342:2:1196 +13343:2:1208 +13344:2:1213 +13345:2:1217 +13346:2:1218 +13347:2:1225 +13348:2:1226 +13349:2:1237 +13350:2:1238 +13351:2:1239 +13352:2:1237 +13353:2:1238 +13354:2:1239 +13355:2:1250 +13356:2:1255 +13357:2:1256 +13358:0:4365 +13359:3:4070 +13360:0:4365 +13361:2:1268 +13362:0:4365 +13363:3:4069 +13364:0:4365 +13365:2:1270 +13366:0:4365 +13367:3:4070 +13368:0:4365 +13369:2:1271 +13370:2:1275 +13371:2:1276 +13372:2:1284 +13373:2:1285 +13374:2:1289 +13375:2:1290 +13376:2:1284 +13377:2:1285 +13378:2:1289 +13379:2:1290 +13380:2:1298 +13381:2:1303 +13382:2:1307 +13383:2:1308 +13384:2:1315 +13385:2:1316 +13386:2:1327 +13387:2:1328 +13388:2:1329 +13389:2:1327 +13390:2:1328 +13391:2:1329 +13392:2:1340 +13393:2:1345 +13394:2:1346 +13395:0:4365 +13396:2:1358 +13397:0:4365 +13398:2:1454 +13399:0:4365 +13400:3:4069 +13401:0:4365 +13402:2:1455 +13403:0:4365 +13404:3:4070 +13405:0:4365 +13406:2:1652 +13407:0:4365 +13408:2:1653 +13409:0:4365 +13410:2:1657 +13411:0:4365 +13412:2:1660 +13413:0:4365 +13414:3:4069 +13415:0:4365 +13416:2:1665 +13417:2:1669 +13418:2:1670 +13419:2:1678 +13420:2:1679 +13421:2:1683 +13422:2:1684 +13423:2:1678 +13424:2:1679 +13425:2:1680 +13426:2:1692 +13427:2:1697 +13428:2:1701 +13429:2:1702 +13430:2:1709 +13431:2:1710 +13432:2:1721 +13433:2:1722 +13434:2:1723 +13435:2:1721 +13436:2:1722 +13437:2:1723 +13438:2:1734 +13439:2:1739 +13440:2:1740 +13441:0:4365 +13442:3:4070 +13443:0:4365 +13444:2:1752 +13445:0:4365 +13446:3:4069 +13447:0:4365 +13448:2:1754 +13449:0:4365 +13450:3:4070 +13451:0:4365 +13452:2:1755 +13453:2:1759 +13454:2:1760 +13455:2:1768 +13456:2:1769 +13457:2:1773 +13458:2:1774 +13459:2:1768 +13460:2:1769 +13461:2:1773 +13462:2:1774 +13463:2:1782 +13464:2:1787 +13465:2:1791 +13466:2:1792 +13467:2:1799 +13468:2:1800 +13469:2:1811 +13470:2:1812 +13471:2:1813 +13472:2:1811 +13473:2:1812 +13474:2:1813 +13475:2:1824 +13476:2:1829 +13477:2:1830 +13478:0:4365 +13479:2:1842 +13480:0:4365 +13481:3:4069 +13482:0:4365 +13483:2:1844 +13484:0:4365 +13485:3:4070 +13486:0:4365 +13487:2:1845 +13488:2:1849 +13489:2:1850 +13490:2:1858 +13491:2:1859 +13492:2:1863 +13493:2:1864 +13494:2:1858 +13495:2:1859 +13496:2:1863 +13497:2:1864 +13498:2:1872 +13499:2:1877 +13500:2:1881 +13501:2:1882 +13502:2:1889 +13503:2:1890 +13504:2:1901 +13505:2:1902 +13506:2:1903 +13507:2:1901 +13508:2:1902 +13509:2:1903 +13510:2:1914 +13511:2:1919 +13512:2:1920 +13513:0:4365 +13514:2:1932 +13515:0:4365 +13516:3:4069 +13517:0:4365 +13518:2:1934 +13519:0:4365 +13520:3:4070 +13521:0:4365 +13522:2:1935 +13523:0:4365 +13524:2:1936 +13525:0:4365 +13526:2:2129 +13527:0:4365 +13528:2:2130 +13529:0:4365 +13530:2:2134 +13531:0:4365 +13532:3:4069 +13533:0:4365 +13534:2:2136 +13535:0:4365 +13536:3:4070 +13537:0:4365 +13538:2:2137 +13539:2:2141 +13540:2:2142 +13541:2:2150 +13542:2:2151 +13543:2:2155 +13544:2:2156 +13545:2:2150 +13546:2:2151 +13547:2:2155 +13548:2:2156 +13549:2:2164 +13550:2:2169 +13551:2:2173 +13552:2:2174 +13553:2:2181 +13554:2:2182 +13555:2:2193 +13556:2:2194 +13557:2:2195 +13558:2:2193 +13559:2:2194 +13560:2:2195 +13561:2:2206 +13562:2:2211 +13563:2:2212 +13564:0:4365 +13565:2:2224 +13566:0:4365 +13567:3:4069 +13568:0:4365 +13569:2:2226 +13570:0:4365 +13571:3:4070 +13572:0:4365 +13573:2:1936 +13574:0:4365 +13575:2:2129 +13576:0:4365 +13577:2:2130 +13578:0:4365 +13579:2:2134 +13580:0:4365 +13581:3:4069 +13582:0:4365 +13583:2:2136 +13584:0:4365 +13585:3:4070 +13586:0:4365 +13587:2:2137 +13588:2:2141 +13589:2:2142 +13590:2:2150 +13591:2:2151 +13592:2:2155 +13593:2:2156 +13594:2:2150 +13595:2:2151 +13596:2:2152 +13597:2:2164 +13598:2:2169 +13599:2:2173 +13600:2:2174 +13601:2:2181 +13602:2:2182 +13603:2:2193 +13604:2:2194 +13605:2:2195 +13606:2:2193 +13607:2:2194 +13608:2:2195 +13609:2:2206 +13610:2:2211 +13611:2:2212 +13612:0:4365 +13613:2:2224 +13614:0:4365 +13615:3:4069 +13616:0:4365 +13617:2:2226 +13618:0:4365 +13619:3:4070 +13620:0:4365 +13621:2:2230 +13622:0:4365 +13623:3:4069 +13624:0:4365 +13625:2:2235 +13626:2:2239 +13627:2:2240 +13628:2:2248 +13629:2:2249 +13630:2:2253 +13631:2:2254 +13632:2:2248 +13633:2:2249 +13634:2:2250 +13635:2:2262 +13636:2:2267 +13637:2:2271 +13638:2:2272 +13639:2:2279 +13640:2:2280 +13641:2:2291 +13642:2:2292 +13643:2:2293 +13644:2:2291 +13645:2:2292 +13646:2:2293 +13647:2:2304 +13648:2:2309 +13649:2:2310 +13650:0:4365 +13651:3:4070 +13652:0:4365 +13653:2:2322 +13654:0:4365 +13655:2:1169 +13656:0:4365 +13657:3:4069 +13658:0:4365 +13659:2:1170 +13660:0:4365 +13661:3:4070 +13662:0:4365 +13663:3:4071 +13664:0:4365 +13665:3:4081 +13666:0:4365 +13667:3:3666 +13668:0:4365 +13669:3:3667 +13670:0:4365 +13671:3:3668 +13672:0:4365 +13673:3:3669 +13674:3:3673 +13675:3:3674 +13676:3:3682 +13677:3:3683 +13678:3:3687 +13679:3:3688 +13680:3:3682 +13681:3:3683 +13682:3:3687 +13683:3:3688 +13684:3:3696 +13685:3:3701 +13686:3:3705 +13687:3:3706 +13688:3:3713 +13689:3:3714 +13690:3:3725 +13691:3:3726 +13692:3:3727 +13693:3:3725 +13694:3:3726 +13695:3:3727 +13696:3:3738 +13697:3:3743 +13698:3:3744 +13699:0:4365 +13700:3:3756 +13701:0:4365 +13702:3:3757 +13703:0:4365 +13704:2:1173 +13705:0:4365 +13706:3:3758 +13707:0:4365 +13708:2:1179 +13709:0:4365 +13710:2:1180 +13711:0:4365 +13712:3:3757 +13713:0:4365 +13714:2:1181 +13715:2:1185 +13716:2:1186 +13717:2:1194 +13718:2:1195 +13719:2:1199 +13720:2:1200 +13721:2:1194 +13722:2:1195 +13723:2:1199 +13724:2:1200 +13725:2:1208 +13726:2:1213 +13727:2:1217 +13728:2:1218 +13729:2:1225 +13730:2:1226 +13731:2:1237 +13732:2:1238 +13733:2:1239 +13734:2:1237 +13735:2:1238 +13736:2:1239 +13737:2:1250 +13738:2:1255 +13739:2:1256 +13740:0:4365 +13741:3:3758 +13742:0:4365 +13743:2:1268 +13744:0:4365 +13745:3:3757 +13746:0:4365 +13747:2:1270 +13748:0:4365 +13749:3:3758 +13750:0:4365 +13751:2:1271 +13752:2:1275 +13753:2:1276 +13754:2:1284 +13755:2:1285 +13756:2:1289 +13757:2:1290 +13758:2:1284 +13759:2:1285 +13760:2:1289 +13761:2:1290 +13762:2:1298 +13763:2:1303 +13764:2:1307 +13765:2:1308 +13766:2:1315 +13767:2:1316 +13768:2:1327 +13769:2:1328 +13770:2:1329 +13771:2:1327 +13772:2:1328 +13773:2:1329 +13774:2:1340 +13775:2:1345 +13776:2:1346 +13777:0:4365 +13778:2:1358 +13779:0:4365 +13780:2:1360 +13781:0:4365 +13782:3:3757 +13783:0:4365 +13784:2:1361 +13785:0:4365 +13786:3:3758 +13787:0:4365 +13788:2:1362 +13789:2:1366 +13790:2:1367 +13791:2:1375 +13792:2:1376 +13793:2:1380 +13794:2:1381 +13795:2:1375 +13796:2:1376 +13797:2:1380 +13798:2:1381 +13799:2:1389 +13800:2:1394 +13801:2:1398 +13802:2:1399 +13803:2:1406 +13804:2:1407 +13805:2:1418 +13806:2:1419 +13807:2:1420 +13808:2:1418 +13809:2:1419 +13810:2:1420 +13811:2:1431 +13812:2:1436 +13813:2:1437 +13814:0:4365 +13815:2:1449 +13816:0:4365 +13817:3:3757 +13818:0:4365 +13819:2:1451 +13820:0:4365 +13821:3:3758 +13822:0:4365 +13823:2:1652 +13824:0:4365 +13825:2:1653 +13826:0:4365 +13827:2:1657 +13828:0:4365 +13829:2:1180 +13830:0:4365 +13831:3:3757 +13832:0:4365 +13833:2:1181 +13834:2:1185 +13835:2:1186 +13836:2:1194 +13837:2:1195 +13838:2:1199 +13839:2:1200 +13840:2:1194 +13841:2:1195 +13842:2:1196 +13843:2:1208 +13844:2:1213 +13845:2:1217 +13846:2:1218 +13847:2:1225 +13848:2:1226 +13849:2:1237 +13850:2:1238 +13851:2:1239 +13852:2:1237 +13853:2:1238 +13854:2:1239 +13855:2:1250 +13856:2:1255 +13857:2:1256 +13858:0:4365 +13859:3:3758 +13860:0:4365 +13861:2:1268 +13862:0:4365 +13863:3:3757 +13864:0:4365 +13865:2:1270 +13866:0:4365 +13867:3:3758 +13868:0:4365 +13869:2:1271 +13870:2:1275 +13871:2:1276 +13872:2:1284 +13873:2:1285 +13874:2:1289 +13875:2:1290 +13876:2:1284 +13877:2:1285 +13878:2:1289 +13879:2:1290 +13880:2:1298 +13881:2:1303 +13882:2:1307 +13883:2:1308 +13884:2:1315 +13885:2:1316 +13886:2:1327 +13887:2:1328 +13888:2:1329 +13889:2:1327 +13890:2:1328 +13891:2:1329 +13892:2:1340 +13893:2:1345 +13894:2:1346 +13895:0:4365 +13896:2:1358 +13897:0:4365 +13898:2:1454 +13899:0:4365 +13900:3:3757 +13901:0:4365 +13902:2:1455 +13903:0:4365 +13904:3:3758 +13905:0:4365 +13906:2:1652 +13907:0:4365 +13908:2:1653 +13909:0:4365 +13910:2:1657 +13911:0:4365 +13912:2:1660 +13913:0:4365 +13914:3:3757 +13915:0:4365 +13916:2:1665 +13917:2:1669 +13918:2:1670 +13919:2:1678 +13920:2:1679 +13921:2:1683 +13922:2:1684 +13923:2:1678 +13924:2:1679 +13925:2:1680 +13926:2:1692 +13927:2:1697 +13928:2:1701 +13929:2:1702 +13930:2:1709 +13931:2:1710 +13932:2:1721 +13933:2:1722 +13934:2:1723 +13935:2:1721 +13936:2:1722 +13937:2:1723 +13938:2:1734 +13939:2:1739 +13940:2:1740 +13941:0:4365 +13942:3:3758 +13943:0:4365 +13944:2:1752 +13945:0:4365 +13946:3:3757 +13947:0:4365 +13948:2:1754 +13949:0:4365 +13950:3:3758 +13951:0:4365 +13952:2:1755 +13953:2:1759 +13954:2:1760 +13955:2:1768 +13956:2:1769 +13957:2:1773 +13958:2:1774 +13959:2:1768 +13960:2:1769 +13961:2:1773 +13962:2:1774 +13963:2:1782 +13964:2:1787 +13965:2:1791 +13966:2:1792 +13967:2:1799 +13968:2:1800 +13969:2:1811 +13970:2:1812 +13971:2:1813 +13972:2:1811 +13973:2:1812 +13974:2:1813 +13975:2:1824 +13976:2:1829 +13977:2:1830 +13978:0:4365 +13979:2:1842 +13980:0:4365 +13981:3:3757 +13982:0:4365 +13983:2:1844 +13984:0:4365 +13985:3:3758 +13986:0:4365 +13987:2:1845 +13988:2:1849 +13989:2:1850 +13990:2:1858 +13991:2:1859 +13992:2:1863 +13993:2:1864 +13994:2:1858 +13995:2:1859 +13996:2:1863 +13997:2:1864 +13998:2:1872 +13999:2:1877 +14000:2:1881 +14001:2:1882 +14002:2:1889 +14003:2:1890 +14004:2:1901 +14005:2:1902 +14006:2:1903 +14007:2:1901 +14008:2:1902 +14009:2:1903 +14010:2:1914 +14011:2:1919 +14012:2:1920 +14013:0:4365 +14014:2:1932 +14015:0:4365 +14016:3:3757 +14017:0:4365 +14018:2:1934 +14019:0:4365 +14020:3:3758 +14021:0:4365 +14022:2:1935 +14023:0:4365 +14024:2:1936 +14025:0:4365 +14026:2:2129 +14027:0:4365 +14028:2:2130 +14029:0:4365 +14030:2:2134 +14031:0:4365 +14032:3:3757 +14033:0:4365 +14034:2:2136 +14035:0:4365 +14036:3:3758 +14037:0:4365 +14038:2:2137 +14039:2:2141 +14040:2:2142 +14041:2:2150 +14042:2:2151 +14043:2:2155 +14044:2:2156 +14045:2:2150 +14046:2:2151 +14047:2:2155 +14048:2:2156 +14049:2:2164 +14050:2:2169 +14051:2:2173 +14052:2:2174 +14053:2:2181 +14054:2:2182 +14055:2:2193 +14056:2:2194 +14057:2:2195 +14058:2:2193 +14059:2:2194 +14060:2:2195 +14061:2:2206 +14062:2:2211 +14063:2:2212 +14064:0:4365 +14065:2:2224 +14066:0:4365 +14067:3:3757 +14068:0:4365 +14069:2:2226 +14070:0:4365 +14071:3:3758 +14072:0:4365 +14073:2:1936 +14074:0:4365 +14075:2:2129 +14076:0:4365 +14077:2:2130 +14078:0:4365 +14079:2:2134 +14080:0:4365 +14081:3:3757 +14082:0:4365 +14083:2:2136 +14084:0:4365 +14085:3:3758 +14086:0:4365 +14087:2:2137 +14088:2:2141 +14089:2:2142 +14090:2:2150 +14091:2:2151 +14092:2:2155 +14093:2:2156 +14094:2:2150 +14095:2:2151 +14096:2:2152 +14097:2:2164 +14098:2:2169 +14099:2:2173 +14100:2:2174 +14101:2:2181 +14102:2:2182 +14103:2:2193 +14104:2:2194 +14105:2:2195 +14106:2:2193 +14107:2:2194 +14108:2:2195 +14109:2:2206 +14110:2:2211 +14111:2:2212 +14112:0:4365 +14113:2:2224 +14114:0:4365 +14115:3:3757 +14116:0:4365 +14117:2:2226 +14118:0:4365 +14119:3:3758 +14120:0:4365 +14121:2:2230 +14122:0:4365 +14123:3:3757 +14124:0:4365 +14125:2:2235 +14126:2:2239 +14127:2:2240 +14128:2:2248 +14129:2:2249 +14130:2:2253 +14131:2:2254 +14132:2:2248 +14133:2:2249 +14134:2:2250 +14135:2:2262 +14136:2:2267 +14137:2:2271 +14138:2:2272 +14139:2:2279 +14140:2:2280 +14141:2:2291 +14142:2:2292 +14143:2:2293 +14144:2:2291 +14145:2:2292 +14146:2:2293 +14147:2:2304 +14148:2:2309 +14149:2:2310 +14150:0:4365 +14151:3:3758 +14152:0:4365 +14153:2:2322 +14154:0:4365 +14155:2:1169 +14156:0:4365 +14157:3:3757 +14158:0:4365 +14159:2:1170 +14160:0:4365 +14161:3:3758 +14162:0:4365 +14163:3:3759 +14164:0:4365 +14165:3:3972 +14166:0:4365 +14167:3:4077 +14168:0:4365 +14169:3:4078 +14170:0:4365 +14171:3:4082 +14172:0:4365 +14173:3:4088 +14174:0:4365 +14175:3:4092 +14176:3:4093 +14177:3:4097 +14178:3:4101 +14179:3:4102 +14180:3:4097 +14181:3:4101 +14182:3:4102 +14183:3:4106 +14184:3:4114 +14185:3:4115 +14186:3:4120 +14187:3:4127 +14188:3:4128 +14189:3:4127 +14190:3:4128 +14191:3:4135 +14192:3:4140 +14193:0:4365 +14194:3:4151 +14195:0:4365 +14196:3:4155 +14197:3:4156 +14198:3:4160 +14199:3:4164 +14200:3:4165 +14201:3:4160 +14202:3:4164 +14203:3:4165 +14204:3:4169 +14205:3:4177 +14206:3:4178 +14207:3:4183 +14208:3:4190 +14209:3:4191 +14210:3:4190 +14211:3:4191 +14212:3:4198 +14213:3:4203 +14214:0:4365 +14215:3:4151 +14216:0:4365 +14217:3:4155 +14218:3:4156 +14219:3:4160 +14220:3:4164 +14221:3:4165 +14222:3:4160 +14223:3:4164 +14224:3:4165 +14225:3:4169 +14226:3:4177 +14227:3:4178 +14228:3:4183 +14229:3:4190 +14230:3:4191 +14231:3:4190 +14232:3:4191 +14233:3:4198 +14234:3:4203 +14235:0:4365 +14236:3:4214 +14237:0:4365 +14238:3:4222 +14239:3:4223 +14240:3:4227 +14241:3:4231 +14242:3:4232 +14243:3:4227 +14244:3:4231 +14245:3:4232 +14246:3:4236 +14247:3:4244 +14248:3:4245 +14249:3:4250 +14250:3:4257 +14251:3:4258 +14252:3:4257 +14253:3:4258 +14254:3:4265 +14255:3:4270 +14256:0:4365 +14257:3:4285 +14258:0:4365 +14259:3:4286 +14260:0:4365 +14261:2:1173 +14262:0:4365 +14263:3:4287 +14264:0:4365 +14265:2:1179 +14266:0:4365 +14267:2:1180 +14268:0:4365 +14269:3:4286 +14270:0:4365 +14271:2:1181 +14272:2:1185 +14273:2:1186 +14274:2:1194 +14275:2:1195 +14276:2:1199 +14277:2:1200 +14278:2:1194 +14279:2:1195 +14280:2:1199 +14281:2:1200 +14282:2:1208 +14283:2:1213 +14284:2:1217 +14285:2:1218 +14286:2:1225 +14287:2:1226 +14288:2:1237 +14289:2:1238 +14290:2:1239 +14291:2:1237 +14292:2:1238 +14293:2:1239 +14294:2:1250 +14295:2:1255 +14296:2:1256 +14297:0:4365 +14298:3:4287 +14299:0:4365 +14300:2:1268 +14301:0:4365 +14302:3:4286 +14303:0:4365 +14304:2:1270 +14305:0:4365 +14306:3:4287 +14307:0:4365 +14308:2:1271 +14309:2:1275 +14310:2:1276 +14311:2:1284 +14312:2:1285 +14313:2:1289 +14314:2:1290 +14315:2:1284 +14316:2:1285 +14317:2:1289 +14318:2:1290 +14319:2:1298 +14320:2:1303 +14321:2:1307 +14322:2:1308 +14323:2:1315 +14324:2:1316 +14325:2:1327 +14326:2:1328 +14327:2:1329 +14328:2:1327 +14329:2:1328 +14330:2:1329 +14331:2:1340 +14332:2:1345 +14333:2:1346 +14334:0:4365 +14335:2:1358 +14336:0:4365 +14337:2:1360 +14338:0:4365 +14339:3:4286 +14340:0:4365 +14341:2:1361 +14342:0:4365 +14343:3:4287 +14344:0:4365 +14345:2:1362 +14346:2:1366 +14347:2:1367 +14348:2:1375 +14349:2:1376 +14350:2:1380 +14351:2:1381 +14352:2:1375 +14353:2:1376 +14354:2:1380 +14355:2:1381 +14356:2:1389 +14357:2:1394 +14358:2:1398 +14359:2:1399 +14360:2:1406 +14361:2:1407 +14362:2:1418 +14363:2:1419 +14364:2:1420 +14365:2:1418 +14366:2:1419 +14367:2:1420 +14368:2:1431 +14369:2:1436 +14370:2:1437 +14371:0:4365 +14372:2:1449 +14373:0:4365 +14374:3:4286 +14375:0:4365 +14376:2:1451 +14377:0:4365 +14378:3:4287 +14379:0:4365 +14380:2:1652 +14381:0:4365 +14382:2:1653 +14383:0:4365 +14384:2:1657 +14385:0:4365 +14386:2:1180 +14387:0:4365 +14388:3:4286 +14389:0:4365 +14390:2:1181 +14391:2:1185 +14392:2:1186 +14393:2:1194 +14394:2:1195 +14395:2:1199 +14396:2:1200 +14397:2:1194 +14398:2:1195 +14399:2:1196 +14400:2:1208 +14401:2:1213 +14402:2:1217 +14403:2:1218 +14404:2:1225 +14405:2:1226 +14406:2:1237 +14407:2:1238 +14408:2:1239 +14409:2:1237 +14410:2:1238 +14411:2:1239 +14412:2:1250 +14413:2:1255 +14414:2:1256 +14415:0:4365 +14416:3:4287 +14417:0:4365 +14418:2:1268 +14419:0:4365 +14420:3:4286 +14421:0:4365 +14422:2:1270 +14423:0:4365 +14424:3:4287 +14425:0:4365 +14426:2:1271 +14427:2:1275 +14428:2:1276 +14429:2:1284 +14430:2:1285 +14431:2:1289 +14432:2:1290 +14433:2:1284 +14434:2:1285 +14435:2:1289 +14436:2:1290 +14437:2:1298 +14438:2:1303 +14439:2:1307 +14440:2:1308 +14441:2:1315 +14442:2:1316 +14443:2:1327 +14444:2:1328 +14445:2:1329 +14446:2:1327 +14447:2:1328 +14448:2:1329 +14449:2:1340 +14450:2:1345 +14451:2:1346 +14452:0:4365 +14453:2:1358 +14454:0:4365 +14455:2:1454 +14456:0:4365 +14457:3:4286 +14458:0:4365 +14459:2:1455 +14460:0:4365 +14461:3:4287 +14462:0:4365 +14463:2:1652 +14464:0:4365 +14465:2:1653 +14466:0:4365 +14467:2:1657 +14468:0:4365 +14469:2:1660 +14470:0:4365 +14471:3:4286 +14472:0:4365 +14473:2:1665 +14474:2:1669 +14475:2:1670 +14476:2:1678 +14477:2:1679 +14478:2:1683 +14479:2:1684 +14480:2:1678 +14481:2:1679 +14482:2:1680 +14483:2:1692 +14484:2:1697 +14485:2:1701 +14486:2:1702 +14487:2:1709 +14488:2:1710 +14489:2:1721 +14490:2:1722 +14491:2:1723 +14492:2:1721 +14493:2:1722 +14494:2:1723 +14495:2:1734 +14496:2:1739 +14497:2:1740 +14498:0:4365 +14499:3:4287 +14500:0:4365 +14501:2:1752 +14502:0:4365 +14503:3:4286 +14504:0:4365 +14505:2:1754 +14506:0:4365 +14507:3:4287 +14508:0:4365 +14509:2:1755 +14510:2:1759 +14511:2:1760 +14512:2:1768 +14513:2:1769 +14514:2:1773 +14515:2:1774 +14516:2:1768 +14517:2:1769 +14518:2:1773 +14519:2:1774 +14520:2:1782 +14521:2:1787 +14522:2:1791 +14523:2:1792 +14524:2:1799 +14525:2:1800 +14526:2:1811 +14527:2:1812 +14528:2:1813 +14529:2:1811 +14530:2:1812 +14531:2:1813 +14532:2:1824 +14533:2:1829 +14534:2:1830 +14535:0:4365 +14536:2:1842 +14537:0:4365 +14538:3:4286 +14539:0:4365 +14540:2:1844 +14541:0:4365 +14542:3:4287 +14543:0:4365 +14544:2:1845 +14545:2:1849 +14546:2:1850 +14547:2:1858 +14548:2:1859 +14549:2:1863 +14550:2:1864 +14551:2:1858 +14552:2:1859 +14553:2:1863 +14554:2:1864 +14555:2:1872 +14556:2:1877 +14557:2:1881 +14558:2:1882 +14559:2:1889 +14560:2:1890 +14561:2:1901 +14562:2:1902 +14563:2:1903 +14564:2:1901 +14565:2:1902 +14566:2:1903 +14567:2:1914 +14568:2:1919 +14569:2:1920 +14570:0:4365 +14571:2:1932 +14572:0:4365 +14573:3:4286 +14574:0:4365 +14575:2:1934 +14576:0:4365 +14577:3:4287 +14578:0:4365 +14579:2:1935 +14580:0:4365 +14581:2:1936 +14582:0:4365 +14583:2:2129 +14584:0:4365 +14585:2:2130 +14586:0:4365 +14587:2:2134 +14588:0:4365 +14589:3:4286 +14590:0:4365 +14591:2:2136 +14592:0:4365 +14593:3:4287 +14594:0:4365 +14595:2:2137 +14596:2:2141 +14597:2:2142 +14598:2:2150 +14599:2:2151 +14600:2:2155 +14601:2:2156 +14602:2:2150 +14603:2:2151 +14604:2:2155 +14605:2:2156 +14606:2:2164 +14607:2:2169 +14608:2:2173 +14609:2:2174 +14610:2:2181 +14611:2:2182 +14612:2:2193 +14613:2:2194 +14614:2:2195 +14615:2:2193 +14616:2:2194 +14617:2:2195 +14618:2:2206 +14619:2:2211 +14620:2:2212 +14621:0:4365 +14622:2:2224 +14623:0:4365 +14624:3:4286 +14625:0:4365 +14626:2:2226 +14627:0:4365 +14628:3:4287 +14629:0:4365 +14630:2:1936 +14631:0:4365 +14632:2:2129 +14633:0:4365 +14634:2:2130 +14635:0:4365 +14636:2:2134 +14637:0:4365 +14638:3:4286 +14639:0:4365 +14640:2:2136 +14641:0:4365 +14642:3:4287 +14643:0:4365 +14644:2:2137 +14645:2:2141 +14646:2:2142 +14647:2:2150 +14648:2:2151 +14649:2:2155 +14650:2:2156 +14651:2:2150 +14652:2:2151 +14653:2:2152 +14654:2:2164 +14655:2:2169 +14656:2:2173 +14657:2:2174 +14658:2:2181 +14659:2:2182 +14660:2:2193 +14661:2:2194 +14662:2:2195 +14663:2:2193 +14664:2:2194 +14665:2:2195 +14666:2:2206 +14667:2:2211 +14668:2:2212 +14669:0:4365 +14670:2:2224 +14671:0:4365 +14672:3:4286 +14673:0:4365 +14674:2:2226 +14675:0:4365 +14676:3:4287 +14677:0:4365 +14678:2:2230 +14679:0:4365 +14680:3:4286 +14681:0:4365 +14682:2:2235 +14683:2:2239 +14684:2:2240 +14685:2:2248 +14686:2:2249 +14687:2:2253 +14688:2:2254 +14689:2:2248 +14690:2:2249 +14691:2:2250 +14692:2:2262 +14693:2:2267 +14694:2:2271 +14695:2:2272 +14696:2:2279 +14697:2:2280 +14698:2:2291 +14699:2:2292 +14700:2:2293 +14701:2:2291 +14702:2:2292 +14703:2:2293 +14704:2:2304 +14705:2:2309 +14706:2:2310 +14707:0:4365 +14708:3:4287 +14709:0:4365 +14710:2:2322 +14711:0:4365 +14712:2:1169 +14713:0:4365 +14714:3:4286 +14715:0:4365 +14716:2:1170 +14717:0:4365 +14718:3:4287 +14719:0:4365 +14720:3:4288 +14721:0:4365 +14722:3:4294 +14723:0:4365 +14724:3:4295 +14725:0:4365 +14726:3:2338 +14727:0:4365 +14728:3:2339 +14729:3:2343 +14730:3:2344 +14731:3:2352 +14732:3:2353 +14733:3:2357 +14734:3:2358 +14735:3:2352 +14736:3:2353 +14737:3:2357 +14738:3:2358 +14739:3:2366 +14740:3:2371 +14741:3:2375 +14742:3:2376 +14743:3:2383 +14744:3:2384 +14745:3:2395 +14746:3:2396 +14747:3:2397 +14748:3:2395 +14749:3:2396 +14750:3:2397 +14751:3:2408 +14752:3:2413 +14753:3:2414 +14754:0:4365 +14755:3:2426 +14756:0:4365 +14757:3:2427 +14758:0:4365 +14759:2:1173 +14760:0:4365 +14761:3:2428 +14762:0:4365 +14763:2:1179 +14764:0:4365 +14765:2:1180 +14766:0:4365 +14767:3:2427 +14768:0:4365 +14769:2:1181 +14770:2:1185 +14771:2:1186 +14772:2:1194 +14773:2:1195 +14774:2:1199 +14775:2:1200 +14776:2:1194 +14777:2:1195 +14778:2:1199 +14779:2:1200 +14780:2:1208 +14781:2:1213 +14782:2:1217 +14783:2:1218 +14784:2:1225 +14785:2:1226 +14786:2:1237 +14787:2:1238 +14788:2:1239 +14789:2:1237 +14790:2:1238 +14791:2:1239 +14792:2:1250 +14793:2:1255 +14794:2:1256 +14795:0:4365 +14796:3:2428 +14797:0:4365 +14798:2:1268 +14799:0:4365 +14800:3:2427 +14801:0:4365 +14802:2:1270 +14803:0:4365 +14804:3:2428 +14805:0:4365 +14806:2:1271 +14807:2:1275 +14808:2:1276 +14809:2:1284 +14810:2:1285 +14811:2:1289 +14812:2:1290 +14813:2:1284 +14814:2:1285 +14815:2:1289 +14816:2:1290 +14817:2:1298 +14818:2:1303 +14819:2:1307 +14820:2:1308 +14821:2:1315 +14822:2:1316 +14823:2:1327 +14824:2:1328 +14825:2:1329 +14826:2:1327 +14827:2:1328 +14828:2:1329 +14829:2:1340 +14830:2:1345 +14831:2:1346 +14832:0:4365 +14833:2:1358 +14834:0:4365 +14835:2:1360 +14836:0:4365 +14837:3:2427 +14838:0:4365 +14839:2:1361 +14840:0:4365 +14841:3:2428 +14842:0:4365 +14843:2:1362 +14844:2:1366 +14845:2:1367 +14846:2:1375 +14847:2:1376 +14848:2:1380 +14849:2:1381 +14850:2:1375 +14851:2:1376 +14852:2:1380 +14853:2:1381 +14854:2:1389 +14855:2:1394 +14856:2:1398 +14857:2:1399 +14858:2:1406 +14859:2:1407 +14860:2:1418 +14861:2:1419 +14862:2:1420 +14863:2:1418 +14864:2:1419 +14865:2:1420 +14866:2:1431 +14867:2:1436 +14868:2:1437 +14869:0:4365 +14870:2:1449 +14871:0:4365 +14872:3:2427 +14873:0:4365 +14874:2:1451 +14875:0:4365 +14876:3:2428 +14877:0:4365 +14878:2:1652 +14879:0:4365 +14880:2:1653 +14881:0:4365 +14882:2:1657 +14883:0:4365 +14884:2:1180 +14885:0:4365 +14886:3:2427 +14887:0:4365 +14888:2:1181 +14889:2:1185 +14890:2:1186 +14891:2:1194 +14892:2:1195 +14893:2:1199 +14894:2:1200 +14895:2:1194 +14896:2:1195 +14897:2:1196 +14898:2:1208 +14899:2:1213 +14900:2:1217 +14901:2:1218 +14902:2:1225 +14903:2:1226 +14904:2:1237 +14905:2:1238 +14906:2:1239 +14907:2:1237 +14908:2:1238 +14909:2:1239 +14910:2:1250 +14911:2:1255 +14912:2:1256 +14913:0:4365 +14914:3:2428 +14915:0:4365 +14916:2:1268 +14917:0:4365 +14918:3:2427 +14919:0:4365 +14920:2:1270 +14921:0:4365 +14922:3:2428 +14923:0:4365 +14924:2:1271 +14925:2:1275 +14926:2:1276 +14927:2:1284 +14928:2:1285 +14929:2:1289 +14930:2:1290 +14931:2:1284 +14932:2:1285 +14933:2:1289 +14934:2:1290 +14935:2:1298 +14936:2:1303 +14937:2:1307 +14938:2:1308 +14939:2:1315 +14940:2:1316 +14941:2:1327 +14942:2:1328 +14943:2:1329 +14944:2:1327 +14945:2:1328 +14946:2:1329 +14947:2:1340 +14948:2:1345 +14949:2:1346 +14950:0:4365 +14951:2:1358 +14952:0:4365 +14953:2:1454 +14954:0:4365 +14955:3:2427 +14956:0:4365 +14957:2:1455 +14958:0:4365 +14959:3:2428 +14960:0:4365 +14961:2:1652 +14962:0:4365 +14963:2:1653 +14964:0:4365 +14965:2:1657 +14966:0:4365 +14967:2:1660 +14968:0:4365 +14969:3:2427 +14970:0:4365 +14971:2:1665 +14972:2:1669 +14973:2:1670 +14974:2:1678 +14975:2:1679 +14976:2:1683 +14977:2:1684 +14978:2:1678 +14979:2:1679 +14980:2:1680 +14981:2:1692 +14982:2:1697 +14983:2:1701 +14984:2:1702 +14985:2:1709 +14986:2:1710 +14987:2:1721 +14988:2:1722 +14989:2:1723 +14990:2:1721 +14991:2:1722 +14992:2:1723 +14993:2:1734 +14994:2:1739 +14995:2:1740 +14996:0:4365 +14997:3:2428 +14998:0:4365 +14999:2:1752 +15000:0:4365 +15001:3:2427 +15002:0:4365 +15003:2:1754 +15004:0:4365 +15005:3:2428 +15006:0:4365 +15007:2:1755 +15008:2:1759 +15009:2:1760 +15010:2:1768 +15011:2:1769 +15012:2:1773 +15013:2:1774 +15014:2:1768 +15015:2:1769 +15016:2:1773 +15017:2:1774 +15018:2:1782 +15019:2:1787 +15020:2:1791 +15021:2:1792 +15022:2:1799 +15023:2:1800 +15024:2:1811 +15025:2:1812 +15026:2:1813 +15027:2:1811 +15028:2:1812 +15029:2:1813 +15030:2:1824 +15031:2:1829 +15032:2:1830 +15033:0:4365 +15034:2:1842 +15035:0:4365 +15036:3:2427 +15037:0:4365 +15038:2:1844 +15039:0:4363 +15040:3:2428 +15041:0:4369 diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.define b/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.define new file mode 100644 index 0000000..136ef67 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.define @@ -0,0 +1,2 @@ +#define NO_RMB +#define NO_WMB diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.log b/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.log new file mode 100644 index 0000000..3afaead --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.log @@ -0,0 +1,303 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_free_no_mb.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 745) +Depth= 6009 States= 1e+06 Transitions= 1.08e+07 Memory= 534.904 t= 9.22 R= 1e+05 +Depth= 6009 States= 2e+06 Transitions= 3.4e+07 Memory= 603.557 t= 31.1 R= 6e+04 +Depth= 7527 States= 3e+06 Transitions= 4.91e+07 Memory= 672.209 t= 45.6 R= 7e+04 +pan: resizing hashtable to -w22.. done +Depth= 68651 States= 4e+06 Transitions= 6.74e+07 Memory= 772.080 t= 62.9 R= 6e+04 +Depth= 68651 States= 5e+06 Transitions= 8.62e+07 Memory= 840.733 t= 80.2 R= 6e+04 +Depth= 68651 States= 6e+06 Transitions= 1.03e+08 Memory= 909.385 t= 95.7 R= 6e+04 +Depth= 68651 States= 7e+06 Transitions= 1.21e+08 Memory= 978.037 t= 112 R= 6e+04 +Depth= 68651 States= 8e+06 Transitions= 1.37e+08 Memory= 1046.690 t= 128 R= 6e+04 +Depth= 68651 States= 9e+06 Transitions= 1.52e+08 Memory= 1115.440 t= 143 R= 6e+04 +pan: resizing hashtable to -w24.. done +Depth= 68651 States= 1e+07 Transitions= 1.72e+08 Memory= 1308.186 t= 163 R= 6e+04 +Depth= 68651 States= 1.1e+07 Transitions= 1.89e+08 Memory= 1376.838 t= 178 R= 6e+04 +Depth= 68651 States= 1.2e+07 Transitions= 2.05e+08 Memory= 1445.490 t= 193 R= 6e+04 +Depth= 68651 States= 1.3e+07 Transitions= 2.22e+08 Memory= 1514.143 t= 208 R= 6e+04 +Depth= 68651 States= 1.4e+07 Transitions= 2.39e+08 Memory= 1582.893 t= 224 R= 6e+04 +pan: claim violated! (at depth 2141) +pan: wrote .input.spin.trail + +(Spin Version 5.1.7 -- 23 December 2008) +Warning: Search not completed + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 88 byte, depth reached 68651, errors: 1 + 14155711 states, stored +2.2815817e+08 states, matched +2.4231388e+08 transitions (= stored+matched) +8.5461256e+08 atomic steps +hash conflicts: 1.1483359e+08 (resolved) + +Stats on memory usage (in Megabytes): + 1565.993 equivalent memory usage for states (stored*(State-vector + overhead)) + 1008.042 actual memory usage for states (compression: 64.37%) + state-vector as stored = 47 byte + 28 byte overhead + 128.000 memory used for hash table (-w24) + 457.764 memory used for DFS stack (-m10000000) + 1593.537 total actual memory usage + +unreached in proctype urcu_reader + line 400, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 61, "(1)" + line 419, "pan.___", state 91, "(1)" + line 400, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 158, "(1)" + line 419, "pan.___", state 188, "(1)" + line 400, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 227, "(1)" + line 409, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 256, "(1)" + line 419, "pan.___", state 286, "(1)" + line 400, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 366, "(1)" + line 409, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 395, "(1)" + line 419, "pan.___", state 425, "(1)" + line 541, "pan.___", state 456, "-end-" + (19 of 456 states) +unreached in proctype urcu_reader_sig + line 400, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 70, "(1)" + line 419, "pan.___", state 100, "(1)" + line 400, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 158, "(1)" + line 419, "pan.___", state 188, "(1)" + line 400, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 247, "(1)" + line 419, "pan.___", state 277, "(1)" + line 400, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 330, "(1)" + line 409, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 359, "(1)" + line 419, "pan.___", state 389, "(1)" + line 615, "pan.___", state 411, "-end-" + (18 of 411 states) +unreached in proctype urcu_writer + line 400, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 400, "pan.___", state 20, "(1)" + line 404, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 34, "(1)" + line 404, "pan.___", state 35, "(1)" + line 404, "pan.___", state 35, "(1)" + line 402, "pan.___", state 40, "((i<1))" + line 402, "pan.___", state 40, "((i>=1))" + line 409, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 59, "(1)" + line 410, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 410, "pan.___", state 60, "else" + line 410, "pan.___", state 63, "(1)" + line 410, "pan.___", state 64, "(1)" + line 410, "pan.___", state 64, "(1)" + line 414, "pan.___", state 72, "(1)" + line 414, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 414, "pan.___", state 73, "else" + line 414, "pan.___", state 76, "(1)" + line 414, "pan.___", state 77, "(1)" + line 414, "pan.___", state 77, "(1)" + line 412, "pan.___", state 82, "((i<1))" + line 412, "pan.___", state 82, "((i>=1))" + line 419, "pan.___", state 89, "(1)" + line 419, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 419, "pan.___", state 90, "else" + line 419, "pan.___", state 93, "(1)" + line 419, "pan.___", state 94, "(1)" + line 419, "pan.___", state 94, "(1)" + line 421, "pan.___", state 97, "(1)" + line 421, "pan.___", state 97, "(1)" + line 370, "pan.___", state 99, "(1)" + line 640, "pan.___", state 103, "cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )] = (old_gen+1)" + line 638, "pan.___", state 104, "old_gen = cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )]" + line 400, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 400, "pan.___", state 114, "(1)" + line 404, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 128, "(1)" + line 404, "pan.___", state 129, "(1)" + line 404, "pan.___", state 129, "(1)" + line 410, "pan.___", state 153, "(1)" + line 414, "pan.___", state 166, "(1)" + line 421, "pan.___", state 191, "(1)" + line 421, "pan.___", state 191, "(1)" + line 653, "pan.___", state 199, "(1)" + line 400, "pan.___", state 209, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 223, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 254, "(1)" + line 414, "pan.___", state 267, "(1)" + line 400, "pan.___", state 300, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 314, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 345, "(1)" + line 414, "pan.___", state 358, "(1)" + line 400, "pan.___", state 395, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 409, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 440, "(1)" + line 414, "pan.___", state 453, "(1)" + line 400, "pan.___", state 488, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 502, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 533, "(1)" + line 414, "pan.___", state 546, "(1)" + line 400, "pan.___", state 582, "(1)" + line 404, "pan.___", state 594, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 414, "pan.___", state 638, "(1)" + line 404, "pan.___", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 414, "pan.___", state 731, "(1)" + line 404, "pan.___", state 777, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 795, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 414, "pan.___", state 821, "(1)" + line 419, "pan.___", state 838, "(1)" + line 404, "pan.___", state 868, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 886, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 414, "pan.___", state 912, "(1)" + line 419, "pan.___", state 929, "(1)" + line 404, "pan.___", state 963, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 981, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 414, "pan.___", state 1007, "(1)" + line 419, "pan.___", state 1024, "(1)" + line 400, "pan.___", state 1050, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 400, "pan.___", state 1052, "(1)" + line 400, "pan.___", state 1053, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 400, "pan.___", state 1053, "else" + line 400, "pan.___", state 1056, "(1)" + line 404, "pan.___", state 1064, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 1066, "(1)" + line 404, "pan.___", state 1067, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 1067, "else" + line 404, "pan.___", state 1070, "(1)" + line 404, "pan.___", state 1071, "(1)" + line 404, "pan.___", state 1071, "(1)" + line 402, "pan.___", state 1076, "((i<1))" + line 402, "pan.___", state 1076, "((i>=1))" + line 409, "pan.___", state 1082, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 1095, "(1)" + line 410, "pan.___", state 1096, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 410, "pan.___", state 1096, "else" + line 410, "pan.___", state 1099, "(1)" + line 410, "pan.___", state 1100, "(1)" + line 410, "pan.___", state 1100, "(1)" + line 414, "pan.___", state 1108, "(1)" + line 414, "pan.___", state 1109, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 414, "pan.___", state 1109, "else" + line 414, "pan.___", state 1112, "(1)" + line 414, "pan.___", state 1113, "(1)" + line 414, "pan.___", state 1113, "(1)" + line 412, "pan.___", state 1118, "((i<1))" + line 412, "pan.___", state 1118, "((i>=1))" + line 419, "pan.___", state 1125, "(1)" + line 419, "pan.___", state 1126, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 419, "pan.___", state 1126, "else" + line 419, "pan.___", state 1129, "(1)" + line 419, "pan.___", state 1130, "(1)" + line 419, "pan.___", state 1130, "(1)" + line 421, "pan.___", state 1133, "(1)" + line 421, "pan.___", state 1133, "(1)" + line 404, "pan.___", state 1164, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 414, "pan.___", state 1208, "(1)" + line 404, "pan.___", state 1254, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 414, "pan.___", state 1298, "(1)" + line 400, "pan.___", state 1334, "(1)" + line 404, "pan.___", state 1346, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 414, "pan.___", state 1390, "(1)" + line 404, "pan.___", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 414, "pan.___", state 1483, "(1)" + line 404, "pan.___", state 1529, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 1547, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 414, "pan.___", state 1573, "(1)" + line 419, "pan.___", state 1590, "(1)" + line 404, "pan.___", state 1620, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 1638, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 414, "pan.___", state 1664, "(1)" + line 419, "pan.___", state 1681, "(1)" + line 404, "pan.___", state 1715, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 1733, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 414, "pan.___", state 1759, "(1)" + line 419, "pan.___", state 1776, "(1)" + line 400, "pan.___", state 1802, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 400, "pan.___", state 1804, "(1)" + line 400, "pan.___", state 1805, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 400, "pan.___", state 1805, "else" + line 400, "pan.___", state 1808, "(1)" + line 404, "pan.___", state 1816, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 1818, "(1)" + line 404, "pan.___", state 1819, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 1819, "else" + line 404, "pan.___", state 1822, "(1)" + line 404, "pan.___", state 1823, "(1)" + line 404, "pan.___", state 1823, "(1)" + line 402, "pan.___", state 1828, "((i<1))" + line 402, "pan.___", state 1828, "((i>=1))" + line 409, "pan.___", state 1834, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 1847, "(1)" + line 410, "pan.___", state 1848, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 410, "pan.___", state 1848, "else" + line 410, "pan.___", state 1851, "(1)" + line 410, "pan.___", state 1852, "(1)" + line 410, "pan.___", state 1852, "(1)" + line 414, "pan.___", state 1860, "(1)" + line 414, "pan.___", state 1861, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 414, "pan.___", state 1861, "else" + line 414, "pan.___", state 1864, "(1)" + line 414, "pan.___", state 1865, "(1)" + line 414, "pan.___", state 1865, "(1)" + line 412, "pan.___", state 1870, "((i<1))" + line 412, "pan.___", state 1870, "((i>=1))" + line 419, "pan.___", state 1877, "(1)" + line 419, "pan.___", state 1878, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 419, "pan.___", state 1878, "else" + line 419, "pan.___", state 1881, "(1)" + line 419, "pan.___", state 1882, "(1)" + line 419, "pan.___", state 1882, "(1)" + line 421, "pan.___", state 1885, "(1)" + line 421, "pan.___", state 1885, "(1)" + line 404, "pan.___", state 1916, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 414, "pan.___", state 1960, "(1)" + line 404, "pan.___", state 2007, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 414, "pan.___", state 2051, "(1)" + line 404, "pan.___", state 2102, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 414, "pan.___", state 2146, "(1)" + line 703, "pan.___", state 2192, "-end-" + (144 of 2192 states) +unreached in proctype :init: + line 710, "pan.___", state 9, "((j<2))" + line 710, "pan.___", state 9, "((j>=2))" + line 711, "pan.___", state 20, "((j<2))" + line 711, "pan.___", state 20, "((j>=2))" + line 716, "pan.___", state 33, "((j<2))" + line 716, "pan.___", state 33, "((j>=2))" + (3 of 46 states) +unreached in proctype :never: + line 750, "pan.___", state 8, "-end-" + (1 of 8 states) + +pan: elapsed time 227 seconds +pan: rate 62472.797 states/second +pan: avg transition delay 9.3511e-07 usec +cp .input.spin urcu_free_no_mb.spin.input +cp .input.spin.trail urcu_free_no_mb.spin.input.trail +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.spin.input b/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.spin.input new file mode 100644 index 0000000..5de16b8 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.spin.input @@ -0,0 +1,724 @@ +#define NO_RMB +#define NO_WMB + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#define TEST_SIGNAL +#define TEST_SIGNAL_ON_READ +//#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 1 +//#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.spin.input.trail b/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.spin.input.trail new file mode 100644 index 0000000..d437aad --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.spin.input.trail @@ -0,0 +1,2144 @@ +-2:4:-2 +-4:-4:-4 +1:0:3107 +2:4:3059 +3:4:3062 +4:4:3062 +5:4:3065 +6:4:3073 +7:4:3073 +8:4:3076 +9:4:3082 +10:4:3086 +11:4:3086 +12:4:3089 +13:4:3097 +14:4:3101 +15:4:3102 +16:0:3107 +17:4:3104 +18:0:3107 +19:3:869 +20:0:3107 +21:3:875 +22:0:3107 +23:3:876 +24:0:3107 +25:3:877 +26:3:881 +27:3:882 +28:3:890 +29:3:891 +30:3:895 +31:3:896 +32:3:904 +33:3:909 +34:3:913 +35:3:914 +36:3:921 +37:3:922 +38:3:933 +39:3:934 +40:3:935 +41:3:946 +42:3:951 +43:3:952 +44:0:3107 +45:3:964 +46:0:3107 +47:3:966 +48:3:967 +49:0:3107 +50:3:971 +51:3:975 +52:3:976 +53:3:984 +54:3:985 +55:3:989 +56:3:990 +57:3:998 +58:3:1003 +59:3:1004 +60:3:1015 +61:3:1016 +62:3:1027 +63:3:1028 +64:3:1029 +65:3:1040 +66:3:1045 +67:3:1046 +68:0:3107 +69:3:1058 +70:0:3107 +71:3:1060 +72:0:3107 +73:3:1061 +74:0:3107 +75:3:1071 +76:0:3107 +77:3:1072 +78:3:1076 +79:3:1077 +80:3:1085 +81:3:1086 +82:3:1090 +83:3:1091 +84:3:1099 +85:3:1104 +86:3:1108 +87:3:1109 +88:3:1116 +89:3:1117 +90:3:1128 +91:3:1129 +92:3:1130 +93:3:1141 +94:3:1146 +95:3:1147 +96:0:3107 +97:3:1162 +98:0:3107 +99:3:1163 +100:3:1167 +101:3:1168 +102:3:1176 +103:3:1177 +104:3:1181 +105:3:1182 +106:3:1190 +107:3:1195 +108:3:1199 +109:3:1200 +110:3:1207 +111:3:1208 +112:3:1219 +113:3:1220 +114:3:1221 +115:3:1232 +116:3:1237 +117:3:1238 +118:0:3107 +119:3:1253 +120:0:3107 +121:3:1258 +122:3:1262 +123:3:1263 +124:3:1271 +125:3:1272 +126:3:1276 +127:3:1277 +128:3:1285 +129:3:1290 +130:3:1294 +131:3:1295 +132:3:1302 +133:3:1303 +134:3:1314 +135:3:1315 +136:3:1316 +137:3:1327 +138:3:1332 +139:3:1333 +140:0:3107 +141:3:1348 +142:0:3107 +143:3:1350 +144:0:3107 +145:3:1351 +146:3:1355 +147:3:1356 +148:3:1364 +149:3:1365 +150:3:1369 +151:3:1370 +152:3:1378 +153:3:1383 +154:3:1387 +155:3:1388 +156:3:1395 +157:3:1396 +158:3:1407 +159:3:1408 +160:3:1409 +161:3:1420 +162:3:1425 +163:3:1426 +164:0:3107 +165:3:1438 +166:0:3107 +167:3:1440 +168:0:3107 +169:3:1443 +170:3:1444 +171:3:1456 +172:3:1457 +173:3:1461 +174:3:1462 +175:3:1470 +176:3:1475 +177:3:1479 +178:3:1480 +179:3:1487 +180:3:1488 +181:3:1499 +182:3:1500 +183:3:1501 +184:3:1512 +185:3:1517 +186:3:1518 +187:0:3107 +188:3:1530 +189:0:3107 +190:3:1532 +191:0:3107 +192:3:1533 +193:0:3107 +194:3:1534 +195:0:3107 +196:3:1535 +197:0:3107 +198:3:1536 +199:3:1540 +200:3:1541 +201:3:1549 +202:3:1550 +203:3:1554 +204:3:1555 +205:3:1563 +206:3:1568 +207:3:1572 +208:3:1573 +209:3:1580 +210:3:1581 +211:3:1592 +212:3:1593 +213:3:1594 +214:3:1605 +215:3:1610 +216:3:1611 +217:0:3107 +218:3:1623 +219:0:3107 +220:3:1904 +221:0:3107 +222:3:2002 +223:0:3107 +224:3:2003 +225:0:3107 +226:3:2007 +227:0:3107 +228:3:2013 +229:3:2017 +230:3:2018 +231:3:2026 +232:3:2027 +233:3:2031 +234:3:2032 +235:3:2040 +236:3:2045 +237:3:2049 +238:3:2050 +239:3:2057 +240:3:2058 +241:3:2069 +242:3:2070 +243:3:2071 +244:3:2082 +245:3:2087 +246:3:2088 +247:0:3107 +248:3:2100 +249:0:3107 +250:3:2102 +251:0:3107 +252:3:2103 +253:3:2107 +254:3:2108 +255:3:2116 +256:3:2117 +257:3:2121 +258:3:2122 +259:3:2130 +260:3:2135 +261:3:2139 +262:3:2140 +263:3:2147 +264:3:2148 +265:3:2159 +266:3:2160 +267:3:2161 +268:3:2172 +269:3:2177 +270:3:2178 +271:0:3107 +272:3:2190 +273:0:3107 +274:3:2192 +275:0:3107 +276:3:2195 +277:3:2196 +278:3:2208 +279:3:2209 +280:3:2213 +281:3:2214 +282:3:2222 +283:3:2227 +284:3:2231 +285:3:2232 +286:3:2239 +287:3:2240 +288:3:2251 +289:3:2252 +290:3:2253 +291:3:2264 +292:3:2269 +293:3:2270 +294:0:3107 +295:3:2282 +296:0:3107 +297:3:2284 +298:0:3107 +299:3:2285 +300:0:3107 +301:3:2286 +302:0:3107 +303:3:2287 +304:0:3107 +305:3:2288 +306:3:2292 +307:3:2293 +308:3:2301 +309:3:2302 +310:3:2306 +311:3:2307 +312:3:2315 +313:3:2320 +314:3:2324 +315:3:2325 +316:3:2332 +317:3:2333 +318:3:2344 +319:3:2345 +320:3:2346 +321:3:2357 +322:3:2362 +323:3:2363 +324:0:3107 +325:3:2375 +326:0:3107 +327:3:2656 +328:0:3107 +329:3:2754 +330:0:3107 +331:3:2755 +332:0:3107 +333:3:2759 +334:0:3107 +335:3:2765 +336:3:2769 +337:3:2770 +338:3:2778 +339:3:2779 +340:3:2783 +341:3:2784 +342:3:2792 +343:3:2797 +344:3:2801 +345:3:2802 +346:3:2809 +347:3:2810 +348:3:2821 +349:3:2822 +350:3:2823 +351:3:2834 +352:3:2839 +353:3:2840 +354:0:3107 +355:3:2855 +356:0:3107 +357:3:2856 +358:3:2860 +359:3:2861 +360:3:2869 +361:3:2870 +362:3:2874 +363:3:2875 +364:3:2883 +365:3:2888 +366:3:2892 +367:3:2893 +368:3:2900 +369:3:2901 +370:3:2912 +371:3:2913 +372:3:2914 +373:3:2925 +374:3:2930 +375:3:2931 +376:0:3107 +377:3:2946 +378:0:3107 +379:3:2951 +380:3:2955 +381:3:2956 +382:3:2964 +383:3:2965 +384:3:2969 +385:3:2970 +386:3:2978 +387:3:2983 +388:3:2987 +389:3:2988 +390:3:2995 +391:3:2996 +392:3:3007 +393:3:3008 +394:3:3009 +395:3:3020 +396:3:3025 +397:3:3026 +398:0:3107 +399:3:3041 +400:0:3107 +401:3:3043 +402:0:3107 +403:3:3044 +404:0:3107 +405:3:876 +406:0:3107 +407:3:877 +408:3:881 +409:3:882 +410:3:890 +411:3:891 +412:3:895 +413:3:896 +414:3:904 +415:3:909 +416:3:913 +417:3:914 +418:3:921 +419:3:922 +420:3:933 +421:3:934 +422:3:935 +423:3:946 +424:3:951 +425:3:952 +426:0:3107 +427:3:964 +428:0:3107 +429:3:966 +430:3:967 +431:0:3107 +432:3:971 +433:3:975 +434:3:976 +435:3:984 +436:3:985 +437:3:989 +438:3:990 +439:3:998 +440:3:1003 +441:3:1004 +442:3:1015 +443:3:1016 +444:3:1027 +445:3:1028 +446:3:1029 +447:3:1040 +448:3:1045 +449:3:1046 +450:0:3107 +451:3:1058 +452:0:3107 +453:3:1060 +454:0:3107 +455:3:1061 +456:0:3107 +457:3:1071 +458:0:3107 +459:3:1072 +460:3:1076 +461:3:1077 +462:3:1085 +463:3:1086 +464:3:1090 +465:3:1091 +466:3:1099 +467:3:1104 +468:3:1108 +469:3:1109 +470:3:1116 +471:3:1117 +472:3:1128 +473:3:1129 +474:3:1130 +475:3:1141 +476:3:1146 +477:3:1147 +478:0:3107 +479:3:1162 +480:0:3107 +481:3:1163 +482:3:1167 +483:3:1168 +484:3:1176 +485:3:1177 +486:3:1181 +487:3:1182 +488:3:1190 +489:3:1195 +490:3:1199 +491:3:1200 +492:3:1207 +493:3:1208 +494:3:1219 +495:3:1220 +496:3:1221 +497:3:1232 +498:3:1237 +499:3:1238 +500:0:3107 +501:3:1253 +502:0:3107 +503:3:1258 +504:3:1262 +505:3:1263 +506:3:1271 +507:3:1272 +508:3:1276 +509:3:1277 +510:3:1285 +511:3:1290 +512:3:1294 +513:3:1295 +514:3:1302 +515:3:1303 +516:3:1314 +517:3:1315 +518:3:1316 +519:3:1327 +520:3:1332 +521:3:1333 +522:0:3107 +523:3:1348 +524:0:3107 +525:3:1350 +526:0:3107 +527:3:1351 +528:3:1355 +529:3:1356 +530:3:1364 +531:3:1365 +532:3:1369 +533:3:1370 +534:3:1378 +535:3:1383 +536:3:1387 +537:3:1388 +538:3:1395 +539:3:1396 +540:3:1407 +541:3:1408 +542:3:1409 +543:3:1420 +544:3:1425 +545:3:1426 +546:0:3107 +547:3:1438 +548:0:3107 +549:3:1440 +550:0:3107 +551:3:1443 +552:3:1444 +553:3:1456 +554:3:1457 +555:3:1461 +556:3:1462 +557:3:1470 +558:3:1475 +559:3:1479 +560:3:1480 +561:3:1487 +562:3:1488 +563:3:1499 +564:3:1500 +565:3:1501 +566:3:1512 +567:3:1517 +568:3:1518 +569:0:3107 +570:3:1530 +571:0:3107 +572:3:1532 +573:0:3107 +574:3:1533 +575:0:3107 +576:3:1534 +577:0:3107 +578:3:1535 +579:0:3107 +580:3:1536 +581:3:1540 +582:3:1541 +583:3:1549 +584:3:1550 +585:3:1554 +586:3:1555 +587:3:1563 +588:3:1568 +589:3:1572 +590:3:1573 +591:3:1580 +592:3:1581 +593:3:1592 +594:3:1593 +595:3:1594 +596:3:1605 +597:3:1610 +598:3:1611 +599:0:3107 +600:3:1623 +601:0:3107 +602:3:1904 +603:0:3107 +604:3:2002 +605:0:3107 +606:3:2003 +607:0:3107 +608:3:2007 +609:0:3107 +610:3:2013 +611:3:2017 +612:3:2018 +613:3:2026 +614:3:2027 +615:3:2031 +616:3:2032 +617:3:2040 +618:3:2045 +619:3:2049 +620:3:2050 +621:3:2057 +622:3:2058 +623:3:2069 +624:3:2070 +625:3:2071 +626:3:2082 +627:3:2087 +628:3:2088 +629:0:3107 +630:3:2100 +631:0:3107 +632:3:2102 +633:0:3107 +634:3:2103 +635:3:2107 +636:3:2108 +637:3:2116 +638:3:2117 +639:3:2121 +640:3:2122 +641:3:2130 +642:3:2135 +643:3:2139 +644:3:2140 +645:3:2147 +646:3:2148 +647:3:2159 +648:3:2160 +649:3:2161 +650:3:2172 +651:3:2177 +652:3:2178 +653:0:3107 +654:3:2190 +655:0:3107 +656:3:2192 +657:0:3107 +658:3:2195 +659:3:2196 +660:3:2208 +661:3:2209 +662:3:2213 +663:3:2214 +664:3:2222 +665:3:2227 +666:3:2231 +667:3:2232 +668:3:2239 +669:3:2240 +670:3:2251 +671:3:2252 +672:3:2253 +673:3:2264 +674:3:2269 +675:3:2270 +676:0:3107 +677:3:2282 +678:0:3107 +679:3:2284 +680:0:3107 +681:3:2285 +682:0:3107 +683:3:2286 +684:0:3107 +685:3:2287 +686:0:3107 +687:3:2288 +688:3:2292 +689:3:2293 +690:3:2301 +691:3:2302 +692:3:2306 +693:3:2307 +694:3:2315 +695:3:2320 +696:3:2324 +697:3:2325 +698:3:2332 +699:3:2333 +700:3:2344 +701:3:2345 +702:3:2346 +703:3:2357 +704:3:2362 +705:3:2363 +706:0:3107 +707:3:2375 +708:0:3107 +709:3:2656 +710:0:3107 +711:3:2754 +712:0:3107 +713:3:2755 +714:0:3107 +715:3:2759 +716:0:3107 +717:3:2765 +718:3:2769 +719:3:2770 +720:3:2778 +721:3:2779 +722:3:2783 +723:3:2784 +724:3:2792 +725:3:2797 +726:3:2801 +727:3:2802 +728:3:2809 +729:3:2810 +730:3:2821 +731:3:2822 +732:3:2823 +733:3:2834 +734:3:2839 +735:3:2840 +736:0:3107 +737:3:2855 +738:0:3107 +739:3:2856 +740:3:2860 +741:3:2861 +742:3:2869 +743:3:2870 +744:3:2874 +745:3:2875 +746:3:2883 +747:3:2888 +748:3:2892 +749:3:2893 +750:3:2900 +751:3:2901 +752:3:2912 +753:3:2913 +754:3:2914 +755:3:2925 +756:3:2930 +757:3:2931 +758:0:3107 +759:3:2946 +760:0:3107 +761:3:2951 +762:3:2955 +763:3:2956 +764:3:2964 +765:3:2965 +766:3:2969 +767:3:2970 +768:3:2978 +769:3:2983 +770:3:2987 +771:3:2988 +772:3:2995 +773:3:2996 +774:3:3007 +775:3:3008 +776:3:3009 +777:3:3020 +778:3:3025 +779:3:3026 +780:0:3107 +781:3:3041 +782:0:3107 +783:3:3043 +784:0:3107 +785:3:3044 +786:0:3107 +787:3:876 +788:0:3107 +789:3:877 +790:3:881 +791:3:882 +792:3:890 +793:3:891 +794:3:895 +795:3:896 +796:3:904 +797:3:909 +798:3:913 +799:3:914 +800:3:921 +801:3:922 +802:3:933 +803:3:934 +804:3:935 +805:3:946 +806:3:951 +807:3:952 +808:0:3107 +809:3:964 +810:0:3107 +811:3:966 +812:3:967 +813:0:3107 +814:3:971 +815:3:975 +816:3:976 +817:3:984 +818:3:985 +819:3:989 +820:3:990 +821:3:998 +822:3:1003 +823:3:1004 +824:3:1015 +825:3:1016 +826:3:1027 +827:3:1028 +828:3:1029 +829:3:1040 +830:3:1045 +831:3:1046 +832:0:3107 +833:3:1058 +834:0:3107 +835:3:1060 +836:0:3107 +837:3:1061 +838:0:3107 +839:3:1071 +840:0:3107 +841:3:1072 +842:3:1076 +843:3:1077 +844:3:1085 +845:3:1086 +846:3:1090 +847:3:1091 +848:3:1099 +849:3:1104 +850:3:1108 +851:3:1109 +852:3:1116 +853:3:1117 +854:3:1128 +855:3:1129 +856:3:1130 +857:3:1141 +858:3:1146 +859:3:1147 +860:0:3107 +861:3:1162 +862:0:3107 +863:3:1163 +864:3:1167 +865:3:1168 +866:3:1176 +867:3:1177 +868:3:1181 +869:3:1182 +870:3:1190 +871:3:1195 +872:3:1199 +873:3:1200 +874:3:1207 +875:3:1208 +876:3:1219 +877:3:1220 +878:3:1221 +879:3:1232 +880:3:1237 +881:3:1238 +882:0:3107 +883:3:1253 +884:0:3107 +885:3:1258 +886:3:1262 +887:3:1263 +888:3:1271 +889:3:1272 +890:3:1276 +891:3:1277 +892:3:1285 +893:3:1290 +894:3:1294 +895:3:1295 +896:3:1302 +897:3:1303 +898:3:1314 +899:3:1315 +900:3:1316 +901:3:1327 +902:3:1332 +903:3:1333 +904:0:3107 +905:3:1348 +906:0:3107 +907:3:1350 +908:0:3107 +909:3:1351 +910:3:1355 +911:3:1356 +912:3:1364 +913:3:1365 +914:3:1369 +915:3:1370 +916:3:1378 +917:3:1383 +918:3:1387 +919:3:1388 +920:3:1395 +921:3:1396 +922:3:1407 +923:3:1408 +924:3:1409 +925:3:1420 +926:3:1425 +927:3:1426 +928:0:3107 +929:3:1438 +930:0:3107 +931:3:1440 +932:0:3107 +933:3:1443 +934:3:1444 +935:3:1456 +936:3:1457 +937:3:1461 +938:3:1462 +939:3:1470 +940:3:1475 +941:3:1479 +942:3:1480 +943:3:1487 +944:3:1488 +945:3:1499 +946:3:1500 +947:3:1501 +948:3:1512 +949:3:1517 +950:3:1518 +951:0:3107 +952:3:1530 +953:0:3107 +954:3:1532 +955:0:3107 +956:3:1533 +957:0:3107 +958:3:1534 +959:0:3107 +960:3:1535 +961:0:3107 +962:3:1536 +963:3:1540 +964:3:1541 +965:3:1549 +966:3:1550 +967:3:1554 +968:3:1555 +969:3:1563 +970:3:1568 +971:3:1572 +972:3:1573 +973:3:1580 +974:3:1581 +975:3:1592 +976:3:1593 +977:3:1594 +978:3:1605 +979:3:1610 +980:3:1611 +981:0:3107 +982:3:1623 +983:0:3107 +984:3:1904 +985:0:3107 +986:3:2002 +987:0:3107 +988:3:2003 +989:0:3107 +990:3:2007 +991:0:3107 +992:3:2013 +993:3:2017 +994:3:2018 +995:3:2026 +996:3:2027 +997:3:2031 +998:3:2032 +999:3:2040 +1000:3:2045 +1001:3:2049 +1002:3:2050 +1003:3:2057 +1004:3:2058 +1005:3:2069 +1006:3:2070 +1007:3:2071 +1008:3:2082 +1009:3:2087 +1010:3:2088 +1011:0:3107 +1012:3:2100 +1013:0:3107 +1014:3:2102 +1015:0:3107 +1016:3:2103 +1017:3:2107 +1018:3:2108 +1019:3:2116 +1020:3:2117 +1021:3:2121 +1022:3:2122 +1023:3:2130 +1024:3:2135 +1025:3:2139 +1026:3:2140 +1027:3:2147 +1028:3:2148 +1029:3:2159 +1030:3:2160 +1031:3:2161 +1032:3:2172 +1033:3:2177 +1034:3:2178 +1035:0:3107 +1036:3:2190 +1037:0:3107 +1038:3:2192 +1039:0:3107 +1040:3:2195 +1041:3:2196 +1042:3:2208 +1043:3:2209 +1044:3:2213 +1045:3:2214 +1046:3:2222 +1047:3:2227 +1048:3:2231 +1049:3:2232 +1050:3:2239 +1051:3:2240 +1052:3:2251 +1053:3:2252 +1054:3:2253 +1055:3:2264 +1056:3:2269 +1057:3:2270 +1058:0:3107 +1059:3:2282 +1060:0:3107 +1061:3:2284 +1062:0:3107 +1063:3:2285 +1064:0:3107 +1065:3:2286 +1066:0:3107 +1067:3:2287 +1068:0:3107 +1069:3:2288 +1070:3:2292 +1071:3:2293 +1072:3:2301 +1073:3:2302 +1074:3:2306 +1075:3:2307 +1076:3:2315 +1077:3:2320 +1078:3:2324 +1079:3:2325 +1080:3:2332 +1081:3:2333 +1082:3:2344 +1083:3:2345 +1084:3:2346 +1085:3:2357 +1086:3:2362 +1087:3:2363 +1088:0:3107 +1089:3:2375 +1090:0:3107 +1091:3:2656 +1092:0:3107 +1093:3:2754 +1094:0:3107 +1095:3:2755 +1096:0:3107 +1097:3:2759 +1098:0:3107 +1099:3:2765 +1100:3:2769 +1101:3:2770 +1102:3:2778 +1103:3:2779 +1104:3:2783 +1105:3:2784 +1106:3:2792 +1107:3:2797 +1108:3:2801 +1109:3:2802 +1110:3:2809 +1111:3:2810 +1112:3:2821 +1113:3:2822 +1114:3:2823 +1115:3:2834 +1116:3:2839 +1117:3:2840 +1118:0:3107 +1119:3:2855 +1120:0:3107 +1121:3:2856 +1122:3:2860 +1123:3:2861 +1124:3:2869 +1125:3:2870 +1126:3:2874 +1127:3:2875 +1128:3:2883 +1129:3:2888 +1130:3:2892 +1131:3:2893 +1132:3:2900 +1133:3:2901 +1134:3:2912 +1135:3:2913 +1136:3:2914 +1137:3:2925 +1138:3:2930 +1139:3:2931 +1140:0:3107 +1141:3:2946 +1142:0:3107 +1143:3:2951 +1144:3:2955 +1145:3:2956 +1146:3:2964 +1147:3:2965 +1148:3:2969 +1149:3:2970 +1150:3:2978 +1151:3:2983 +1152:3:2987 +1153:3:2988 +1154:3:2995 +1155:3:2996 +1156:3:3007 +1157:3:3008 +1158:3:3009 +1159:3:3020 +1160:3:3025 +1161:3:3026 +1162:0:3107 +1163:3:3041 +1164:0:3107 +1165:3:3043 +1166:0:3107 +1167:3:3044 +1168:0:3107 +1169:3:876 +1170:0:3107 +1171:3:877 +1172:3:881 +1173:3:882 +1174:3:890 +1175:3:891 +1176:3:895 +1177:3:896 +1178:3:904 +1179:3:909 +1180:3:913 +1181:3:914 +1182:3:921 +1183:3:922 +1184:3:933 +1185:3:934 +1186:3:935 +1187:3:946 +1188:3:951 +1189:3:952 +1190:0:3107 +1191:3:964 +1192:0:3107 +1193:3:966 +1194:3:967 +1195:0:3107 +1196:3:971 +1197:3:975 +1198:3:976 +1199:3:984 +1200:3:985 +1201:3:989 +1202:3:990 +1203:3:998 +1204:3:1003 +1205:3:1004 +1206:3:1015 +1207:3:1016 +1208:3:1027 +1209:3:1028 +1210:3:1029 +1211:3:1040 +1212:3:1045 +1213:3:1046 +1214:0:3107 +1215:3:1058 +1216:0:3107 +1217:3:1060 +1218:0:3107 +1219:3:1061 +1220:0:3107 +1221:3:1071 +1222:0:3107 +1223:3:1072 +1224:3:1076 +1225:3:1077 +1226:3:1085 +1227:3:1086 +1228:3:1090 +1229:3:1091 +1230:3:1099 +1231:3:1104 +1232:3:1108 +1233:3:1109 +1234:3:1116 +1235:3:1117 +1236:3:1128 +1237:3:1129 +1238:3:1130 +1239:3:1141 +1240:3:1146 +1241:3:1147 +1242:0:3107 +1243:3:1162 +1244:0:3107 +1245:3:1163 +1246:3:1167 +1247:3:1168 +1248:3:1176 +1249:3:1177 +1250:3:1181 +1251:3:1182 +1252:3:1190 +1253:3:1195 +1254:3:1199 +1255:3:1200 +1256:3:1207 +1257:3:1208 +1258:3:1219 +1259:3:1220 +1260:3:1221 +1261:3:1232 +1262:3:1237 +1263:3:1238 +1264:0:3107 +1265:3:1253 +1266:0:3107 +1267:3:1258 +1268:3:1262 +1269:3:1263 +1270:3:1271 +1271:3:1272 +1272:3:1276 +1273:3:1277 +1274:3:1285 +1275:3:1290 +1276:3:1294 +1277:3:1295 +1278:3:1302 +1279:3:1303 +1280:3:1314 +1281:3:1315 +1282:3:1316 +1283:3:1327 +1284:3:1332 +1285:3:1333 +1286:0:3107 +1287:3:1348 +1288:0:3107 +1289:3:1350 +1290:0:3107 +1291:3:1351 +1292:3:1355 +1293:3:1356 +1294:3:1364 +1295:3:1365 +1296:3:1369 +1297:3:1370 +1298:3:1378 +1299:3:1383 +1300:3:1387 +1301:3:1388 +1302:3:1395 +1303:3:1396 +1304:3:1407 +1305:3:1408 +1306:3:1409 +1307:3:1420 +1308:3:1425 +1309:3:1426 +1310:0:3107 +1311:3:1438 +1312:0:3107 +1313:3:1440 +1314:0:3107 +1315:3:1443 +1316:3:1444 +1317:3:1456 +1318:3:1457 +1319:3:1461 +1320:3:1462 +1321:3:1470 +1322:3:1475 +1323:3:1479 +1324:3:1480 +1325:3:1487 +1326:3:1488 +1327:3:1499 +1328:3:1500 +1329:3:1501 +1330:3:1512 +1331:3:1517 +1332:3:1518 +1333:0:3107 +1334:3:1530 +1335:0:3107 +1336:3:1532 +1337:0:3107 +1338:3:1533 +1339:0:3107 +1340:3:1534 +1341:0:3107 +1342:3:1535 +1343:0:3107 +1344:3:1536 +1345:3:1540 +1346:3:1541 +1347:3:1549 +1348:3:1550 +1349:3:1554 +1350:3:1555 +1351:3:1563 +1352:3:1568 +1353:3:1572 +1354:3:1573 +1355:3:1580 +1356:3:1581 +1357:3:1592 +1358:3:1593 +1359:3:1594 +1360:3:1605 +1361:3:1610 +1362:3:1611 +1363:0:3107 +1364:3:1623 +1365:0:3107 +1366:3:1904 +1367:0:3107 +1368:3:2002 +1369:0:3107 +1370:3:2003 +1371:0:3107 +1372:3:2007 +1373:0:3107 +1374:3:2013 +1375:3:2017 +1376:3:2018 +1377:3:2026 +1378:3:2027 +1379:3:2031 +1380:3:2032 +1381:3:2040 +1382:3:2045 +1383:3:2049 +1384:3:2050 +1385:3:2057 +1386:3:2058 +1387:3:2069 +1388:3:2070 +1389:3:2071 +1390:3:2082 +1391:3:2087 +1392:3:2088 +1393:0:3107 +1394:3:2100 +1395:0:3107 +1396:3:2102 +1397:0:3107 +1398:3:2103 +1399:3:2107 +1400:3:2108 +1401:3:2116 +1402:3:2117 +1403:3:2121 +1404:3:2122 +1405:3:2130 +1406:3:2135 +1407:3:2139 +1408:3:2140 +1409:3:2147 +1410:3:2148 +1411:3:2159 +1412:3:2160 +1413:3:2161 +1414:3:2172 +1415:3:2177 +1416:3:2178 +1417:0:3107 +1418:3:2190 +1419:0:3107 +1420:3:2192 +1421:0:3107 +1422:3:2195 +1423:3:2196 +1424:3:2208 +1425:3:2209 +1426:3:2213 +1427:3:2214 +1428:3:2222 +1429:3:2227 +1430:3:2231 +1431:3:2232 +1432:3:2239 +1433:3:2240 +1434:3:2251 +1435:3:2252 +1436:3:2253 +1437:3:2264 +1438:3:2269 +1439:3:2270 +1440:0:3107 +1441:3:2282 +1442:0:3107 +1443:3:2284 +1444:0:3107 +1445:3:2285 +1446:0:3107 +1447:3:2286 +1448:0:3107 +1449:3:2287 +1450:0:3107 +1451:3:2288 +1452:3:2292 +1453:3:2293 +1454:3:2301 +1455:3:2302 +1456:3:2306 +1457:3:2307 +1458:3:2315 +1459:3:2320 +1460:3:2324 +1461:3:2325 +1462:3:2332 +1463:3:2333 +1464:3:2344 +1465:3:2345 +1466:3:2346 +1467:3:2357 +1468:3:2362 +1469:3:2363 +1470:0:3107 +1471:3:2375 +1472:0:3107 +1473:3:2656 +1474:0:3107 +1475:3:2754 +1476:0:3107 +1477:3:2755 +1478:0:3107 +1479:3:2759 +1480:0:3107 +1481:3:2765 +1482:3:2769 +1483:3:2770 +1484:3:2778 +1485:3:2779 +1486:3:2783 +1487:3:2784 +1488:3:2792 +1489:3:2797 +1490:3:2801 +1491:3:2802 +1492:3:2809 +1493:3:2810 +1494:3:2821 +1495:3:2822 +1496:3:2823 +1497:3:2834 +1498:3:2839 +1499:3:2840 +1500:0:3107 +1501:3:2855 +1502:0:3107 +1503:3:2856 +1504:3:2860 +1505:3:2861 +1506:3:2869 +1507:3:2870 +1508:3:2874 +1509:3:2875 +1510:3:2883 +1511:3:2888 +1512:3:2892 +1513:3:2893 +1514:3:2900 +1515:3:2901 +1516:3:2912 +1517:3:2913 +1518:3:2914 +1519:3:2925 +1520:3:2930 +1521:3:2931 +1522:0:3107 +1523:3:2946 +1524:0:3107 +1525:3:2951 +1526:3:2955 +1527:3:2956 +1528:3:2964 +1529:3:2965 +1530:3:2969 +1531:3:2970 +1532:3:2978 +1533:3:2983 +1534:3:2987 +1535:3:2988 +1536:3:2995 +1537:3:2996 +1538:3:3007 +1539:3:3008 +1540:3:3009 +1541:3:3020 +1542:3:3025 +1543:3:3026 +1544:0:3107 +1545:3:3041 +1546:0:3107 +1547:3:3043 +1548:0:3107 +1549:3:3044 +1550:0:3107 +1551:3:876 +1552:0:3107 +1553:3:877 +1554:3:881 +1555:3:882 +1556:3:890 +1557:3:891 +1558:3:895 +1559:3:896 +1560:3:904 +1561:3:909 +1562:3:913 +1563:3:914 +1564:3:921 +1565:3:922 +1566:3:933 +1567:3:934 +1568:3:935 +1569:3:946 +1570:3:951 +1571:3:952 +1572:0:3107 +1573:3:964 +1574:0:3107 +1575:3:966 +1576:3:967 +1577:0:3107 +1578:3:971 +1579:3:975 +1580:3:976 +1581:3:984 +1582:3:985 +1583:3:989 +1584:3:990 +1585:3:998 +1586:3:1011 +1587:3:1012 +1588:3:1015 +1589:3:1016 +1590:3:1027 +1591:3:1028 +1592:3:1029 +1593:3:1040 +1594:3:1045 +1595:3:1048 +1596:3:1049 +1597:0:3107 +1598:3:1058 +1599:0:3107 +1600:3:1060 +1601:0:3107 +1602:3:1061 +1603:0:3107 +1604:3:1071 +1605:0:3107 +1606:3:1072 +1607:3:1076 +1608:3:1077 +1609:3:1085 +1610:3:1086 +1611:3:1090 +1612:3:1091 +1613:3:1099 +1614:3:1112 +1615:3:1113 +1616:3:1116 +1617:3:1117 +1618:3:1128 +1619:3:1129 +1620:3:1130 +1621:3:1141 +1622:3:1146 +1623:3:1149 +1624:3:1150 +1625:0:3107 +1626:3:1162 +1627:0:3107 +1628:3:1163 +1629:3:1167 +1630:3:1168 +1631:3:1176 +1632:3:1177 +1633:3:1181 +1634:3:1182 +1635:3:1190 +1636:3:1203 +1637:3:1204 +1638:3:1207 +1639:3:1208 +1640:3:1219 +1641:3:1220 +1642:3:1221 +1643:3:1232 +1644:3:1237 +1645:3:1240 +1646:3:1241 +1647:0:3107 +1648:3:1253 +1649:0:3107 +1650:3:1258 +1651:3:1262 +1652:3:1263 +1653:3:1271 +1654:3:1272 +1655:3:1276 +1656:3:1277 +1657:3:1285 +1658:3:1298 +1659:3:1299 +1660:3:1302 +1661:3:1303 +1662:3:1314 +1663:3:1315 +1664:3:1316 +1665:3:1327 +1666:3:1332 +1667:3:1335 +1668:3:1336 +1669:0:3107 +1670:3:1348 +1671:0:3107 +1672:3:1350 +1673:0:3107 +1674:3:1351 +1675:3:1355 +1676:3:1356 +1677:3:1364 +1678:3:1365 +1679:3:1369 +1680:3:1370 +1681:3:1378 +1682:3:1391 +1683:3:1392 +1684:3:1395 +1685:3:1396 +1686:3:1407 +1687:3:1408 +1688:3:1409 +1689:3:1420 +1690:3:1425 +1691:3:1428 +1692:3:1429 +1693:0:3107 +1694:3:1438 +1695:0:3107 +1696:3:1440 +1697:0:3107 +1698:3:1443 +1699:3:1444 +1700:3:1456 +1701:3:1457 +1702:3:1461 +1703:3:1462 +1704:3:1470 +1705:3:1483 +1706:3:1484 +1707:3:1487 +1708:3:1488 +1709:3:1499 +1710:3:1500 +1711:3:1501 +1712:3:1512 +1713:3:1517 +1714:3:1520 +1715:3:1521 +1716:0:3107 +1717:3:1530 +1718:0:3107 +1719:3:1532 +1720:0:3107 +1721:3:1533 +1722:0:3107 +1723:3:1534 +1724:0:3107 +1725:3:1535 +1726:0:3107 +1727:3:1536 +1728:3:1540 +1729:3:1541 +1730:3:1549 +1731:3:1550 +1732:3:1554 +1733:3:1555 +1734:3:1563 +1735:3:1576 +1736:3:1577 +1737:3:1580 +1738:3:1581 +1739:3:1592 +1740:3:1593 +1741:3:1594 +1742:3:1605 +1743:3:1610 +1744:3:1613 +1745:3:1614 +1746:0:3107 +1747:3:1623 +1748:0:3107 +1749:3:1904 +1750:0:3107 +1751:3:2002 +1752:0:3107 +1753:3:2003 +1754:0:3107 +1755:3:2007 +1756:0:3107 +1757:3:2013 +1758:3:2017 +1759:3:2018 +1760:3:2026 +1761:3:2027 +1762:3:2031 +1763:3:2032 +1764:3:2040 +1765:3:2053 +1766:3:2054 +1767:3:2057 +1768:3:2058 +1769:3:2069 +1770:3:2070 +1771:3:2071 +1772:3:2082 +1773:3:2087 +1774:3:2090 +1775:3:2091 +1776:0:3107 +1777:3:2100 +1778:0:3107 +1779:3:2102 +1780:0:3107 +1781:3:2103 +1782:3:2107 +1783:3:2108 +1784:3:2116 +1785:3:2117 +1786:3:2121 +1787:3:2122 +1788:3:2130 +1789:3:2143 +1790:3:2144 +1791:3:2147 +1792:3:2148 +1793:3:2159 +1794:3:2160 +1795:3:2161 +1796:3:2172 +1797:3:2177 +1798:3:2180 +1799:3:2181 +1800:0:3107 +1801:3:2190 +1802:0:3107 +1803:3:2192 +1804:0:3107 +1805:3:2195 +1806:3:2196 +1807:3:2208 +1808:3:2209 +1809:3:2213 +1810:3:2214 +1811:3:2222 +1812:3:2235 +1813:3:2236 +1814:3:2239 +1815:3:2240 +1816:3:2251 +1817:3:2252 +1818:3:2253 +1819:3:2264 +1820:3:2269 +1821:3:2272 +1822:3:2273 +1823:0:3107 +1824:3:2282 +1825:0:3107 +1826:3:2284 +1827:0:3107 +1828:3:2285 +1829:0:3107 +1830:3:2286 +1831:0:3107 +1832:3:2287 +1833:0:3107 +1834:3:2288 +1835:3:2292 +1836:3:2293 +1837:3:2301 +1838:3:2302 +1839:3:2306 +1840:3:2307 +1841:3:2315 +1842:3:2328 +1843:3:2329 +1844:3:2332 +1845:3:2333 +1846:3:2344 +1847:3:2345 +1848:3:2346 +1849:3:2357 +1850:3:2362 +1851:3:2365 +1852:3:2366 +1853:0:3107 +1854:3:2375 +1855:0:3107 +1856:3:2656 +1857:0:3107 +1858:3:2754 +1859:0:3107 +1860:3:2755 +1861:0:3107 +1862:3:2759 +1863:0:3107 +1864:3:2765 +1865:3:2769 +1866:3:2770 +1867:3:2778 +1868:3:2779 +1869:3:2783 +1870:3:2784 +1871:3:2792 +1872:3:2805 +1873:3:2806 +1874:3:2809 +1875:3:2810 +1876:3:2821 +1877:3:2822 +1878:3:2823 +1879:3:2834 +1880:3:2839 +1881:3:2842 +1882:3:2843 +1883:0:3107 +1884:3:2855 +1885:0:3107 +1886:3:2856 +1887:3:2860 +1888:3:2861 +1889:3:2869 +1890:3:2870 +1891:3:2874 +1892:3:2875 +1893:3:2883 +1894:3:2896 +1895:3:2897 +1896:3:2900 +1897:3:2901 +1898:3:2912 +1899:3:2913 +1900:3:2914 +1901:3:2925 +1902:3:2930 +1903:3:2933 +1904:3:2934 +1905:0:3107 +1906:3:2946 +1907:0:3107 +1908:3:2951 +1909:3:2955 +1910:3:2956 +1911:3:2964 +1912:3:2965 +1913:3:2969 +1914:3:2970 +1915:3:2978 +1916:3:2991 +1917:3:2992 +1918:3:2995 +1919:3:2996 +1920:3:3007 +1921:3:3008 +1922:3:3009 +1923:3:3020 +1924:3:3025 +1925:3:3028 +1926:3:3029 +1927:0:3107 +1928:3:3041 +1929:0:3107 +1930:3:3043 +1931:0:3107 +1932:3:3044 +1933:0:3107 +1934:3:3047 +1935:0:3107 +1936:3:3052 +1937:0:3107 +1938:2:458 +1939:0:3107 +1940:3:3053 +1941:0:3107 +1942:2:464 +1943:0:3107 +1944:3:3052 +1945:0:3107 +1946:2:465 +1947:0:3107 +1948:3:3053 +1949:0:3107 +1950:2:466 +1951:0:3107 +1952:3:3052 +1953:0:3107 +1954:2:467 +1955:0:3107 +1956:3:3053 +1957:0:3107 +1958:1:2 +1959:0:3107 +1960:3:3052 +1961:0:3107 +1962:2:468 +1963:0:3107 +1964:3:3053 +1965:0:3107 +1966:1:8 +1967:0:3107 +1968:3:3052 +1969:0:3107 +1970:2:467 +1971:0:3107 +1972:3:3053 +1973:0:3107 +1974:1:9 +1975:0:3107 +1976:3:3052 +1977:0:3107 +1978:2:468 +1979:0:3107 +1980:3:3053 +1981:0:3107 +1982:1:10 +1983:0:3107 +1984:3:3052 +1985:0:3107 +1986:2:467 +1987:0:3107 +1988:3:3053 +1989:0:3107 +1990:1:11 +1991:0:3107 +1992:3:3052 +1993:0:3107 +1994:2:468 +1995:0:3107 +1996:3:3053 +1997:0:3107 +1998:1:12 +1999:1:16 +2000:1:17 +2001:1:25 +2002:1:26 +2003:1:30 +2004:1:31 +2005:1:39 +2006:1:44 +2007:1:48 +2008:1:49 +2009:1:56 +2010:1:57 +2011:1:68 +2012:1:69 +2013:1:70 +2014:1:81 +2015:1:86 +2016:1:87 +2017:0:3107 +2018:3:3052 +2019:0:3107 +2020:2:467 +2021:0:3107 +2022:3:3053 +2023:0:3107 +2024:1:99 +2025:0:3107 +2026:3:3052 +2027:0:3107 +2028:2:468 +2029:0:3107 +2030:3:3053 +2031:0:3107 +2032:2:469 +2033:0:3107 +2034:3:3052 +2035:0:3107 +2036:2:475 +2037:0:3107 +2038:3:3053 +2039:0:3107 +2040:2:476 +2041:0:3107 +2042:3:3052 +2043:0:3107 +2044:2:477 +2045:2:481 +2046:2:482 +2047:2:490 +2048:2:491 +2049:2:495 +2050:2:496 +2051:2:504 +2052:2:509 +2053:2:513 +2054:2:514 +2055:2:521 +2056:2:522 +2057:2:533 +2058:2:534 +2059:2:535 +2060:2:546 +2061:2:551 +2062:2:552 +2063:0:3107 +2064:3:3053 +2065:0:3107 +2066:2:564 +2067:0:3107 +2068:3:3052 +2069:0:3107 +2070:2:565 +2071:2:569 +2072:2:570 +2073:2:578 +2074:2:579 +2075:2:583 +2076:2:584 +2077:2:592 +2078:2:597 +2079:2:601 +2080:2:602 +2081:2:609 +2082:2:610 +2083:2:621 +2084:2:622 +2085:2:623 +2086:2:634 +2087:2:639 +2088:2:640 +2089:0:3107 +2090:3:3053 +2091:0:3107 +2092:2:652 +2093:0:3107 +2094:3:3052 +2095:0:3107 +2096:2:653 +2097:0:3107 +2098:3:3053 +2099:0:3107 +2100:2:654 +2101:2:658 +2102:2:659 +2103:2:667 +2104:2:668 +2105:2:672 +2106:2:673 +2107:2:681 +2108:2:686 +2109:2:690 +2110:2:691 +2111:2:698 +2112:2:699 +2113:2:710 +2114:2:711 +2115:2:712 +2116:2:723 +2117:2:728 +2118:2:729 +2119:0:3107 +2120:3:3052 +2121:0:3107 +2122:2:741 +2123:0:3107 +2124:3:3053 +2125:0:3107 +2126:2:750 +2127:0:3107 +2128:3:3052 +2129:0:3107 +2130:2:753 +2131:0:3107 +2132:3:3053 +2133:0:3107 +2134:2:758 +2135:0:3107 +2136:3:3052 +2137:0:3107 +2138:2:759 +2139:0:3105 +2140:3:3053 +2141:0:3111 +2142:2:647 diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.define b/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.define new file mode 100644 index 0000000..73e61a4 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.define @@ -0,0 +1 @@ +#define NO_RMB diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.log b/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.log new file mode 100644 index 0000000..5bcef22 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.log @@ -0,0 +1,300 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_free_no_rmb.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 744) +Depth= 5678 States= 1e+06 Transitions= 8.21e+06 Memory= 534.904 t= 6.72 R= 1e+05 +Depth= 5678 States= 2e+06 Transitions= 1.6e+07 Memory= 603.557 t= 13.4 R= 1e+05 +Depth= 16003 States= 3e+06 Transitions= 2.49e+07 Memory= 672.209 t= 21.5 R= 1e+05 +pan: resizing hashtable to -w22.. done +Depth= 31043 States= 4e+06 Transitions= 3.44e+07 Memory= 771.983 t= 30.1 R= 1e+05 +Depth= 31043 States= 5e+06 Transitions= 4.41e+07 Memory= 840.635 t= 38.4 R= 1e+05 +Depth= 31043 States= 6e+06 Transitions= 5.25e+07 Memory= 909.287 t= 45.7 R= 1e+05 +Depth= 31043 States= 7e+06 Transitions= 6.12e+07 Memory= 977.940 t= 53.4 R= 1e+05 +Depth= 31043 States= 8e+06 Transitions= 6.95e+07 Memory= 1046.690 t= 60.8 R= 1e+05 +Depth= 31043 States= 9e+06 Transitions= 7.78e+07 Memory= 1115.342 t= 68.5 R= 1e+05 +pan: resizing hashtable to -w24.. done +Depth= 31043 States= 1e+07 Transitions= 8.68e+07 Memory= 1308.088 t= 77.9 R= 1e+05 +Depth= 31043 States= 1.1e+07 Transitions= 1.01e+08 Memory= 1376.740 t= 90.1 R= 1e+05 +Depth= 31043 States= 1.2e+07 Transitions= 1.13e+08 Memory= 1445.393 t= 101 R= 1e+05 +Depth= 31043 States= 1.3e+07 Transitions= 1.25e+08 Memory= 1514.045 t= 111 R= 1e+05 +Depth= 31043 States= 1.4e+07 Transitions= 1.38e+08 Memory= 1582.795 t= 122 R= 1e+05 +pan: claim violated! (at depth 1774) +pan: wrote .input.spin.trail + +(Spin Version 5.1.7 -- 23 December 2008) +Warning: Search not completed + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 64 byte, depth reached 31043, errors: 1 + 14288659 states, stored +1.2755714e+08 states, matched +1.418458e+08 transitions (= stored+matched) +4.6616273e+08 atomic steps +hash conflicts: 65726574 (resolved) + +Stats on memory usage (in Megabytes): + 1253.659 equivalent memory usage for states (stored*(State-vector + overhead)) + 1017.191 actual memory usage for states (compression: 81.14%) + state-vector as stored = 47 byte + 28 byte overhead + 128.000 memory used for hash table (-w24) + 457.764 memory used for DFS stack (-m10000000) + 1602.619 total actual memory usage + +unreached in proctype urcu_reader + line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 61, "(1)" + line 418, "pan.___", state 91, "(1)" + line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 158, "(1)" + line 418, "pan.___", state 188, "(1)" + line 399, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 256, "(1)" + line 418, "pan.___", state 286, "(1)" + line 399, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 395, "(1)" + line 418, "pan.___", state 425, "(1)" + line 540, "pan.___", state 456, "-end-" + (17 of 456 states) +unreached in proctype urcu_reader_sig + line 399, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 70, "(1)" + line 418, "pan.___", state 100, "(1)" + line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 158, "(1)" + line 418, "pan.___", state 188, "(1)" + line 399, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 247, "(1)" + line 418, "pan.___", state 277, "(1)" + line 399, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 359, "(1)" + line 418, "pan.___", state 389, "(1)" + line 614, "pan.___", state 411, "-end-" + (17 of 411 states) +unreached in proctype urcu_writer + line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 20, "(1)" + line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 34, "(1)" + line 403, "pan.___", state 35, "(1)" + line 403, "pan.___", state 35, "(1)" + line 401, "pan.___", state 40, "((i<1))" + line 401, "pan.___", state 40, "((i>=1))" + line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 59, "(1)" + line 409, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 409, "pan.___", state 60, "else" + line 409, "pan.___", state 63, "(1)" + line 409, "pan.___", state 64, "(1)" + line 409, "pan.___", state 64, "(1)" + line 413, "pan.___", state 72, "(1)" + line 413, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 413, "pan.___", state 73, "else" + line 413, "pan.___", state 76, "(1)" + line 413, "pan.___", state 77, "(1)" + line 413, "pan.___", state 77, "(1)" + line 411, "pan.___", state 82, "((i<1))" + line 411, "pan.___", state 82, "((i>=1))" + line 418, "pan.___", state 89, "(1)" + line 418, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 418, "pan.___", state 90, "else" + line 418, "pan.___", state 93, "(1)" + line 418, "pan.___", state 94, "(1)" + line 418, "pan.___", state 94, "(1)" + line 420, "pan.___", state 97, "(1)" + line 420, "pan.___", state 97, "(1)" + line 369, "pan.___", state 99, "(1)" + line 639, "pan.___", state 103, "cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )] = (old_gen+1)" + line 637, "pan.___", state 104, "old_gen = cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )]" + line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 114, "(1)" + line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 128, "(1)" + line 403, "pan.___", state 129, "(1)" + line 403, "pan.___", state 129, "(1)" + line 409, "pan.___", state 153, "(1)" + line 413, "pan.___", state 166, "(1)" + line 420, "pan.___", state 191, "(1)" + line 420, "pan.___", state 191, "(1)" + line 652, "pan.___", state 199, "(1)" + line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 175, "pan.___", state 243, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 179, "pan.___", state 291, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 304, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 320, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 334, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 352, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 365, "(1)" + line 413, "pan.___", state 378, "(1)" + line 418, "pan.___", state 395, "(1)" + line 399, "pan.___", state 414, "(1)" + line 403, "pan.___", state 426, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 444, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 470, "(1)" + line 418, "pan.___", state 487, "(1)" + line 403, "pan.___", state 519, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 537, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 563, "(1)" + line 418, "pan.___", state 580, "(1)" + line 179, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 616, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 175, "pan.___", state 629, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 179, "pan.___", state 677, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 690, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 714, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 716, "(1)" + line 399, "pan.___", state 717, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 717, "else" + line 399, "pan.___", state 720, "(1)" + line 403, "pan.___", state 728, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 730, "(1)" + line 403, "pan.___", state 731, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 731, "else" + line 403, "pan.___", state 734, "(1)" + line 403, "pan.___", state 735, "(1)" + line 403, "pan.___", state 735, "(1)" + line 401, "pan.___", state 740, "((i<1))" + line 401, "pan.___", state 740, "((i>=1))" + line 408, "pan.___", state 746, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 759, "(1)" + line 409, "pan.___", state 760, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 409, "pan.___", state 760, "else" + line 409, "pan.___", state 763, "(1)" + line 409, "pan.___", state 764, "(1)" + line 409, "pan.___", state 764, "(1)" + line 413, "pan.___", state 772, "(1)" + line 413, "pan.___", state 773, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 413, "pan.___", state 773, "else" + line 413, "pan.___", state 776, "(1)" + line 413, "pan.___", state 777, "(1)" + line 413, "pan.___", state 777, "(1)" + line 411, "pan.___", state 782, "((i<1))" + line 411, "pan.___", state 782, "((i>=1))" + line 418, "pan.___", state 789, "(1)" + line 418, "pan.___", state 790, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 418, "pan.___", state 790, "else" + line 418, "pan.___", state 793, "(1)" + line 418, "pan.___", state 794, "(1)" + line 418, "pan.___", state 794, "(1)" + line 420, "pan.___", state 797, "(1)" + line 420, "pan.___", state 797, "(1)" + line 403, "pan.___", state 828, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 846, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 872, "(1)" + line 418, "pan.___", state 889, "(1)" + line 403, "pan.___", state 918, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 936, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 962, "(1)" + line 418, "pan.___", state 979, "(1)" + line 399, "pan.___", state 998, "(1)" + line 403, "pan.___", state 1010, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 1028, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 1054, "(1)" + line 418, "pan.___", state 1071, "(1)" + line 403, "pan.___", state 1103, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 1121, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 1147, "(1)" + line 418, "pan.___", state 1164, "(1)" + line 179, "pan.___", state 1187, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 1200, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 175, "pan.___", state 1213, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 179, "pan.___", state 1261, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 1274, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 1298, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 1300, "(1)" + line 399, "pan.___", state 1301, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 1301, "else" + line 399, "pan.___", state 1304, "(1)" + line 403, "pan.___", state 1312, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 1314, "(1)" + line 403, "pan.___", state 1315, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 1315, "else" + line 403, "pan.___", state 1318, "(1)" + line 403, "pan.___", state 1319, "(1)" + line 403, "pan.___", state 1319, "(1)" + line 401, "pan.___", state 1324, "((i<1))" + line 401, "pan.___", state 1324, "((i>=1))" + line 408, "pan.___", state 1330, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 1343, "(1)" + line 409, "pan.___", state 1344, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 409, "pan.___", state 1344, "else" + line 409, "pan.___", state 1347, "(1)" + line 409, "pan.___", state 1348, "(1)" + line 409, "pan.___", state 1348, "(1)" + line 413, "pan.___", state 1356, "(1)" + line 413, "pan.___", state 1357, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 413, "pan.___", state 1357, "else" + line 413, "pan.___", state 1360, "(1)" + line 413, "pan.___", state 1361, "(1)" + line 413, "pan.___", state 1361, "(1)" + line 411, "pan.___", state 1366, "((i<1))" + line 411, "pan.___", state 1366, "((i>=1))" + line 418, "pan.___", state 1373, "(1)" + line 418, "pan.___", state 1374, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 418, "pan.___", state 1374, "else" + line 418, "pan.___", state 1377, "(1)" + line 418, "pan.___", state 1378, "(1)" + line 418, "pan.___", state 1378, "(1)" + line 420, "pan.___", state 1381, "(1)" + line 420, "pan.___", state 1381, "(1)" + line 179, "pan.___", state 1406, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 1419, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 175, "pan.___", state 1432, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 179, "pan.___", state 1480, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 1493, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 702, "pan.___", state 1520, "-end-" + (144 of 1520 states) +unreached in proctype :init: + line 709, "pan.___", state 9, "((j<2))" + line 709, "pan.___", state 9, "((j>=2))" + line 710, "pan.___", state 20, "((j<2))" + line 710, "pan.___", state 20, "((j>=2))" + line 715, "pan.___", state 33, "((j<2))" + line 715, "pan.___", state 33, "((j>=2))" + (3 of 46 states) +unreached in proctype :never: + line 749, "pan.___", state 8, "-end-" + (1 of 8 states) + +pan: elapsed time 125 seconds +pan: rate 114108.44 states/second +pan: avg transition delay 8.8279e-07 usec +cp .input.spin urcu_free_no_rmb.spin.input +cp .input.spin.trail urcu_free_no_rmb.spin.input.trail +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.spin.input b/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.spin.input new file mode 100644 index 0000000..ccf5f5c --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.spin.input @@ -0,0 +1,723 @@ +#define NO_RMB + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#define TEST_SIGNAL +#define TEST_SIGNAL_ON_READ +//#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 1 +//#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.spin.input.trail b/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.spin.input.trail new file mode 100644 index 0000000..1e5e132 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.spin.input.trail @@ -0,0 +1,1777 @@ +-2:4:-2 +-4:-4:-4 +1:0:2435 +2:4:2387 +3:4:2390 +4:4:2390 +5:4:2393 +6:4:2401 +7:4:2401 +8:4:2404 +9:4:2410 +10:4:2414 +11:4:2414 +12:4:2417 +13:4:2425 +14:4:2429 +15:4:2430 +16:0:2435 +17:4:2432 +18:0:2435 +19:3:869 +20:0:2435 +21:3:875 +22:0:2435 +23:3:876 +24:0:2435 +25:3:877 +26:3:881 +27:3:882 +28:3:890 +29:3:891 +30:3:895 +31:3:896 +32:3:904 +33:3:909 +34:3:913 +35:3:914 +36:3:921 +37:3:922 +38:3:933 +39:3:934 +40:3:935 +41:3:946 +42:3:951 +43:3:952 +44:0:2435 +45:3:964 +46:0:2435 +47:3:966 +48:3:967 +49:0:2435 +50:3:971 +51:3:975 +52:3:976 +53:3:984 +54:3:985 +55:3:989 +56:3:990 +57:3:998 +58:3:1003 +59:3:1004 +60:3:1015 +61:3:1016 +62:3:1027 +63:3:1028 +64:3:1029 +65:3:1040 +66:3:1045 +67:3:1046 +68:0:2435 +69:3:1058 +70:0:2435 +71:3:1060 +72:0:2435 +73:3:1061 +74:0:2435 +75:3:1071 +76:0:2435 +77:3:1075 +78:3:1076 +79:3:1080 +80:3:1084 +81:3:1085 +82:3:1089 +83:3:1097 +84:3:1098 +85:0:2435 +86:3:1106 +87:0:2435 +88:3:1110 +89:3:1111 +90:3:1115 +91:3:1119 +92:3:1120 +93:3:1124 +94:3:1132 +95:3:1133 +96:0:2435 +97:3:1141 +98:0:2435 +99:3:1149 +100:3:1150 +101:3:1154 +102:3:1158 +103:3:1159 +104:3:1163 +105:3:1171 +106:3:1172 +107:0:2435 +108:3:1180 +109:0:2435 +110:3:1182 +111:0:2435 +112:3:1183 +113:3:1187 +114:3:1188 +115:3:1196 +116:3:1197 +117:3:1201 +118:3:1202 +119:3:1210 +120:3:1215 +121:3:1219 +122:3:1220 +123:3:1227 +124:3:1228 +125:3:1239 +126:3:1240 +127:3:1241 +128:3:1252 +129:3:1257 +130:3:1258 +131:0:2435 +132:3:1270 +133:0:2435 +134:3:1272 +135:0:2435 +136:3:1275 +137:3:1276 +138:3:1288 +139:3:1289 +140:3:1293 +141:3:1294 +142:3:1302 +143:3:1307 +144:3:1311 +145:3:1312 +146:3:1319 +147:3:1320 +148:3:1331 +149:3:1332 +150:3:1333 +151:3:1344 +152:3:1349 +153:3:1350 +154:0:2435 +155:3:1362 +156:0:2435 +157:3:1364 +158:0:2435 +159:3:1365 +160:0:2435 +161:3:1366 +162:0:2435 +163:3:1367 +164:0:2435 +165:3:1368 +166:3:1372 +167:3:1373 +168:3:1381 +169:3:1382 +170:3:1386 +171:3:1387 +172:3:1395 +173:3:1400 +174:3:1404 +175:3:1405 +176:3:1412 +177:3:1413 +178:3:1424 +179:3:1425 +180:3:1426 +181:3:1437 +182:3:1442 +183:3:1443 +184:0:2435 +185:3:1455 +186:0:2435 +187:3:1568 +188:0:2435 +189:3:1666 +190:0:2435 +191:3:1667 +192:0:2435 +193:3:1671 +194:0:2435 +195:3:1677 +196:3:1681 +197:3:1682 +198:3:1690 +199:3:1691 +200:3:1695 +201:3:1696 +202:3:1704 +203:3:1709 +204:3:1713 +205:3:1714 +206:3:1721 +207:3:1722 +208:3:1733 +209:3:1734 +210:3:1735 +211:3:1746 +212:3:1751 +213:3:1752 +214:0:2435 +215:3:1764 +216:0:2435 +217:3:1766 +218:0:2435 +219:3:1767 +220:3:1771 +221:3:1772 +222:3:1780 +223:3:1781 +224:3:1785 +225:3:1786 +226:3:1794 +227:3:1799 +228:3:1803 +229:3:1804 +230:3:1811 +231:3:1812 +232:3:1823 +233:3:1824 +234:3:1825 +235:3:1836 +236:3:1841 +237:3:1842 +238:0:2435 +239:3:1854 +240:0:2435 +241:3:1856 +242:0:2435 +243:3:1859 +244:3:1860 +245:3:1872 +246:3:1873 +247:3:1877 +248:3:1878 +249:3:1886 +250:3:1891 +251:3:1895 +252:3:1896 +253:3:1903 +254:3:1904 +255:3:1915 +256:3:1916 +257:3:1917 +258:3:1928 +259:3:1933 +260:3:1934 +261:0:2435 +262:3:1946 +263:0:2435 +264:3:1948 +265:0:2435 +266:3:1949 +267:0:2435 +268:3:1950 +269:0:2435 +270:3:1951 +271:0:2435 +272:3:1952 +273:3:1956 +274:3:1957 +275:3:1965 +276:3:1966 +277:3:1970 +278:3:1971 +279:3:1979 +280:3:1984 +281:3:1988 +282:3:1989 +283:3:1996 +284:3:1997 +285:3:2008 +286:3:2009 +287:3:2010 +288:3:2021 +289:3:2026 +290:3:2027 +291:0:2435 +292:3:2039 +293:0:2435 +294:3:2152 +295:0:2435 +296:3:2250 +297:0:2435 +298:3:2251 +299:0:2435 +300:3:2255 +301:0:2435 +302:3:2264 +303:3:2265 +304:3:2269 +305:3:2273 +306:3:2274 +307:3:2278 +308:3:2286 +309:3:2287 +310:0:2435 +311:3:2295 +312:0:2435 +313:3:2299 +314:3:2300 +315:3:2304 +316:3:2308 +317:3:2309 +318:3:2313 +319:3:2321 +320:3:2322 +321:0:2435 +322:3:2330 +323:0:2435 +324:3:2338 +325:3:2339 +326:3:2343 +327:3:2347 +328:3:2348 +329:3:2352 +330:3:2360 +331:3:2361 +332:0:2435 +333:3:2369 +334:0:2435 +335:3:2371 +336:0:2435 +337:3:2372 +338:0:2435 +339:3:876 +340:0:2435 +341:3:877 +342:3:881 +343:3:882 +344:3:890 +345:3:891 +346:3:895 +347:3:896 +348:3:904 +349:3:909 +350:3:913 +351:3:914 +352:3:921 +353:3:922 +354:3:933 +355:3:934 +356:3:935 +357:3:946 +358:3:951 +359:3:952 +360:0:2435 +361:3:964 +362:0:2435 +363:3:966 +364:3:967 +365:0:2435 +366:3:971 +367:3:975 +368:3:976 +369:3:984 +370:3:985 +371:3:989 +372:3:990 +373:3:998 +374:3:1003 +375:3:1004 +376:3:1015 +377:3:1016 +378:3:1027 +379:3:1028 +380:3:1029 +381:3:1040 +382:3:1045 +383:3:1046 +384:0:2435 +385:3:1058 +386:0:2435 +387:3:1060 +388:0:2435 +389:3:1061 +390:0:2435 +391:3:1071 +392:0:2435 +393:3:1075 +394:3:1076 +395:3:1080 +396:3:1084 +397:3:1085 +398:3:1089 +399:3:1097 +400:3:1098 +401:0:2435 +402:3:1106 +403:0:2435 +404:3:1110 +405:3:1111 +406:3:1115 +407:3:1119 +408:3:1120 +409:3:1124 +410:3:1132 +411:3:1133 +412:0:2435 +413:3:1141 +414:0:2435 +415:3:1149 +416:3:1150 +417:3:1154 +418:3:1158 +419:3:1159 +420:3:1163 +421:3:1171 +422:3:1172 +423:0:2435 +424:3:1180 +425:0:2435 +426:3:1182 +427:0:2435 +428:3:1183 +429:3:1187 +430:3:1188 +431:3:1196 +432:3:1197 +433:3:1201 +434:3:1202 +435:3:1210 +436:3:1215 +437:3:1219 +438:3:1220 +439:3:1227 +440:3:1228 +441:3:1239 +442:3:1240 +443:3:1241 +444:3:1252 +445:3:1257 +446:3:1258 +447:0:2435 +448:3:1270 +449:0:2435 +450:3:1272 +451:0:2435 +452:3:1275 +453:3:1276 +454:3:1288 +455:3:1289 +456:3:1293 +457:3:1294 +458:3:1302 +459:3:1307 +460:3:1311 +461:3:1312 +462:3:1319 +463:3:1320 +464:3:1331 +465:3:1332 +466:3:1333 +467:3:1344 +468:3:1349 +469:3:1350 +470:0:2435 +471:3:1362 +472:0:2435 +473:3:1364 +474:0:2435 +475:3:1365 +476:0:2435 +477:3:1366 +478:0:2435 +479:3:1367 +480:0:2435 +481:3:1368 +482:3:1372 +483:3:1373 +484:3:1381 +485:3:1382 +486:3:1386 +487:3:1387 +488:3:1395 +489:3:1400 +490:3:1404 +491:3:1405 +492:3:1412 +493:3:1413 +494:3:1424 +495:3:1425 +496:3:1426 +497:3:1437 +498:3:1442 +499:3:1443 +500:0:2435 +501:3:1455 +502:0:2435 +503:3:1568 +504:0:2435 +505:3:1666 +506:0:2435 +507:3:1667 +508:0:2435 +509:3:1671 +510:0:2435 +511:3:1677 +512:3:1681 +513:3:1682 +514:3:1690 +515:3:1691 +516:3:1695 +517:3:1696 +518:3:1704 +519:3:1709 +520:3:1713 +521:3:1714 +522:3:1721 +523:3:1722 +524:3:1733 +525:3:1734 +526:3:1735 +527:3:1746 +528:3:1751 +529:3:1752 +530:0:2435 +531:3:1764 +532:0:2435 +533:3:1766 +534:0:2435 +535:3:1767 +536:3:1771 +537:3:1772 +538:3:1780 +539:3:1781 +540:3:1785 +541:3:1786 +542:3:1794 +543:3:1799 +544:3:1803 +545:3:1804 +546:3:1811 +547:3:1812 +548:3:1823 +549:3:1824 +550:3:1825 +551:3:1836 +552:3:1841 +553:3:1842 +554:0:2435 +555:3:1854 +556:0:2435 +557:3:1856 +558:0:2435 +559:3:1859 +560:3:1860 +561:3:1872 +562:3:1873 +563:3:1877 +564:3:1878 +565:3:1886 +566:3:1891 +567:3:1895 +568:3:1896 +569:3:1903 +570:3:1904 +571:3:1915 +572:3:1916 +573:3:1917 +574:3:1928 +575:3:1933 +576:3:1934 +577:0:2435 +578:3:1946 +579:0:2435 +580:3:1948 +581:0:2435 +582:3:1949 +583:0:2435 +584:3:1950 +585:0:2435 +586:3:1951 +587:0:2435 +588:3:1952 +589:3:1956 +590:3:1957 +591:3:1965 +592:3:1966 +593:3:1970 +594:3:1971 +595:3:1979 +596:3:1984 +597:3:1988 +598:3:1989 +599:3:1996 +600:3:1997 +601:3:2008 +602:3:2009 +603:3:2010 +604:3:2021 +605:3:2026 +606:3:2027 +607:0:2435 +608:3:2039 +609:0:2435 +610:3:2152 +611:0:2435 +612:3:2250 +613:0:2435 +614:3:2251 +615:0:2435 +616:3:2255 +617:0:2435 +618:3:2264 +619:3:2265 +620:3:2269 +621:3:2273 +622:3:2274 +623:3:2278 +624:3:2286 +625:3:2287 +626:0:2435 +627:3:2295 +628:0:2435 +629:3:2299 +630:3:2300 +631:3:2304 +632:3:2308 +633:3:2309 +634:3:2313 +635:3:2321 +636:3:2322 +637:0:2435 +638:3:2330 +639:0:2435 +640:3:2338 +641:3:2339 +642:3:2343 +643:3:2347 +644:3:2348 +645:3:2352 +646:3:2360 +647:3:2361 +648:0:2435 +649:3:2369 +650:0:2435 +651:3:2371 +652:0:2435 +653:3:2372 +654:0:2435 +655:3:876 +656:0:2435 +657:3:877 +658:3:881 +659:3:882 +660:3:890 +661:3:891 +662:3:895 +663:3:896 +664:3:904 +665:3:909 +666:3:913 +667:3:914 +668:3:921 +669:3:922 +670:3:933 +671:3:934 +672:3:935 +673:3:946 +674:3:951 +675:3:952 +676:0:2435 +677:3:964 +678:0:2435 +679:3:966 +680:3:967 +681:0:2435 +682:3:971 +683:3:975 +684:3:976 +685:3:984 +686:3:985 +687:3:989 +688:3:990 +689:3:998 +690:3:1003 +691:3:1004 +692:3:1015 +693:3:1016 +694:3:1027 +695:3:1028 +696:3:1029 +697:3:1040 +698:3:1045 +699:3:1046 +700:0:2435 +701:3:1058 +702:0:2435 +703:3:1060 +704:0:2435 +705:3:1061 +706:0:2435 +707:3:1071 +708:0:2435 +709:3:1075 +710:3:1076 +711:3:1080 +712:3:1084 +713:3:1085 +714:3:1089 +715:3:1097 +716:3:1098 +717:0:2435 +718:3:1106 +719:0:2435 +720:3:1110 +721:3:1111 +722:3:1115 +723:3:1119 +724:3:1120 +725:3:1124 +726:3:1132 +727:3:1133 +728:0:2435 +729:3:1141 +730:0:2435 +731:3:1149 +732:3:1150 +733:3:1154 +734:3:1158 +735:3:1159 +736:3:1163 +737:3:1171 +738:3:1172 +739:0:2435 +740:3:1180 +741:0:2435 +742:3:1182 +743:0:2435 +744:3:1183 +745:3:1187 +746:3:1188 +747:3:1196 +748:3:1197 +749:3:1201 +750:3:1202 +751:3:1210 +752:3:1215 +753:3:1219 +754:3:1220 +755:3:1227 +756:3:1228 +757:3:1239 +758:3:1240 +759:3:1241 +760:3:1252 +761:3:1257 +762:3:1258 +763:0:2435 +764:3:1270 +765:0:2435 +766:3:1272 +767:0:2435 +768:3:1275 +769:3:1276 +770:3:1288 +771:3:1289 +772:3:1293 +773:3:1294 +774:3:1302 +775:3:1307 +776:3:1311 +777:3:1312 +778:3:1319 +779:3:1320 +780:3:1331 +781:3:1332 +782:3:1333 +783:3:1344 +784:3:1349 +785:3:1350 +786:0:2435 +787:3:1362 +788:0:2435 +789:3:1364 +790:0:2435 +791:3:1365 +792:0:2435 +793:3:1366 +794:0:2435 +795:3:1367 +796:0:2435 +797:3:1368 +798:3:1372 +799:3:1373 +800:3:1381 +801:3:1382 +802:3:1386 +803:3:1387 +804:3:1395 +805:3:1400 +806:3:1404 +807:3:1405 +808:3:1412 +809:3:1413 +810:3:1424 +811:3:1425 +812:3:1426 +813:3:1437 +814:3:1442 +815:3:1443 +816:0:2435 +817:3:1455 +818:0:2435 +819:3:1568 +820:0:2435 +821:3:1666 +822:0:2435 +823:3:1667 +824:0:2435 +825:3:1671 +826:0:2435 +827:3:1677 +828:3:1681 +829:3:1682 +830:3:1690 +831:3:1691 +832:3:1695 +833:3:1696 +834:3:1704 +835:3:1709 +836:3:1713 +837:3:1714 +838:3:1721 +839:3:1722 +840:3:1733 +841:3:1734 +842:3:1735 +843:3:1746 +844:3:1751 +845:3:1752 +846:0:2435 +847:3:1764 +848:0:2435 +849:3:1766 +850:0:2435 +851:3:1767 +852:3:1771 +853:3:1772 +854:3:1780 +855:3:1781 +856:3:1785 +857:3:1786 +858:3:1794 +859:3:1799 +860:3:1803 +861:3:1804 +862:3:1811 +863:3:1812 +864:3:1823 +865:3:1824 +866:3:1825 +867:3:1836 +868:3:1841 +869:3:1842 +870:0:2435 +871:3:1854 +872:0:2435 +873:3:1856 +874:0:2435 +875:3:1859 +876:3:1860 +877:3:1872 +878:3:1873 +879:3:1877 +880:3:1878 +881:3:1886 +882:3:1891 +883:3:1895 +884:3:1896 +885:3:1903 +886:3:1904 +887:3:1915 +888:3:1916 +889:3:1917 +890:3:1928 +891:3:1933 +892:3:1934 +893:0:2435 +894:3:1946 +895:0:2435 +896:3:1948 +897:0:2435 +898:3:1949 +899:0:2435 +900:3:1950 +901:0:2435 +902:3:1951 +903:0:2435 +904:3:1952 +905:3:1956 +906:3:1957 +907:3:1965 +908:3:1966 +909:3:1970 +910:3:1971 +911:3:1979 +912:3:1984 +913:3:1988 +914:3:1989 +915:3:1996 +916:3:1997 +917:3:2008 +918:3:2009 +919:3:2010 +920:3:2021 +921:3:2026 +922:3:2027 +923:0:2435 +924:3:2039 +925:0:2435 +926:3:2152 +927:0:2435 +928:3:2250 +929:0:2435 +930:3:2251 +931:0:2435 +932:3:2255 +933:0:2435 +934:3:2264 +935:3:2265 +936:3:2269 +937:3:2273 +938:3:2274 +939:3:2278 +940:3:2286 +941:3:2287 +942:0:2435 +943:3:2295 +944:0:2435 +945:3:2299 +946:3:2300 +947:3:2304 +948:3:2308 +949:3:2309 +950:3:2313 +951:3:2321 +952:3:2322 +953:0:2435 +954:3:2330 +955:0:2435 +956:3:2338 +957:3:2339 +958:3:2343 +959:3:2347 +960:3:2348 +961:3:2352 +962:3:2360 +963:3:2361 +964:0:2435 +965:3:2369 +966:0:2435 +967:3:2371 +968:0:2435 +969:3:2372 +970:0:2435 +971:3:876 +972:0:2435 +973:3:877 +974:3:881 +975:3:882 +976:3:890 +977:3:891 +978:3:895 +979:3:896 +980:3:904 +981:3:909 +982:3:913 +983:3:914 +984:3:921 +985:3:922 +986:3:933 +987:3:934 +988:3:935 +989:3:946 +990:3:951 +991:3:952 +992:0:2435 +993:3:964 +994:0:2435 +995:3:966 +996:3:967 +997:0:2435 +998:3:971 +999:3:975 +1000:3:976 +1001:3:984 +1002:3:985 +1003:3:989 +1004:3:990 +1005:3:998 +1006:3:1003 +1007:3:1004 +1008:3:1015 +1009:3:1016 +1010:3:1027 +1011:3:1028 +1012:3:1029 +1013:3:1040 +1014:3:1045 +1015:3:1046 +1016:0:2435 +1017:3:1058 +1018:0:2435 +1019:3:1060 +1020:0:2435 +1021:3:1061 +1022:0:2435 +1023:3:1071 +1024:0:2435 +1025:3:1075 +1026:3:1076 +1027:3:1080 +1028:3:1084 +1029:3:1085 +1030:3:1089 +1031:3:1097 +1032:3:1098 +1033:0:2435 +1034:3:1106 +1035:0:2435 +1036:3:1110 +1037:3:1111 +1038:3:1115 +1039:3:1119 +1040:3:1120 +1041:3:1124 +1042:3:1132 +1043:3:1133 +1044:0:2435 +1045:3:1141 +1046:0:2435 +1047:3:1149 +1048:3:1150 +1049:3:1154 +1050:3:1158 +1051:3:1159 +1052:3:1163 +1053:3:1171 +1054:3:1172 +1055:0:2435 +1056:3:1180 +1057:0:2435 +1058:3:1182 +1059:0:2435 +1060:3:1183 +1061:3:1187 +1062:3:1188 +1063:3:1196 +1064:3:1197 +1065:3:1201 +1066:3:1202 +1067:3:1210 +1068:3:1215 +1069:3:1219 +1070:3:1220 +1071:3:1227 +1072:3:1228 +1073:3:1239 +1074:3:1240 +1075:3:1241 +1076:3:1252 +1077:3:1257 +1078:3:1258 +1079:0:2435 +1080:3:1270 +1081:0:2435 +1082:3:1272 +1083:0:2435 +1084:3:1275 +1085:3:1276 +1086:3:1288 +1087:3:1289 +1088:3:1293 +1089:3:1294 +1090:3:1302 +1091:3:1307 +1092:3:1311 +1093:3:1312 +1094:3:1319 +1095:3:1320 +1096:3:1331 +1097:3:1332 +1098:3:1333 +1099:3:1344 +1100:3:1349 +1101:3:1350 +1102:0:2435 +1103:3:1362 +1104:0:2435 +1105:3:1364 +1106:0:2435 +1107:3:1365 +1108:0:2435 +1109:3:1366 +1110:0:2435 +1111:3:1367 +1112:0:2435 +1113:3:1368 +1114:3:1372 +1115:3:1373 +1116:3:1381 +1117:3:1382 +1118:3:1386 +1119:3:1387 +1120:3:1395 +1121:3:1400 +1122:3:1404 +1123:3:1405 +1124:3:1412 +1125:3:1413 +1126:3:1424 +1127:3:1425 +1128:3:1426 +1129:3:1437 +1130:3:1442 +1131:3:1443 +1132:0:2435 +1133:3:1455 +1134:0:2435 +1135:3:1568 +1136:0:2435 +1137:3:1666 +1138:0:2435 +1139:3:1667 +1140:0:2435 +1141:3:1671 +1142:0:2435 +1143:3:1677 +1144:3:1681 +1145:3:1682 +1146:3:1690 +1147:3:1691 +1148:3:1695 +1149:3:1696 +1150:3:1704 +1151:3:1709 +1152:3:1713 +1153:3:1714 +1154:3:1721 +1155:3:1722 +1156:3:1733 +1157:3:1734 +1158:3:1735 +1159:3:1746 +1160:3:1751 +1161:3:1752 +1162:0:2435 +1163:3:1764 +1164:0:2435 +1165:3:1766 +1166:0:2435 +1167:3:1767 +1168:3:1771 +1169:3:1772 +1170:3:1780 +1171:3:1781 +1172:3:1785 +1173:3:1786 +1174:3:1794 +1175:3:1799 +1176:3:1803 +1177:3:1804 +1178:3:1811 +1179:3:1812 +1180:3:1823 +1181:3:1824 +1182:3:1825 +1183:3:1836 +1184:3:1841 +1185:3:1842 +1186:0:2435 +1187:3:1854 +1188:0:2435 +1189:3:1856 +1190:0:2435 +1191:3:1859 +1192:3:1860 +1193:3:1872 +1194:3:1873 +1195:3:1877 +1196:3:1878 +1197:3:1886 +1198:3:1891 +1199:3:1895 +1200:3:1896 +1201:3:1903 +1202:3:1904 +1203:3:1915 +1204:3:1916 +1205:3:1917 +1206:3:1928 +1207:3:1933 +1208:3:1934 +1209:0:2435 +1210:3:1946 +1211:0:2435 +1212:3:1948 +1213:0:2435 +1214:3:1949 +1215:0:2435 +1216:3:1950 +1217:0:2435 +1218:3:1951 +1219:0:2435 +1220:3:1952 +1221:3:1956 +1222:3:1957 +1223:3:1965 +1224:3:1966 +1225:3:1970 +1226:3:1971 +1227:3:1979 +1228:3:1984 +1229:3:1988 +1230:3:1989 +1231:3:1996 +1232:3:1997 +1233:3:2008 +1234:3:2009 +1235:3:2010 +1236:3:2021 +1237:3:2026 +1238:3:2027 +1239:0:2435 +1240:3:2039 +1241:0:2435 +1242:3:2152 +1243:0:2435 +1244:3:2250 +1245:0:2435 +1246:3:2251 +1247:0:2435 +1248:3:2255 +1249:0:2435 +1250:3:2264 +1251:3:2265 +1252:3:2269 +1253:3:2273 +1254:3:2274 +1255:3:2278 +1256:3:2286 +1257:3:2287 +1258:0:2435 +1259:3:2295 +1260:0:2435 +1261:3:2299 +1262:3:2300 +1263:3:2304 +1264:3:2308 +1265:3:2309 +1266:3:2313 +1267:3:2321 +1268:3:2322 +1269:0:2435 +1270:3:2330 +1271:0:2435 +1272:3:2338 +1273:3:2339 +1274:3:2343 +1275:3:2347 +1276:3:2348 +1277:3:2352 +1278:3:2360 +1279:3:2361 +1280:0:2435 +1281:3:2369 +1282:0:2435 +1283:3:2371 +1284:0:2435 +1285:3:2372 +1286:0:2435 +1287:3:876 +1288:0:2435 +1289:3:877 +1290:3:881 +1291:3:882 +1292:3:890 +1293:3:891 +1294:3:895 +1295:3:896 +1296:3:904 +1297:3:909 +1298:3:913 +1299:3:914 +1300:3:921 +1301:3:922 +1302:3:933 +1303:3:934 +1304:3:935 +1305:3:946 +1306:3:951 +1307:3:952 +1308:0:2435 +1309:3:964 +1310:0:2435 +1311:3:966 +1312:3:967 +1313:0:2435 +1314:3:971 +1315:3:975 +1316:3:976 +1317:3:984 +1318:3:985 +1319:3:989 +1320:3:990 +1321:3:998 +1322:3:1011 +1323:3:1012 +1324:3:1015 +1325:3:1016 +1326:3:1027 +1327:3:1028 +1328:3:1029 +1329:3:1040 +1330:3:1045 +1331:3:1048 +1332:3:1049 +1333:0:2435 +1334:3:1058 +1335:0:2435 +1336:3:1060 +1337:0:2435 +1338:3:1061 +1339:0:2435 +1340:3:1071 +1341:0:2435 +1342:2:458 +1343:0:2435 +1344:2:464 +1345:0:2435 +1346:2:465 +1347:0:2435 +1348:2:466 +1349:0:2435 +1350:2:467 +1351:0:2435 +1352:1:2 +1353:0:2435 +1354:2:468 +1355:0:2435 +1356:1:8 +1357:0:2435 +1358:1:9 +1359:0:2435 +1360:1:10 +1361:0:2435 +1362:1:11 +1363:0:2435 +1364:2:467 +1365:0:2435 +1366:1:12 +1367:1:16 +1368:1:17 +1369:1:25 +1370:1:26 +1371:1:30 +1372:1:31 +1373:1:39 +1374:1:44 +1375:1:48 +1376:1:49 +1377:1:56 +1378:1:57 +1379:1:68 +1380:1:69 +1381:1:70 +1382:1:81 +1383:1:86 +1384:1:87 +1385:0:2435 +1386:2:468 +1387:0:2435 +1388:3:1075 +1389:3:1076 +1390:3:1080 +1391:3:1084 +1392:3:1085 +1393:3:1089 +1394:3:1094 +1395:0:2435 +1396:3:1106 +1397:0:2435 +1398:3:1110 +1399:3:1111 +1400:3:1115 +1401:3:1119 +1402:3:1120 +1403:3:1124 +1404:3:1132 +1405:3:1133 +1406:0:2435 +1407:3:1141 +1408:0:2435 +1409:3:1149 +1410:3:1150 +1411:3:1154 +1412:3:1158 +1413:3:1159 +1414:3:1163 +1415:3:1171 +1416:3:1172 +1417:0:2435 +1418:3:1180 +1419:0:2435 +1420:3:1182 +1421:0:2435 +1422:3:1183 +1423:3:1187 +1424:3:1188 +1425:3:1196 +1426:3:1197 +1427:3:1201 +1428:3:1202 +1429:3:1210 +1430:3:1215 +1431:3:1219 +1432:3:1220 +1433:3:1227 +1434:3:1228 +1435:3:1239 +1436:3:1240 +1437:3:1241 +1438:3:1252 +1439:3:1257 +1440:3:1258 +1441:0:2435 +1442:3:1270 +1443:0:2435 +1444:3:1272 +1445:0:2435 +1446:3:1275 +1447:3:1276 +1448:3:1288 +1449:3:1289 +1450:3:1293 +1451:3:1294 +1452:3:1302 +1453:3:1307 +1454:3:1311 +1455:3:1312 +1456:3:1319 +1457:3:1320 +1458:3:1331 +1459:3:1332 +1460:3:1333 +1461:3:1344 +1462:3:1349 +1463:3:1350 +1464:0:2435 +1465:3:1362 +1466:0:2435 +1467:3:1364 +1468:0:2435 +1469:3:1365 +1470:0:2435 +1471:3:1366 +1472:0:2435 +1473:3:1367 +1474:0:2435 +1475:3:1368 +1476:3:1372 +1477:3:1373 +1478:3:1381 +1479:3:1382 +1480:3:1386 +1481:3:1387 +1482:3:1395 +1483:3:1400 +1484:3:1404 +1485:3:1405 +1486:3:1412 +1487:3:1413 +1488:3:1424 +1489:3:1425 +1490:3:1426 +1491:3:1437 +1492:3:1442 +1493:3:1443 +1494:0:2435 +1495:3:1455 +1496:0:2435 +1497:3:1568 +1498:0:2435 +1499:3:1666 +1500:0:2435 +1501:3:1667 +1502:0:2435 +1503:3:1671 +1504:0:2435 +1505:3:1677 +1506:3:1681 +1507:3:1682 +1508:3:1690 +1509:3:1691 +1510:3:1695 +1511:3:1696 +1512:3:1704 +1513:3:1709 +1514:3:1713 +1515:3:1714 +1516:3:1721 +1517:3:1722 +1518:3:1733 +1519:3:1734 +1520:3:1735 +1521:3:1746 +1522:3:1751 +1523:3:1752 +1524:0:2435 +1525:3:1764 +1526:0:2435 +1527:3:1766 +1528:0:2435 +1529:3:1767 +1530:3:1771 +1531:3:1772 +1532:3:1780 +1533:3:1781 +1534:3:1785 +1535:3:1786 +1536:3:1794 +1537:3:1799 +1538:3:1803 +1539:3:1804 +1540:3:1811 +1541:3:1812 +1542:3:1823 +1543:3:1824 +1544:3:1825 +1545:3:1836 +1546:3:1841 +1547:3:1842 +1548:0:2435 +1549:3:1854 +1550:0:2435 +1551:3:1856 +1552:0:2435 +1553:3:1859 +1554:3:1860 +1555:3:1872 +1556:3:1873 +1557:3:1877 +1558:3:1878 +1559:3:1886 +1560:3:1891 +1561:3:1895 +1562:3:1896 +1563:3:1903 +1564:3:1904 +1565:3:1915 +1566:3:1916 +1567:3:1917 +1568:3:1928 +1569:3:1933 +1570:3:1934 +1571:0:2435 +1572:3:1946 +1573:0:2435 +1574:3:1948 +1575:0:2435 +1576:3:1949 +1577:0:2435 +1578:3:1950 +1579:0:2435 +1580:3:1951 +1581:0:2435 +1582:3:1952 +1583:3:1956 +1584:3:1957 +1585:3:1965 +1586:3:1966 +1587:3:1970 +1588:3:1971 +1589:3:1979 +1590:3:1984 +1591:3:1988 +1592:3:1989 +1593:3:1996 +1594:3:1997 +1595:3:2008 +1596:3:2009 +1597:3:2010 +1598:3:2021 +1599:3:2026 +1600:3:2027 +1601:0:2435 +1602:3:2039 +1603:0:2435 +1604:3:2152 +1605:0:2435 +1606:3:2250 +1607:0:2435 +1608:3:2251 +1609:0:2435 +1610:3:2255 +1611:0:2435 +1612:3:2264 +1613:3:2265 +1614:3:2269 +1615:3:2273 +1616:3:2274 +1617:3:2278 +1618:3:2286 +1619:3:2287 +1620:0:2435 +1621:3:2295 +1622:0:2435 +1623:3:2299 +1624:3:2300 +1625:3:2304 +1626:3:2308 +1627:3:2309 +1628:3:2313 +1629:3:2321 +1630:3:2322 +1631:0:2435 +1632:3:2330 +1633:0:2435 +1634:3:2338 +1635:3:2339 +1636:3:2343 +1637:3:2347 +1638:3:2348 +1639:3:2352 +1640:3:2360 +1641:3:2361 +1642:0:2435 +1643:3:2369 +1644:0:2435 +1645:3:2371 +1646:0:2435 +1647:3:2372 +1648:0:2435 +1649:3:2375 +1650:0:2435 +1651:3:2380 +1652:0:2435 +1653:2:467 +1654:0:2435 +1655:3:2381 +1656:0:2435 +1657:1:99 +1658:0:2435 +1659:3:2380 +1660:0:2435 +1661:2:468 +1662:0:2435 +1663:3:2381 +1664:0:2435 +1665:2:469 +1666:0:2435 +1667:3:2380 +1668:0:2435 +1669:2:475 +1670:0:2435 +1671:3:2381 +1672:0:2435 +1673:2:476 +1674:0:2435 +1675:3:2380 +1676:0:2435 +1677:2:477 +1678:2:481 +1679:2:482 +1680:2:490 +1681:2:491 +1682:2:495 +1683:2:496 +1684:2:504 +1685:2:509 +1686:2:513 +1687:2:514 +1688:2:521 +1689:2:522 +1690:2:533 +1691:2:534 +1692:2:535 +1693:2:546 +1694:2:558 +1695:2:559 +1696:0:2435 +1697:3:2381 +1698:0:2435 +1699:2:564 +1700:0:2435 +1701:3:2380 +1702:0:2435 +1703:2:565 +1704:2:569 +1705:2:570 +1706:2:578 +1707:2:579 +1708:2:583 +1709:2:584 +1710:2:592 +1711:2:597 +1712:2:601 +1713:2:602 +1714:2:609 +1715:2:610 +1716:2:621 +1717:2:622 +1718:2:623 +1719:2:634 +1720:2:646 +1721:2:647 +1722:0:2435 +1723:3:2381 +1724:0:2435 +1725:2:652 +1726:0:2435 +1727:3:2380 +1728:0:2435 +1729:2:653 +1730:0:2435 +1731:3:2381 +1732:0:2435 +1733:2:654 +1734:2:658 +1735:2:659 +1736:2:667 +1737:2:668 +1738:2:672 +1739:2:673 +1740:2:681 +1741:2:686 +1742:2:690 +1743:2:691 +1744:2:698 +1745:2:699 +1746:2:710 +1747:2:711 +1748:2:712 +1749:2:723 +1750:2:735 +1751:2:736 +1752:0:2435 +1753:3:2380 +1754:0:2435 +1755:2:741 +1756:0:2435 +1757:3:2381 +1758:0:2435 +1759:2:750 +1760:0:2435 +1761:3:2380 +1762:0:2435 +1763:2:753 +1764:0:2435 +1765:3:2381 +1766:0:2435 +1767:2:758 +1768:0:2435 +1769:3:2380 +1770:0:2435 +1771:2:759 +1772:0:2433 +1773:3:2381 +1774:0:2439 +1775:0:2435 diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.define b/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.define new file mode 100644 index 0000000..710f29d --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.define @@ -0,0 +1 @@ +#define NO_WMB diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.log b/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.log new file mode 100644 index 0000000..0423ec5 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.log @@ -0,0 +1,320 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_free_no_wmb.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 744) +Depth= 10656 States= 1e+06 Transitions= 8.86e+06 Memory= 534.807 t= 7.38 R= 1e+05 +Depth= 35214 States= 2e+06 Transitions= 1.82e+07 Memory= 603.557 t= 15.5 R= 1e+05 +Depth= 35214 States= 3e+06 Transitions= 2.73e+07 Memory= 672.209 t= 23.8 R= 1e+05 +pan: resizing hashtable to -w22.. done +Depth= 35214 States= 4e+06 Transitions= 4.08e+07 Memory= 771.885 t= 35.9 R= 1e+05 +pan: claim violated! (at depth 1650) +pan: wrote .input.spin.trail + +(Spin Version 5.1.7 -- 23 December 2008) +Warning: Search not completed + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 64 byte, depth reached 35214, errors: 1 + 4154272 states, stored + 38595853 states, matched + 42750125 transitions (= stored+matched) +1.4058824e+08 atomic steps +hash conflicts: 21492325 (resolved) + +Stats on memory usage (in Megabytes): + 364.488 equivalent memory usage for states (stored*(State-vector + overhead)) + 292.863 actual memory usage for states (compression: 80.35%) + state-vector as stored = 46 byte + 28 byte overhead + 32.000 memory used for hash table (-w22) + 457.764 memory used for DFS stack (-m10000000) + 782.529 total actual memory usage + +unreached in proctype urcu_reader + line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 61, "(1)" + line 418, "pan.___", state 91, "(1)" + line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 158, "(1)" + line 418, "pan.___", state 188, "(1)" + line 399, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 227, "(1)" + line 408, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 256, "(1)" + line 418, "pan.___", state 286, "(1)" + line 399, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 366, "(1)" + line 408, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 395, "(1)" + line 418, "pan.___", state 425, "(1)" + line 540, "pan.___", state 456, "-end-" + (19 of 456 states) +unreached in proctype urcu_reader_sig + line 399, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 70, "(1)" + line 418, "pan.___", state 100, "(1)" + line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 158, "(1)" + line 418, "pan.___", state 188, "(1)" + line 399, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 247, "(1)" + line 418, "pan.___", state 277, "(1)" + line 399, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 330, "(1)" + line 408, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 359, "(1)" + line 418, "pan.___", state 389, "(1)" + line 614, "pan.___", state 411, "-end-" + (18 of 411 states) +unreached in proctype urcu_writer + line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 20, "(1)" + line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 34, "(1)" + line 403, "pan.___", state 35, "(1)" + line 403, "pan.___", state 35, "(1)" + line 401, "pan.___", state 40, "((i<1))" + line 401, "pan.___", state 40, "((i>=1))" + line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 59, "(1)" + line 409, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 409, "pan.___", state 60, "else" + line 409, "pan.___", state 63, "(1)" + line 409, "pan.___", state 64, "(1)" + line 409, "pan.___", state 64, "(1)" + line 413, "pan.___", state 72, "(1)" + line 413, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 413, "pan.___", state 73, "else" + line 413, "pan.___", state 76, "(1)" + line 413, "pan.___", state 77, "(1)" + line 413, "pan.___", state 77, "(1)" + line 411, "pan.___", state 82, "((i<1))" + line 411, "pan.___", state 82, "((i>=1))" + line 418, "pan.___", state 89, "(1)" + line 418, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 418, "pan.___", state 90, "else" + line 418, "pan.___", state 93, "(1)" + line 418, "pan.___", state 94, "(1)" + line 418, "pan.___", state 94, "(1)" + line 420, "pan.___", state 97, "(1)" + line 420, "pan.___", state 97, "(1)" + line 369, "pan.___", state 99, "(1)" + line 639, "pan.___", state 103, "cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )] = (old_gen+1)" + line 637, "pan.___", state 104, "old_gen = cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )]" + line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 114, "(1)" + line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 128, "(1)" + line 403, "pan.___", state 129, "(1)" + line 403, "pan.___", state 129, "(1)" + line 401, "pan.___", state 134, "((i<1))" + line 401, "pan.___", state 134, "((i>=1))" + line 409, "pan.___", state 153, "(1)" + line 409, "pan.___", state 154, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 409, "pan.___", state 154, "else" + line 409, "pan.___", state 157, "(1)" + line 409, "pan.___", state 158, "(1)" + line 409, "pan.___", state 158, "(1)" + line 413, "pan.___", state 166, "(1)" + line 413, "pan.___", state 167, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 413, "pan.___", state 167, "else" + line 413, "pan.___", state 170, "(1)" + line 413, "pan.___", state 171, "(1)" + line 413, "pan.___", state 171, "(1)" + line 411, "pan.___", state 176, "((i<1))" + line 411, "pan.___", state 176, "((i>=1))" + line 418, "pan.___", state 183, "(1)" + line 418, "pan.___", state 184, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 418, "pan.___", state 184, "else" + line 418, "pan.___", state 187, "(1)" + line 418, "pan.___", state 188, "(1)" + line 418, "pan.___", state 188, "(1)" + line 420, "pan.___", state 191, "(1)" + line 420, "pan.___", state 191, "(1)" + line 369, "pan.___", state 193, "(1)" + line 652, "pan.___", state 199, "(1)" + line 646, "pan.___", state 202, "((write_lock==0))" + line 646, "pan.___", state 202, "else" + line 644, "pan.___", state 203, "(1)" + line 160, "pan.___", state 209, "(1)" + line 164, "pan.___", state 217, "(1)" + line 164, "pan.___", state 218, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 164, "pan.___", state 218, "else" + line 162, "pan.___", state 223, "((j<1))" + line 162, "pan.___", state 223, "((j>=1))" + line 168, "pan.___", state 229, "(1)" + line 168, "pan.___", state 230, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 168, "pan.___", state 230, "else" + line 160, "pan.___", state 241, "(1)" + line 168, "pan.___", state 261, "(1)" + line 160, "pan.___", state 277, "(1)" + line 164, "pan.___", state 285, "(1)" + line 168, "pan.___", state 297, "(1)" + line 399, "pan.___", state 311, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 325, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 343, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 356, "(1)" + line 413, "pan.___", state 369, "(1)" + line 418, "pan.___", state 386, "(1)" + line 399, "pan.___", state 405, "(1)" + line 403, "pan.___", state 417, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 435, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 461, "(1)" + line 418, "pan.___", state 478, "(1)" + line 403, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 554, "(1)" + line 418, "pan.___", state 571, "(1)" + line 164, "pan.___", state 594, "(1)" + line 168, "pan.___", state 606, "(1)" + line 160, "pan.___", state 618, "(1)" + line 168, "pan.___", state 638, "(1)" + line 164, "pan.___", state 662, "(1)" + line 168, "pan.___", state 674, "(1)" + line 399, "pan.___", state 696, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 698, "(1)" + line 399, "pan.___", state 699, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 699, "else" + line 399, "pan.___", state 702, "(1)" + line 403, "pan.___", state 710, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 712, "(1)" + line 403, "pan.___", state 713, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 713, "else" + line 403, "pan.___", state 716, "(1)" + line 403, "pan.___", state 717, "(1)" + line 403, "pan.___", state 717, "(1)" + line 401, "pan.___", state 722, "((i<1))" + line 401, "pan.___", state 722, "((i>=1))" + line 408, "pan.___", state 728, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 741, "(1)" + line 409, "pan.___", state 742, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 409, "pan.___", state 742, "else" + line 409, "pan.___", state 745, "(1)" + line 409, "pan.___", state 746, "(1)" + line 409, "pan.___", state 746, "(1)" + line 413, "pan.___", state 754, "(1)" + line 413, "pan.___", state 755, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 413, "pan.___", state 755, "else" + line 413, "pan.___", state 758, "(1)" + line 413, "pan.___", state 759, "(1)" + line 413, "pan.___", state 759, "(1)" + line 411, "pan.___", state 764, "((i<1))" + line 411, "pan.___", state 764, "((i>=1))" + line 418, "pan.___", state 771, "(1)" + line 418, "pan.___", state 772, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 418, "pan.___", state 772, "else" + line 418, "pan.___", state 775, "(1)" + line 418, "pan.___", state 776, "(1)" + line 418, "pan.___", state 776, "(1)" + line 420, "pan.___", state 779, "(1)" + line 420, "pan.___", state 779, "(1)" + line 403, "pan.___", state 810, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 828, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 854, "(1)" + line 418, "pan.___", state 871, "(1)" + line 403, "pan.___", state 900, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 918, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 944, "(1)" + line 418, "pan.___", state 961, "(1)" + line 399, "pan.___", state 980, "(1)" + line 403, "pan.___", state 992, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 1010, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 1036, "(1)" + line 418, "pan.___", state 1053, "(1)" + line 403, "pan.___", state 1085, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 1103, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 1129, "(1)" + line 418, "pan.___", state 1146, "(1)" + line 164, "pan.___", state 1169, "(1)" + line 168, "pan.___", state 1181, "(1)" + line 160, "pan.___", state 1193, "(1)" + line 168, "pan.___", state 1213, "(1)" + line 164, "pan.___", state 1237, "(1)" + line 168, "pan.___", state 1249, "(1)" + line 399, "pan.___", state 1271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 1273, "(1)" + line 399, "pan.___", state 1274, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 1274, "else" + line 399, "pan.___", state 1277, "(1)" + line 403, "pan.___", state 1285, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 1287, "(1)" + line 403, "pan.___", state 1288, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 1288, "else" + line 403, "pan.___", state 1291, "(1)" + line 403, "pan.___", state 1292, "(1)" + line 403, "pan.___", state 1292, "(1)" + line 401, "pan.___", state 1297, "((i<1))" + line 401, "pan.___", state 1297, "((i>=1))" + line 408, "pan.___", state 1303, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 1316, "(1)" + line 409, "pan.___", state 1317, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 409, "pan.___", state 1317, "else" + line 409, "pan.___", state 1320, "(1)" + line 409, "pan.___", state 1321, "(1)" + line 409, "pan.___", state 1321, "(1)" + line 413, "pan.___", state 1329, "(1)" + line 413, "pan.___", state 1330, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 413, "pan.___", state 1330, "else" + line 413, "pan.___", state 1333, "(1)" + line 413, "pan.___", state 1334, "(1)" + line 413, "pan.___", state 1334, "(1)" + line 411, "pan.___", state 1339, "((i<1))" + line 411, "pan.___", state 1339, "((i>=1))" + line 418, "pan.___", state 1346, "(1)" + line 418, "pan.___", state 1347, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 418, "pan.___", state 1347, "else" + line 418, "pan.___", state 1350, "(1)" + line 418, "pan.___", state 1351, "(1)" + line 418, "pan.___", state 1351, "(1)" + line 420, "pan.___", state 1354, "(1)" + line 420, "pan.___", state 1354, "(1)" + line 164, "pan.___", state 1379, "(1)" + line 168, "pan.___", state 1391, "(1)" + line 160, "pan.___", state 1403, "(1)" + line 168, "pan.___", state 1423, "(1)" + line 164, "pan.___", state 1447, "(1)" + line 168, "pan.___", state 1459, "(1)" + line 702, "pan.___", state 1484, "-end-" + (160 of 1484 states) +unreached in proctype :init: + line 709, "pan.___", state 9, "((j<2))" + line 709, "pan.___", state 9, "((j>=2))" + line 710, "pan.___", state 20, "((j<2))" + line 710, "pan.___", state 20, "((j>=2))" + line 715, "pan.___", state 33, "((j<2))" + line 715, "pan.___", state 33, "((j>=2))" + (3 of 46 states) +unreached in proctype :never: + line 749, "pan.___", state 8, "-end-" + (1 of 8 states) + +pan: elapsed time 37.6 seconds +pan: rate 110515.35 states/second +pan: avg transition delay 8.793e-07 usec +cp .input.spin urcu_free_no_wmb.spin.input +cp .input.spin.trail urcu_free_no_wmb.spin.input.trail +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.spin.input b/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.spin.input new file mode 100644 index 0000000..d5d174d --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.spin.input @@ -0,0 +1,723 @@ +#define NO_WMB + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#define TEST_SIGNAL +#define TEST_SIGNAL_ON_READ +//#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 1 +//#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.spin.input.trail b/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.spin.input.trail new file mode 100644 index 0000000..f2ce974 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.spin.input.trail @@ -0,0 +1,1653 @@ +-2:4:-2 +-4:-4:-4 +1:0:2399 +2:4:2351 +3:4:2354 +4:4:2354 +5:4:2357 +6:4:2365 +7:4:2365 +8:4:2368 +9:4:2374 +10:4:2378 +11:4:2378 +12:4:2381 +13:4:2389 +14:4:2393 +15:4:2394 +16:0:2399 +17:4:2396 +18:0:2399 +19:3:869 +20:0:2399 +21:3:875 +22:0:2399 +23:3:876 +24:0:2399 +25:3:877 +26:3:881 +27:3:882 +28:3:890 +29:3:891 +30:3:895 +31:3:896 +32:3:904 +33:3:909 +34:3:913 +35:3:914 +36:3:921 +37:3:922 +38:3:933 +39:3:934 +40:3:935 +41:3:946 +42:3:951 +43:3:952 +44:0:2399 +45:3:964 +46:0:2399 +47:3:966 +48:3:967 +49:0:2399 +50:3:971 +51:3:975 +52:3:976 +53:3:984 +54:3:985 +55:3:989 +56:3:990 +57:3:998 +58:3:1003 +59:3:1004 +60:3:1015 +61:3:1016 +62:3:1027 +63:3:1028 +64:3:1029 +65:3:1040 +66:3:1045 +67:3:1046 +68:0:2399 +69:3:1058 +70:0:2399 +71:3:1060 +72:0:2399 +73:3:1061 +74:0:2399 +75:3:1071 +76:0:2399 +77:3:1072 +78:3:1079 +79:3:1080 +80:3:1087 +81:3:1092 +82:0:2399 +83:3:1103 +84:0:2399 +85:3:1104 +86:3:1111 +87:3:1112 +88:3:1119 +89:3:1124 +90:0:2399 +91:3:1135 +92:0:2399 +93:3:1140 +94:3:1147 +95:3:1148 +96:3:1155 +97:3:1160 +98:0:2399 +99:3:1171 +100:0:2399 +101:3:1173 +102:0:2399 +103:3:1174 +104:3:1178 +105:3:1179 +106:3:1187 +107:3:1188 +108:3:1192 +109:3:1193 +110:3:1201 +111:3:1206 +112:3:1210 +113:3:1211 +114:3:1218 +115:3:1219 +116:3:1230 +117:3:1231 +118:3:1232 +119:3:1243 +120:3:1248 +121:3:1249 +122:0:2399 +123:3:1261 +124:0:2399 +125:3:1263 +126:0:2399 +127:3:1266 +128:3:1267 +129:3:1279 +130:3:1280 +131:3:1284 +132:3:1285 +133:3:1293 +134:3:1298 +135:3:1302 +136:3:1303 +137:3:1310 +138:3:1311 +139:3:1322 +140:3:1323 +141:3:1324 +142:3:1335 +143:3:1340 +144:3:1341 +145:0:2399 +146:3:1353 +147:0:2399 +148:3:1355 +149:0:2399 +150:3:1356 +151:0:2399 +152:3:1357 +153:0:2399 +154:3:1358 +155:0:2399 +156:3:1359 +157:3:1363 +158:3:1364 +159:3:1372 +160:3:1373 +161:3:1377 +162:3:1378 +163:3:1386 +164:3:1391 +165:3:1395 +166:3:1396 +167:3:1403 +168:3:1404 +169:3:1415 +170:3:1416 +171:3:1417 +172:3:1428 +173:3:1433 +174:3:1434 +175:0:2399 +176:3:1446 +177:0:2399 +178:3:1550 +179:0:2399 +180:3:1648 +181:0:2399 +182:3:1649 +183:0:2399 +184:3:1653 +185:0:2399 +186:3:1659 +187:3:1663 +188:3:1664 +189:3:1672 +190:3:1673 +191:3:1677 +192:3:1678 +193:3:1686 +194:3:1691 +195:3:1695 +196:3:1696 +197:3:1703 +198:3:1704 +199:3:1715 +200:3:1716 +201:3:1717 +202:3:1728 +203:3:1733 +204:3:1734 +205:0:2399 +206:3:1746 +207:0:2399 +208:3:1748 +209:0:2399 +210:3:1749 +211:3:1753 +212:3:1754 +213:3:1762 +214:3:1763 +215:3:1767 +216:3:1768 +217:3:1776 +218:3:1781 +219:3:1785 +220:3:1786 +221:3:1793 +222:3:1794 +223:3:1805 +224:3:1806 +225:3:1807 +226:3:1818 +227:3:1823 +228:3:1824 +229:0:2399 +230:3:1836 +231:0:2399 +232:3:1838 +233:0:2399 +234:3:1841 +235:3:1842 +236:3:1854 +237:3:1855 +238:3:1859 +239:3:1860 +240:3:1868 +241:3:1873 +242:3:1877 +243:3:1878 +244:3:1885 +245:3:1886 +246:3:1897 +247:3:1898 +248:3:1899 +249:3:1910 +250:3:1915 +251:3:1916 +252:0:2399 +253:3:1928 +254:0:2399 +255:3:1930 +256:0:2399 +257:3:1931 +258:0:2399 +259:3:1932 +260:0:2399 +261:3:1933 +262:0:2399 +263:3:1934 +264:3:1938 +265:3:1939 +266:3:1947 +267:3:1948 +268:3:1952 +269:3:1953 +270:3:1961 +271:3:1966 +272:3:1970 +273:3:1971 +274:3:1978 +275:3:1979 +276:3:1990 +277:3:1991 +278:3:1992 +279:3:2003 +280:3:2008 +281:3:2009 +282:0:2399 +283:3:2021 +284:0:2399 +285:3:2125 +286:0:2399 +287:3:2223 +288:0:2399 +289:3:2224 +290:0:2399 +291:3:2228 +292:0:2399 +293:3:2234 +294:3:2241 +295:3:2242 +296:3:2249 +297:3:2254 +298:0:2399 +299:3:2265 +300:0:2399 +301:3:2266 +302:3:2273 +303:3:2274 +304:3:2281 +305:3:2286 +306:0:2399 +307:3:2297 +308:0:2399 +309:3:2302 +310:3:2309 +311:3:2310 +312:3:2317 +313:3:2322 +314:0:2399 +315:3:2333 +316:0:2399 +317:3:2335 +318:0:2399 +319:3:2336 +320:0:2399 +321:3:876 +322:0:2399 +323:3:877 +324:3:881 +325:3:882 +326:3:890 +327:3:891 +328:3:895 +329:3:896 +330:3:904 +331:3:909 +332:3:913 +333:3:914 +334:3:921 +335:3:922 +336:3:933 +337:3:934 +338:3:935 +339:3:946 +340:3:951 +341:3:952 +342:0:2399 +343:3:964 +344:0:2399 +345:3:966 +346:3:967 +347:0:2399 +348:3:971 +349:3:975 +350:3:976 +351:3:984 +352:3:985 +353:3:989 +354:3:990 +355:3:998 +356:3:1003 +357:3:1004 +358:3:1015 +359:3:1016 +360:3:1027 +361:3:1028 +362:3:1029 +363:3:1040 +364:3:1045 +365:3:1046 +366:0:2399 +367:3:1058 +368:0:2399 +369:3:1060 +370:0:2399 +371:3:1061 +372:0:2399 +373:3:1071 +374:0:2399 +375:3:1072 +376:3:1079 +377:3:1080 +378:3:1087 +379:3:1092 +380:0:2399 +381:3:1103 +382:0:2399 +383:3:1104 +384:3:1111 +385:3:1112 +386:3:1119 +387:3:1124 +388:0:2399 +389:3:1135 +390:0:2399 +391:3:1140 +392:3:1147 +393:3:1148 +394:3:1155 +395:3:1160 +396:0:2399 +397:3:1171 +398:0:2399 +399:3:1173 +400:0:2399 +401:3:1174 +402:3:1178 +403:3:1179 +404:3:1187 +405:3:1188 +406:3:1192 +407:3:1193 +408:3:1201 +409:3:1206 +410:3:1210 +411:3:1211 +412:3:1218 +413:3:1219 +414:3:1230 +415:3:1231 +416:3:1232 +417:3:1243 +418:3:1248 +419:3:1249 +420:0:2399 +421:3:1261 +422:0:2399 +423:3:1263 +424:0:2399 +425:3:1266 +426:3:1267 +427:3:1279 +428:3:1280 +429:3:1284 +430:3:1285 +431:3:1293 +432:3:1298 +433:3:1302 +434:3:1303 +435:3:1310 +436:3:1311 +437:3:1322 +438:3:1323 +439:3:1324 +440:3:1335 +441:3:1340 +442:3:1341 +443:0:2399 +444:3:1353 +445:0:2399 +446:3:1355 +447:0:2399 +448:3:1356 +449:0:2399 +450:3:1357 +451:0:2399 +452:3:1358 +453:0:2399 +454:3:1359 +455:3:1363 +456:3:1364 +457:3:1372 +458:3:1373 +459:3:1377 +460:3:1378 +461:3:1386 +462:3:1391 +463:3:1395 +464:3:1396 +465:3:1403 +466:3:1404 +467:3:1415 +468:3:1416 +469:3:1417 +470:3:1428 +471:3:1433 +472:3:1434 +473:0:2399 +474:3:1446 +475:0:2399 +476:3:1550 +477:0:2399 +478:3:1648 +479:0:2399 +480:3:1649 +481:0:2399 +482:3:1653 +483:0:2399 +484:3:1659 +485:3:1663 +486:3:1664 +487:3:1672 +488:3:1673 +489:3:1677 +490:3:1678 +491:3:1686 +492:3:1691 +493:3:1695 +494:3:1696 +495:3:1703 +496:3:1704 +497:3:1715 +498:3:1716 +499:3:1717 +500:3:1728 +501:3:1733 +502:3:1734 +503:0:2399 +504:3:1746 +505:0:2399 +506:3:1748 +507:0:2399 +508:3:1749 +509:3:1753 +510:3:1754 +511:3:1762 +512:3:1763 +513:3:1767 +514:3:1768 +515:3:1776 +516:3:1781 +517:3:1785 +518:3:1786 +519:3:1793 +520:3:1794 +521:3:1805 +522:3:1806 +523:3:1807 +524:3:1818 +525:3:1823 +526:3:1824 +527:0:2399 +528:3:1836 +529:0:2399 +530:3:1838 +531:0:2399 +532:3:1841 +533:3:1842 +534:3:1854 +535:3:1855 +536:3:1859 +537:3:1860 +538:3:1868 +539:3:1873 +540:3:1877 +541:3:1878 +542:3:1885 +543:3:1886 +544:3:1897 +545:3:1898 +546:3:1899 +547:3:1910 +548:3:1915 +549:3:1916 +550:0:2399 +551:3:1928 +552:0:2399 +553:3:1930 +554:0:2399 +555:3:1931 +556:0:2399 +557:3:1932 +558:0:2399 +559:3:1933 +560:0:2399 +561:3:1934 +562:3:1938 +563:3:1939 +564:3:1947 +565:3:1948 +566:3:1952 +567:3:1953 +568:3:1961 +569:3:1966 +570:3:1970 +571:3:1971 +572:3:1978 +573:3:1979 +574:3:1990 +575:3:1991 +576:3:1992 +577:3:2003 +578:3:2008 +579:3:2009 +580:0:2399 +581:3:2021 +582:0:2399 +583:3:2125 +584:0:2399 +585:3:2223 +586:0:2399 +587:3:2224 +588:0:2399 +589:3:2228 +590:0:2399 +591:3:2234 +592:3:2241 +593:3:2242 +594:3:2249 +595:3:2254 +596:0:2399 +597:3:2265 +598:0:2399 +599:3:2266 +600:3:2273 +601:3:2274 +602:3:2281 +603:3:2286 +604:0:2399 +605:3:2297 +606:0:2399 +607:3:2302 +608:3:2309 +609:3:2310 +610:3:2317 +611:3:2322 +612:0:2399 +613:3:2333 +614:0:2399 +615:3:2335 +616:0:2399 +617:3:2336 +618:0:2399 +619:3:876 +620:0:2399 +621:3:877 +622:3:881 +623:3:882 +624:3:890 +625:3:891 +626:3:895 +627:3:896 +628:3:904 +629:3:909 +630:3:913 +631:3:914 +632:3:921 +633:3:922 +634:3:933 +635:3:934 +636:3:935 +637:3:946 +638:3:951 +639:3:952 +640:0:2399 +641:3:964 +642:0:2399 +643:3:966 +644:3:967 +645:0:2399 +646:3:971 +647:3:975 +648:3:976 +649:3:984 +650:3:985 +651:3:989 +652:3:990 +653:3:998 +654:3:1003 +655:3:1004 +656:3:1015 +657:3:1016 +658:3:1027 +659:3:1028 +660:3:1029 +661:3:1040 +662:3:1045 +663:3:1046 +664:0:2399 +665:3:1058 +666:0:2399 +667:3:1060 +668:0:2399 +669:3:1061 +670:0:2399 +671:3:1071 +672:0:2399 +673:3:1072 +674:3:1079 +675:3:1080 +676:3:1087 +677:3:1092 +678:0:2399 +679:3:1103 +680:0:2399 +681:3:1104 +682:3:1111 +683:3:1112 +684:3:1119 +685:3:1124 +686:0:2399 +687:3:1135 +688:0:2399 +689:3:1140 +690:3:1147 +691:3:1148 +692:3:1155 +693:3:1160 +694:0:2399 +695:3:1171 +696:0:2399 +697:3:1173 +698:0:2399 +699:3:1174 +700:3:1178 +701:3:1179 +702:3:1187 +703:3:1188 +704:3:1192 +705:3:1193 +706:3:1201 +707:3:1206 +708:3:1210 +709:3:1211 +710:3:1218 +711:3:1219 +712:3:1230 +713:3:1231 +714:3:1232 +715:3:1243 +716:3:1248 +717:3:1249 +718:0:2399 +719:3:1261 +720:0:2399 +721:3:1263 +722:0:2399 +723:3:1266 +724:3:1267 +725:3:1279 +726:3:1280 +727:3:1284 +728:3:1285 +729:3:1293 +730:3:1298 +731:3:1302 +732:3:1303 +733:3:1310 +734:3:1311 +735:3:1322 +736:3:1323 +737:3:1324 +738:3:1335 +739:3:1340 +740:3:1341 +741:0:2399 +742:3:1353 +743:0:2399 +744:3:1355 +745:0:2399 +746:3:1356 +747:0:2399 +748:3:1357 +749:0:2399 +750:3:1358 +751:0:2399 +752:3:1359 +753:3:1363 +754:3:1364 +755:3:1372 +756:3:1373 +757:3:1377 +758:3:1378 +759:3:1386 +760:3:1391 +761:3:1395 +762:3:1396 +763:3:1403 +764:3:1404 +765:3:1415 +766:3:1416 +767:3:1417 +768:3:1428 +769:3:1433 +770:3:1434 +771:0:2399 +772:3:1446 +773:0:2399 +774:3:1550 +775:0:2399 +776:3:1648 +777:0:2399 +778:3:1649 +779:0:2399 +780:3:1653 +781:0:2399 +782:3:1659 +783:3:1663 +784:3:1664 +785:3:1672 +786:3:1673 +787:3:1677 +788:3:1678 +789:3:1686 +790:3:1691 +791:3:1695 +792:3:1696 +793:3:1703 +794:3:1704 +795:3:1715 +796:3:1716 +797:3:1717 +798:3:1728 +799:3:1733 +800:3:1734 +801:0:2399 +802:3:1746 +803:0:2399 +804:3:1748 +805:0:2399 +806:3:1749 +807:3:1753 +808:3:1754 +809:3:1762 +810:3:1763 +811:3:1767 +812:3:1768 +813:3:1776 +814:3:1781 +815:3:1785 +816:3:1786 +817:3:1793 +818:3:1794 +819:3:1805 +820:3:1806 +821:3:1807 +822:3:1818 +823:3:1823 +824:3:1824 +825:0:2399 +826:3:1836 +827:0:2399 +828:3:1838 +829:0:2399 +830:3:1841 +831:3:1842 +832:3:1854 +833:3:1855 +834:3:1859 +835:3:1860 +836:3:1868 +837:3:1873 +838:3:1877 +839:3:1878 +840:3:1885 +841:3:1886 +842:3:1897 +843:3:1898 +844:3:1899 +845:3:1910 +846:3:1915 +847:3:1916 +848:0:2399 +849:3:1928 +850:0:2399 +851:3:1930 +852:0:2399 +853:3:1931 +854:0:2399 +855:3:1932 +856:0:2399 +857:3:1933 +858:0:2399 +859:3:1934 +860:3:1938 +861:3:1939 +862:3:1947 +863:3:1948 +864:3:1952 +865:3:1953 +866:3:1961 +867:3:1966 +868:3:1970 +869:3:1971 +870:3:1978 +871:3:1979 +872:3:1990 +873:3:1991 +874:3:1992 +875:3:2003 +876:3:2008 +877:3:2009 +878:0:2399 +879:3:2021 +880:0:2399 +881:3:2125 +882:0:2399 +883:3:2223 +884:0:2399 +885:3:2224 +886:0:2399 +887:3:2228 +888:0:2399 +889:3:2234 +890:3:2241 +891:3:2242 +892:3:2249 +893:3:2254 +894:0:2399 +895:3:2265 +896:0:2399 +897:3:2266 +898:3:2273 +899:3:2274 +900:3:2281 +901:3:2286 +902:0:2399 +903:3:2297 +904:0:2399 +905:3:2302 +906:3:2309 +907:3:2310 +908:3:2317 +909:3:2322 +910:0:2399 +911:3:2333 +912:0:2399 +913:3:2335 +914:0:2399 +915:3:2336 +916:0:2399 +917:3:876 +918:0:2399 +919:3:877 +920:3:881 +921:3:882 +922:3:890 +923:3:891 +924:3:895 +925:3:896 +926:3:904 +927:3:909 +928:3:913 +929:3:914 +930:3:921 +931:3:922 +932:3:933 +933:3:934 +934:3:935 +935:3:946 +936:3:951 +937:3:952 +938:0:2399 +939:3:964 +940:0:2399 +941:3:966 +942:3:967 +943:0:2399 +944:3:971 +945:3:975 +946:3:976 +947:3:984 +948:3:985 +949:3:989 +950:3:990 +951:3:998 +952:3:1003 +953:3:1004 +954:3:1015 +955:3:1016 +956:3:1027 +957:3:1028 +958:3:1029 +959:3:1040 +960:3:1045 +961:3:1046 +962:0:2399 +963:3:1058 +964:0:2399 +965:3:1060 +966:0:2399 +967:3:1061 +968:0:2399 +969:3:1071 +970:0:2399 +971:3:1072 +972:3:1079 +973:3:1080 +974:3:1087 +975:3:1092 +976:0:2399 +977:3:1103 +978:0:2399 +979:3:1104 +980:3:1111 +981:3:1112 +982:3:1119 +983:3:1124 +984:0:2399 +985:3:1135 +986:0:2399 +987:3:1140 +988:3:1147 +989:3:1148 +990:3:1155 +991:3:1160 +992:0:2399 +993:3:1171 +994:0:2399 +995:3:1173 +996:0:2399 +997:3:1174 +998:3:1178 +999:3:1179 +1000:3:1187 +1001:3:1188 +1002:3:1192 +1003:3:1193 +1004:3:1201 +1005:3:1206 +1006:3:1210 +1007:3:1211 +1008:3:1218 +1009:3:1219 +1010:3:1230 +1011:3:1231 +1012:3:1232 +1013:3:1243 +1014:3:1248 +1015:3:1249 +1016:0:2399 +1017:3:1261 +1018:0:2399 +1019:3:1263 +1020:0:2399 +1021:3:1266 +1022:3:1267 +1023:3:1279 +1024:3:1280 +1025:3:1284 +1026:3:1285 +1027:3:1293 +1028:3:1298 +1029:3:1302 +1030:3:1303 +1031:3:1310 +1032:3:1311 +1033:3:1322 +1034:3:1323 +1035:3:1324 +1036:3:1335 +1037:3:1340 +1038:3:1341 +1039:0:2399 +1040:3:1353 +1041:0:2399 +1042:3:1355 +1043:0:2399 +1044:3:1356 +1045:0:2399 +1046:3:1357 +1047:0:2399 +1048:3:1358 +1049:0:2399 +1050:3:1359 +1051:3:1363 +1052:3:1364 +1053:3:1372 +1054:3:1373 +1055:3:1377 +1056:3:1378 +1057:3:1386 +1058:3:1391 +1059:3:1395 +1060:3:1396 +1061:3:1403 +1062:3:1404 +1063:3:1415 +1064:3:1416 +1065:3:1417 +1066:3:1428 +1067:3:1433 +1068:3:1434 +1069:0:2399 +1070:3:1446 +1071:0:2399 +1072:3:1550 +1073:0:2399 +1074:3:1648 +1075:0:2399 +1076:3:1649 +1077:0:2399 +1078:3:1653 +1079:0:2399 +1080:3:1659 +1081:3:1663 +1082:3:1664 +1083:3:1672 +1084:3:1673 +1085:3:1677 +1086:3:1678 +1087:3:1686 +1088:3:1691 +1089:3:1695 +1090:3:1696 +1091:3:1703 +1092:3:1704 +1093:3:1715 +1094:3:1716 +1095:3:1717 +1096:3:1728 +1097:3:1733 +1098:3:1734 +1099:0:2399 +1100:3:1746 +1101:0:2399 +1102:3:1748 +1103:0:2399 +1104:3:1749 +1105:3:1753 +1106:3:1754 +1107:3:1762 +1108:3:1763 +1109:3:1767 +1110:3:1768 +1111:3:1776 +1112:3:1781 +1113:3:1785 +1114:3:1786 +1115:3:1793 +1116:3:1794 +1117:3:1805 +1118:3:1806 +1119:3:1807 +1120:3:1818 +1121:3:1823 +1122:3:1824 +1123:0:2399 +1124:3:1836 +1125:0:2399 +1126:3:1838 +1127:0:2399 +1128:3:1841 +1129:3:1842 +1130:3:1854 +1131:3:1855 +1132:3:1859 +1133:3:1860 +1134:3:1868 +1135:3:1873 +1136:3:1877 +1137:3:1878 +1138:3:1885 +1139:3:1886 +1140:3:1897 +1141:3:1898 +1142:3:1899 +1143:3:1910 +1144:3:1915 +1145:3:1916 +1146:0:2399 +1147:3:1928 +1148:0:2399 +1149:3:1930 +1150:0:2399 +1151:3:1931 +1152:0:2399 +1153:3:1932 +1154:0:2399 +1155:3:1933 +1156:0:2399 +1157:3:1934 +1158:3:1938 +1159:3:1939 +1160:3:1947 +1161:3:1948 +1162:3:1952 +1163:3:1953 +1164:3:1961 +1165:3:1966 +1166:3:1970 +1167:3:1971 +1168:3:1978 +1169:3:1979 +1170:3:1990 +1171:3:1991 +1172:3:1992 +1173:3:2003 +1174:3:2008 +1175:3:2009 +1176:0:2399 +1177:3:2021 +1178:0:2399 +1179:3:2125 +1180:0:2399 +1181:3:2223 +1182:0:2399 +1183:3:2224 +1184:0:2399 +1185:3:2228 +1186:0:2399 +1187:3:2234 +1188:3:2241 +1189:3:2242 +1190:3:2249 +1191:3:2254 +1192:0:2399 +1193:3:2265 +1194:0:2399 +1195:3:2266 +1196:3:2273 +1197:3:2274 +1198:3:2281 +1199:3:2286 +1200:0:2399 +1201:3:2297 +1202:0:2399 +1203:3:2302 +1204:3:2309 +1205:3:2310 +1206:3:2317 +1207:3:2322 +1208:0:2399 +1209:3:2333 +1210:0:2399 +1211:3:2335 +1212:0:2399 +1213:3:2336 +1214:0:2399 +1215:3:876 +1216:0:2399 +1217:3:877 +1218:3:881 +1219:3:882 +1220:3:890 +1221:3:891 +1222:3:895 +1223:3:896 +1224:3:904 +1225:3:909 +1226:3:913 +1227:3:914 +1228:3:921 +1229:3:922 +1230:3:933 +1231:3:934 +1232:3:935 +1233:3:946 +1234:3:951 +1235:3:952 +1236:0:2399 +1237:3:964 +1238:0:2399 +1239:3:966 +1240:3:967 +1241:0:2399 +1242:3:971 +1243:3:975 +1244:3:976 +1245:3:984 +1246:3:985 +1247:3:989 +1248:3:990 +1249:3:998 +1250:3:1003 +1251:3:1004 +1252:3:1015 +1253:3:1016 +1254:3:1027 +1255:3:1028 +1256:3:1029 +1257:3:1040 +1258:3:1045 +1259:3:1046 +1260:0:2399 +1261:3:1058 +1262:0:2399 +1263:3:1060 +1264:0:2399 +1265:3:1061 +1266:0:2399 +1267:3:1071 +1268:0:2399 +1269:3:1072 +1270:3:1079 +1271:3:1080 +1272:3:1087 +1273:3:1092 +1274:0:2399 +1275:3:1103 +1276:0:2399 +1277:2:458 +1278:0:2399 +1279:2:464 +1280:0:2399 +1281:2:465 +1282:0:2399 +1283:2:466 +1284:0:2399 +1285:2:467 +1286:0:2399 +1287:1:2 +1288:0:2399 +1289:2:468 +1290:0:2399 +1291:1:8 +1292:0:2399 +1293:1:9 +1294:0:2399 +1295:1:10 +1296:0:2399 +1297:1:11 +1298:0:2399 +1299:2:467 +1300:0:2399 +1301:1:12 +1302:1:16 +1303:1:17 +1304:1:25 +1305:1:26 +1306:1:30 +1307:1:31 +1308:1:39 +1309:1:44 +1310:1:48 +1311:1:49 +1312:1:56 +1313:1:57 +1314:1:68 +1315:1:69 +1316:1:70 +1317:1:81 +1318:1:93 +1319:1:94 +1320:0:2399 +1321:2:468 +1322:0:2399 +1323:1:99 +1324:0:2399 +1325:2:469 +1326:0:2399 +1327:2:475 +1328:0:2399 +1329:2:476 +1330:0:2399 +1331:2:477 +1332:2:481 +1333:2:482 +1334:2:490 +1335:2:491 +1336:2:495 +1337:2:496 +1338:2:504 +1339:2:509 +1340:2:513 +1341:2:514 +1342:2:521 +1343:2:522 +1344:2:533 +1345:2:534 +1346:2:535 +1347:2:546 +1348:2:558 +1349:2:559 +1350:0:2399 +1351:2:564 +1352:0:2399 +1353:2:565 +1354:2:569 +1355:2:570 +1356:2:578 +1357:2:579 +1358:2:583 +1359:2:584 +1360:2:592 +1361:2:597 +1362:2:601 +1363:2:602 +1364:2:609 +1365:2:610 +1366:2:621 +1367:2:622 +1368:2:623 +1369:2:634 +1370:2:646 +1371:2:647 +1372:0:2399 +1373:2:652 +1374:0:2399 +1375:2:653 +1376:0:2399 +1377:2:654 +1378:2:658 +1379:2:659 +1380:2:667 +1381:2:668 +1382:2:672 +1383:2:673 +1384:2:681 +1385:2:686 +1386:2:690 +1387:2:691 +1388:2:698 +1389:2:699 +1390:2:710 +1391:2:711 +1392:2:712 +1393:2:723 +1394:2:735 +1395:2:736 +1396:0:2399 +1397:2:741 +1398:0:2399 +1399:2:750 +1400:0:2399 +1401:2:753 +1402:0:2399 +1403:2:758 +1404:0:2399 +1405:3:1104 +1406:3:1111 +1407:3:1114 +1408:3:1115 +1409:3:1119 +1410:3:1124 +1411:0:2399 +1412:3:1135 +1413:0:2399 +1414:3:1140 +1415:3:1147 +1416:3:1148 +1417:3:1155 +1418:3:1160 +1419:0:2399 +1420:3:1171 +1421:0:2399 +1422:3:1173 +1423:0:2399 +1424:3:1174 +1425:3:1178 +1426:3:1179 +1427:3:1187 +1428:3:1188 +1429:3:1192 +1430:3:1193 +1431:3:1201 +1432:3:1206 +1433:3:1210 +1434:3:1211 +1435:3:1218 +1436:3:1219 +1437:3:1230 +1438:3:1231 +1439:3:1232 +1440:3:1243 +1441:3:1248 +1442:3:1249 +1443:0:2399 +1444:3:1261 +1445:0:2399 +1446:3:1263 +1447:0:2399 +1448:3:1266 +1449:3:1267 +1450:3:1279 +1451:3:1280 +1452:3:1284 +1453:3:1285 +1454:3:1293 +1455:3:1298 +1456:3:1302 +1457:3:1303 +1458:3:1310 +1459:3:1311 +1460:3:1322 +1461:3:1323 +1462:3:1324 +1463:3:1335 +1464:3:1340 +1465:3:1341 +1466:0:2399 +1467:3:1353 +1468:0:2399 +1469:3:1355 +1470:0:2399 +1471:3:1356 +1472:0:2399 +1473:3:1357 +1474:0:2399 +1475:3:1358 +1476:0:2399 +1477:3:1359 +1478:3:1363 +1479:3:1364 +1480:3:1372 +1481:3:1373 +1482:3:1377 +1483:3:1378 +1484:3:1386 +1485:3:1391 +1486:3:1395 +1487:3:1396 +1488:3:1403 +1489:3:1404 +1490:3:1415 +1491:3:1416 +1492:3:1417 +1493:3:1428 +1494:3:1433 +1495:3:1434 +1496:0:2399 +1497:3:1446 +1498:0:2399 +1499:3:1550 +1500:0:2399 +1501:3:1648 +1502:0:2399 +1503:3:1649 +1504:0:2399 +1505:3:1653 +1506:0:2399 +1507:3:1659 +1508:3:1663 +1509:3:1664 +1510:3:1672 +1511:3:1673 +1512:3:1677 +1513:3:1678 +1514:3:1686 +1515:3:1691 +1516:3:1695 +1517:3:1696 +1518:3:1703 +1519:3:1704 +1520:3:1715 +1521:3:1716 +1522:3:1717 +1523:3:1728 +1524:3:1733 +1525:3:1734 +1526:0:2399 +1527:3:1746 +1528:0:2399 +1529:3:1748 +1530:0:2399 +1531:3:1749 +1532:3:1753 +1533:3:1754 +1534:3:1762 +1535:3:1763 +1536:3:1767 +1537:3:1768 +1538:3:1776 +1539:3:1781 +1540:3:1785 +1541:3:1786 +1542:3:1793 +1543:3:1794 +1544:3:1805 +1545:3:1806 +1546:3:1807 +1547:3:1818 +1548:3:1823 +1549:3:1824 +1550:0:2399 +1551:3:1836 +1552:0:2399 +1553:3:1838 +1554:0:2399 +1555:3:1841 +1556:3:1842 +1557:3:1854 +1558:3:1855 +1559:3:1859 +1560:3:1860 +1561:3:1868 +1562:3:1873 +1563:3:1877 +1564:3:1878 +1565:3:1885 +1566:3:1886 +1567:3:1897 +1568:3:1898 +1569:3:1899 +1570:3:1910 +1571:3:1915 +1572:3:1916 +1573:0:2399 +1574:3:1928 +1575:0:2399 +1576:3:1930 +1577:0:2399 +1578:3:1931 +1579:0:2399 +1580:3:1932 +1581:0:2399 +1582:3:1933 +1583:0:2399 +1584:3:1934 +1585:3:1938 +1586:3:1939 +1587:3:1947 +1588:3:1948 +1589:3:1952 +1590:3:1953 +1591:3:1961 +1592:3:1966 +1593:3:1970 +1594:3:1971 +1595:3:1978 +1596:3:1979 +1597:3:1990 +1598:3:1991 +1599:3:1992 +1600:3:2003 +1601:3:2008 +1602:3:2009 +1603:0:2399 +1604:3:2021 +1605:0:2399 +1606:3:2125 +1607:0:2399 +1608:3:2223 +1609:0:2399 +1610:3:2224 +1611:0:2399 +1612:3:2228 +1613:0:2399 +1614:3:2234 +1615:3:2241 +1616:3:2242 +1617:3:2249 +1618:3:2254 +1619:0:2399 +1620:3:2265 +1621:0:2399 +1622:3:2266 +1623:3:2273 +1624:3:2276 +1625:3:2277 +1626:3:2281 +1627:3:2286 +1628:0:2399 +1629:3:2297 +1630:0:2399 +1631:3:2302 +1632:3:2309 +1633:3:2310 +1634:3:2317 +1635:3:2322 +1636:0:2399 +1637:3:2333 +1638:0:2399 +1639:3:2335 +1640:0:2399 +1641:3:2336 +1642:0:2399 +1643:3:2339 +1644:0:2399 +1645:3:2344 +1646:0:2399 +1647:2:759 +1648:0:2397 +1649:3:2345 +1650:0:2403 +1651:2:518 diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.define b/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.define new file mode 100644 index 0000000..5e642ef --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.define @@ -0,0 +1 @@ +#define SINGLE_FLIP diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.log b/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.log new file mode 100644 index 0000000..5d7d35c --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.log @@ -0,0 +1,217 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_free_single_flip.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 744) +Depth= 8352 States= 1e+06 Transitions= 1.05e+07 Memory= 534.807 t= 8.93 R= 1e+05 +pan: claim violated! (at depth 1352) +pan: wrote .input.spin.trail + +(Spin Version 5.1.7 -- 23 December 2008) +Warning: Search not completed + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 64 byte, depth reached 8352, errors: 1 + 1456373 states, stored + 13442538 states, matched + 14898911 transitions (= stored+matched) + 50580660 atomic steps +hash conflicts: 5166006 (resolved) + +Stats on memory usage (in Megabytes): + 127.779 equivalent memory usage for states (stored*(State-vector + overhead)) + 100.443 actual memory usage for states (compression: 78.61%) + state-vector as stored = 44 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 566.154 total actual memory usage + +unreached in proctype urcu_reader + line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 61, "(1)" + line 418, "pan.___", state 91, "(1)" + line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 158, "(1)" + line 418, "pan.___", state 188, "(1)" + line 399, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 256, "(1)" + line 418, "pan.___", state 286, "(1)" + line 399, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 395, "(1)" + line 418, "pan.___", state 425, "(1)" + line 540, "pan.___", state 456, "-end-" + (17 of 456 states) +unreached in proctype urcu_reader_sig + line 399, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 70, "(1)" + line 418, "pan.___", state 100, "(1)" + line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 158, "(1)" + line 418, "pan.___", state 188, "(1)" + line 399, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 247, "(1)" + line 418, "pan.___", state 277, "(1)" + line 399, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 359, "(1)" + line 418, "pan.___", state 389, "(1)" + line 614, "pan.___", state 411, "-end-" + (17 of 411 states) +unreached in proctype urcu_writer + line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 59, "(1)" + line 413, "pan.___", state 72, "(1)" + line 418, "pan.___", state 89, "(1)" + line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 153, "(1)" + line 413, "pan.___", state 166, "(1)" + line 652, "pan.___", state 199, "(1)" + line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 160, "pan.___", state 240, "(1)" + line 164, "pan.___", state 248, "(1)" + line 168, "pan.___", state 260, "(1)" + line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 179, "pan.___", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 160, "pan.___", state 370, "(1)" + line 164, "pan.___", state 378, "(1)" + line 168, "pan.___", state 390, "(1)" + line 399, "pan.___", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 449, "(1)" + line 413, "pan.___", state 462, "(1)" + line 418, "pan.___", state 479, "(1)" + line 399, "pan.___", state 498, "(1)" + line 403, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 554, "(1)" + line 418, "pan.___", state 571, "(1)" + line 403, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 647, "(1)" + line 418, "pan.___", state 664, "(1)" + line 179, "pan.___", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 160, "pan.___", state 710, "(1)" + line 164, "pan.___", state 718, "(1)" + line 168, "pan.___", state 730, "(1)" + line 175, "pan.___", state 741, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 179, "pan.___", state 817, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 830, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 160, "pan.___", state 840, "(1)" + line 164, "pan.___", state 848, "(1)" + line 168, "pan.___", state 860, "(1)" + line 399, "pan.___", state 882, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 884, "(1)" + line 399, "pan.___", state 885, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 885, "else" + line 399, "pan.___", state 888, "(1)" + line 403, "pan.___", state 896, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 898, "(1)" + line 403, "pan.___", state 899, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 899, "else" + line 403, "pan.___", state 902, "(1)" + line 403, "pan.___", state 903, "(1)" + line 403, "pan.___", state 903, "(1)" + line 401, "pan.___", state 908, "((i<1))" + line 401, "pan.___", state 908, "((i>=1))" + line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 927, "(1)" + line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 409, "pan.___", state 928, "else" + line 409, "pan.___", state 931, "(1)" + line 409, "pan.___", state 932, "(1)" + line 409, "pan.___", state 932, "(1)" + line 413, "pan.___", state 940, "(1)" + line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 413, "pan.___", state 941, "else" + line 413, "pan.___", state 944, "(1)" + line 413, "pan.___", state 945, "(1)" + line 413, "pan.___", state 945, "(1)" + line 411, "pan.___", state 950, "((i<1))" + line 411, "pan.___", state 950, "((i>=1))" + line 418, "pan.___", state 957, "(1)" + line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 418, "pan.___", state 958, "else" + line 418, "pan.___", state 961, "(1)" + line 418, "pan.___", state 962, "(1)" + line 418, "pan.___", state 962, "(1)" + line 420, "pan.___", state 965, "(1)" + line 420, "pan.___", state 965, "(1)" + line 179, "pan.___", state 990, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 1003, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 160, "pan.___", state 1013, "(1)" + line 164, "pan.___", state 1021, "(1)" + line 168, "pan.___", state 1033, "(1)" + line 175, "pan.___", state 1044, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 179, "pan.___", state 1120, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 1133, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 160, "pan.___", state 1143, "(1)" + line 164, "pan.___", state 1151, "(1)" + line 168, "pan.___", state 1163, "(1)" + line 702, "pan.___", state 1188, "-end-" + (100 of 1188 states) +unreached in proctype :init: + line 709, "pan.___", state 9, "((j<2))" + line 709, "pan.___", state 9, "((j>=2))" + line 710, "pan.___", state 20, "((j<2))" + line 710, "pan.___", state 20, "((j>=2))" + line 715, "pan.___", state 33, "((j<2))" + line 715, "pan.___", state 33, "((j>=2))" + (3 of 46 states) +unreached in proctype :never: + line 749, "pan.___", state 8, "-end-" + (1 of 8 states) + +pan: elapsed time 12.8 seconds +pan: rate 113424.69 states/second +pan: avg transition delay 8.6181e-07 usec +cp .input.spin urcu_free_single_flip.spin.input +cp .input.spin.trail urcu_free_single_flip.spin.input.trail +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.spin.input b/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.spin.input new file mode 100644 index 0000000..103464e --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.spin.input @@ -0,0 +1,723 @@ +#define SINGLE_FLIP + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#define TEST_SIGNAL +#define TEST_SIGNAL_ON_READ +//#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 1 +//#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.spin.input.trail b/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.spin.input.trail new file mode 100644 index 0000000..e81c46c --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.spin.input.trail @@ -0,0 +1,1355 @@ +-2:4:-2 +-4:-4:-4 +1:0:2103 +2:4:2055 +3:4:2058 +4:4:2058 +5:4:2061 +6:4:2069 +7:4:2069 +8:4:2072 +9:4:2078 +10:4:2082 +11:4:2082 +12:4:2085 +13:4:2093 +14:4:2097 +15:4:2098 +16:0:2103 +17:4:2100 +18:0:2103 +19:3:869 +20:0:2103 +21:3:875 +22:0:2103 +23:3:876 +24:0:2103 +25:3:877 +26:3:881 +27:3:882 +28:3:890 +29:3:891 +30:3:895 +31:3:896 +32:3:904 +33:3:909 +34:3:913 +35:3:914 +36:3:921 +37:3:922 +38:3:933 +39:3:934 +40:3:935 +41:3:946 +42:3:951 +43:3:952 +44:0:2103 +45:3:964 +46:0:2103 +47:3:966 +48:3:967 +49:0:2103 +50:3:971 +51:3:975 +52:3:976 +53:3:984 +54:3:985 +55:3:989 +56:3:990 +57:3:998 +58:3:1003 +59:3:1004 +60:3:1015 +61:3:1016 +62:3:1027 +63:3:1028 +64:3:1029 +65:3:1040 +66:3:1045 +67:3:1046 +68:0:2103 +69:3:1058 +70:0:2103 +71:3:1060 +72:0:2103 +73:3:1061 +74:0:2103 +75:3:1071 +76:0:2103 +77:3:1075 +78:3:1076 +79:3:1080 +80:3:1084 +81:3:1085 +82:3:1089 +83:3:1097 +84:3:1098 +85:3:1103 +86:3:1110 +87:3:1111 +88:3:1118 +89:3:1123 +90:0:2103 +91:3:1134 +92:0:2103 +93:3:1138 +94:3:1139 +95:3:1143 +96:3:1147 +97:3:1148 +98:3:1152 +99:3:1160 +100:3:1161 +101:3:1166 +102:3:1173 +103:3:1174 +104:3:1181 +105:3:1186 +106:0:2103 +107:3:1197 +108:0:2103 +109:3:1205 +110:3:1206 +111:3:1210 +112:3:1214 +113:3:1215 +114:3:1219 +115:3:1227 +116:3:1228 +117:3:1233 +118:3:1240 +119:3:1241 +120:3:1248 +121:3:1253 +122:0:2103 +123:3:1264 +124:0:2103 +125:3:1266 +126:0:2103 +127:3:1267 +128:3:1271 +129:3:1272 +130:3:1280 +131:3:1281 +132:3:1285 +133:3:1286 +134:3:1294 +135:3:1299 +136:3:1303 +137:3:1304 +138:3:1311 +139:3:1312 +140:3:1323 +141:3:1324 +142:3:1325 +143:3:1336 +144:3:1341 +145:3:1342 +146:0:2103 +147:3:1354 +148:0:2103 +149:3:1356 +150:0:2103 +151:3:1359 +152:3:1360 +153:3:1372 +154:3:1373 +155:3:1377 +156:3:1378 +157:3:1386 +158:3:1391 +159:3:1395 +160:3:1396 +161:3:1403 +162:3:1404 +163:3:1415 +164:3:1416 +165:3:1417 +166:3:1428 +167:3:1433 +168:3:1434 +169:0:2103 +170:3:1446 +171:0:2103 +172:3:1448 +173:0:2103 +174:3:1449 +175:0:2103 +176:3:1450 +177:0:2103 +178:3:1451 +179:0:2103 +180:3:1452 +181:3:1456 +182:3:1457 +183:3:1465 +184:3:1466 +185:3:1470 +186:3:1471 +187:3:1479 +188:3:1484 +189:3:1488 +190:3:1489 +191:3:1496 +192:3:1497 +193:3:1508 +194:3:1509 +195:3:1510 +196:3:1521 +197:3:1526 +198:3:1527 +199:0:2103 +200:3:1539 +201:0:2103 +202:3:1736 +203:0:2103 +204:3:1834 +205:0:2103 +206:3:1835 +207:0:2103 +208:3:1839 +209:0:2103 +210:3:1848 +211:3:1849 +212:3:1853 +213:3:1857 +214:3:1858 +215:3:1862 +216:3:1870 +217:3:1871 +218:3:1876 +219:3:1883 +220:3:1884 +221:3:1891 +222:3:1896 +223:0:2103 +224:3:1907 +225:0:2103 +226:3:1911 +227:3:1912 +228:3:1916 +229:3:1920 +230:3:1921 +231:3:1925 +232:3:1933 +233:3:1934 +234:3:1939 +235:3:1946 +236:3:1947 +237:3:1954 +238:3:1959 +239:0:2103 +240:3:1970 +241:0:2103 +242:3:1978 +243:3:1979 +244:3:1983 +245:3:1987 +246:3:1988 +247:3:1992 +248:3:2000 +249:3:2001 +250:3:2006 +251:3:2013 +252:3:2014 +253:3:2021 +254:3:2026 +255:0:2103 +256:3:2037 +257:0:2103 +258:3:2039 +259:0:2103 +260:3:2040 +261:0:2103 +262:3:876 +263:0:2103 +264:3:877 +265:3:881 +266:3:882 +267:3:890 +268:3:891 +269:3:895 +270:3:896 +271:3:904 +272:3:909 +273:3:913 +274:3:914 +275:3:921 +276:3:922 +277:3:933 +278:3:934 +279:3:935 +280:3:946 +281:3:951 +282:3:952 +283:0:2103 +284:3:964 +285:0:2103 +286:3:966 +287:3:967 +288:0:2103 +289:3:971 +290:3:975 +291:3:976 +292:3:984 +293:3:985 +294:3:989 +295:3:990 +296:3:998 +297:3:1003 +298:3:1004 +299:3:1015 +300:3:1016 +301:3:1027 +302:3:1028 +303:3:1029 +304:3:1040 +305:3:1045 +306:3:1046 +307:0:2103 +308:3:1058 +309:0:2103 +310:3:1060 +311:0:2103 +312:3:1061 +313:0:2103 +314:3:1071 +315:0:2103 +316:3:1075 +317:3:1076 +318:3:1080 +319:3:1084 +320:3:1085 +321:3:1089 +322:3:1097 +323:3:1098 +324:3:1103 +325:3:1110 +326:3:1111 +327:3:1118 +328:3:1123 +329:0:2103 +330:3:1134 +331:0:2103 +332:3:1138 +333:3:1139 +334:3:1143 +335:3:1147 +336:3:1148 +337:3:1152 +338:3:1160 +339:3:1161 +340:3:1166 +341:3:1173 +342:3:1174 +343:3:1181 +344:3:1186 +345:0:2103 +346:3:1197 +347:0:2103 +348:3:1205 +349:3:1206 +350:3:1210 +351:3:1214 +352:3:1215 +353:3:1219 +354:3:1227 +355:3:1228 +356:3:1233 +357:3:1240 +358:3:1241 +359:3:1248 +360:3:1253 +361:0:2103 +362:3:1264 +363:0:2103 +364:3:1266 +365:0:2103 +366:3:1267 +367:3:1271 +368:3:1272 +369:3:1280 +370:3:1281 +371:3:1285 +372:3:1286 +373:3:1294 +374:3:1299 +375:3:1303 +376:3:1304 +377:3:1311 +378:3:1312 +379:3:1323 +380:3:1324 +381:3:1325 +382:3:1336 +383:3:1341 +384:3:1342 +385:0:2103 +386:3:1354 +387:0:2103 +388:3:1356 +389:0:2103 +390:3:1359 +391:3:1360 +392:3:1372 +393:3:1373 +394:3:1377 +395:3:1378 +396:3:1386 +397:3:1391 +398:3:1395 +399:3:1396 +400:3:1403 +401:3:1404 +402:3:1415 +403:3:1416 +404:3:1417 +405:3:1428 +406:3:1433 +407:3:1434 +408:0:2103 +409:3:1446 +410:0:2103 +411:3:1448 +412:0:2103 +413:3:1449 +414:0:2103 +415:3:1450 +416:0:2103 +417:3:1451 +418:0:2103 +419:3:1452 +420:3:1456 +421:3:1457 +422:3:1465 +423:3:1466 +424:3:1470 +425:3:1471 +426:3:1479 +427:3:1484 +428:3:1488 +429:3:1489 +430:3:1496 +431:3:1497 +432:3:1508 +433:3:1509 +434:3:1510 +435:3:1521 +436:3:1526 +437:3:1527 +438:0:2103 +439:3:1539 +440:0:2103 +441:3:1736 +442:0:2103 +443:3:1834 +444:0:2103 +445:3:1835 +446:0:2103 +447:3:1839 +448:0:2103 +449:3:1848 +450:3:1849 +451:3:1853 +452:3:1857 +453:3:1858 +454:3:1862 +455:3:1870 +456:3:1871 +457:3:1876 +458:3:1883 +459:3:1884 +460:3:1891 +461:3:1896 +462:0:2103 +463:3:1907 +464:0:2103 +465:3:1911 +466:3:1912 +467:3:1916 +468:3:1920 +469:3:1921 +470:3:1925 +471:3:1933 +472:3:1934 +473:3:1939 +474:3:1946 +475:3:1947 +476:3:1954 +477:3:1959 +478:0:2103 +479:3:1970 +480:0:2103 +481:3:1978 +482:3:1979 +483:3:1983 +484:3:1987 +485:3:1988 +486:3:1992 +487:3:2000 +488:3:2001 +489:3:2006 +490:3:2013 +491:3:2014 +492:3:2021 +493:3:2026 +494:0:2103 +495:3:2037 +496:0:2103 +497:3:2039 +498:0:2103 +499:3:2040 +500:0:2103 +501:3:876 +502:0:2103 +503:3:877 +504:3:881 +505:3:882 +506:3:890 +507:3:891 +508:3:895 +509:3:896 +510:3:904 +511:3:909 +512:3:913 +513:3:914 +514:3:921 +515:3:922 +516:3:933 +517:3:934 +518:3:935 +519:3:946 +520:3:951 +521:3:952 +522:0:2103 +523:3:964 +524:0:2103 +525:3:966 +526:3:967 +527:0:2103 +528:3:971 +529:3:975 +530:3:976 +531:3:984 +532:3:985 +533:3:989 +534:3:990 +535:3:998 +536:3:1003 +537:3:1004 +538:3:1015 +539:3:1016 +540:3:1027 +541:3:1028 +542:3:1029 +543:3:1040 +544:3:1045 +545:3:1046 +546:0:2103 +547:3:1058 +548:0:2103 +549:3:1060 +550:0:2103 +551:3:1061 +552:0:2103 +553:3:1071 +554:0:2103 +555:3:1075 +556:3:1076 +557:3:1080 +558:3:1084 +559:3:1085 +560:3:1089 +561:3:1097 +562:3:1098 +563:3:1103 +564:3:1110 +565:3:1111 +566:3:1118 +567:3:1123 +568:0:2103 +569:3:1134 +570:0:2103 +571:3:1138 +572:3:1139 +573:3:1143 +574:3:1147 +575:3:1148 +576:3:1152 +577:3:1160 +578:3:1161 +579:3:1166 +580:3:1173 +581:3:1174 +582:3:1181 +583:3:1186 +584:0:2103 +585:3:1197 +586:0:2103 +587:3:1205 +588:3:1206 +589:3:1210 +590:3:1214 +591:3:1215 +592:3:1219 +593:3:1227 +594:3:1228 +595:3:1233 +596:3:1240 +597:3:1241 +598:3:1248 +599:3:1253 +600:0:2103 +601:3:1264 +602:0:2103 +603:3:1266 +604:0:2103 +605:3:1267 +606:3:1271 +607:3:1272 +608:3:1280 +609:3:1281 +610:3:1285 +611:3:1286 +612:3:1294 +613:3:1299 +614:3:1303 +615:3:1304 +616:3:1311 +617:3:1312 +618:3:1323 +619:3:1324 +620:3:1325 +621:3:1336 +622:3:1341 +623:3:1342 +624:0:2103 +625:3:1354 +626:0:2103 +627:3:1356 +628:0:2103 +629:3:1359 +630:3:1360 +631:3:1372 +632:3:1373 +633:3:1377 +634:3:1378 +635:3:1386 +636:3:1391 +637:3:1395 +638:3:1396 +639:3:1403 +640:3:1404 +641:3:1415 +642:3:1416 +643:3:1417 +644:3:1428 +645:3:1433 +646:3:1434 +647:0:2103 +648:3:1446 +649:0:2103 +650:3:1448 +651:0:2103 +652:3:1449 +653:0:2103 +654:3:1450 +655:0:2103 +656:3:1451 +657:0:2103 +658:3:1452 +659:3:1456 +660:3:1457 +661:3:1465 +662:3:1466 +663:3:1470 +664:3:1471 +665:3:1479 +666:3:1484 +667:3:1488 +668:3:1489 +669:3:1496 +670:3:1497 +671:3:1508 +672:3:1509 +673:3:1510 +674:3:1521 +675:3:1526 +676:3:1527 +677:0:2103 +678:3:1539 +679:0:2103 +680:3:1736 +681:0:2103 +682:3:1834 +683:0:2103 +684:3:1835 +685:0:2103 +686:3:1839 +687:0:2103 +688:3:1848 +689:3:1849 +690:3:1853 +691:3:1857 +692:3:1858 +693:3:1862 +694:3:1870 +695:3:1871 +696:3:1876 +697:3:1883 +698:3:1884 +699:3:1891 +700:3:1896 +701:0:2103 +702:3:1907 +703:0:2103 +704:3:1911 +705:3:1912 +706:3:1916 +707:3:1920 +708:3:1921 +709:3:1925 +710:3:1933 +711:3:1934 +712:3:1939 +713:3:1946 +714:3:1947 +715:3:1954 +716:3:1959 +717:0:2103 +718:3:1970 +719:0:2103 +720:3:1978 +721:3:1979 +722:3:1983 +723:3:1987 +724:3:1988 +725:3:1992 +726:3:2000 +727:3:2001 +728:3:2006 +729:3:2013 +730:3:2014 +731:3:2021 +732:3:2026 +733:0:2103 +734:3:2037 +735:0:2103 +736:3:2039 +737:0:2103 +738:3:2040 +739:0:2103 +740:3:876 +741:0:2103 +742:3:877 +743:3:881 +744:3:882 +745:3:890 +746:3:891 +747:3:895 +748:3:896 +749:3:904 +750:3:909 +751:3:913 +752:3:914 +753:3:921 +754:3:922 +755:3:933 +756:3:934 +757:3:935 +758:3:946 +759:3:951 +760:3:952 +761:0:2103 +762:3:964 +763:0:2103 +764:3:966 +765:3:967 +766:0:2103 +767:3:971 +768:3:975 +769:3:976 +770:3:984 +771:3:985 +772:3:989 +773:3:990 +774:3:998 +775:3:1003 +776:3:1004 +777:3:1015 +778:3:1016 +779:3:1027 +780:3:1028 +781:3:1029 +782:3:1040 +783:3:1045 +784:3:1046 +785:0:2103 +786:3:1058 +787:0:2103 +788:3:1060 +789:0:2103 +790:3:1061 +791:0:2103 +792:3:1071 +793:0:2103 +794:3:1075 +795:3:1076 +796:3:1080 +797:3:1084 +798:3:1085 +799:3:1089 +800:3:1097 +801:3:1098 +802:3:1103 +803:3:1110 +804:3:1111 +805:3:1118 +806:3:1123 +807:0:2103 +808:3:1134 +809:0:2103 +810:3:1138 +811:3:1139 +812:3:1143 +813:3:1147 +814:3:1148 +815:3:1152 +816:3:1160 +817:3:1161 +818:3:1166 +819:3:1173 +820:3:1174 +821:3:1181 +822:3:1186 +823:0:2103 +824:3:1197 +825:0:2103 +826:3:1205 +827:3:1206 +828:3:1210 +829:3:1214 +830:3:1215 +831:3:1219 +832:3:1227 +833:3:1228 +834:3:1233 +835:3:1240 +836:3:1241 +837:3:1248 +838:3:1253 +839:0:2103 +840:3:1264 +841:0:2103 +842:3:1266 +843:0:2103 +844:3:1267 +845:3:1271 +846:3:1272 +847:3:1280 +848:3:1281 +849:3:1285 +850:3:1286 +851:3:1294 +852:3:1299 +853:3:1303 +854:3:1304 +855:3:1311 +856:3:1312 +857:3:1323 +858:3:1324 +859:3:1325 +860:3:1336 +861:3:1341 +862:3:1342 +863:0:2103 +864:3:1354 +865:0:2103 +866:3:1356 +867:0:2103 +868:3:1359 +869:3:1360 +870:3:1372 +871:3:1373 +872:3:1377 +873:3:1378 +874:3:1386 +875:3:1391 +876:3:1395 +877:3:1396 +878:3:1403 +879:3:1404 +880:3:1415 +881:3:1416 +882:3:1417 +883:3:1428 +884:3:1433 +885:3:1434 +886:0:2103 +887:3:1446 +888:0:2103 +889:3:1448 +890:0:2103 +891:3:1449 +892:0:2103 +893:3:1450 +894:0:2103 +895:3:1451 +896:0:2103 +897:3:1452 +898:3:1456 +899:3:1457 +900:3:1465 +901:3:1466 +902:3:1470 +903:3:1471 +904:3:1479 +905:3:1484 +906:3:1488 +907:3:1489 +908:3:1496 +909:3:1497 +910:3:1508 +911:3:1509 +912:3:1510 +913:3:1521 +914:3:1526 +915:3:1527 +916:0:2103 +917:3:1539 +918:0:2103 +919:3:1736 +920:0:2103 +921:3:1834 +922:0:2103 +923:3:1835 +924:0:2103 +925:3:1839 +926:0:2103 +927:3:1848 +928:3:1849 +929:3:1853 +930:3:1857 +931:3:1858 +932:3:1862 +933:3:1870 +934:3:1871 +935:3:1876 +936:3:1883 +937:3:1884 +938:3:1891 +939:3:1896 +940:0:2103 +941:3:1907 +942:0:2103 +943:2:458 +944:0:2103 +945:2:464 +946:0:2103 +947:2:465 +948:0:2103 +949:2:466 +950:0:2103 +951:2:467 +952:0:2103 +953:1:2 +954:0:2103 +955:2:468 +956:0:2103 +957:1:8 +958:0:2103 +959:1:9 +960:0:2103 +961:1:10 +962:0:2103 +963:1:11 +964:0:2103 +965:2:467 +966:0:2103 +967:1:12 +968:1:16 +969:1:17 +970:1:25 +971:1:26 +972:1:30 +973:1:31 +974:1:39 +975:1:44 +976:1:48 +977:1:49 +978:1:63 +979:1:64 +980:1:68 +981:1:69 +982:1:70 +983:1:81 +984:1:86 +985:1:87 +986:0:2103 +987:2:468 +988:0:2103 +989:1:99 +990:0:2103 +991:2:469 +992:0:2103 +993:2:475 +994:0:2103 +995:2:476 +996:0:2103 +997:2:477 +998:2:481 +999:2:482 +1000:2:490 +1001:2:491 +1002:2:495 +1003:2:496 +1004:2:504 +1005:2:509 +1006:2:513 +1007:2:514 +1008:2:528 +1009:2:529 +1010:2:533 +1011:2:534 +1012:2:535 +1013:2:546 +1014:2:551 +1015:2:552 +1016:0:2103 +1017:2:564 +1018:0:2103 +1019:2:565 +1020:2:569 +1021:2:570 +1022:2:578 +1023:2:579 +1024:2:583 +1025:2:584 +1026:2:592 +1027:2:597 +1028:2:601 +1029:2:602 +1030:2:616 +1031:2:617 +1032:2:621 +1033:2:622 +1034:2:623 +1035:2:634 +1036:2:639 +1037:2:640 +1038:0:2103 +1039:2:652 +1040:0:2103 +1041:2:653 +1042:0:2103 +1043:3:1911 +1044:3:1912 +1045:3:1916 +1046:3:1920 +1047:3:1921 +1048:3:1925 +1049:3:1933 +1050:3:1934 +1051:3:1939 +1052:3:1946 +1053:3:1947 +1054:3:1954 +1055:3:1959 +1056:0:2103 +1057:3:1970 +1058:0:2103 +1059:3:1978 +1060:3:1979 +1061:3:1983 +1062:3:1987 +1063:3:1988 +1064:3:1992 +1065:3:2000 +1066:3:2001 +1067:3:2006 +1068:3:2013 +1069:3:2014 +1070:3:2021 +1071:3:2026 +1072:0:2103 +1073:3:2037 +1074:0:2103 +1075:3:2039 +1076:0:2103 +1077:3:2040 +1078:0:2103 +1079:3:876 +1080:0:2103 +1081:3:877 +1082:3:881 +1083:3:882 +1084:3:890 +1085:3:891 +1086:3:895 +1087:3:896 +1088:3:904 +1089:3:909 +1090:3:913 +1091:3:914 +1092:3:921 +1093:3:922 +1094:3:933 +1095:3:934 +1096:3:935 +1097:3:946 +1098:3:951 +1099:3:952 +1100:0:2103 +1101:3:964 +1102:0:2103 +1103:3:966 +1104:3:967 +1105:0:2103 +1106:3:971 +1107:3:975 +1108:3:976 +1109:3:984 +1110:3:985 +1111:3:989 +1112:3:990 +1113:3:998 +1114:3:1003 +1115:3:1004 +1116:3:1015 +1117:3:1016 +1118:3:1027 +1119:3:1028 +1120:3:1029 +1121:3:1040 +1122:3:1045 +1123:3:1046 +1124:0:2103 +1125:3:1058 +1126:0:2103 +1127:3:1060 +1128:0:2103 +1129:3:1061 +1130:0:2103 +1131:3:1071 +1132:0:2103 +1133:3:1075 +1134:3:1076 +1135:3:1080 +1136:3:1084 +1137:3:1085 +1138:3:1089 +1139:3:1097 +1140:3:1098 +1141:3:1103 +1142:3:1110 +1143:3:1111 +1144:3:1118 +1145:3:1123 +1146:0:2103 +1147:3:1134 +1148:0:2103 +1149:2:654 +1150:2:658 +1151:2:659 +1152:2:667 +1153:2:668 +1154:2:672 +1155:2:673 +1156:2:681 +1157:2:686 +1158:2:690 +1159:2:691 +1160:2:698 +1161:2:699 +1162:2:710 +1163:2:711 +1164:2:712 +1165:2:723 +1166:2:735 +1167:2:736 +1168:0:2103 +1169:2:741 +1170:0:2103 +1171:2:750 +1172:0:2103 +1173:2:753 +1174:0:2103 +1175:2:758 +1176:0:2103 +1177:3:1138 +1178:3:1139 +1179:3:1143 +1180:3:1144 +1181:3:1152 +1182:3:1160 +1183:3:1161 +1184:3:1166 +1185:3:1173 +1186:3:1174 +1187:3:1181 +1188:3:1186 +1189:0:2103 +1190:3:1197 +1191:0:2103 +1192:3:1205 +1193:3:1206 +1194:3:1210 +1195:3:1214 +1196:3:1215 +1197:3:1219 +1198:3:1227 +1199:3:1228 +1200:3:1233 +1201:3:1240 +1202:3:1241 +1203:3:1248 +1204:3:1253 +1205:0:2103 +1206:3:1264 +1207:0:2103 +1208:3:1266 +1209:0:2103 +1210:3:1267 +1211:3:1271 +1212:3:1272 +1213:3:1280 +1214:3:1281 +1215:3:1285 +1216:3:1286 +1217:3:1294 +1218:3:1299 +1219:3:1303 +1220:3:1304 +1221:3:1311 +1222:3:1312 +1223:3:1323 +1224:3:1324 +1225:3:1325 +1226:3:1336 +1227:3:1341 +1228:3:1342 +1229:0:2103 +1230:3:1354 +1231:0:2103 +1232:3:1356 +1233:0:2103 +1234:3:1359 +1235:3:1360 +1236:3:1372 +1237:3:1373 +1238:3:1377 +1239:3:1378 +1240:3:1386 +1241:3:1391 +1242:3:1395 +1243:3:1396 +1244:3:1403 +1245:3:1404 +1246:3:1415 +1247:3:1416 +1248:3:1417 +1249:3:1428 +1250:3:1433 +1251:3:1434 +1252:0:2103 +1253:3:1446 +1254:0:2103 +1255:3:1448 +1256:0:2103 +1257:3:1449 +1258:0:2103 +1259:3:1450 +1260:0:2103 +1261:3:1451 +1262:0:2103 +1263:3:1452 +1264:3:1456 +1265:3:1457 +1266:3:1465 +1267:3:1466 +1268:3:1470 +1269:3:1471 +1270:3:1479 +1271:3:1484 +1272:3:1488 +1273:3:1489 +1274:3:1496 +1275:3:1497 +1276:3:1508 +1277:3:1509 +1278:3:1510 +1279:3:1521 +1280:3:1526 +1281:3:1527 +1282:0:2103 +1283:3:1539 +1284:0:2103 +1285:3:1736 +1286:0:2103 +1287:3:1834 +1288:0:2103 +1289:3:1835 +1290:0:2103 +1291:3:1839 +1292:0:2103 +1293:3:1848 +1294:3:1849 +1295:3:1853 +1296:3:1857 +1297:3:1858 +1298:3:1862 +1299:3:1870 +1300:3:1871 +1301:3:1876 +1302:3:1883 +1303:3:1884 +1304:3:1891 +1305:3:1896 +1306:0:2103 +1307:3:1907 +1308:0:2103 +1309:3:1911 +1310:3:1912 +1311:3:1916 +1312:3:1920 +1313:3:1921 +1314:3:1925 +1315:3:1933 +1316:3:1934 +1317:3:1939 +1318:3:1946 +1319:3:1947 +1320:3:1954 +1321:3:1959 +1322:0:2103 +1323:3:1970 +1324:0:2103 +1325:3:1978 +1326:3:1979 +1327:3:1983 +1328:3:1987 +1329:3:1988 +1330:3:1992 +1331:3:2000 +1332:3:2001 +1333:3:2006 +1334:3:2013 +1335:3:2014 +1336:3:2021 +1337:3:2026 +1338:0:2103 +1339:3:2037 +1340:0:2103 +1341:3:2039 +1342:0:2103 +1343:3:2040 +1344:0:2103 +1345:3:2043 +1346:0:2103 +1347:3:2048 +1348:0:2103 +1349:2:759 +1350:0:2101 +1351:3:2049 +1352:0:2107 +1353:3:1181 diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress.ltl b/formal-model/urcu/result-signal-over-reader/urcu_progress.ltl new file mode 100644 index 0000000..8718641 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_progress.ltl @@ -0,0 +1 @@ +([] <> !np_) diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.define b/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.define new file mode 100644 index 0000000..ff3f783 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.define @@ -0,0 +1 @@ +#define READER_PROGRESS diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.log b/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.log new file mode 100644 index 0000000..e3ec127 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.log @@ -0,0 +1,506 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define > pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_progress_reader.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -f -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 744) +depth 15: Claim reached state 9 (line 749) +depth 1803: Claim reached state 9 (line 748) +Depth= 5838 States= 1e+06 Transitions= 1.06e+07 Memory= 494.865 t= 9.24 R= 1e+05 +Depth= 5838 States= 2e+06 Transitions= 1.97e+07 Memory= 532.658 t= 17.7 R= 1e+05 +Depth= 5838 States= 3e+06 Transitions= 3.15e+07 Memory= 555.315 t= 28.4 R= 1e+05 +pan: resizing hashtable to -w22.. done +Depth= 6855 States= 4e+06 Transitions= 4.32e+07 Memory= 613.096 t= 39.1 R= 1e+05 +Depth= 9059 States= 5e+06 Transitions= 5.48e+07 Memory= 642.295 t= 49.5 R= 1e+05 +Depth= 9059 States= 6e+06 Transitions= 6.91e+07 Memory= 672.178 t= 62.5 R= 1e+05 +Depth= 9059 States= 7e+06 Transitions= 7.99e+07 Memory= 706.455 t= 72.5 R= 1e+05 +Depth= 9059 States= 8e+06 Transitions= 9.23e+07 Memory= 735.752 t= 84 R= 1e+05 +Depth= 9059 States= 9e+06 Transitions= 1.04e+08 Memory= 766.318 t= 94.5 R= 1e+05 +pan: resizing hashtable to -w24.. done +Depth= 9059 States= 1e+07 Transitions= 1.16e+08 Memory= 920.002 t= 106 R= 9e+04 +Depth= 9059 States= 1.1e+07 Transitions= 1.3e+08 Memory= 945.002 t= 119 R= 9e+04 +Depth= 9059 States= 1.2e+07 Transitions= 1.54e+08 Memory= 967.756 t= 140 R= 9e+04 +Depth= 9059 States= 1.3e+07 Transitions= 1.72e+08 Memory= 995.002 t= 157 R= 8e+04 +Depth= 9059 States= 1.4e+07 Transitions= 1.92e+08 Memory= 1022.736 t= 175 R= 8e+04 +Depth= 9059 States= 1.5e+07 Transitions= 2.1e+08 Memory= 1050.080 t= 191 R= 8e+04 +Depth= 9059 States= 1.6e+07 Transitions= 2.22e+08 Memory= 1082.502 t= 203 R= 8e+04 +Depth= 9059 States= 1.7e+07 Transitions= 2.41e+08 Memory= 1108.479 t= 219 R= 8e+04 +Depth= 9059 States= 1.8e+07 Transitions= 2.58e+08 Memory= 1134.455 t= 235 R= 8e+04 +Depth= 9059 States= 1.9e+07 Transitions= 2.7e+08 Memory= 1164.533 t= 246 R= 8e+04 +Depth= 9059 States= 2e+07 Transitions= 2.83e+08 Memory= 1193.830 t= 258 R= 8e+04 +Depth= 9059 States= 2.1e+07 Transitions= 3.03e+08 Memory= 1219.026 t= 276 R= 8e+04 +Depth= 9059 States= 2.2e+07 Transitions= 3.19e+08 Memory= 1248.420 t= 291 R= 8e+04 +Depth= 9059 States= 2.3e+07 Transitions= 3.42e+08 Memory= 1271.858 t= 312 R= 7e+04 +Depth= 9059 States= 2.4e+07 Transitions= 3.6e+08 Memory= 1298.908 t= 328 R= 7e+04 +Depth= 9059 States= 2.5e+07 Transitions= 3.84e+08 Memory= 1323.127 t= 350 R= 7e+04 +Depth= 9059 States= 2.6e+07 Transitions= 4e+08 Memory= 1348.518 t= 365 R= 7e+04 +Depth= 9059 States= 2.7e+07 Transitions= 4.16e+08 Memory= 1379.865 t= 380 R= 7e+04 +Depth= 9059 States= 2.8e+07 Transitions= 4.26e+08 Memory= 1411.115 t= 389 R= 7e+04 +Depth= 9059 States= 2.9e+07 Transitions= 4.42e+08 Memory= 1439.631 t= 404 R= 7e+04 +Depth= 9059 States= 3e+07 Transitions= 4.64e+08 Memory= 1462.385 t= 423 R= 7e+04 +Depth= 9059 States= 3.1e+07 Transitions= 4.82e+08 Memory= 1490.998 t= 439 R= 7e+04 +Depth= 9059 States= 3.2e+07 Transitions= 4.99e+08 Memory= 1519.514 t= 456 R= 7e+04 +Depth= 9059 States= 3.3e+07 Transitions= 5.18e+08 Memory= 1545.393 t= 473 R= 7e+04 +Depth= 9059 States= 3.4e+07 Transitions= 5.33e+08 Memory= 1578.108 t= 486 R= 7e+04 +pan: resizing hashtable to -w26.. done +Depth= 9059 States= 3.5e+07 Transitions= 5.49e+08 Memory= 2098.994 t= 504 R= 7e+04 +Depth= 9059 States= 3.6e+07 Transitions= 5.74e+08 Memory= 2121.651 t= 528 R= 7e+04 +Depth= 9059 States= 3.7e+07 Transitions= 5.96e+08 Memory= 2147.334 t= 547 R= 7e+04 +Depth= 9059 States= 3.8e+07 Transitions= 6.17e+08 Memory= 2170.186 t= 567 R= 7e+04 +Depth= 9059 States= 3.9e+07 Transitions= 6.3e+08 Memory= 2199.776 t= 578 R= 7e+04 +Depth= 9059 States= 4e+07 Transitions= 6.53e+08 Memory= 2225.459 t= 599 R= 7e+04 +Depth= 9059 States= 4.1e+07 Transitions= 6.69e+08 Memory= 2250.361 t= 614 R= 7e+04 +Depth= 9059 States= 4.2e+07 Transitions= 6.85e+08 Memory= 2279.268 t= 628 R= 7e+04 +Depth= 9059 States= 4.3e+07 Transitions= 7.03e+08 Memory= 2304.463 t= 644 R= 7e+04 +Depth= 9059 States= 4.4e+07 Transitions= 7.13e+08 Memory= 2338.252 t= 654 R= 7e+04 +Depth= 9059 States= 4.5e+07 Transitions= 7.25e+08 Memory= 2366.768 t= 665 R= 7e+04 +Depth= 9059 States= 4.6e+07 Transitions= 7.41e+08 Memory= 2393.330 t= 679 R= 7e+04 +Depth= 9059 States= 4.7e+07 Transitions= 7.57e+08 Memory= 2420.381 t= 694 R= 7e+04 +Depth= 9059 States= 4.8e+07 Transitions= 7.72e+08 Memory= 2447.041 t= 708 R= 7e+04 +Depth= 9059 States= 4.9e+07 Transitions= 7.88e+08 Memory= 2476.143 t= 722 R= 7e+04 +Depth= 9059 States= 5e+07 Transitions= 8.04e+08 Memory= 2501.045 t= 737 R= 7e+04 +Depth= 9059 States= 5.1e+07 Transitions= 8.2e+08 Memory= 2530.440 t= 752 R= 7e+04 +Depth= 9059 States= 5.2e+07 Transitions= 8.37e+08 Memory= 2554.854 t= 766 R= 7e+04 +Depth= 9059 States= 5.3e+07 Transitions= 8.5e+08 Memory= 2583.467 t= 779 R= 7e+04 +Depth= 9059 States= 5.4e+07 Transitions= 8.66e+08 Memory= 2611.299 t= 794 R= 7e+04 +Depth= 9059 States= 5.5e+07 Transitions= 8.79e+08 Memory= 2640.791 t= 805 R= 7e+04 +Depth= 9059 States= 5.6e+07 Transitions= 8.9e+08 Memory= 2672.139 t= 815 R= 7e+04 +Depth= 9059 States= 5.7e+07 Transitions= 9.05e+08 Memory= 2702.705 t= 829 R= 7e+04 +Depth= 9059 States= 5.8e+07 Transitions= 9.22e+08 Memory= 2727.998 t= 845 R= 7e+04 +Depth= 9059 States= 5.9e+07 Transitions= 9.38e+08 Memory= 2754.463 t= 859 R= 7e+04 +Depth= 9059 States= 6e+07 Transitions= 9.49e+08 Memory= 2789.717 t= 870 R= 7e+04 +Depth= 9059 States= 6.1e+07 Transitions= 9.62e+08 Memory= 2817.744 t= 881 R= 7e+04 +Depth= 9059 States= 6.2e+07 Transitions= 9.79e+08 Memory= 2838.447 t= 896 R= 7e+04 +Depth= 9059 States= 6.3e+07 Transitions= 1e+09 Memory= 2863.154 t= 919 R= 7e+04 +Depth= 9059 States= 6.4e+07 Transitions= 1.02e+09 Memory= 2889.131 t= 936 R= 7e+04 +Depth= 9059 States= 6.5e+07 Transitions= 1.04e+09 Memory= 2919.502 t= 952 R= 7e+04 +Depth= 9059 States= 6.6e+07 Transitions= 1.06e+09 Memory= 2943.916 t= 968 R= 7e+04 +Depth= 9059 States= 6.7e+07 Transitions= 1.07e+09 Memory= 2978.975 t= 979 R= 7e+04 +Depth= 9059 States= 6.8e+07 Transitions= 1.09e+09 Memory= 3003.877 t= 996 R= 7e+04 +Depth= 9059 States= 6.9e+07 Transitions= 1.11e+09 Memory= 3028.584 t= 1.01e+03 R= 7e+04 +Depth= 9059 States= 7e+07 Transitions= 1.12e+09 Memory= 3058.174 t= 1.02e+03 R= 7e+04 +Depth= 9059 States= 7.1e+07 Transitions= 1.13e+09 Memory= 3088.350 t= 1.04e+03 R= 7e+04 +Depth= 9059 States= 7.2e+07 Transitions= 1.15e+09 Memory= 3113.350 t= 1.05e+03 R= 7e+04 +Depth= 9059 States= 7.3e+07 Transitions= 1.17e+09 Memory= 3142.158 t= 1.07e+03 R= 7e+04 +Depth= 9059 States= 7.4e+07 Transitions= 1.19e+09 Memory= 3166.279 t= 1.09e+03 R= 7e+04 +Depth= 9059 States= 7.5e+07 Transitions= 1.21e+09 Memory= 3192.744 t= 1.11e+03 R= 7e+04 +Depth= 9059 States= 7.6e+07 Transitions= 1.23e+09 Memory= 3217.256 t= 1.13e+03 R= 7e+04 +Depth= 9059 States= 7.7e+07 Transitions= 1.25e+09 Memory= 3242.549 t= 1.14e+03 R= 7e+04 +Depth= 9059 States= 7.8e+07 Transitions= 1.26e+09 Memory= 3273.115 t= 1.16e+03 R= 7e+04 +Depth= 9059 States= 7.9e+07 Transitions= 1.27e+09 Memory= 3303.975 t= 1.17e+03 R= 7e+04 +Depth= 9059 States= 8e+07 Transitions= 1.29e+09 Memory= 3334.541 t= 1.18e+03 R= 7e+04 +Depth= 9059 States= 8.1e+07 Transitions= 1.31e+09 Memory= 3356.221 t= 1.2e+03 R= 7e+04 +Depth= 9059 States= 8.2e+07 Transitions= 1.33e+09 Memory= 3385.127 t= 1.22e+03 R= 7e+04 +Depth= 9059 States= 8.3e+07 Transitions= 1.35e+09 Memory= 3412.959 t= 1.23e+03 R= 7e+04 +Depth= 9059 States= 8.4e+07 Transitions= 1.37e+09 Memory= 3438.936 t= 1.25e+03 R= 7e+04 +Depth= 9059 States= 8.5e+07 Transitions= 1.38e+09 Memory= 3471.455 t= 1.26e+03 R= 7e+04 +Depth= 9059 States= 8.6e+07 Transitions= 1.4e+09 Memory= 3498.115 t= 1.28e+03 R= 7e+04 +Depth= 9059 States= 8.7e+07 Transitions= 1.42e+09 Memory= 3519.014 t= 1.3e+03 R= 7e+04 +Depth= 9059 States= 8.8e+07 Transitions= 1.44e+09 Memory= 3546.162 t= 1.32e+03 R= 7e+04 +Depth= 9059 States= 8.9e+07 Transitions= 1.46e+09 Memory= 3567.842 t= 1.34e+03 R= 7e+04 +Depth= 9059 States= 9e+07 Transitions= 1.48e+09 Memory= 3598.799 t= 1.35e+03 R= 7e+04 +Depth= 9059 States= 9.1e+07 Transitions= 1.5e+09 Memory= 3622.920 t= 1.37e+03 R= 7e+04 +Depth= 9059 States= 9.2e+07 Transitions= 1.52e+09 Memory= 3648.701 t= 1.39e+03 R= 7e+04 +Depth= 9059 States= 9.3e+07 Transitions= 1.53e+09 Memory= 3676.045 t= 1.4e+03 R= 7e+04 +Depth= 9059 States= 9.4e+07 Transitions= 1.55e+09 Memory= 3702.412 t= 1.42e+03 R= 7e+04 +Depth= 9059 States= 9.5e+07 Transitions= 1.56e+09 Memory= 3735.713 t= 1.43e+03 R= 7e+04 +Depth= 9059 States= 9.6e+07 Transitions= 1.57e+09 Memory= 3764.522 t= 1.44e+03 R= 7e+04 +Depth= 9059 States= 9.7e+07 Transitions= 1.59e+09 Memory= 3790.693 t= 1.45e+03 R= 7e+04 +Depth= 9059 States= 9.8e+07 Transitions= 1.61e+09 Memory= 3817.940 t= 1.47e+03 R= 7e+04 +Depth= 9059 States= 9.9e+07 Transitions= 1.62e+09 Memory= 3845.283 t= 1.48e+03 R= 7e+04 +Depth= 9059 States= 1e+08 Transitions= 1.64e+09 Memory= 3873.213 t= 1.5e+03 R= 7e+04 +Depth= 9059 States= 1.01e+08 Transitions= 1.65e+09 Memory= 3897.920 t= 1.51e+03 R= 7e+04 +Depth= 9059 States= 1.02e+08 Transitions= 1.67e+09 Memory= 3926.631 t= 1.53e+03 R= 7e+04 +Depth= 9059 States= 1.03e+08 Transitions= 1.68e+09 Memory= 3952.315 t= 1.54e+03 R= 7e+04 +Depth= 9059 States= 1.04e+08 Transitions= 1.7e+09 Memory= 3981.026 t= 1.56e+03 R= 7e+04 +Depth= 9059 States= 1.05e+08 Transitions= 1.71e+09 Memory= 4010.029 t= 1.57e+03 R= 7e+04 +Depth= 9059 States= 1.06e+08 Transitions= 1.73e+09 Memory= 4038.838 t= 1.58e+03 R= 7e+04 +Depth= 9059 States= 1.07e+08 Transitions= 1.74e+09 Memory= 4070.381 t= 1.59e+03 R= 7e+04 +Depth= 9059 States= 1.08e+08 Transitions= 1.75e+09 Memory= 4099.385 t= 1.61e+03 R= 7e+04 +Depth= 9059 States= 1.09e+08 Transitions= 1.77e+09 Memory= 4126.338 t= 1.62e+03 R= 7e+04 +Depth= 9059 States= 1.1e+08 Transitions= 1.79e+09 Memory= 4151.924 t= 1.64e+03 R= 7e+04 +Depth= 9059 States= 1.11e+08 Transitions= 1.8e+09 Memory= 4187.276 t= 1.65e+03 R= 7e+04 +Depth= 9059 States= 1.12e+08 Transitions= 1.81e+09 Memory= 4214.326 t= 1.66e+03 R= 7e+04 +Depth= 9059 States= 1.13e+08 Transitions= 1.83e+09 Memory= 4237.471 t= 1.67e+03 R= 7e+04 +Depth= 9059 States= 1.14e+08 Transitions= 1.85e+09 Memory= 4261.104 t= 1.7e+03 R= 7e+04 +Depth= 9059 States= 1.15e+08 Transitions= 1.87e+09 Memory= 4286.690 t= 1.71e+03 R= 7e+04 +Depth= 9059 States= 1.16e+08 Transitions= 1.89e+09 Memory= 4314.619 t= 1.73e+03 R= 7e+04 +Depth= 9059 States= 1.17e+08 Transitions= 1.91e+09 Memory= 4341.768 t= 1.75e+03 R= 7e+04 +Depth= 9059 States= 1.18e+08 Transitions= 1.92e+09 Memory= 4375.166 t= 1.76e+03 R= 7e+04 +Depth= 9059 States= 1.19e+08 Transitions= 1.94e+09 Memory= 4401.338 t= 1.78e+03 R= 7e+04 +Depth= 9059 States= 1.2e+08 Transitions= 1.95e+09 Memory= 4426.436 t= 1.79e+03 R= 7e+04 +Depth= 9059 States= 1.21e+08 Transitions= 1.97e+09 Memory= 4456.807 t= 1.8e+03 R= 7e+04 +Depth= 9059 States= 1.22e+08 Transitions= 1.98e+09 Memory= 4486.592 t= 1.82e+03 R= 7e+04 +Depth= 9059 States= 1.23e+08 Transitions= 2e+09 Memory= 4511.787 t= 1.83e+03 R= 7e+04 +Depth= 9059 States= 1.24e+08 Transitions= 2.02e+09 Memory= 4540.108 t= 1.85e+03 R= 7e+04 +Depth= 9059 States= 1.25e+08 Transitions= 2.04e+09 Memory= 4564.033 t= 1.87e+03 R= 7e+04 +Depth= 9059 States= 1.26e+08 Transitions= 2.06e+09 Memory= 4591.865 t= 1.89e+03 R= 7e+04 +Depth= 9059 States= 1.27e+08 Transitions= 2.08e+09 Memory= 4615.889 t= 1.91e+03 R= 7e+04 +Depth= 9059 States= 1.28e+08 Transitions= 2.1e+09 Memory= 4640.303 t= 1.92e+03 R= 7e+04 +Depth= 9059 States= 1.29e+08 Transitions= 2.11e+09 Memory= 4670.479 t= 1.94e+03 R= 7e+04 +Depth= 9059 States= 1.3e+08 Transitions= 2.12e+09 Memory= 4702.998 t= 1.95e+03 R= 7e+04 +Depth= 9059 States= 1.31e+08 Transitions= 2.14e+09 Memory= 4732.393 t= 1.96e+03 R= 7e+04 +Depth= 9059 States= 1.32e+08 Transitions= 2.16e+09 Memory= 4754.756 t= 1.98e+03 R= 7e+04 +Depth= 9059 States= 1.33e+08 Transitions= 2.18e+09 Memory= 4783.174 t= 2e+03 R= 7e+04 +Depth= 9059 States= 1.34e+08 Transitions= 2.19e+09 Memory= 4810.518 t= 2.01e+03 R= 7e+04 +Depth= 9059 States= 1.35e+08 Transitions= 2.21e+09 Memory= 4837.568 t= 2.03e+03 R= 7e+04 +pan: resizing hashtable to -w28.. done +Depth= 9059 States= 1.36e+08 Transitions= 2.23e+09 Memory= 6885.568 t= 2.06e+03 R= 7e+04 +Depth= 9059 States= 1.37e+08 Transitions= 2.24e+09 Memory= 6885.568 t= 2.08e+03 R= 7e+04 +Depth= 9059 States= 1.38e+08 Transitions= 2.27e+09 Memory= 6900.412 t= 2.1e+03 R= 7e+04 +Depth= 9059 States= 1.39e+08 Transitions= 2.29e+09 Memory= 6927.658 t= 2.12e+03 R= 7e+04 +Depth= 9059 States= 1.4e+08 Transitions= 2.31e+09 Memory= 6950.315 t= 2.14e+03 R= 7e+04 +Depth= 9059 States= 1.41e+08 Transitions= 2.33e+09 Memory= 6981.858 t= 2.15e+03 R= 7e+04 +Depth= 9059 States= 1.42e+08 Transitions= 2.35e+09 Memory= 7005.295 t= 2.17e+03 R= 7e+04 +Depth= 9059 States= 1.43e+08 Transitions= 2.36e+09 Memory= 7031.076 t= 2.18e+03 R= 7e+04 +Depth= 9059 States= 1.44e+08 Transitions= 2.38e+09 Memory= 7056.955 t= 2.2e+03 R= 7e+04 +Depth= 9059 States= 1.45e+08 Transitions= 2.4e+09 Memory= 7084.494 t= 2.22e+03 R= 7e+04 +Depth= 9059 States= 1.46e+08 Transitions= 2.41e+09 Memory= 7115.744 t= 2.23e+03 R= 7e+04 +Depth= 9059 States= 1.47e+08 Transitions= 2.42e+09 Memory= 7146.604 t= 2.24e+03 R= 7e+04 +Depth= 9059 States= 1.48e+08 Transitions= 2.44e+09 Memory= 7172.287 t= 2.25e+03 R= 7e+04 +Depth= 9059 States= 1.49e+08 Transitions= 2.45e+09 Memory= 7200.315 t= 2.26e+03 R= 7e+04 +Depth= 9059 States= 1.5e+08 Transitions= 2.47e+09 Memory= 7226.389 t= 2.28e+03 R= 7e+04 +Depth= 9059 States= 1.51e+08 Transitions= 2.48e+09 Memory= 7253.733 t= 2.29e+03 R= 7e+04 +Depth= 9059 States= 1.52e+08 Transitions= 2.5e+09 Memory= 7279.709 t= 2.31e+03 R= 7e+04 +Depth= 9059 States= 1.53e+08 Transitions= 2.52e+09 Memory= 7309.104 t= 2.32e+03 R= 7e+04 +Depth= 9059 States= 1.54e+08 Transitions= 2.53e+09 Memory= 7334.592 t= 2.34e+03 R= 7e+04 +Depth= 9059 States= 1.55e+08 Transitions= 2.55e+09 Memory= 7362.229 t= 2.35e+03 R= 7e+04 +Depth= 9059 States= 1.56e+08 Transitions= 2.56e+09 Memory= 7391.135 t= 2.36e+03 R= 7e+04 +Depth= 9059 States= 1.57e+08 Transitions= 2.57e+09 Memory= 7420.822 t= 2.38e+03 R= 7e+04 +Depth= 9059 States= 1.58e+08 Transitions= 2.59e+09 Memory= 7452.854 t= 2.39e+03 R= 7e+04 +Depth= 9059 States= 1.59e+08 Transitions= 2.6e+09 Memory= 7481.760 t= 2.4e+03 R= 7e+04 +Depth= 9059 States= 1.6e+08 Transitions= 2.62e+09 Memory= 7509.299 t= 2.41e+03 R= 7e+04 +Depth= 9059 States= 1.61e+08 Transitions= 2.63e+09 Memory= 7534.201 t= 2.43e+03 R= 7e+04 +Depth= 9059 States= 1.62e+08 Transitions= 2.65e+09 Memory= 7567.600 t= 2.44e+03 R= 7e+04 +Depth= 9059 States= 1.63e+08 Transitions= 2.66e+09 Memory= 7594.846 t= 2.45e+03 R= 7e+04 +Depth= 9059 States= 1.64e+08 Transitions= 2.67e+09 Memory= 7619.455 t= 2.47e+03 R= 7e+04 +Depth= 9059 States= 1.65e+08 Transitions= 2.7e+09 Memory= 7642.502 t= 2.49e+03 R= 7e+04 +Depth= 9059 States= 1.66e+08 Transitions= 2.72e+09 Memory= 7669.260 t= 2.51e+03 R= 7e+04 +Depth= 9059 States= 1.67e+08 Transitions= 2.73e+09 Memory= 7696.799 t= 2.52e+03 R= 7e+04 +Depth= 9059 States= 1.68e+08 Transitions= 2.75e+09 Memory= 7723.850 t= 2.54e+03 R= 7e+04 +Depth= 9059 States= 1.69e+08 Transitions= 2.77e+09 Memory= 7757.053 t= 2.55e+03 R= 7e+04 +Depth= 9059 States= 1.7e+08 Transitions= 2.78e+09 Memory= 7782.346 t= 2.57e+03 R= 7e+04 +Depth= 9059 States= 1.71e+08 Transitions= 2.8e+09 Memory= 7808.908 t= 2.58e+03 R= 7e+04 +Depth= 9059 States= 1.72e+08 Transitions= 2.81e+09 Memory= 7838.791 t= 2.59e+03 R= 7e+04 +Depth= 9059 States= 1.73e+08 Transitions= 2.83e+09 Memory= 7867.893 t= 2.61e+03 R= 7e+04 +Depth= 9059 States= 1.74e+08 Transitions= 2.85e+09 Memory= 7892.990 t= 2.62e+03 R= 7e+04 +Depth= 9059 States= 1.75e+08 Transitions= 2.86e+09 Memory= 7922.190 t= 2.64e+03 R= 7e+04 +Depth= 9059 States= 1.76e+08 Transitions= 2.89e+09 Memory= 7945.627 t= 2.66e+03 R= 7e+04 +Depth= 9059 States= 1.77e+08 Transitions= 2.9e+09 Memory= 7973.947 t= 2.68e+03 R= 7e+04 +Depth= 9059 States= 1.78e+08 Transitions= 2.93e+09 Memory= 7997.483 t= 2.7e+03 R= 7e+04 +Depth= 9059 States= 1.79e+08 Transitions= 2.94e+09 Memory= 8020.920 t= 2.71e+03 R= 7e+04 +Depth= 9059 States= 1.8e+08 Transitions= 2.96e+09 Memory= 8050.412 t= 2.73e+03 R= 7e+04 +Depth= 9059 States= 1.81e+08 Transitions= 2.97e+09 Memory= 8085.666 t= 2.74e+03 R= 7e+04 +Depth= 9059 States= 1.82e+08 Transitions= 2.98e+09 Memory= 8114.279 t= 2.75e+03 R= 7e+04 +Depth= 9059 States= 1.83e+08 Transitions= 3e+09 Memory= 8137.131 t= 2.77e+03 R= 7e+04 +Depth= 9059 States= 1.84e+08 Transitions= 3.02e+09 Memory= 8165.451 t= 2.79e+03 R= 7e+04 +Depth= 9059 States= 1.85e+08 Transitions= 3.04e+09 Memory= 8193.186 t= 2.8e+03 R= 7e+04 +Depth= 9059 States= 1.86e+08 Transitions= 3.06e+09 Memory= 8218.674 t= 2.82e+03 R= 7e+04 +Depth= 9059 States= 1.87e+08 Transitions= 3.08e+09 Memory= 8255.100 t= 2.83e+03 R= 7e+04 +Depth= 9059 States= 1.88e+08 Transitions= 3.09e+09 Memory= 8279.221 t= 2.85e+03 R= 7e+04 +Depth= 9059 States= 1.89e+08 Transitions= 3.12e+09 Memory= 8298.264 t= 2.87e+03 R= 7e+04 +Depth= 9059 States= 1.9e+08 Transitions= 3.14e+09 Memory= 8325.998 t= 2.89e+03 R= 7e+04 +Depth= 9059 States= 1.91e+08 Transitions= 3.16e+09 Memory= 8349.338 t= 2.91e+03 R= 7e+04 +Depth= 9059 States= 1.92e+08 Transitions= 3.17e+09 Memory= 8379.221 t= 2.92e+03 R= 7e+04 +Depth= 9059 States= 1.93e+08 Transitions= 3.19e+09 Memory= 8403.440 t= 2.94e+03 R= 7e+04 +Depth= 9059 States= 1.94e+08 Transitions= 3.21e+09 Memory= 8430.100 t= 2.96e+03 R= 7e+04 +Depth= 9059 States= 1.95e+08 Transitions= 3.23e+09 Memory= 8455.295 t= 2.97e+03 R= 7e+04 +Depth= 9059 States= 1.96e+08 Transitions= 3.25e+09 Memory= 8482.932 t= 2.99e+03 R= 7e+04 +Depth= 9059 States= 1.97e+08 Transitions= 3.26e+09 Memory= 8515.256 t= 3e+03 R= 7e+04 +Depth= 9059 States= 1.98e+08 Transitions= 3.27e+09 Memory= 8542.502 t= 3.01e+03 R= 7e+04 +Depth= 9059 States= 1.99e+08 Transitions= 3.29e+09 Memory= 8569.260 t= 3.02e+03 R= 7e+04 +Depth= 9059 States= 2e+08 Transitions= 3.3e+09 Memory= 8598.459 t= 3.04e+03 R= 7e+04 +Depth= 9059 States= 2.01e+08 Transitions= 3.32e+09 Memory= 8624.631 t= 3.05e+03 R= 7e+04 +Depth= 9059 States= 2.02e+08 Transitions= 3.33e+09 Memory= 8652.365 t= 3.07e+03 R= 7e+04 +Depth= 9059 States= 2.03e+08 Transitions= 3.35e+09 Memory= 8678.440 t= 3.08e+03 R= 7e+04 +Depth= 9059 States= 2.04e+08 Transitions= 3.36e+09 Memory= 8706.369 t= 3.1e+03 R= 7e+04 +Depth= 9059 States= 2.05e+08 Transitions= 3.38e+09 Memory= 8732.932 t= 3.11e+03 R= 7e+04 +Depth= 9059 States= 2.06e+08 Transitions= 3.39e+09 Memory= 8760.276 t= 3.12e+03 R= 7e+04 +Depth= 9059 States= 2.07e+08 Transitions= 3.41e+09 Memory= 8789.475 t= 3.14e+03 R= 7e+04 +Depth= 9059 States= 2.08e+08 Transitions= 3.42e+09 Memory= 8819.455 t= 3.15e+03 R= 7e+04 +Depth= 9059 States= 2.09e+08 Transitions= 3.43e+09 Memory= 8851.779 t= 3.16e+03 R= 7e+04 +Depth= 9059 States= 2.1e+08 Transitions= 3.45e+09 Memory= 8880.100 t= 3.17e+03 R= 7e+04 +Depth= 9059 States= 2.11e+08 Transitions= 3.46e+09 Memory= 8907.053 t= 3.19e+03 R= 7e+04 +Depth= 9059 States= 2.12e+08 Transitions= 3.48e+09 Memory= 8932.639 t= 3.2e+03 R= 7e+04 +Depth= 9059 States= 2.13e+08 Transitions= 3.49e+09 Memory= 8964.572 t= 3.22e+03 R= 7e+04 +Depth= 9059 States= 2.14e+08 Transitions= 3.51e+09 Memory= 8991.526 t= 3.23e+03 R= 7e+04 +Depth= 9059 States= 2.15e+08 Transitions= 3.52e+09 Memory= 9018.088 t= 3.24e+03 R= 7e+04 +Depth= 9059 States= 2.16e+08 Transitions= 3.54e+09 Memory= 9039.865 t= 3.26e+03 R= 7e+04 +Depth= 9059 States= 2.17e+08 Transitions= 3.56e+09 Memory= 9067.600 t= 3.28e+03 R= 7e+04 +Depth= 9059 States= 2.18e+08 Transitions= 3.58e+09 Memory= 9094.260 t= 3.3e+03 R= 7e+04 +Depth= 9059 States= 2.19e+08 Transitions= 3.6e+09 Memory= 9122.483 t= 3.31e+03 R= 7e+04 +Depth= 9059 States= 2.2e+08 Transitions= 3.61e+09 Memory= 9153.635 t= 3.32e+03 R= 7e+04 +Depth= 9059 States= 2.21e+08 Transitions= 3.63e+09 Memory= 9181.272 t= 3.34e+03 R= 7e+04 +Depth= 9059 States= 2.22e+08 Transitions= 3.65e+09 Memory= 9207.639 t= 3.36e+03 R= 7e+04 + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness enabled) + invalid end states - (disabled by never claim) + +State-vector 64 byte, depth reached 9059, errors: 0 + 88961904 states, stored (2.22145e+08 visited) +3.4291111e+09 states, matched +3.6512561e+09 transitions (= visited+matched) +1.2885947e+10 atomic steps +hash conflicts: 7.2188776e+08 (resolved) + +Stats on memory usage (in Megabytes): + 7805.343 equivalent memory usage for states (stored*(State-vector + overhead)) + 6706.219 actual memory usage for states (compression: 85.92%) + state-vector as stored = 51 byte + 28 byte overhead + 2048.000 memory used for hash table (-w28) + 457.764 memory used for DFS stack (-m10000000) + 1.122 memory lost to fragmentation + 9210.861 total actual memory usage + +unreached in proctype urcu_reader + line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 61, "(1)" + line 418, "pan.___", state 91, "(1)" + line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 158, "(1)" + line 418, "pan.___", state 188, "(1)" + line 399, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 256, "(1)" + line 418, "pan.___", state 286, "(1)" + line 399, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 395, "(1)" + line 418, "pan.___", state 425, "(1)" + line 540, "pan.___", state 456, "-end-" + (17 of 456 states) +unreached in proctype urcu_reader_sig + line 399, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 70, "(1)" + line 418, "pan.___", state 100, "(1)" + line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 158, "(1)" + line 418, "pan.___", state 188, "(1)" + line 399, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 247, "(1)" + line 418, "pan.___", state 277, "(1)" + line 399, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 359, "(1)" + line 418, "pan.___", state 389, "(1)" + line 614, "pan.___", state 411, "-end-" + (17 of 411 states) +unreached in proctype urcu_writer + line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 59, "(1)" + line 413, "pan.___", state 72, "(1)" + line 418, "pan.___", state 89, "(1)" + line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 153, "(1)" + line 413, "pan.___", state 166, "(1)" + line 652, "pan.___", state 199, "(1)" + line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 160, "pan.___", state 240, "(1)" + line 164, "pan.___", state 248, "(1)" + line 168, "pan.___", state 260, "(1)" + line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 179, "pan.___", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 160, "pan.___", state 370, "(1)" + line 164, "pan.___", state 378, "(1)" + line 168, "pan.___", state 390, "(1)" + line 399, "pan.___", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 449, "(1)" + line 413, "pan.___", state 462, "(1)" + line 418, "pan.___", state 479, "(1)" + line 399, "pan.___", state 498, "(1)" + line 403, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 554, "(1)" + line 418, "pan.___", state 571, "(1)" + line 403, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 647, "(1)" + line 418, "pan.___", state 664, "(1)" + line 179, "pan.___", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 160, "pan.___", state 710, "(1)" + line 164, "pan.___", state 718, "(1)" + line 168, "pan.___", state 730, "(1)" + line 175, "pan.___", state 741, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 179, "pan.___", state 817, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 830, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 160, "pan.___", state 840, "(1)" + line 164, "pan.___", state 848, "(1)" + line 168, "pan.___", state 860, "(1)" + line 399, "pan.___", state 882, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 884, "(1)" + line 399, "pan.___", state 885, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 885, "else" + line 399, "pan.___", state 888, "(1)" + line 403, "pan.___", state 896, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 898, "(1)" + line 403, "pan.___", state 899, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 899, "else" + line 403, "pan.___", state 902, "(1)" + line 403, "pan.___", state 903, "(1)" + line 403, "pan.___", state 903, "(1)" + line 401, "pan.___", state 908, "((i<1))" + line 401, "pan.___", state 908, "((i>=1))" + line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 927, "(1)" + line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 409, "pan.___", state 928, "else" + line 409, "pan.___", state 931, "(1)" + line 409, "pan.___", state 932, "(1)" + line 409, "pan.___", state 932, "(1)" + line 413, "pan.___", state 940, "(1)" + line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 413, "pan.___", state 941, "else" + line 413, "pan.___", state 944, "(1)" + line 413, "pan.___", state 945, "(1)" + line 413, "pan.___", state 945, "(1)" + line 411, "pan.___", state 950, "((i<1))" + line 411, "pan.___", state 950, "((i>=1))" + line 418, "pan.___", state 957, "(1)" + line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 418, "pan.___", state 958, "else" + line 418, "pan.___", state 961, "(1)" + line 418, "pan.___", state 962, "(1)" + line 418, "pan.___", state 962, "(1)" + line 420, "pan.___", state 965, "(1)" + line 420, "pan.___", state 965, "(1)" + line 403, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 1040, "(1)" + line 418, "pan.___", state 1057, "(1)" + line 403, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 1130, "(1)" + line 418, "pan.___", state 1147, "(1)" + line 399, "pan.___", state 1166, "(1)" + line 403, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 1222, "(1)" + line 418, "pan.___", state 1239, "(1)" + line 403, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 1315, "(1)" + line 418, "pan.___", state 1332, "(1)" + line 179, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 160, "pan.___", state 1378, "(1)" + line 164, "pan.___", state 1386, "(1)" + line 168, "pan.___", state 1398, "(1)" + line 175, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 179, "pan.___", state 1485, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 1498, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 160, "pan.___", state 1508, "(1)" + line 164, "pan.___", state 1516, "(1)" + line 168, "pan.___", state 1528, "(1)" + line 399, "pan.___", state 1550, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 1552, "(1)" + line 399, "pan.___", state 1553, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 1553, "else" + line 399, "pan.___", state 1556, "(1)" + line 403, "pan.___", state 1564, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 1566, "(1)" + line 403, "pan.___", state 1567, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 1567, "else" + line 403, "pan.___", state 1570, "(1)" + line 403, "pan.___", state 1571, "(1)" + line 403, "pan.___", state 1571, "(1)" + line 401, "pan.___", state 1576, "((i<1))" + line 401, "pan.___", state 1576, "((i>=1))" + line 408, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 1595, "(1)" + line 409, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 409, "pan.___", state 1596, "else" + line 409, "pan.___", state 1599, "(1)" + line 409, "pan.___", state 1600, "(1)" + line 409, "pan.___", state 1600, "(1)" + line 413, "pan.___", state 1608, "(1)" + line 413, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 413, "pan.___", state 1609, "else" + line 413, "pan.___", state 1612, "(1)" + line 413, "pan.___", state 1613, "(1)" + line 413, "pan.___", state 1613, "(1)" + line 411, "pan.___", state 1618, "((i<1))" + line 411, "pan.___", state 1618, "((i>=1))" + line 418, "pan.___", state 1625, "(1)" + line 418, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 418, "pan.___", state 1626, "else" + line 418, "pan.___", state 1629, "(1)" + line 418, "pan.___", state 1630, "(1)" + line 418, "pan.___", state 1630, "(1)" + line 420, "pan.___", state 1633, "(1)" + line 420, "pan.___", state 1633, "(1)" + line 179, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 160, "pan.___", state 1681, "(1)" + line 164, "pan.___", state 1689, "(1)" + line 168, "pan.___", state 1701, "(1)" + line 175, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 179, "pan.___", state 1788, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 1801, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 160, "pan.___", state 1811, "(1)" + line 164, "pan.___", state 1819, "(1)" + line 168, "pan.___", state 1831, "(1)" + line 702, "pan.___", state 1856, "-end-" + (158 of 1856 states) +unreached in proctype :init: + (0 of 46 states) +unreached in proctype :never: + line 751, "pan.___", state 11, "-end-" + (1 of 11 states) + +pan: elapsed time 3.36e+03 seconds +pan: rate 66138.803 states/second +pan: avg transition delay 9.1989e-07 usec +cp .input.spin urcu_progress_reader.spin.input +cp .input.spin.trail urcu_progress_reader.spin.input.trail +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.spin.input b/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.spin.input new file mode 100644 index 0000000..91b1126 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.spin.input @@ -0,0 +1,723 @@ +#define READER_PROGRESS + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#define TEST_SIGNAL +#define TEST_SIGNAL_ON_READ +//#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 1 +//#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.spin.input.trail b/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.spin.input.trail new file mode 100644 index 0000000..7c42af1 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.spin.input.trail @@ -0,0 +1,1270 @@ +-2:4:-2 +-4:-4:-4 +1:0:4401 +2:4:4353 +3:4:4356 +4:4:4356 +5:4:4359 +6:4:4367 +7:4:4367 +8:4:4370 +9:4:4376 +10:4:4380 +11:4:4380 +12:4:4383 +13:4:4391 +14:4:4395 +15:4:4396 +16:0:4401 +17:4:4398 +18:0:4401 +19:3:2479 +20:0:4401 +21:3:2485 +22:0:4401 +23:3:2486 +24:0:4401 +25:3:2487 +26:3:2491 +27:3:2492 +28:3:2500 +29:3:2501 +30:3:2505 +31:3:2506 +32:3:2514 +33:3:2519 +34:3:2523 +35:3:2524 +36:3:2531 +37:3:2532 +38:3:2543 +39:3:2544 +40:3:2545 +41:3:2556 +42:3:2561 +43:3:2562 +44:0:4401 +45:3:2574 +46:0:4401 +47:3:2576 +48:3:2577 +49:0:4401 +50:3:2581 +51:3:2585 +52:3:2586 +53:3:2594 +54:3:2595 +55:3:2599 +56:3:2600 +57:3:2608 +58:3:2613 +59:3:2614 +60:3:2625 +61:3:2626 +62:3:2637 +63:3:2638 +64:3:2639 +65:3:2650 +66:3:2655 +67:3:2656 +68:0:4401 +69:3:2668 +70:0:4401 +71:3:2670 +72:0:4401 +73:3:2671 +74:0:4401 +75:3:2681 +76:0:4401 +77:3:2682 +78:0:4401 +79:3:2686 +80:3:2687 +81:3:2691 +82:3:2695 +83:3:2696 +84:3:2700 +85:3:2708 +86:3:2709 +87:3:2714 +88:3:2721 +89:3:2722 +90:3:2729 +91:3:2734 +92:0:4401 +93:3:2745 +94:0:4401 +95:3:2749 +96:3:2750 +97:3:2754 +98:3:2758 +99:3:2759 +100:3:2763 +101:3:2771 +102:3:2772 +103:3:2777 +104:3:2784 +105:3:2785 +106:3:2792 +107:3:2797 +108:0:4401 +109:3:2808 +110:0:4401 +111:3:2816 +112:3:2817 +113:3:2821 +114:3:2825 +115:3:2826 +116:3:2830 +117:3:2838 +118:3:2839 +119:3:2844 +120:3:2851 +121:3:2852 +122:3:2859 +123:3:2864 +124:0:4401 +125:3:2879 +126:0:4401 +127:3:2881 +128:0:4401 +129:3:2882 +130:3:2886 +131:3:2887 +132:3:2895 +133:3:2896 +134:3:2900 +135:3:2901 +136:3:2909 +137:3:2914 +138:3:2918 +139:3:2919 +140:3:2926 +141:3:2927 +142:3:2938 +143:3:2939 +144:3:2940 +145:3:2951 +146:3:2956 +147:3:2957 +148:0:4401 +149:3:2969 +150:0:4401 +151:3:2971 +152:0:4401 +153:3:2974 +154:3:2975 +155:3:2987 +156:3:2988 +157:3:2992 +158:3:2993 +159:3:3001 +160:3:3006 +161:3:3010 +162:3:3011 +163:3:3018 +164:3:3019 +165:3:3030 +166:3:3031 +167:3:3032 +168:3:3043 +169:3:3048 +170:3:3049 +171:0:4401 +172:3:3061 +173:0:4401 +174:3:3063 +175:0:4401 +176:3:3064 +177:0:4401 +178:3:3065 +179:0:4401 +180:3:3066 +181:0:4401 +182:3:3067 +183:3:3071 +184:3:3072 +185:3:3080 +186:3:3081 +187:3:3085 +188:3:3086 +189:3:3094 +190:3:3099 +191:3:3103 +192:3:3104 +193:3:3111 +194:3:3112 +195:3:3123 +196:3:3124 +197:3:3125 +198:3:3136 +199:3:3141 +200:3:3142 +201:0:4401 +202:3:3154 +203:0:4401 +204:3:3356 +205:0:4401 +206:3:3454 +207:0:4401 +208:3:3455 +209:0:4401 +210:3:3459 +211:0:4401 +212:3:3465 +213:3:3469 +214:3:3470 +215:3:3478 +216:3:3479 +217:3:3483 +218:3:3484 +219:3:3492 +220:3:3497 +221:3:3501 +222:3:3502 +223:3:3509 +224:3:3510 +225:3:3521 +226:3:3522 +227:3:3523 +228:3:3534 +229:3:3539 +230:3:3540 +231:0:4401 +232:3:3552 +233:0:4401 +234:3:3554 +235:0:4401 +236:3:3555 +237:3:3559 +238:3:3560 +239:3:3568 +240:3:3569 +241:3:3573 +242:3:3574 +243:3:3582 +244:3:3587 +245:3:3591 +246:3:3592 +247:3:3599 +248:3:3600 +249:3:3611 +250:3:3612 +251:3:3613 +252:3:3624 +253:3:3629 +254:3:3630 +255:0:4401 +256:3:3642 +257:0:4401 +258:3:3644 +259:0:4401 +260:3:3647 +261:3:3648 +262:3:3660 +263:3:3661 +264:3:3665 +265:3:3666 +266:3:3674 +267:3:3679 +268:3:3683 +269:3:3684 +270:3:3691 +271:3:3692 +272:3:3703 +273:3:3704 +274:3:3705 +275:3:3716 +276:3:3721 +277:3:3722 +278:0:4401 +279:3:3734 +280:0:4401 +281:3:3736 +282:0:4401 +283:3:3737 +284:0:4401 +285:3:3738 +286:0:4401 +287:3:3739 +288:0:4401 +289:3:3740 +290:3:3744 +291:3:3745 +292:3:3753 +293:3:3754 +294:3:3758 +295:3:3759 +296:3:3767 +297:3:3772 +298:3:3776 +299:3:3777 +300:3:3784 +301:3:3785 +302:3:3796 +303:3:3797 +304:3:3798 +305:3:3809 +306:3:3814 +307:3:3815 +308:0:4401 +309:3:3827 +310:0:4401 +311:3:4029 +312:0:4401 +313:3:4127 +314:0:4401 +315:3:4128 +316:0:4401 +317:3:4132 +318:0:4401 +319:3:4138 +320:0:4401 +321:3:4142 +322:3:4143 +323:3:4147 +324:3:4151 +325:3:4152 +326:3:4156 +327:3:4164 +328:3:4165 +329:3:4170 +330:3:4177 +331:3:4178 +332:3:4185 +333:3:4190 +334:0:4401 +335:3:4201 +336:0:4401 +337:3:4205 +338:3:4206 +339:3:4210 +340:3:4214 +341:3:4215 +342:3:4219 +343:3:4227 +344:3:4228 +345:3:4233 +346:3:4240 +347:3:4241 +348:3:4248 +349:3:4253 +350:0:4401 +351:3:4264 +352:0:4401 +353:3:4272 +354:3:4273 +355:3:4277 +356:3:4281 +357:3:4282 +358:3:4286 +359:3:4294 +360:3:4295 +361:3:4300 +362:3:4307 +363:3:4308 +364:3:4315 +365:3:4320 +366:0:4401 +367:3:4335 +368:0:4401 +369:3:4337 +370:0:4401 +371:3:4338 +372:0:4401 +373:3:2486 +374:0:4401 +375:3:2487 +376:3:2491 +377:3:2492 +378:3:2500 +379:3:2501 +380:3:2505 +381:3:2506 +382:3:2514 +383:3:2519 +384:3:2523 +385:3:2524 +386:3:2531 +387:3:2532 +388:3:2543 +389:3:2544 +390:3:2545 +391:3:2556 +392:3:2561 +393:3:2562 +394:0:4401 +395:3:2574 +396:0:4401 +397:3:2576 +398:3:2577 +399:0:4401 +400:3:2581 +401:3:2585 +402:3:2586 +403:3:2594 +404:3:2595 +405:3:2599 +406:3:2600 +407:3:2608 +408:3:2613 +409:3:2614 +410:3:2625 +411:3:2626 +412:3:2637 +413:3:2638 +414:3:2639 +415:3:2650 +416:3:2655 +417:3:2656 +418:0:4401 +419:3:2668 +420:0:4401 +421:3:2670 +422:0:4401 +423:3:2671 +424:0:4401 +425:3:2681 +426:0:4401 +427:3:2682 +428:0:4401 +429:3:2686 +430:3:2687 +431:3:2691 +432:3:2695 +433:3:2696 +434:3:2700 +435:3:2708 +436:3:2709 +437:3:2714 +438:3:2721 +439:3:2722 +440:3:2729 +441:3:2734 +442:0:4401 +443:3:2745 +444:0:4401 +445:3:2749 +446:3:2750 +447:3:2754 +448:3:2758 +449:3:2759 +450:3:2763 +451:3:2771 +452:3:2772 +453:3:2777 +454:3:2784 +455:3:2785 +456:3:2792 +457:3:2797 +458:0:4401 +459:3:2808 +460:0:4401 +461:3:2816 +462:3:2817 +463:3:2821 +464:3:2825 +465:3:2826 +466:3:2830 +467:3:2838 +468:3:2839 +469:3:2844 +470:3:2851 +471:3:2852 +472:3:2859 +473:3:2864 +474:0:4401 +475:3:2879 +476:0:4401 +477:3:2881 +478:0:4401 +479:3:2882 +480:3:2886 +481:3:2887 +482:3:2895 +483:3:2896 +484:3:2900 +485:3:2901 +486:3:2909 +487:3:2914 +488:3:2918 +489:3:2919 +490:3:2926 +491:3:2927 +492:3:2938 +493:3:2939 +494:3:2940 +495:3:2951 +496:3:2956 +497:3:2957 +498:0:4401 +499:3:2969 +500:0:4401 +501:3:2971 +502:0:4401 +503:3:2974 +504:3:2975 +505:3:2987 +506:3:2988 +507:3:2992 +508:3:2993 +509:3:3001 +510:3:3006 +511:3:3010 +512:3:3011 +513:3:3018 +514:3:3019 +515:3:3030 +516:3:3031 +517:3:3032 +518:3:3043 +519:3:3048 +520:3:3049 +521:0:4401 +522:3:3061 +523:0:4401 +524:3:3063 +525:0:4401 +526:3:3064 +527:0:4401 +528:3:3065 +529:0:4401 +530:3:3066 +531:0:4401 +532:3:3067 +533:3:3071 +534:3:3072 +535:3:3080 +536:3:3081 +537:3:3085 +538:3:3086 +539:3:3094 +540:3:3099 +541:3:3103 +542:3:3104 +543:3:3111 +544:3:3112 +545:3:3123 +546:3:3124 +547:3:3125 +548:3:3136 +549:3:3141 +550:3:3142 +551:0:4401 +552:3:3154 +553:0:4401 +554:3:3356 +555:0:4401 +556:3:3454 +557:0:4401 +558:3:3455 +559:0:4401 +560:3:3459 +561:0:4401 +562:3:3465 +563:3:3469 +564:3:3470 +565:3:3478 +566:3:3479 +567:3:3483 +568:3:3484 +569:3:3492 +570:3:3497 +571:3:3501 +572:3:3502 +573:3:3509 +574:3:3510 +575:3:3521 +576:3:3522 +577:3:3523 +578:3:3534 +579:3:3539 +580:3:3540 +581:0:4401 +582:3:3552 +583:0:4401 +584:3:3554 +585:0:4401 +586:3:3555 +587:3:3559 +588:3:3560 +589:3:3568 +590:3:3569 +591:3:3573 +592:3:3574 +593:3:3582 +594:3:3587 +595:3:3591 +596:3:3592 +597:3:3599 +598:3:3600 +599:3:3611 +600:3:3612 +601:3:3613 +602:3:3624 +603:3:3629 +604:3:3630 +605:0:4401 +606:3:3642 +607:0:4401 +608:3:3644 +609:0:4401 +610:3:3647 +611:3:3648 +612:3:3660 +613:3:3661 +614:3:3665 +615:3:3666 +616:3:3674 +617:3:3679 +618:3:3683 +619:3:3684 +620:3:3691 +621:3:3692 +622:3:3703 +623:3:3704 +624:3:3705 +625:3:3716 +626:3:3721 +627:3:3722 +628:0:4401 +629:3:3734 +630:0:4401 +631:3:3736 +632:0:4401 +633:3:3737 +634:0:4401 +635:3:3738 +636:0:4401 +637:3:3739 +638:0:4401 +639:3:3740 +640:3:3744 +641:3:3745 +642:3:3753 +643:3:3754 +644:3:3758 +645:3:3759 +646:3:3767 +647:3:3772 +648:3:3776 +649:3:3777 +650:3:3784 +651:3:3785 +652:3:3796 +653:3:3797 +654:3:3798 +655:3:3809 +656:3:3814 +657:3:3815 +658:0:4401 +659:3:3827 +660:0:4401 +661:3:4029 +662:0:4401 +663:3:4127 +664:0:4401 +665:3:4128 +666:0:4401 +667:3:4132 +668:0:4401 +669:3:4138 +670:0:4401 +671:3:4142 +672:3:4143 +673:3:4147 +674:3:4151 +675:3:4152 +676:3:4156 +677:3:4164 +678:3:4165 +679:3:4170 +680:3:4177 +681:3:4178 +682:3:4185 +683:3:4190 +684:0:4401 +685:3:4201 +686:0:4401 +687:3:4205 +688:3:4206 +689:3:4210 +690:3:4214 +691:3:4215 +692:3:4219 +693:3:4227 +694:3:4228 +695:3:4233 +696:3:4240 +697:3:4241 +698:3:4248 +699:3:4253 +700:0:4401 +701:3:4264 +702:0:4401 +703:3:4272 +704:3:4273 +705:3:4277 +706:3:4281 +707:3:4282 +708:3:4286 +709:3:4294 +710:3:4295 +711:3:4300 +712:3:4307 +713:3:4308 +714:3:4315 +715:3:4320 +716:0:4401 +717:3:4335 +718:0:4401 +719:3:4337 +720:0:4401 +721:3:4338 +722:0:4401 +723:3:2486 +724:0:4401 +725:3:2487 +726:3:2491 +727:3:2492 +728:3:2500 +729:3:2501 +730:3:2505 +731:3:2506 +732:3:2514 +733:3:2519 +734:3:2523 +735:3:2524 +736:3:2531 +737:3:2532 +738:3:2543 +739:3:2544 +740:3:2545 +741:3:2556 +742:3:2561 +743:3:2562 +744:0:4401 +745:3:2574 +746:0:4401 +747:3:2576 +748:3:2577 +749:0:4401 +750:3:2581 +751:3:2585 +752:3:2586 +753:3:2594 +754:3:2595 +755:3:2599 +756:3:2600 +757:3:2608 +758:3:2613 +759:3:2614 +760:3:2625 +761:3:2626 +762:3:2637 +763:3:2638 +764:3:2639 +765:3:2650 +766:3:2655 +767:3:2656 +768:0:4401 +769:3:2668 +770:0:4401 +771:3:2670 +772:0:4401 +773:3:2671 +774:0:4401 +775:3:2681 +776:0:4401 +777:3:2682 +778:0:4401 +779:3:2686 +780:3:2687 +781:3:2691 +782:3:2695 +783:3:2696 +784:3:2700 +785:3:2708 +786:3:2709 +787:3:2714 +788:3:2721 +789:3:2722 +790:3:2729 +791:3:2734 +792:0:4401 +793:3:2745 +794:0:4401 +795:3:2749 +796:3:2750 +797:3:2754 +798:3:2758 +799:3:2759 +800:3:2763 +801:3:2771 +802:3:2772 +803:3:2777 +804:3:2784 +805:3:2785 +806:3:2792 +807:3:2797 +808:0:4401 +809:3:2808 +810:0:4401 +811:3:2816 +812:3:2817 +813:3:2821 +814:3:2825 +815:3:2826 +816:3:2830 +817:3:2838 +818:3:2839 +819:3:2844 +820:3:2851 +821:3:2852 +822:3:2859 +823:3:2864 +824:0:4401 +825:3:2879 +826:0:4401 +827:3:2881 +828:0:4401 +829:3:2882 +830:3:2886 +831:3:2887 +832:3:2895 +833:3:2896 +834:3:2900 +835:3:2901 +836:3:2909 +837:3:2914 +838:3:2918 +839:3:2919 +840:3:2926 +841:3:2927 +842:3:2938 +843:3:2939 +844:3:2940 +845:3:2951 +846:3:2956 +847:3:2957 +848:0:4401 +849:3:2969 +850:0:4401 +851:3:2971 +852:0:4401 +853:3:2974 +854:3:2975 +855:3:2987 +856:3:2988 +857:3:2992 +858:3:2993 +859:3:3001 +860:3:3006 +861:3:3010 +862:3:3011 +863:3:3018 +864:3:3019 +865:3:3030 +866:3:3031 +867:3:3032 +868:3:3043 +869:3:3048 +870:3:3049 +871:0:4401 +872:3:3061 +873:0:4401 +874:3:3063 +875:0:4401 +876:3:3064 +877:0:4401 +878:3:3065 +879:0:4401 +880:3:3066 +881:0:4401 +882:3:3067 +883:3:3071 +884:3:3072 +885:3:3080 +886:3:3081 +887:3:3085 +888:3:3086 +889:3:3094 +890:3:3099 +891:3:3103 +892:3:3104 +893:3:3111 +894:3:3112 +895:3:3123 +896:3:3124 +897:3:3125 +898:3:3136 +899:3:3141 +900:3:3142 +901:0:4401 +902:3:3154 +903:0:4401 +904:3:3356 +905:0:4401 +906:3:3454 +907:0:4401 +908:3:3455 +909:0:4401 +910:3:3459 +911:0:4401 +912:3:3465 +913:3:3469 +914:3:3470 +915:3:3478 +916:3:3479 +917:3:3483 +918:3:3484 +919:3:3492 +920:3:3497 +921:3:3501 +922:3:3502 +923:3:3509 +924:3:3510 +925:3:3521 +926:3:3522 +927:3:3523 +928:3:3534 +929:3:3539 +930:3:3540 +931:0:4401 +932:3:3552 +933:0:4401 +934:3:3554 +935:0:4401 +936:3:3555 +937:3:3559 +938:3:3560 +939:3:3568 +940:3:3569 +941:3:3573 +942:3:3574 +943:3:3582 +944:3:3587 +945:3:3591 +946:3:3592 +947:3:3599 +948:3:3600 +949:3:3611 +950:3:3612 +951:3:3613 +952:3:3624 +953:3:3629 +954:3:3630 +955:0:4401 +956:3:3642 +957:0:4401 +958:3:3644 +959:0:4401 +960:3:3647 +961:3:3648 +962:3:3660 +963:3:3661 +964:3:3665 +965:3:3666 +966:3:3674 +967:3:3679 +968:3:3683 +969:3:3684 +970:3:3691 +971:3:3692 +972:3:3703 +973:3:3704 +974:3:3705 +975:3:3716 +976:3:3721 +977:3:3722 +978:0:4401 +979:3:3734 +980:0:4401 +981:3:3736 +982:0:4401 +983:3:3737 +984:0:4401 +985:3:3738 +986:0:4401 +987:3:3739 +988:0:4401 +989:3:3740 +990:3:3744 +991:3:3745 +992:3:3753 +993:3:3754 +994:3:3758 +995:3:3759 +996:3:3767 +997:3:3772 +998:3:3776 +999:3:3777 +1000:3:3784 +1001:3:3785 +1002:3:3796 +1003:3:3797 +1004:3:3798 +1005:3:3809 +1006:3:3814 +1007:3:3815 +1008:0:4401 +1009:3:3827 +1010:0:4401 +1011:3:4029 +1012:0:4401 +1013:3:4127 +1014:0:4401 +1015:3:4128 +1016:0:4401 +1017:3:4132 +1018:0:4401 +1019:3:4138 +1020:0:4401 +1021:3:4142 +1022:3:4143 +1023:3:4147 +1024:3:4151 +1025:3:4152 +1026:3:4156 +1027:3:4164 +1028:3:4165 +1029:3:4170 +1030:3:4177 +1031:3:4178 +1032:3:4185 +1033:3:4190 +1034:0:4401 +1035:3:4201 +1036:0:4401 +1037:3:4205 +1038:3:4206 +1039:3:4210 +1040:3:4214 +1041:3:4215 +1042:3:4219 +1043:3:4227 +1044:3:4228 +1045:3:4233 +1046:3:4240 +1047:3:4241 +1048:3:4248 +1049:3:4253 +1050:0:4401 +1051:3:4264 +1052:0:4401 +1053:3:4272 +1054:3:4273 +1055:3:4277 +1056:3:4281 +1057:3:4282 +1058:3:4286 +1059:3:4294 +1060:3:4295 +1061:3:4300 +1062:3:4307 +1063:3:4308 +1064:3:4315 +1065:3:4320 +1066:0:4401 +1067:3:4335 +1068:0:4401 +1069:3:4337 +1070:0:4401 +1071:3:4338 +1072:0:4401 +1073:3:4341 +1074:0:4401 +1075:3:4346 +1076:0:4401 +1077:2:1236 +1078:0:4401 +1079:3:4347 +1080:0:4401 +1081:2:1242 +1082:0:4401 +1083:3:4346 +1084:0:4401 +1085:2:1243 +1086:0:4401 +1087:3:4347 +1088:0:4401 +1089:2:1244 +1090:0:4401 +1091:3:4346 +1092:0:4401 +1093:2:1245 +1094:0:4401 +1095:3:4347 +1096:0:4401 +1097:1:2 +1098:0:4401 +1099:3:4346 +1100:0:4401 +1101:2:1246 +1102:0:4401 +1103:3:4347 +1104:0:4401 +1105:1:8 +1106:0:4401 +1107:3:4346 +1108:0:4401 +1109:2:1245 +1110:0:4401 +1111:3:4347 +1112:0:4401 +1113:1:9 +1114:0:4401 +1115:3:4346 +1116:0:4401 +1117:2:1246 +1118:0:4401 +1119:3:4347 +1120:0:4401 +1121:1:10 +1122:0:4401 +1123:3:4346 +1124:0:4401 +1125:2:1245 +1126:0:4401 +1127:3:4347 +1128:0:4401 +1129:1:11 +1130:0:4401 +1131:3:4346 +1132:0:4401 +1133:2:1246 +1134:0:4401 +1135:3:4347 +1136:0:4401 +1137:1:14 +1138:0:4401 +1139:3:4346 +1140:0:4401 +1141:2:1245 +1142:0:4401 +1143:3:4347 +1144:0:4401 +1145:1:15 +1146:0:4401 +1147:3:4346 +1148:0:4401 +1149:2:1246 +1150:0:4401 +1151:3:4347 +1152:0:4401 +1153:1:16 +1154:1:20 +1155:1:21 +1156:1:29 +1157:1:30 +1158:1:34 +1159:1:35 +1160:1:43 +1161:1:48 +1162:1:52 +1163:1:53 +1164:1:60 +1165:1:61 +1166:1:72 +1167:1:73 +1168:1:74 +1169:1:85 +1170:1:90 +1171:1:91 +1172:0:4401 +1173:3:4346 +1174:0:4401 +1175:2:1245 +1176:0:4401 +1177:3:4347 +1178:0:4401 +1179:1:103 +1180:0:4401 +1181:3:4346 +1182:0:4401 +1183:2:1246 +1184:0:4401 +1185:3:4347 +1186:0:4401 +1187:2:1247 +1188:0:4401 +1189:3:4346 +1190:0:4401 +1191:2:1253 +1192:0:4401 +1193:3:4347 +1194:0:4401 +1195:2:1254 +1196:0:4399 +1197:3:4346 +1198:0:4405 +1199:3:4347 +1200:0:4405 +1201:2:1257 +1202:0:4405 +1203:3:4346 +1204:0:4405 +1205:2:1258 +1206:0:4405 +1207:3:4347 +1208:0:4405 +1209:2:1259 +1210:2:1263 +1211:2:1264 +1212:2:1272 +1213:2:1273 +1214:2:1277 +1215:2:1278 +1216:2:1286 +1217:2:1291 +1218:2:1295 +1219:2:1296 +1220:2:1303 +1221:2:1304 +1222:2:1315 +1223:2:1316 +1224:2:1317 +1225:2:1328 +1226:2:1333 +1227:2:1334 +1228:0:4405 +1229:3:4346 +1230:0:4405 +1231:2:1346 +1232:0:4405 +1233:3:4347 +1234:0:4405 +1235:2:1347 +1236:0:4405 +1237:3:4346 +1238:0:4405 +1239:1:104 +-1:-1:-1 +1240:0:4405 +1241:3:4347 +1242:0:4405 +1243:3:4346 +1244:0:4405 +1245:2:1348 +1246:0:4405 +1247:3:4347 +1248:0:4405 +1249:2:1347 +1250:0:4405 +1251:3:4346 +1252:0:4405 +1253:1:105 +1254:0:4405 +1255:3:4347 +1256:0:4405 +1257:3:4346 +1258:0:4405 +1259:2:1348 +1260:0:4405 +1261:3:4347 +1262:0:4405 +1263:2:1347 +1264:0:4405 +1265:3:4346 +1266:0:4405 +1267:1:104 diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.define b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.define new file mode 100644 index 0000000..1e4417f --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.define @@ -0,0 +1 @@ +#define WRITER_PROGRESS diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.log b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.log new file mode 100644 index 0000000..fc83245 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.log @@ -0,0 +1,524 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define > pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_progress_writer.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -f -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 744) +depth 15: Claim reached state 9 (line 749) +depth 1194: Claim reached state 9 (line 748) +Depth= 3253 States= 1e+06 Transitions= 1.06e+07 Memory= 484.416 t= 9.64 R= 1e+05 +Depth= 3253 States= 2e+06 Transitions= 2.04e+07 Memory= 501.311 t= 18.6 R= 1e+05 +Depth= 3253 States= 3e+06 Transitions= 3.44e+07 Memory= 516.252 t= 31.6 R= 9e+04 +pan: resizing hashtable to -w22.. done +Depth= 7995 States= 4e+06 Transitions= 4.66e+07 Memory= 563.486 t= 42.8 R= 9e+04 +Depth= 7995 States= 5e+06 Transitions= 6.05e+07 Memory= 580.674 t= 55.6 R= 9e+04 +Depth= 7995 States= 6e+06 Transitions= 7.12e+07 Memory= 599.229 t= 65.5 R= 9e+04 +Depth= 7995 States= 7e+06 Transitions= 8.58e+07 Memory= 613.975 t= 78.9 R= 9e+04 +Depth= 7995 States= 8e+06 Transitions= 9.62e+07 Memory= 631.846 t= 88.7 R= 9e+04 +Depth= 7995 States= 9e+06 Transitions= 1.1e+08 Memory= 646.592 t= 101 R= 9e+04 +pan: resizing hashtable to -w24.. done +Depth= 7995 States= 1e+07 Transitions= 1.32e+08 Memory= 783.869 t= 122 R= 8e+04 +Depth= 7995 States= 1.1e+07 Transitions= 1.52e+08 Memory= 799.104 t= 140 R= 8e+04 +Depth= 7995 States= 1.2e+07 Transitions= 1.71e+08 Memory= 814.533 t= 157 R= 8e+04 +Depth= 7995 States= 1.3e+07 Transitions= 1.9e+08 Memory= 829.670 t= 174 R= 7e+04 +Depth= 7995 States= 1.4e+07 Transitions= 2.01e+08 Memory= 848.029 t= 185 R= 8e+04 +Depth= 7995 States= 1.5e+07 Transitions= 2.21e+08 Memory= 862.287 t= 203 R= 7e+04 +Depth= 7995 States= 1.6e+07 Transitions= 2.35e+08 Memory= 877.815 t= 215 R= 7e+04 +Depth= 7995 States= 1.7e+07 Transitions= 2.44e+08 Memory= 897.736 t= 223 R= 8e+04 +Depth= 7995 States= 1.8e+07 Transitions= 2.57e+08 Memory= 911.115 t= 235 R= 8e+04 +Depth= 7995 States= 1.9e+07 Transitions= 2.69e+08 Memory= 927.033 t= 246 R= 8e+04 +Depth= 8341 States= 2e+07 Transitions= 2.83e+08 Memory= 943.440 t= 259 R= 8e+04 +Depth= 8341 States= 2.1e+07 Transitions= 2.96e+08 Memory= 961.604 t= 271 R= 8e+04 +Depth= 8341 States= 2.2e+07 Transitions= 3.07e+08 Memory= 978.791 t= 281 R= 8e+04 +Depth= 8341 States= 2.3e+07 Transitions= 3.2e+08 Memory= 996.369 t= 293 R= 8e+04 +Depth= 8341 States= 2.4e+07 Transitions= 3.32e+08 Memory= 1013.264 t= 304 R= 8e+04 +Depth= 8341 States= 2.5e+07 Transitions= 3.48e+08 Memory= 1024.885 t= 319 R= 8e+04 +Depth= 8341 States= 2.6e+07 Transitions= 3.72e+08 Memory= 1038.947 t= 341 R= 8e+04 +Depth= 8341 States= 2.7e+07 Transitions= 3.91e+08 Memory= 1055.158 t= 358 R= 8e+04 +Depth= 8341 States= 2.8e+07 Transitions= 4.09e+08 Memory= 1069.904 t= 374 R= 7e+04 +Depth= 8341 States= 2.9e+07 Transitions= 4.25e+08 Memory= 1086.701 t= 389 R= 7e+04 +Depth= 8341 States= 3e+07 Transitions= 4.43e+08 Memory= 1102.131 t= 405 R= 7e+04 +Depth= 8341 States= 3.1e+07 Transitions= 4.58e+08 Memory= 1117.268 t= 419 R= 7e+04 +Depth= 8341 States= 3.2e+07 Transitions= 4.68e+08 Memory= 1136.213 t= 429 R= 7e+04 +Depth= 8341 States= 3.3e+07 Transitions= 4.8e+08 Memory= 1151.154 t= 440 R= 8e+04 +Depth= 8341 States= 3.4e+07 Transitions= 4.92e+08 Memory= 1166.779 t= 451 R= 8e+04 +pan: resizing hashtable to -w26.. done +Depth= 8687 States= 3.5e+07 Transitions= 5.05e+08 Memory= 1679.658 t= 464 R= 8e+04 +Depth= 8687 States= 3.6e+07 Transitions= 5.18e+08 Memory= 1697.432 t= 477 R= 8e+04 +Depth= 8687 States= 3.7e+07 Transitions= 5.29e+08 Memory= 1714.326 t= 487 R= 8e+04 +Depth= 8687 States= 3.8e+07 Transitions= 5.44e+08 Memory= 1730.244 t= 500 R= 8e+04 +Depth= 8687 States= 3.9e+07 Transitions= 5.55e+08 Memory= 1747.920 t= 511 R= 8e+04 +Depth= 8687 States= 4e+07 Transitions= 5.69e+08 Memory= 1761.885 t= 523 R= 8e+04 +Depth= 8687 States= 4.1e+07 Transitions= 5.92e+08 Memory= 1775.850 t= 544 R= 8e+04 +Depth= 8687 States= 4.2e+07 Transitions= 6.12e+08 Memory= 1790.498 t= 562 R= 7e+04 +Depth= 8687 States= 4.3e+07 Transitions= 6.29e+08 Memory= 1807.783 t= 578 R= 7e+04 +Depth= 8687 States= 4.4e+07 Transitions= 6.48e+08 Memory= 1822.432 t= 595 R= 7e+04 +Depth= 8687 States= 4.5e+07 Transitions= 6.61e+08 Memory= 1838.838 t= 606 R= 7e+04 +Depth= 8687 States= 4.6e+07 Transitions= 6.81e+08 Memory= 1853.291 t= 625 R= 7e+04 +Depth= 8687 States= 4.7e+07 Transitions= 6.93e+08 Memory= 1870.772 t= 635 R= 7e+04 +Depth= 8687 States= 4.8e+07 Transitions= 7.02e+08 Memory= 1889.912 t= 644 R= 7e+04 +Depth= 8687 States= 4.9e+07 Transitions= 7.15e+08 Memory= 1902.998 t= 656 R= 7e+04 +Depth= 8687 States= 5e+07 Transitions= 7.27e+08 Memory= 1919.600 t= 667 R= 7e+04 +Depth= 9033 States= 5.1e+07 Transitions= 7.42e+08 Memory= 1935.518 t= 681 R= 7e+04 +Depth= 9033 States= 5.2e+07 Transitions= 7.53e+08 Memory= 1954.170 t= 691 R= 8e+04 +Depth= 9033 States= 5.3e+07 Transitions= 7.66e+08 Memory= 1969.990 t= 703 R= 8e+04 +Depth= 9033 States= 5.4e+07 Transitions= 7.77e+08 Memory= 1988.545 t= 713 R= 8e+04 +Depth= 9033 States= 5.5e+07 Transitions= 7.9e+08 Memory= 2004.756 t= 725 R= 8e+04 +Depth= 9033 States= 5.6e+07 Transitions= 8.1e+08 Memory= 2016.084 t= 743 R= 8e+04 +Depth= 9033 States= 5.7e+07 Transitions= 8.32e+08 Memory= 2030.440 t= 763 R= 7e+04 +Depth= 9033 States= 5.8e+07 Transitions= 8.51e+08 Memory= 2046.260 t= 781 R= 7e+04 +Depth= 9033 States= 5.9e+07 Transitions= 8.7e+08 Memory= 2061.592 t= 797 R= 7e+04 +Depth= 9033 States= 6e+07 Transitions= 8.83e+08 Memory= 2078.779 t= 809 R= 7e+04 +Depth= 9033 States= 6.1e+07 Transitions= 9.01e+08 Memory= 2094.014 t= 826 R= 7e+04 +Depth= 9033 States= 6.2e+07 Transitions= 9.16e+08 Memory= 2108.467 t= 840 R= 7e+04 +Depth= 9033 States= 6.3e+07 Transitions= 9.26e+08 Memory= 2126.924 t= 849 R= 7e+04 +Depth= 9033 States= 6.4e+07 Transitions= 9.38e+08 Memory= 2142.158 t= 860 R= 7e+04 +Depth= 9033 States= 6.5e+07 Transitions= 9.51e+08 Memory= 2157.295 t= 871 R= 7e+04 +Depth= 9379 States= 6.6e+07 Transitions= 9.63e+08 Memory= 2173.115 t= 883 R= 7e+04 +Depth= 9379 States= 6.7e+07 Transitions= 9.77e+08 Memory= 2190.401 t= 895 R= 7e+04 +Depth= 9379 States= 6.8e+07 Transitions= 9.88e+08 Memory= 2208.955 t= 905 R= 8e+04 +Depth= 9379 States= 6.9e+07 Transitions= 1e+09 Memory= 2223.311 t= 919 R= 8e+04 +Depth= 9379 States= 7e+07 Transitions= 1.01e+09 Memory= 2242.256 t= 928 R= 8e+04 +Depth= 9379 States= 7.1e+07 Transitions= 1.03e+09 Memory= 2257.295 t= 940 R= 8e+04 +Depth= 9379 States= 7.2e+07 Transitions= 1.05e+09 Memory= 2269.307 t= 960 R= 8e+04 +Depth= 9379 States= 7.3e+07 Transitions= 1.07e+09 Memory= 2283.760 t= 979 R= 7e+04 +Depth= 9379 States= 7.4e+07 Transitions= 1.09e+09 Memory= 2299.385 t= 996 R= 7e+04 +Depth= 9379 States= 7.5e+07 Transitions= 1.11e+09 Memory= 2314.619 t= 1.01e+03 R= 7e+04 +Depth= 9379 States= 7.6e+07 Transitions= 1.12e+09 Memory= 2333.369 t= 1.02e+03 R= 7e+04 +Depth= 9379 States= 7.7e+07 Transitions= 1.14e+09 Memory= 2347.139 t= 1.04e+03 R= 7e+04 +Depth= 9379 States= 7.8e+07 Transitions= 1.15e+09 Memory= 2385.029 t= 1.06e+03 R= 7e+04 +Depth= 9379 States= 7.9e+07 Transitions= 1.17e+09 Memory= 2453.682 t= 1.07e+03 R= 7e+04 +Depth= 9379 States= 8e+07 Transitions= 1.18e+09 Memory= 2522.236 t= 1.08e+03 R= 7e+04 +Depth= 9379 States= 8.1e+07 Transitions= 1.2e+09 Memory= 2590.889 t= 1.1e+03 R= 7e+04 +Depth= 9379 States= 8.2e+07 Transitions= 1.22e+09 Memory= 2624.287 t= 1.12e+03 R= 7e+04 +Depth= 9379 States= 8.3e+07 Transitions= 1.23e+09 Memory= 2640.303 t= 1.13e+03 R= 7e+04 +Depth= 9379 States= 8.4e+07 Transitions= 1.25e+09 Memory= 2654.170 t= 1.15e+03 R= 7e+04 +Depth= 9379 States= 8.5e+07 Transitions= 1.27e+09 Memory= 2669.111 t= 1.16e+03 R= 7e+04 +Depth= 9379 States= 8.6e+07 Transitions= 1.29e+09 Memory= 2684.053 t= 1.18e+03 R= 7e+04 +Depth= 9379 States= 8.7e+07 Transitions= 1.31e+09 Memory= 2698.604 t= 1.2e+03 R= 7e+04 +Depth= 9379 States= 8.8e+07 Transitions= 1.33e+09 Memory= 2719.697 t= 1.22e+03 R= 7e+04 +Depth= 9379 States= 8.9e+07 Transitions= 1.35e+09 Memory= 2788.350 t= 1.24e+03 R= 7e+04 +Depth= 9379 States= 9e+07 Transitions= 1.37e+09 Memory= 2819.990 t= 1.26e+03 R= 7e+04 +Depth= 9379 States= 9.1e+07 Transitions= 1.39e+09 Memory= 2846.553 t= 1.27e+03 R= 7e+04 +Depth= 9379 States= 9.2e+07 Transitions= 1.4e+09 Memory= 2864.912 t= 1.28e+03 R= 7e+04 +Depth= 9379 States= 9.3e+07 Transitions= 1.41e+09 Memory= 2877.901 t= 1.3e+03 R= 7e+04 +Depth= 9379 States= 9.4e+07 Transitions= 1.44e+09 Memory= 2892.842 t= 1.31e+03 R= 7e+04 +Depth= 9379 States= 9.5e+07 Transitions= 1.45e+09 Memory= 2908.076 t= 1.33e+03 R= 7e+04 +Depth= 9379 States= 9.6e+07 Transitions= 1.47e+09 Memory= 2922.627 t= 1.35e+03 R= 7e+04 +Depth= 9379 States= 9.7e+07 Transitions= 1.49e+09 Memory= 2940.693 t= 1.36e+03 R= 7e+04 +Depth= 9379 States= 9.8e+07 Transitions= 1.51e+09 Memory= 2953.291 t= 1.38e+03 R= 7e+04 +Depth= 9379 States= 9.9e+07 Transitions= 1.53e+09 Memory= 2968.526 t= 1.4e+03 R= 7e+04 +Depth= 9379 States= 1e+08 Transitions= 1.56e+09 Memory= 2981.709 t= 1.42e+03 R= 7e+04 +Depth= 9379 States= 1.01e+08 Transitions= 1.57e+09 Memory= 2997.236 t= 1.44e+03 R= 7e+04 +Depth= 9379 States= 1.02e+08 Transitions= 1.59e+09 Memory= 3011.592 t= 1.46e+03 R= 7e+04 +Depth= 9379 States= 1.03e+08 Transitions= 1.61e+09 Memory= 3037.861 t= 1.47e+03 R= 7e+04 +Depth= 9379 States= 1.04e+08 Transitions= 1.63e+09 Memory= 3106.514 t= 1.49e+03 R= 7e+04 +Depth= 9379 States= 1.05e+08 Transitions= 1.65e+09 Memory= 3175.166 t= 1.51e+03 R= 7e+04 +Depth= 9379 States= 1.06e+08 Transitions= 1.67e+09 Memory= 3223.897 t= 1.52e+03 R= 7e+04 +Depth= 9379 States= 1.07e+08 Transitions= 1.68e+09 Memory= 3246.846 t= 1.54e+03 R= 7e+04 +Depth= 9379 States= 1.08e+08 Transitions= 1.7e+09 Memory= 3283.467 t= 1.56e+03 R= 7e+04 +Depth= 9379 States= 1.09e+08 Transitions= 1.72e+09 Memory= 3316.670 t= 1.57e+03 R= 7e+04 +Depth= 9379 States= 1.1e+08 Transitions= 1.73e+09 Memory= 3344.209 t= 1.59e+03 R= 7e+04 +Depth= 9379 States= 1.11e+08 Transitions= 1.75e+09 Memory= 3376.338 t= 1.6e+03 R= 7e+04 +Depth= 9379 States= 1.12e+08 Transitions= 1.76e+09 Memory= 3396.943 t= 1.62e+03 R= 7e+04 +Depth= 9379 States= 1.13e+08 Transitions= 1.78e+09 Memory= 3426.143 t= 1.63e+03 R= 7e+04 +Depth= 9379 States= 1.14e+08 Transitions= 1.8e+09 Memory= 3452.705 t= 1.65e+03 R= 7e+04 +Depth= 9379 States= 1.15e+08 Transitions= 1.81e+09 Memory= 3493.818 t= 1.66e+03 R= 7e+04 +Depth= 9379 States= 1.16e+08 Transitions= 1.83e+09 Memory= 3533.369 t= 1.67e+03 R= 7e+04 +Depth= 9379 States= 1.17e+08 Transitions= 1.84e+09 Memory= 3566.182 t= 1.69e+03 R= 7e+04 +Depth= 9379 States= 1.18e+08 Transitions= 1.86e+09 Memory= 3582.881 t= 1.7e+03 R= 7e+04 +Depth= 9379 States= 1.19e+08 Transitions= 1.88e+09 Memory= 3630.830 t= 1.72e+03 R= 7e+04 +Depth= 9379 States= 1.2e+08 Transitions= 1.89e+09 Memory= 3692.744 t= 1.74e+03 R= 7e+04 +Depth= 9379 States= 1.21e+08 Transitions= 1.91e+09 Memory= 3750.361 t= 1.75e+03 R= 7e+04 +Depth= 9379 States= 1.22e+08 Transitions= 1.92e+09 Memory= 3767.354 t= 1.76e+03 R= 7e+04 +Depth= 9379 States= 1.23e+08 Transitions= 1.94e+09 Memory= 3781.904 t= 1.78e+03 R= 7e+04 +Depth= 9379 States= 1.24e+08 Transitions= 1.96e+09 Memory= 3797.529 t= 1.8e+03 R= 7e+04 +Depth= 9379 States= 1.25e+08 Transitions= 1.98e+09 Memory= 3810.908 t= 1.82e+03 R= 7e+04 +Depth= 9379 States= 1.26e+08 Transitions= 2e+09 Memory= 3826.143 t= 1.83e+03 R= 7e+04 +Depth= 9379 States= 1.27e+08 Transitions= 2.02e+09 Memory= 3839.717 t= 1.86e+03 R= 7e+04 +Depth= 9379 States= 1.28e+08 Transitions= 2.04e+09 Memory= 3881.709 t= 1.87e+03 R= 7e+04 +Depth= 9379 States= 1.29e+08 Transitions= 2.06e+09 Memory= 3946.553 t= 1.89e+03 R= 7e+04 +Depth= 9379 States= 1.3e+08 Transitions= 2.08e+09 Memory= 3970.479 t= 1.91e+03 R= 7e+04 +Depth= 9379 States= 1.31e+08 Transitions= 2.09e+09 Memory= 3991.768 t= 1.92e+03 R= 7e+04 +Depth= 9379 States= 1.32e+08 Transitions= 2.1e+09 Memory= 4007.490 t= 1.93e+03 R= 7e+04 +Depth= 9379 States= 1.33e+08 Transitions= 2.13e+09 Memory= 4020.772 t= 1.95e+03 R= 7e+04 +Depth= 9379 States= 1.34e+08 Transitions= 2.14e+09 Memory= 4036.201 t= 1.97e+03 R= 7e+04 +Depth= 9379 States= 1.35e+08 Transitions= 2.16e+09 Memory= 4051.924 t= 1.98e+03 R= 7e+04 +pan: resizing hashtable to -w28.. done +Depth= 9379 States= 1.36e+08 Transitions= 2.18e+09 Memory= 6099.924 t= 2.02e+03 R= 7e+04 +Depth= 9379 States= 1.37e+08 Transitions= 2.2e+09 Memory= 6099.924 t= 2.03e+03 R= 7e+04 +Depth= 9379 States= 1.38e+08 Transitions= 2.22e+09 Memory= 6099.924 t= 2.05e+03 R= 7e+04 +Depth= 9379 States= 1.39e+08 Transitions= 2.24e+09 Memory= 6099.924 t= 2.07e+03 R= 7e+04 +Depth= 9379 States= 1.4e+08 Transitions= 2.26e+09 Memory= 6108.518 t= 2.09e+03 R= 7e+04 +Depth= 9379 States= 1.41e+08 Transitions= 2.28e+09 Memory= 6124.729 t= 2.1e+03 R= 7e+04 +Depth= 9379 States= 1.42e+08 Transitions= 2.3e+09 Memory= 6138.889 t= 2.12e+03 R= 7e+04 +Depth= 9379 States= 1.43e+08 Transitions= 2.31e+09 Memory= 6178.928 t= 2.13e+03 R= 7e+04 +Depth= 9379 States= 1.44e+08 Transitions= 2.33e+09 Memory= 6247.483 t= 2.15e+03 R= 7e+04 +Depth= 9379 States= 1.45e+08 Transitions= 2.35e+09 Memory= 6316.135 t= 2.17e+03 R= 7e+04 +Depth= 9379 States= 1.46e+08 Transitions= 2.37e+09 Memory= 6353.440 t= 2.19e+03 R= 7e+04 +Depth= 9379 States= 1.47e+08 Transitions= 2.39e+09 Memory= 6381.662 t= 2.21e+03 R= 7e+04 +Depth= 9379 States= 1.48e+08 Transitions= 2.41e+09 Memory= 6422.190 t= 2.22e+03 R= 7e+04 +Depth= 9379 States= 1.49e+08 Transitions= 2.42e+09 Memory= 6449.143 t= 2.23e+03 R= 7e+04 +Depth= 9379 States= 1.5e+08 Transitions= 2.44e+09 Memory= 6472.580 t= 2.25e+03 R= 7e+04 +Depth= 9379 States= 1.51e+08 Transitions= 2.45e+09 Memory= 6503.733 t= 2.26e+03 R= 7e+04 +Depth= 9379 States= 1.52e+08 Transitions= 2.47e+09 Memory= 6531.369 t= 2.28e+03 R= 7e+04 +Depth= 9379 States= 1.53e+08 Transitions= 2.49e+09 Memory= 6554.123 t= 2.29e+03 R= 7e+04 +Depth= 9379 States= 1.54e+08 Transitions= 2.5e+09 Memory= 6585.373 t= 2.31e+03 R= 7e+04 +Depth= 9379 States= 1.55e+08 Transitions= 2.52e+09 Memory= 6622.776 t= 2.32e+03 R= 7e+04 +Depth= 9379 States= 1.56e+08 Transitions= 2.54e+09 Memory= 6671.213 t= 2.34e+03 R= 7e+04 +Depth= 9379 States= 1.57e+08 Transitions= 2.55e+09 Memory= 6696.115 t= 2.35e+03 R= 7e+04 +Depth= 9379 States= 1.58e+08 Transitions= 2.57e+09 Memory= 6722.776 t= 2.37e+03 R= 7e+04 +Depth= 9379 States= 1.59e+08 Transitions= 2.58e+09 Memory= 6764.572 t= 2.38e+03 R= 7e+04 +Depth= 9379 States= 1.6e+08 Transitions= 2.6e+09 Memory= 6830.490 t= 2.4e+03 R= 7e+04 +Depth= 9379 States= 1.61e+08 Transitions= 2.62e+09 Memory= 6879.026 t= 2.41e+03 R= 7e+04 +Depth= 9379 States= 1.62e+08 Transitions= 2.63e+09 Memory= 6895.432 t= 2.42e+03 R= 7e+04 +Depth= 9379 States= 1.63e+08 Transitions= 2.65e+09 Memory= 6909.787 t= 2.44e+03 R= 7e+04 +Depth= 9379 States= 1.64e+08 Transitions= 2.67e+09 Memory= 6925.217 t= 2.46e+03 R= 7e+04 +Depth= 9379 States= 1.65e+08 Transitions= 2.69e+09 Memory= 6938.986 t= 2.48e+03 R= 7e+04 +Depth= 9379 States= 1.66e+08 Transitions= 2.71e+09 Memory= 6953.537 t= 2.5e+03 R= 7e+04 +Depth= 9379 States= 1.67e+08 Transitions= 2.73e+09 Memory= 6967.893 t= 2.52e+03 R= 7e+04 +Depth= 9379 States= 1.68e+08 Transitions= 2.75e+09 Memory= 7022.190 t= 2.53e+03 R= 7e+04 +Depth= 9379 States= 1.69e+08 Transitions= 2.77e+09 Memory= 7076.779 t= 2.55e+03 R= 7e+04 +Depth= 9379 States= 1.7e+08 Transitions= 2.79e+09 Memory= 7102.365 t= 2.57e+03 R= 7e+04 +Depth= 9379 States= 1.71e+08 Transitions= 2.8e+09 Memory= 7119.162 t= 2.58e+03 R= 7e+04 +Depth= 9379 States= 1.72e+08 Transitions= 2.81e+09 Memory= 7135.178 t= 2.59e+03 R= 7e+04 +Depth= 9379 States= 1.73e+08 Transitions= 2.84e+09 Memory= 7150.022 t= 2.61e+03 R= 7e+04 +Depth= 9379 States= 1.74e+08 Transitions= 2.85e+09 Memory= 7164.475 t= 2.63e+03 R= 7e+04 +Depth= 9379 States= 1.75e+08 Transitions= 2.87e+09 Memory= 7180.295 t= 2.64e+03 R= 7e+04 +Depth= 9379 States= 1.76e+08 Transitions= 2.89e+09 Memory= 7198.264 t= 2.66e+03 R= 7e+04 +Depth= 9379 States= 1.77e+08 Transitions= 2.9e+09 Memory= 7211.447 t= 2.67e+03 R= 7e+04 +Depth= 9379 States= 1.78e+08 Transitions= 2.93e+09 Memory= 7224.338 t= 2.7e+03 R= 7e+04 +Depth= 9379 States= 1.79e+08 Transitions= 2.95e+09 Memory= 7239.084 t= 2.72e+03 R= 7e+04 +Depth= 9379 States= 1.8e+08 Transitions= 2.97e+09 Memory= 7253.342 t= 2.74e+03 R= 7e+04 +Depth= 9379 States= 1.81e+08 Transitions= 2.99e+09 Memory= 7268.283 t= 2.75e+03 R= 7e+04 +Depth= 9379 States= 1.82e+08 Transitions= 3.01e+09 Memory= 7283.615 t= 2.77e+03 R= 7e+04 +Depth= 9379 States= 1.83e+08 Transitions= 3.02e+09 Memory= 7335.276 t= 2.78e+03 R= 7e+04 +Depth= 9379 States= 1.84e+08 Transitions= 3.04e+09 Memory= 7403.928 t= 2.8e+03 R= 7e+04 +Depth= 9379 States= 1.85e+08 Transitions= 3.06e+09 Memory= 7472.580 t= 2.82e+03 R= 7e+04 +Depth= 9379 States= 1.86e+08 Transitions= 3.08e+09 Memory= 7501.877 t= 2.84e+03 R= 7e+04 +Depth= 9379 States= 1.87e+08 Transitions= 3.1e+09 Memory= 7528.147 t= 2.85e+03 R= 7e+04 +Depth= 9379 States= 1.88e+08 Transitions= 3.11e+09 Memory= 7566.135 t= 2.87e+03 R= 7e+04 +Depth= 9379 States= 1.89e+08 Transitions= 3.13e+09 Memory= 7593.479 t= 2.88e+03 R= 7e+04 +Depth= 9379 States= 1.9e+08 Transitions= 3.15e+09 Memory= 7625.119 t= 2.9e+03 R= 7e+04 +Depth= 9379 States= 1.91e+08 Transitions= 3.16e+09 Memory= 7647.483 t= 2.91e+03 R= 7e+04 +Depth= 9379 States= 1.92e+08 Transitions= 3.18e+09 Memory= 7677.951 t= 2.93e+03 R= 7e+04 +Depth= 9379 States= 1.93e+08 Transitions= 3.2e+09 Memory= 7698.947 t= 2.94e+03 R= 7e+04 +Depth= 9379 States= 1.94e+08 Transitions= 3.21e+09 Memory= 7732.443 t= 2.96e+03 R= 7e+04 +Depth= 9379 States= 1.95e+08 Transitions= 3.23e+09 Memory= 7772.092 t= 2.97e+03 R= 7e+04 +Depth= 9379 States= 1.96e+08 Transitions= 3.24e+09 Memory= 7815.451 t= 2.98e+03 R= 7e+04 +Depth= 9379 States= 1.97e+08 Transitions= 3.26e+09 Memory= 7839.865 t= 3e+03 R= 7e+04 +Depth= 9379 States= 1.98e+08 Transitions= 3.28e+09 Memory= 7869.651 t= 3.01e+03 R= 7e+04 +Depth= 9379 States= 1.99e+08 Transitions= 3.29e+09 Memory= 7921.018 t= 3.03e+03 R= 7e+04 +Depth= 9379 States= 2e+08 Transitions= 3.31e+09 Memory= 7986.740 t= 3.05e+03 R= 7e+04 +Depth= 9379 States= 2.01e+08 Transitions= 3.33e+09 Memory= 8023.752 t= 3.06e+03 R= 7e+04 +Depth= 9379 States= 2.02e+08 Transitions= 3.34e+09 Memory= 8039.768 t= 3.07e+03 R= 7e+04 +Depth= 9379 States= 2.03e+08 Transitions= 3.36e+09 Memory= 8053.830 t= 3.09e+03 R= 7e+04 +Depth= 9379 States= 2.04e+08 Transitions= 3.38e+09 Memory= 8068.772 t= 3.11e+03 R= 7e+04 +Depth= 9379 States= 2.05e+08 Transitions= 3.4e+09 Memory= 8083.127 t= 3.13e+03 R= 7e+04 +Depth= 9379 States= 2.06e+08 Transitions= 3.42e+09 Memory= 8098.068 t= 3.15e+03 R= 7e+04 +Depth= 9379 States= 2.07e+08 Transitions= 3.44e+09 Memory= 8115.744 t= 3.16e+03 R= 7e+04 +Depth= 9379 States= 2.08e+08 Transitions= 3.46e+09 Memory= 8178.537 t= 3.18e+03 R= 7e+04 +Depth= 9379 States= 2.09e+08 Transitions= 3.48e+09 Memory= 8220.627 t= 3.2e+03 R= 7e+04 +Depth= 9379 States= 2.1e+08 Transitions= 3.49e+09 Memory= 8246.799 t= 3.21e+03 R= 7e+04 +Depth= 9379 States= 2.11e+08 Transitions= 3.5e+09 Memory= 8263.791 t= 3.22e+03 R= 7e+04 +Depth= 9379 States= 2.12e+08 Transitions= 3.52e+09 Memory= 8279.514 t= 3.24e+03 R= 7e+04 +Depth= 9379 States= 2.13e+08 Transitions= 3.54e+09 Memory= 8293.772 t= 3.26e+03 R= 7e+04 +Depth= 9379 States= 2.14e+08 Transitions= 3.56e+09 Memory= 8309.201 t= 3.28e+03 R= 7e+04 +Depth= 9379 States= 2.15e+08 Transitions= 3.58e+09 Memory= 8323.752 t= 3.29e+03 R= 7e+04 +Depth= 9379 States= 2.16e+08 Transitions= 3.6e+09 Memory= 8342.990 t= 3.31e+03 R= 7e+04 +Depth= 9379 States= 2.17e+08 Transitions= 3.61e+09 Memory= 8355.197 t= 3.32e+03 R= 7e+04 +Depth= 9379 States= 2.18e+08 Transitions= 3.64e+09 Memory= 8368.674 t= 3.35e+03 R= 7e+04 +Depth= 9379 States= 2.19e+08 Transitions= 3.66e+09 Memory= 8382.932 t= 3.37e+03 R= 7e+04 +Depth= 9379 States= 2.2e+08 Transitions= 3.68e+09 Memory= 8398.459 t= 3.38e+03 R= 7e+04 +Depth= 9379 States= 2.21e+08 Transitions= 3.7e+09 Memory= 8412.912 t= 3.4e+03 R= 6e+04 +Depth= 9379 States= 2.22e+08 Transitions= 3.71e+09 Memory= 8428.244 t= 3.42e+03 R= 6e+04 +Depth= 9379 States= 2.23e+08 Transitions= 3.73e+09 Memory= 8491.721 t= 3.43e+03 R= 6e+04 +Depth= 9379 States= 2.24e+08 Transitions= 3.75e+09 Memory= 8560.373 t= 3.45e+03 R= 6e+04 +Depth= 9379 States= 2.25e+08 Transitions= 3.77e+09 Memory= 8621.604 t= 3.47e+03 R= 6e+04 +Depth= 9379 States= 2.26e+08 Transitions= 3.79e+09 Memory= 8648.850 t= 3.48e+03 R= 6e+04 +Depth= 9379 States= 2.27e+08 Transitions= 3.81e+09 Memory= 8671.994 t= 3.5e+03 R= 6e+04 +Depth= 9379 States= 2.28e+08 Transitions= 3.82e+09 Memory= 8710.861 t= 3.51e+03 R= 6e+04 +Depth= 9379 States= 2.29e+08 Transitions= 3.84e+09 Memory= 8742.893 t= 3.53e+03 R= 6e+04 +Depth= 9379 States= 2.3e+08 Transitions= 3.85e+09 Memory= 8771.799 t= 3.54e+03 R= 6e+04 +Depth= 9379 States= 2.31e+08 Transitions= 3.87e+09 Memory= 8792.600 t= 3.56e+03 R= 6e+04 +Depth= 9379 States= 2.32e+08 Transitions= 3.89e+09 Memory= 8828.733 t= 3.57e+03 R= 6e+04 +Depth= 9379 States= 2.33e+08 Transitions= 3.9e+09 Memory= 8843.869 t= 3.59e+03 R= 6e+04 +Depth= 9379 States= 2.34e+08 Transitions= 3.92e+09 Memory= 8884.787 t= 3.6e+03 R= 6e+04 +Depth= 9379 States= 2.35e+08 Transitions= 3.93e+09 Memory= 8924.240 t= 3.62e+03 R= 6e+04 +Depth= 9379 States= 2.36e+08 Transitions= 3.95e+09 Memory= 8960.276 t= 3.63e+03 R= 6e+04 +Depth= 9379 States= 2.37e+08 Transitions= 3.97e+09 Memory= 8984.494 t= 3.65e+03 R= 6e+04 +Depth= 9379 States= 2.38e+08 Transitions= 3.98e+09 Memory= 9016.428 t= 3.66e+03 R= 6e+04 +Depth= 9379 States= 2.39e+08 Transitions= 4e+09 Memory= 9077.365 t= 3.68e+03 R= 6e+04 +Depth= 9379 States= 2.4e+08 Transitions= 4.02e+09 Memory= 9143.088 t= 3.7e+03 R= 6e+04 + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness enabled) + invalid end states - (disabled by never claim) + +State-vector 64 byte, depth reached 9379, errors: 0 + 88114592 states, stored (2.40192e+08 visited) +3.782223e+09 states, matched +4.0224152e+09 transitions (= visited+matched) +1.4282782e+10 atomic steps +hash conflicts: 5.384059e+08 (resolved) + +Stats on memory usage (in Megabytes): + 7731.001 equivalent memory usage for states (stored*(State-vector + overhead)) + 6648.180 actual memory usage for states (compression: 85.99%) + state-vector as stored = 51 byte + 28 byte overhead + 2048.000 memory used for hash table (-w28) + 457.764 memory used for DFS stack (-m10000000) + 1.188 memory lost to fragmentation + 9152.756 total actual memory usage + +unreached in proctype urcu_reader + line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 61, "(1)" + line 418, "pan.___", state 91, "(1)" + line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 158, "(1)" + line 418, "pan.___", state 188, "(1)" + line 399, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 256, "(1)" + line 418, "pan.___", state 286, "(1)" + line 399, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 395, "(1)" + line 418, "pan.___", state 425, "(1)" + line 540, "pan.___", state 456, "-end-" + (17 of 456 states) +unreached in proctype urcu_reader_sig + line 399, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 70, "(1)" + line 418, "pan.___", state 100, "(1)" + line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 158, "(1)" + line 418, "pan.___", state 188, "(1)" + line 399, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 247, "(1)" + line 418, "pan.___", state 277, "(1)" + line 399, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 359, "(1)" + line 418, "pan.___", state 389, "(1)" + line 614, "pan.___", state 411, "-end-" + (17 of 411 states) +unreached in proctype urcu_writer + line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 59, "(1)" + line 413, "pan.___", state 72, "(1)" + line 418, "pan.___", state 89, "(1)" + line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 153, "(1)" + line 413, "pan.___", state 166, "(1)" + line 652, "pan.___", state 199, "(1)" + line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 160, "pan.___", state 240, "(1)" + line 164, "pan.___", state 248, "(1)" + line 168, "pan.___", state 260, "(1)" + line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 179, "pan.___", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 160, "pan.___", state 370, "(1)" + line 164, "pan.___", state 378, "(1)" + line 168, "pan.___", state 390, "(1)" + line 399, "pan.___", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 449, "(1)" + line 413, "pan.___", state 462, "(1)" + line 418, "pan.___", state 479, "(1)" + line 399, "pan.___", state 498, "(1)" + line 403, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 554, "(1)" + line 418, "pan.___", state 571, "(1)" + line 403, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 647, "(1)" + line 418, "pan.___", state 664, "(1)" + line 179, "pan.___", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 160, "pan.___", state 710, "(1)" + line 164, "pan.___", state 718, "(1)" + line 168, "pan.___", state 730, "(1)" + line 175, "pan.___", state 741, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 179, "pan.___", state 817, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 830, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 160, "pan.___", state 840, "(1)" + line 164, "pan.___", state 848, "(1)" + line 168, "pan.___", state 860, "(1)" + line 399, "pan.___", state 882, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 884, "(1)" + line 399, "pan.___", state 885, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 885, "else" + line 399, "pan.___", state 888, "(1)" + line 403, "pan.___", state 896, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 898, "(1)" + line 403, "pan.___", state 899, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 899, "else" + line 403, "pan.___", state 902, "(1)" + line 403, "pan.___", state 903, "(1)" + line 403, "pan.___", state 903, "(1)" + line 401, "pan.___", state 908, "((i<1))" + line 401, "pan.___", state 908, "((i>=1))" + line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 927, "(1)" + line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 409, "pan.___", state 928, "else" + line 409, "pan.___", state 931, "(1)" + line 409, "pan.___", state 932, "(1)" + line 409, "pan.___", state 932, "(1)" + line 413, "pan.___", state 940, "(1)" + line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 413, "pan.___", state 941, "else" + line 413, "pan.___", state 944, "(1)" + line 413, "pan.___", state 945, "(1)" + line 413, "pan.___", state 945, "(1)" + line 411, "pan.___", state 950, "((i<1))" + line 411, "pan.___", state 950, "((i>=1))" + line 418, "pan.___", state 957, "(1)" + line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 418, "pan.___", state 958, "else" + line 418, "pan.___", state 961, "(1)" + line 418, "pan.___", state 962, "(1)" + line 418, "pan.___", state 962, "(1)" + line 420, "pan.___", state 965, "(1)" + line 420, "pan.___", state 965, "(1)" + line 403, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 1040, "(1)" + line 418, "pan.___", state 1057, "(1)" + line 403, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 1130, "(1)" + line 418, "pan.___", state 1147, "(1)" + line 399, "pan.___", state 1166, "(1)" + line 403, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 1222, "(1)" + line 418, "pan.___", state 1239, "(1)" + line 403, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 408, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 413, "pan.___", state 1315, "(1)" + line 418, "pan.___", state 1332, "(1)" + line 179, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 160, "pan.___", state 1378, "(1)" + line 164, "pan.___", state 1386, "(1)" + line 168, "pan.___", state 1398, "(1)" + line 175, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 179, "pan.___", state 1485, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 1498, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 160, "pan.___", state 1508, "(1)" + line 164, "pan.___", state 1516, "(1)" + line 168, "pan.___", state 1528, "(1)" + line 399, "pan.___", state 1550, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 1552, "(1)" + line 399, "pan.___", state 1553, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 399, "pan.___", state 1553, "else" + line 399, "pan.___", state 1556, "(1)" + line 403, "pan.___", state 1564, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 1566, "(1)" + line 403, "pan.___", state 1567, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 403, "pan.___", state 1567, "else" + line 403, "pan.___", state 1570, "(1)" + line 403, "pan.___", state 1571, "(1)" + line 403, "pan.___", state 1571, "(1)" + line 401, "pan.___", state 1576, "((i<1))" + line 401, "pan.___", state 1576, "((i>=1))" + line 408, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 1595, "(1)" + line 409, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 409, "pan.___", state 1596, "else" + line 409, "pan.___", state 1599, "(1)" + line 409, "pan.___", state 1600, "(1)" + line 409, "pan.___", state 1600, "(1)" + line 413, "pan.___", state 1608, "(1)" + line 413, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 413, "pan.___", state 1609, "else" + line 413, "pan.___", state 1612, "(1)" + line 413, "pan.___", state 1613, "(1)" + line 413, "pan.___", state 1613, "(1)" + line 411, "pan.___", state 1618, "((i<1))" + line 411, "pan.___", state 1618, "((i>=1))" + line 418, "pan.___", state 1625, "(1)" + line 418, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 418, "pan.___", state 1626, "else" + line 418, "pan.___", state 1629, "(1)" + line 418, "pan.___", state 1630, "(1)" + line 418, "pan.___", state 1630, "(1)" + line 420, "pan.___", state 1633, "(1)" + line 420, "pan.___", state 1633, "(1)" + line 179, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 160, "pan.___", state 1681, "(1)" + line 164, "pan.___", state 1689, "(1)" + line 168, "pan.___", state 1701, "(1)" + line 175, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 179, "pan.___", state 1788, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 183, "pan.___", state 1801, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 160, "pan.___", state 1811, "(1)" + line 164, "pan.___", state 1819, "(1)" + line 168, "pan.___", state 1831, "(1)" + line 702, "pan.___", state 1856, "-end-" + (158 of 1856 states) +unreached in proctype :init: + (0 of 46 states) +unreached in proctype :never: + line 751, "pan.___", state 11, "-end-" + (1 of 11 states) + +pan: elapsed time 3.7e+03 seconds +pan: rate 64918.749 states/second +pan: avg transition delay 9.1982e-07 usec +cp .input.spin urcu_progress_writer.spin.input +cp .input.spin.trail urcu_progress_writer.spin.input.trail +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.spin.input b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.spin.input new file mode 100644 index 0000000..43221e7 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.spin.input @@ -0,0 +1,723 @@ +#define WRITER_PROGRESS + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#define TEST_SIGNAL +#define TEST_SIGNAL_ON_READ +//#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 1 +//#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.spin.input.trail b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.spin.input.trail new file mode 100644 index 0000000..e65d663 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.spin.input.trail @@ -0,0 +1,9 @@ +-2:3:-2 +-4:-4:-4 +1:0:2679 +2:1:2673 +3:1:2674 +4:1:2675 +5:1:2676 +6:0:2685 +7:5:1129 diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.define b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.define new file mode 100644 index 0000000..8d304f5 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.define @@ -0,0 +1,2 @@ +#define WRITER_PROGRESS +#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.log b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.log new file mode 100644 index 0000000..f870a6e --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.log @@ -0,0 +1,535 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define > pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_progress_writer_error.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -f -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 745) +depth 15: Claim reached state 9 (line 750) +depth 1194: Claim reached state 9 (line 749) +Depth= 3253 States= 1e+06 Transitions= 1.06e+07 Memory= 484.416 t= 9.57 R= 1e+05 +Depth= 3253 States= 2e+06 Transitions= 2.04e+07 Memory= 501.311 t= 18.5 R= 1e+05 +pan: acceptance cycle (at depth 1938) +pan: wrote .input.spin.trail + +(Spin Version 5.1.7 -- 23 December 2008) +Warning: Search not completed + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness enabled) + invalid end states - (disabled by never claim) + +State-vector 64 byte, depth reached 23684, errors: 1 + 682672 states, stored (2.81536e+06 visited) + 30226122 states, matched + 33041487 transitions (= visited+matched) +1.1631626e+08 atomic steps +hash conflicts: 6056013 (resolved) + +Stats on memory usage (in Megabytes): + 59.896 equivalent memory usage for states (stored*(State-vector + overhead)) + 47.456 actual memory usage for states (compression: 79.23%) + state-vector as stored = 45 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 513.127 total actual memory usage + +unreached in proctype urcu_reader + line 400, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 61, "(1)" + line 419, "pan.___", state 91, "(1)" + line 400, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 158, "(1)" + line 419, "pan.___", state 188, "(1)" + line 400, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 256, "(1)" + line 419, "pan.___", state 286, "(1)" + line 400, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 395, "(1)" + line 419, "pan.___", state 425, "(1)" + line 541, "pan.___", state 456, "-end-" + (17 of 456 states) +unreached in proctype urcu_reader_sig + line 400, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 70, "(1)" + line 419, "pan.___", state 100, "(1)" + line 400, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 158, "(1)" + line 419, "pan.___", state 188, "(1)" + line 400, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 247, "(1)" + line 419, "pan.___", state 277, "(1)" + line 400, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 359, "(1)" + line 419, "pan.___", state 389, "(1)" + line 615, "pan.___", state 411, "-end-" + (17 of 411 states) +unreached in proctype urcu_writer + line 400, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 400, "pan.___", state 20, "(1)" + line 404, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 34, "(1)" + line 404, "pan.___", state 35, "(1)" + line 404, "pan.___", state 35, "(1)" + line 402, "pan.___", state 40, "((i<1))" + line 402, "pan.___", state 40, "((i>=1))" + line 409, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 59, "(1)" + line 410, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 410, "pan.___", state 60, "else" + line 410, "pan.___", state 63, "(1)" + line 410, "pan.___", state 64, "(1)" + line 410, "pan.___", state 64, "(1)" + line 414, "pan.___", state 72, "(1)" + line 414, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 414, "pan.___", state 73, "else" + line 414, "pan.___", state 76, "(1)" + line 414, "pan.___", state 77, "(1)" + line 414, "pan.___", state 77, "(1)" + line 412, "pan.___", state 82, "((i<1))" + line 412, "pan.___", state 82, "((i>=1))" + line 419, "pan.___", state 89, "(1)" + line 419, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 419, "pan.___", state 90, "else" + line 419, "pan.___", state 93, "(1)" + line 419, "pan.___", state 94, "(1)" + line 419, "pan.___", state 94, "(1)" + line 370, "pan.___", state 99, "(1)" + line 640, "pan.___", state 103, "cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )] = (old_gen+1)" + line 638, "pan.___", state 104, "old_gen = cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )]" + line 400, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 400, "pan.___", state 114, "(1)" + line 404, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 128, "(1)" + line 404, "pan.___", state 129, "(1)" + line 404, "pan.___", state 129, "(1)" + line 402, "pan.___", state 134, "((i<1))" + line 402, "pan.___", state 134, "((i>=1))" + line 410, "pan.___", state 153, "(1)" + line 410, "pan.___", state 154, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 410, "pan.___", state 154, "else" + line 410, "pan.___", state 157, "(1)" + line 410, "pan.___", state 158, "(1)" + line 410, "pan.___", state 158, "(1)" + line 414, "pan.___", state 166, "(1)" + line 414, "pan.___", state 167, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 414, "pan.___", state 167, "else" + line 414, "pan.___", state 170, "(1)" + line 414, "pan.___", state 171, "(1)" + line 414, "pan.___", state 171, "(1)" + line 412, "pan.___", state 176, "((i<1))" + line 412, "pan.___", state 176, "((i>=1))" + line 419, "pan.___", state 183, "(1)" + line 419, "pan.___", state 184, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 419, "pan.___", state 184, "else" + line 419, "pan.___", state 187, "(1)" + line 419, "pan.___", state 188, "(1)" + line 419, "pan.___", state 188, "(1)" + line 421, "pan.___", state 191, "(1)" + line 421, "pan.___", state 191, "(1)" + line 370, "pan.___", state 193, "(1)" + line 653, "pan.___", state 199, "(1)" + line 647, "pan.___", state 202, "((write_lock==0))" + line 647, "pan.___", state 202, "else" + line 645, "pan.___", state 203, "(1)" + line 176, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 180, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 178, "pan.___", state 225, "((j<1))" + line 178, "pan.___", state 225, "((j>=1))" + line 184, "pan.___", state 230, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 161, "pan.___", state 240, "(1)" + line 165, "pan.___", state 248, "(1)" + line 165, "pan.___", state 249, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 165, "pan.___", state 249, "else" + line 163, "pan.___", state 254, "((j<1))" + line 163, "pan.___", state 254, "((j>=1))" + line 169, "pan.___", state 260, "(1)" + line 169, "pan.___", state 261, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 169, "pan.___", state 261, "else" + line 171, "pan.___", state 264, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 171, "pan.___", state 264, "else" + line 176, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 184, "pan.___", state 293, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 169, "pan.___", state 323, "(1)" + line 169, "pan.___", state 324, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 176, "pan.___", state 338, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 180, "pan.___", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 178, "pan.___", state 355, "((j<1))" + line 178, "pan.___", state 355, "((j>=1))" + line 184, "pan.___", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 161, "pan.___", state 370, "(1)" + line 165, "pan.___", state 378, "(1)" + line 165, "pan.___", state 379, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 165, "pan.___", state 379, "else" + line 163, "pan.___", state 384, "((j<1))" + line 163, "pan.___", state 384, "((j>=1))" + line 169, "pan.___", state 390, "(1)" + line 169, "pan.___", state 391, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 169, "pan.___", state 391, "else" + line 171, "pan.___", state 394, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 171, "pan.___", state 394, "else" + line 400, "pan.___", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 400, "pan.___", state 410, "(1)" + line 404, "pan.___", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 424, "(1)" + line 404, "pan.___", state 425, "(1)" + line 404, "pan.___", state 425, "(1)" + line 402, "pan.___", state 430, "((i<1))" + line 402, "pan.___", state 430, "((i>=1))" + line 409, "pan.___", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 449, "(1)" + line 410, "pan.___", state 450, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 410, "pan.___", state 450, "else" + line 410, "pan.___", state 453, "(1)" + line 410, "pan.___", state 454, "(1)" + line 410, "pan.___", state 454, "(1)" + line 414, "pan.___", state 462, "(1)" + line 414, "pan.___", state 463, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 414, "pan.___", state 463, "else" + line 414, "pan.___", state 466, "(1)" + line 414, "pan.___", state 467, "(1)" + line 414, "pan.___", state 467, "(1)" + line 412, "pan.___", state 472, "((i<1))" + line 412, "pan.___", state 472, "((i>=1))" + line 419, "pan.___", state 479, "(1)" + line 419, "pan.___", state 480, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 419, "pan.___", state 480, "else" + line 419, "pan.___", state 483, "(1)" + line 419, "pan.___", state 484, "(1)" + line 419, "pan.___", state 484, "(1)" + line 421, "pan.___", state 487, "(1)" + line 421, "pan.___", state 487, "(1)" + line 370, "pan.___", state 489, "(1)" + line 662, "pan.___", state 492, "cached_urcu_gp_ctr.val[( ((_pid<2)) ? (0) : (1) )] = (tmp^(1<<7))" + line 400, "pan.___", state 498, "(1)" + line 400, "pan.___", state 499, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 400, "pan.___", state 499, "else" + line 400, "pan.___", state 502, "(1)" + line 404, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 516, "(1)" + line 404, "pan.___", state 517, "(1)" + line 404, "pan.___", state 517, "(1)" + line 402, "pan.___", state 522, "((i<1))" + line 402, "pan.___", state 522, "((i>=1))" + line 409, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 541, "(1)" + line 410, "pan.___", state 542, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 410, "pan.___", state 542, "else" + line 410, "pan.___", state 545, "(1)" + line 410, "pan.___", state 546, "(1)" + line 410, "pan.___", state 546, "(1)" + line 414, "pan.___", state 554, "(1)" + line 414, "pan.___", state 555, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 414, "pan.___", state 555, "else" + line 414, "pan.___", state 558, "(1)" + line 414, "pan.___", state 559, "(1)" + line 414, "pan.___", state 559, "(1)" + line 412, "pan.___", state 564, "((i<1))" + line 412, "pan.___", state 564, "((i>=1))" + line 419, "pan.___", state 571, "(1)" + line 419, "pan.___", state 572, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 419, "pan.___", state 572, "else" + line 419, "pan.___", state 575, "(1)" + line 419, "pan.___", state 576, "(1)" + line 419, "pan.___", state 576, "(1)" + line 421, "pan.___", state 579, "(1)" + line 421, "pan.___", state 579, "(1)" + line 370, "pan.___", state 581, "(1)" + line 400, "pan.___", state 589, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 400, "pan.___", state 595, "(1)" + line 404, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 609, "(1)" + line 404, "pan.___", state 610, "(1)" + line 404, "pan.___", state 610, "(1)" + line 402, "pan.___", state 615, "((i<1))" + line 402, "pan.___", state 615, "((i>=1))" + line 409, "pan.___", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 634, "(1)" + line 410, "pan.___", state 635, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 410, "pan.___", state 635, "else" + line 410, "pan.___", state 638, "(1)" + line 410, "pan.___", state 639, "(1)" + line 410, "pan.___", state 639, "(1)" + line 414, "pan.___", state 647, "(1)" + line 414, "pan.___", state 648, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 414, "pan.___", state 648, "else" + line 414, "pan.___", state 651, "(1)" + line 414, "pan.___", state 652, "(1)" + line 414, "pan.___", state 652, "(1)" + line 412, "pan.___", state 657, "((i<1))" + line 412, "pan.___", state 657, "((i>=1))" + line 419, "pan.___", state 664, "(1)" + line 419, "pan.___", state 665, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 419, "pan.___", state 665, "else" + line 419, "pan.___", state 668, "(1)" + line 419, "pan.___", state 669, "(1)" + line 419, "pan.___", state 669, "(1)" + line 421, "pan.___", state 672, "(1)" + line 421, "pan.___", state 672, "(1)" + line 370, "pan.___", state 674, "(1)" + line 400, "pan.___", state 679, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 400, "pan.___", state 681, "(1)" + line 400, "pan.___", state 682, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 400, "pan.___", state 682, "else" + line 400, "pan.___", state 685, "(1)" + line 404, "pan.___", state 693, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 695, "(1)" + line 404, "pan.___", state 696, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 696, "else" + line 404, "pan.___", state 699, "(1)" + line 404, "pan.___", state 700, "(1)" + line 404, "pan.___", state 700, "(1)" + line 402, "pan.___", state 705, "((i<1))" + line 402, "pan.___", state 705, "((i>=1))" + line 409, "pan.___", state 711, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 724, "(1)" + line 410, "pan.___", state 725, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 410, "pan.___", state 725, "else" + line 410, "pan.___", state 728, "(1)" + line 410, "pan.___", state 729, "(1)" + line 410, "pan.___", state 729, "(1)" + line 414, "pan.___", state 737, "(1)" + line 414, "pan.___", state 738, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 414, "pan.___", state 738, "else" + line 414, "pan.___", state 741, "(1)" + line 414, "pan.___", state 742, "(1)" + line 414, "pan.___", state 742, "(1)" + line 412, "pan.___", state 747, "((i<1))" + line 412, "pan.___", state 747, "((i>=1))" + line 419, "pan.___", state 754, "(1)" + line 419, "pan.___", state 755, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 419, "pan.___", state 755, "else" + line 419, "pan.___", state 758, "(1)" + line 419, "pan.___", state 759, "(1)" + line 419, "pan.___", state 759, "(1)" + line 421, "pan.___", state 762, "(1)" + line 421, "pan.___", state 762, "(1)" + line 370, "pan.___", state 764, "(1)" + line 430, "pan.___", state 767, "(((tmp2&((1<<7)-1))&&((tmp2^cached_urcu_gp_ctr.val[( ((_pid<2)) ? (0) : (1) )])&(1<<7))))" + line 430, "pan.___", state 767, "else" + line 400, "pan.___", state 777, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 400, "pan.___", state 779, "(1)" + line 400, "pan.___", state 780, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 400, "pan.___", state 780, "else" + line 400, "pan.___", state 783, "(1)" + line 404, "pan.___", state 791, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 793, "(1)" + line 404, "pan.___", state 794, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 794, "else" + line 404, "pan.___", state 797, "(1)" + line 404, "pan.___", state 798, "(1)" + line 404, "pan.___", state 798, "(1)" + line 402, "pan.___", state 803, "((i<1))" + line 402, "pan.___", state 803, "((i>=1))" + line 409, "pan.___", state 809, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 822, "(1)" + line 410, "pan.___", state 823, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 410, "pan.___", state 823, "else" + line 410, "pan.___", state 826, "(1)" + line 410, "pan.___", state 827, "(1)" + line 410, "pan.___", state 827, "(1)" + line 414, "pan.___", state 835, "(1)" + line 414, "pan.___", state 836, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 414, "pan.___", state 836, "else" + line 414, "pan.___", state 839, "(1)" + line 414, "pan.___", state 840, "(1)" + line 414, "pan.___", state 840, "(1)" + line 412, "pan.___", state 845, "((i<1))" + line 412, "pan.___", state 845, "((i>=1))" + line 419, "pan.___", state 852, "(1)" + line 419, "pan.___", state 853, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 419, "pan.___", state 853, "else" + line 419, "pan.___", state 856, "(1)" + line 419, "pan.___", state 857, "(1)" + line 419, "pan.___", state 857, "(1)" + line 421, "pan.___", state 860, "(1)" + line 421, "pan.___", state 860, "(1)" + line 370, "pan.___", state 862, "(1)" + line 449, "pan.___", state 870, "((tmp<1))" + line 449, "pan.___", state 870, "((tmp>=1))" + line 462, "pan.___", state 873, "tmp = 0" + line 400, "pan.___", state 877, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 400, "pan.___", state 883, "(1)" + line 404, "pan.___", state 891, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 897, "(1)" + line 404, "pan.___", state 898, "(1)" + line 404, "pan.___", state 898, "(1)" + line 402, "pan.___", state 903, "((i<1))" + line 402, "pan.___", state 903, "((i>=1))" + line 409, "pan.___", state 909, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 922, "(1)" + line 410, "pan.___", state 923, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 410, "pan.___", state 923, "else" + line 410, "pan.___", state 926, "(1)" + line 410, "pan.___", state 927, "(1)" + line 410, "pan.___", state 927, "(1)" + line 414, "pan.___", state 935, "(1)" + line 414, "pan.___", state 936, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 414, "pan.___", state 936, "else" + line 414, "pan.___", state 939, "(1)" + line 414, "pan.___", state 940, "(1)" + line 414, "pan.___", state 940, "(1)" + line 412, "pan.___", state 945, "((i<1))" + line 412, "pan.___", state 945, "((i>=1))" + line 419, "pan.___", state 952, "(1)" + line 419, "pan.___", state 953, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 419, "pan.___", state 953, "else" + line 419, "pan.___", state 956, "(1)" + line 419, "pan.___", state 957, "(1)" + line 419, "pan.___", state 957, "(1)" + line 421, "pan.___", state 960, "(1)" + line 421, "pan.___", state 960, "(1)" + line 370, "pan.___", state 962, "(1)" + line 671, "pan.___", state 963, "tmp = cached_urcu_gp_ctr.val[( ((_pid<2)) ? (0) : (1) )]" + line 400, "pan.___", state 967, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 400, "pan.___", state 973, "(1)" + line 404, "pan.___", state 981, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 987, "(1)" + line 404, "pan.___", state 988, "(1)" + line 404, "pan.___", state 988, "(1)" + line 402, "pan.___", state 993, "((i<1))" + line 402, "pan.___", state 993, "((i>=1))" + line 409, "pan.___", state 999, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 1012, "(1)" + line 410, "pan.___", state 1013, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 410, "pan.___", state 1013, "else" + line 410, "pan.___", state 1016, "(1)" + line 410, "pan.___", state 1017, "(1)" + line 410, "pan.___", state 1017, "(1)" + line 414, "pan.___", state 1025, "(1)" + line 414, "pan.___", state 1026, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 414, "pan.___", state 1026, "else" + line 414, "pan.___", state 1029, "(1)" + line 414, "pan.___", state 1030, "(1)" + line 414, "pan.___", state 1030, "(1)" + line 412, "pan.___", state 1035, "((i<1))" + line 412, "pan.___", state 1035, "((i>=1))" + line 419, "pan.___", state 1042, "(1)" + line 419, "pan.___", state 1043, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 419, "pan.___", state 1043, "else" + line 419, "pan.___", state 1046, "(1)" + line 419, "pan.___", state 1047, "(1)" + line 419, "pan.___", state 1047, "(1)" + line 421, "pan.___", state 1050, "(1)" + line 421, "pan.___", state 1050, "(1)" + line 370, "pan.___", state 1052, "(1)" + line 400, "pan.___", state 1061, "(1)" + line 404, "pan.___", state 1073, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 1091, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 414, "pan.___", state 1117, "(1)" + line 419, "pan.___", state 1134, "(1)" + line 404, "pan.___", state 1166, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 1184, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 414, "pan.___", state 1210, "(1)" + line 419, "pan.___", state 1227, "(1)" + line 400, "pan.___", state 1242, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 1256, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 409, "pan.___", state 1274, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 1287, "(1)" + line 414, "pan.___", state 1300, "(1)" + line 419, "pan.___", state 1317, "(1)" + line 400, "pan.___", state 1340, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 400, "pan.___", state 1342, "(1)" + line 400, "pan.___", state 1343, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 400, "pan.___", state 1343, "else" + line 400, "pan.___", state 1346, "(1)" + line 404, "pan.___", state 1354, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 1356, "(1)" + line 404, "pan.___", state 1357, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" + line 404, "pan.___", state 1357, "else" + line 404, "pan.___", state 1360, "(1)" + line 404, "pan.___", state 1361, "(1)" + line 404, "pan.___", state 1361, "(1)" + line 402, "pan.___", state 1366, "((i<1))" + line 402, "pan.___", state 1366, "((i>=1))" + line 409, "pan.___", state 1372, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 410, "pan.___", state 1385, "(1)" + line 410, "pan.___", state 1386, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 410, "pan.___", state 1386, "else" + line 410, "pan.___", state 1389, "(1)" + line 410, "pan.___", state 1390, "(1)" + line 410, "pan.___", state 1390, "(1)" + line 414, "pan.___", state 1398, "(1)" + line 414, "pan.___", state 1399, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 414, "pan.___", state 1399, "else" + line 414, "pan.___", state 1402, "(1)" + line 414, "pan.___", state 1403, "(1)" + line 414, "pan.___", state 1403, "(1)" + line 412, "pan.___", state 1408, "((i<1))" + line 412, "pan.___", state 1408, "((i>=1))" + line 419, "pan.___", state 1415, "(1)" + line 419, "pan.___", state 1416, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" + line 419, "pan.___", state 1416, "else" + line 419, "pan.___", state 1419, "(1)" + line 419, "pan.___", state 1420, "(1)" + line 419, "pan.___", state 1420, "(1)" + line 421, "pan.___", state 1423, "(1)" + line 421, "pan.___", state 1423, "(1)" + line 180, "pan.___", state 1448, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 184, "pan.___", state 1461, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 161, "pan.___", state 1471, "(1)" + line 165, "pan.___", state 1479, "(1)" + line 169, "pan.___", state 1491, "(1)" + line 176, "pan.___", state 1502, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" + line 180, "pan.___", state 1578, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 184, "pan.___", state 1591, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" + line 161, "pan.___", state 1601, "(1)" + line 165, "pan.___", state 1609, "(1)" + line 169, "pan.___", state 1621, "(1)" + line 370, "pan.___", state 1642, "(1)" + line 696, "pan.___", state 1643, "(1)" + line 703, "pan.___", state 1646, "-end-" + (308 of 1646 states) +unreached in proctype :init: + (0 of 46 states) +unreached in proctype :never: + line 752, "pan.___", state 11, "-end-" + (1 of 11 states) + +pan: elapsed time 30.2 seconds +pan: rate 93347.646 states/second +pan: avg transition delay 9.1279e-07 usec +cp .input.spin urcu_progress_writer_error.spin.input +cp .input.spin.trail urcu_progress_writer_error.spin.input.trail +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.spin.input b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.spin.input new file mode 100644 index 0000000..eb1d4e6 --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.spin.input @@ -0,0 +1,724 @@ +#define WRITER_PROGRESS +#define GEN_ERROR_WRITER_PROGRESS + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#define TEST_SIGNAL +#define TEST_SIGNAL_ON_READ +//#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 1 +//#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.spin.input.trail b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.spin.input.trail new file mode 100644 index 0000000..c5a6fbf --- /dev/null +++ b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.spin.input.trail @@ -0,0 +1,23572 @@ +-2:4:-2 +-4:-4:-4 +1:0:2561 +2:4:2513 +3:4:2516 +4:4:2516 +5:4:2519 +6:4:2527 +7:4:2527 +8:4:2530 +9:4:2536 +10:4:2540 +11:4:2540 +12:4:2543 +13:4:2551 +14:4:2555 +15:4:2556 +16:0:2561 +17:4:2558 +18:0:2561 +19:3:869 +20:0:2561 +21:3:875 +22:0:2561 +23:3:876 +24:0:2561 +25:3:877 +26:3:881 +27:3:882 +28:3:890 +29:3:891 +30:3:895 +31:3:896 +32:3:904 +33:3:909 +34:3:913 +35:3:914 +36:3:921 +37:3:922 +38:3:933 +39:3:934 +40:3:935 +41:3:946 +42:3:951 +43:3:952 +44:0:2559 +45:3:964 +46:0:2565 +47:3:966 +48:3:967 +49:0:2565 +50:3:971 +51:3:975 +52:3:976 +53:3:984 +54:3:985 +55:3:989 +56:3:990 +57:3:998 +58:3:1003 +59:3:1004 +60:3:1015 +61:3:1016 +62:3:1027 +63:3:1028 +64:3:1029 +65:3:1040 +66:3:1045 +67:3:1046 +68:0:2565 +69:3:1058 +70:0:2565 +71:3:1060 +72:0:2565 +73:3:1061 +74:0:2565 +75:3:1071 +76:0:2565 +77:3:1075 +78:3:1076 +79:3:1080 +80:3:1084 +81:3:1085 +82:3:1089 +83:3:1097 +84:3:1098 +85:3:1103 +86:3:1110 +87:3:1111 +88:3:1118 +89:3:1123 +90:0:2565 +91:3:1134 +92:0:2565 +93:3:1138 +94:3:1139 +95:3:1143 +96:3:1147 +97:3:1148 +98:3:1152 +99:3:1160 +100:3:1161 +101:3:1166 +102:3:1173 +103:3:1174 +104:3:1181 +105:3:1186 +106:0:2565 +107:3:1197 +108:0:2565 +109:3:1205 +110:3:1206 +111:3:1210 +112:3:1214 +113:3:1215 +114:3:1219 +115:3:1227 +116:3:1228 +117:3:1233 +118:3:1240 +119:3:1241 +120:3:1248 +121:3:1253 +122:0:2565 +123:3:1264 +124:0:2565 +125:3:1266 +126:0:2565 +127:3:1267 +128:3:1271 +129:3:1272 +130:3:1280 +131:3:1281 +132:3:1285 +133:3:1286 +134:3:1294 +135:3:1299 +136:3:1303 +137:3:1304 +138:3:1311 +139:3:1312 +140:3:1323 +141:3:1324 +142:3:1325 +143:3:1336 +144:3:1341 +145:3:1342 +146:0:2565 +147:3:1354 +148:0:2565 +149:3:1356 +150:0:2565 +151:3:1359 +152:3:1360 +153:3:1372 +154:3:1373 +155:3:1377 +156:3:1378 +157:3:1386 +158:3:1391 +159:3:1395 +160:3:1396 +161:3:1403 +162:3:1404 +163:3:1415 +164:3:1416 +165:3:1417 +166:3:1428 +167:3:1433 +168:3:1434 +169:0:2565 +170:3:1446 +171:0:2565 +172:3:1448 +173:0:2565 +174:3:1449 +175:0:2565 +176:3:1450 +177:0:2565 +178:3:1451 +179:0:2565 +180:3:1452 +181:3:1456 +182:3:1457 +183:3:1465 +184:3:1466 +185:3:1470 +186:3:1471 +187:3:1479 +188:3:1484 +189:3:1488 +190:3:1489 +191:3:1496 +192:3:1497 +193:3:1508 +194:3:1509 +195:3:1510 +196:3:1521 +197:3:1526 +198:3:1527 +199:0:2565 +200:3:1539 +201:0:2565 +202:3:1631 +203:0:2565 +204:3:1729 +205:0:2565 +206:3:1730 +207:0:2565 +208:3:1734 +209:0:2565 +210:3:1740 +211:3:1744 +212:3:1745 +213:3:1753 +214:3:1754 +215:3:1758 +216:3:1759 +217:3:1767 +218:3:1772 +219:3:1776 +220:3:1777 +221:3:1784 +222:3:1785 +223:3:1796 +224:3:1797 +225:3:1798 +226:3:1809 +227:3:1814 +228:3:1815 +229:0:2565 +230:3:1827 +231:0:2565 +232:3:1829 +233:0:2565 +234:3:1830 +235:3:1834 +236:3:1835 +237:3:1843 +238:3:1844 +239:3:1848 +240:3:1849 +241:3:1857 +242:3:1862 +243:3:1866 +244:3:1867 +245:3:1874 +246:3:1875 +247:3:1886 +248:3:1887 +249:3:1888 +250:3:1899 +251:3:1904 +252:3:1905 +253:0:2565 +254:3:1917 +255:0:2565 +256:3:1919 +257:0:2565 +258:2:458 +259:0:2565 +260:2:464 +261:0:2565 +262:2:465 +263:0:2565 +264:2:466 +265:0:2565 +266:2:467 +267:0:2565 +268:1:2 +269:0:2565 +270:2:468 +271:0:2565 +272:1:8 +273:0:2565 +274:1:9 +275:0:2565 +276:1:10 +277:0:2565 +278:1:11 +279:0:2565 +280:2:467 +281:0:2565 +282:1:12 +283:1:16 +284:1:17 +285:1:25 +286:1:26 +287:1:30 +288:1:31 +289:1:39 +290:1:44 +291:1:48 +292:1:49 +293:1:56 +294:1:57 +295:1:68 +296:1:69 +297:1:70 +298:1:81 +299:1:86 +300:1:87 +301:0:2565 +302:2:468 +303:0:2565 +304:1:99 +305:0:2565 +306:2:469 +307:0:2565 +308:2:475 +309:0:2565 +310:2:476 +311:0:2565 +312:2:477 +313:2:481 +314:2:482 +315:2:490 +316:2:491 +317:2:495 +318:2:496 +319:2:504 +320:2:509 +321:2:513 +322:2:514 +323:2:521 +324:2:522 +325:2:533 +326:2:534 +327:2:535 +328:2:546 +329:2:551 +330:2:552 +331:0:2565 +332:2:564 +333:0:2565 +334:2:565 +335:2:569 +336:2:570 +337:2:578 +338:2:579 +339:2:583 +340:2:584 +341:2:592 +342:2:597 +343:2:601 +344:2:602 +345:2:609 +346:2:610 +347:2:621 +348:2:622 +349:2:623 +350:2:634 +351:2:639 +352:2:640 +353:0:2565 +354:2:652 +355:0:2565 +356:2:653 +357:0:2565 +358:2:654 +359:2:658 +360:2:659 +361:2:667 +362:2:668 +363:2:672 +364:2:673 +365:2:681 +366:2:686 +367:2:690 +368:2:691 +369:2:698 +370:2:699 +371:2:710 +372:2:711 +373:2:712 +374:2:723 +375:2:728 +376:2:729 +377:0:2565 +378:2:741 +379:0:2565 +380:2:750 +381:0:2565 +382:2:753 +383:0:2565 +384:2:758 +385:0:2565 +386:2:759 +387:0:2565 +388:2:760 +389:0:2565 +390:2:761 +391:0:2565 +392:2:762 +393:0:2565 +394:2:763 +395:0:2565 +396:2:765 +397:0:2565 +398:2:766 +399:2:770 +400:2:771 +401:2:779 +402:2:780 +403:2:781 +404:2:793 +405:2:798 +406:2:802 +407:2:803 +408:2:810 +409:2:811 +410:2:822 +411:2:823 +412:2:824 +413:2:835 +414:2:840 +415:2:841 +416:0:2565 +417:3:1922 +418:3:1923 +419:3:1935 +420:3:1936 +421:3:1940 +422:3:1941 +423:3:1949 +424:3:1954 +425:3:1958 +426:3:1959 +427:3:1966 +428:3:1967 +429:3:1978 +430:3:1979 +431:3:1980 +432:3:1991 +433:3:1996 +434:3:1997 +435:0:2565 +436:3:2009 +437:0:2565 +438:3:2011 +439:0:2565 +440:3:2012 +441:0:2565 +442:3:2013 +443:0:2565 +444:3:2014 +445:0:2565 +446:3:2015 +447:3:2019 +448:3:2020 +449:3:2028 +450:3:2029 +451:3:2033 +452:3:2034 +453:3:2042 +454:3:2047 +455:3:2051 +456:3:2052 +457:3:2059 +458:3:2060 +459:3:2071 +460:3:2072 +461:3:2073 +462:3:2084 +463:3:2089 +464:3:2090 +465:0:2565 +466:3:2102 +467:0:2565 +468:3:2104 +469:0:2565 +470:3:2105 +471:3:2109 +472:3:2110 +473:3:2118 +474:3:2119 +475:3:2123 +476:3:2124 +477:3:2132 +478:3:2137 +479:3:2141 +480:3:2142 +481:3:2149 +482:3:2150 +483:3:2161 +484:3:2162 +485:3:2163 +486:3:2174 +487:3:2179 +488:3:2180 +489:0:2565 +490:3:2192 +491:0:2565 +492:2:853 +493:0:2565 +494:3:2013 +495:0:2565 +496:2:857 +497:0:2565 +498:2:465 +499:0:2565 +500:3:2014 +501:0:2565 +502:3:2015 +503:3:2019 +504:3:2020 +505:3:2028 +506:3:2029 +507:3:2033 +508:3:2034 +509:3:2042 +510:3:2047 +511:3:2051 +512:3:2052 +513:3:2059 +514:3:2060 +515:3:2071 +516:3:2072 +517:3:2073 +518:3:2084 +519:3:2089 +520:3:2090 +521:0:2565 +522:3:2102 +523:0:2565 +524:3:2104 +525:0:2565 +526:3:2105 +527:3:2109 +528:3:2110 +529:3:2118 +530:3:2119 +531:3:2123 +532:3:2124 +533:3:2132 +534:3:2137 +535:3:2141 +536:3:2142 +537:3:2149 +538:3:2150 +539:3:2161 +540:3:2162 +541:3:2163 +542:3:2174 +543:3:2179 +544:3:2180 +545:0:2565 +546:3:2192 +547:0:2565 +548:2:466 +549:0:2565 +550:3:2013 +551:0:2565 +552:3:2014 +553:0:2565 +554:3:2015 +555:3:2019 +556:3:2020 +557:3:2028 +558:3:2029 +559:3:2033 +560:3:2034 +561:3:2042 +562:3:2047 +563:3:2051 +564:3:2052 +565:3:2059 +566:3:2060 +567:3:2071 +568:3:2072 +569:3:2073 +570:3:2084 +571:3:2089 +572:3:2090 +573:0:2565 +574:3:2102 +575:0:2565 +576:3:2104 +577:0:2565 +578:3:2105 +579:3:2109 +580:3:2110 +581:3:2118 +582:3:2119 +583:3:2123 +584:3:2124 +585:3:2132 +586:3:2137 +587:3:2141 +588:3:2142 +589:3:2149 +590:3:2150 +591:3:2161 +592:3:2162 +593:3:2163 +594:3:2174 +595:3:2179 +596:3:2180 +597:0:2565 +598:2:467 +599:0:2565 +600:3:2192 +601:0:2565 +602:3:2013 +603:0:2565 +604:3:2014 +605:0:2565 +606:3:2015 +607:3:2019 +608:3:2020 +609:3:2028 +610:3:2029 +611:3:2033 +612:3:2034 +613:3:2042 +614:3:2047 +615:3:2051 +616:3:2052 +617:3:2059 +618:3:2060 +619:3:2071 +620:3:2072 +621:3:2073 +622:3:2084 +623:3:2089 +624:3:2090 +625:0:2565 +626:3:2102 +627:0:2565 +628:3:2104 +629:0:2565 +630:1:102 +631:0:2565 +632:2:468 +633:0:2565 +634:3:2105 +635:3:2109 +636:3:2110 +637:3:2118 +638:3:2119 +639:3:2123 +640:3:2124 +641:3:2132 +642:3:2137 +643:3:2141 +644:3:2142 +645:3:2149 +646:3:2150 +647:3:2161 +648:3:2162 +649:3:2163 +650:3:2174 +651:3:2179 +652:3:2180 +653:0:2565 +654:3:2192 +655:0:2565 +656:3:2013 +657:0:2565 +658:3:2014 +659:0:2565 +660:3:2015 +661:3:2019 +662:3:2020 +663:3:2028 +664:3:2029 +665:3:2033 +666:3:2034 +667:3:2042 +668:3:2047 +669:3:2051 +670:3:2052 +671:3:2059 +672:3:2060 +673:3:2071 +674:3:2072 +675:3:2073 +676:3:2084 +677:3:2089 +678:3:2090 +679:0:2565 +680:3:2102 +681:0:2565 +682:3:2104 +683:0:2565 +684:2:467 +685:0:2565 +686:2:468 +687:0:2565 +688:3:2105 +689:3:2109 +690:3:2110 +691:3:2118 +692:3:2119 +693:3:2123 +694:3:2124 +695:3:2132 +696:3:2137 +697:3:2141 +698:3:2142 +699:3:2149 +700:3:2150 +701:3:2161 +702:3:2162 +703:3:2163 +704:3:2174 +705:3:2179 +706:3:2180 +707:0:2565 +708:3:2192 +709:0:2565 +710:3:2013 +711:0:2565 +712:3:2014 +713:0:2565 +714:3:2015 +715:3:2019 +716:3:2020 +717:3:2028 +718:3:2029 +719:3:2033 +720:3:2034 +721:3:2042 +722:3:2047 +723:3:2051 +724:3:2052 +725:3:2059 +726:3:2060 +727:3:2071 +728:3:2072 +729:3:2073 +730:3:2084 +731:3:2089 +732:3:2090 +733:0:2565 +734:3:2102 +735:0:2565 +736:2:467 +737:0:2565 +738:1:108 +739:0:2565 +740:2:468 +741:0:2565 +742:3:2104 +743:0:2565 +744:3:2105 +745:3:2109 +746:3:2110 +747:3:2118 +748:3:2119 +749:3:2123 +750:3:2124 +751:3:2132 +752:3:2137 +753:3:2141 +754:3:2142 +755:3:2149 +756:3:2150 +757:3:2161 +758:3:2162 +759:3:2163 +760:3:2174 +761:3:2179 +762:3:2180 +763:0:2565 +764:3:2192 +765:0:2565 +766:3:2013 +767:0:2565 +768:3:2014 +769:0:2565 +770:3:2015 +771:3:2019 +772:3:2020 +773:3:2028 +774:3:2029 +775:3:2033 +776:3:2034 +777:3:2042 +778:3:2047 +779:3:2051 +780:3:2052 +781:3:2059 +782:3:2060 +783:3:2071 +784:3:2072 +785:3:2073 +786:3:2084 +787:3:2089 +788:3:2090 +789:0:2565 +790:3:2102 +791:0:2565 +792:2:467 +793:0:2565 +794:2:468 +795:0:2565 +796:3:2104 +797:0:2565 +798:3:2105 +799:3:2109 +800:3:2110 +801:3:2118 +802:3:2119 +803:3:2123 +804:3:2124 +805:3:2132 +806:3:2137 +807:3:2141 +808:3:2142 +809:3:2149 +810:3:2150 +811:3:2161 +812:3:2162 +813:3:2163 +814:3:2174 +815:3:2179 +816:3:2180 +817:0:2565 +818:3:2192 +819:0:2565 +820:3:2013 +821:0:2565 +822:3:2014 +823:0:2565 +824:3:2015 +825:3:2019 +826:3:2020 +827:3:2028 +828:3:2029 +829:3:2033 +830:3:2034 +831:3:2042 +832:3:2047 +833:3:2051 +834:3:2052 +835:3:2059 +836:3:2060 +837:3:2071 +838:3:2072 +839:3:2073 +840:3:2084 +841:3:2089 +842:3:2090 +843:0:2565 +844:2:467 +845:0:2565 +846:1:109 +847:1:113 +848:1:114 +849:1:122 +850:1:123 +851:1:124 +852:1:136 +853:1:141 +854:1:145 +855:1:146 +856:1:153 +857:1:154 +858:1:165 +859:1:166 +860:1:167 +861:1:178 +862:1:183 +863:1:184 +864:0:2565 +865:3:2102 +866:0:2565 +867:2:468 +868:0:2565 +869:3:2104 +870:0:2565 +871:3:2105 +872:3:2109 +873:3:2110 +874:3:2118 +875:3:2119 +876:3:2123 +877:3:2124 +878:3:2132 +879:3:2137 +880:3:2141 +881:3:2142 +882:3:2149 +883:3:2150 +884:3:2161 +885:3:2169 +886:3:2170 +887:3:2174 +888:3:2179 +889:3:2180 +890:0:2565 +891:3:2192 +892:0:2565 +893:3:2013 +894:0:2565 +895:3:2014 +896:0:2565 +897:3:2015 +898:3:2019 +899:3:2020 +900:3:2028 +901:3:2029 +902:3:2033 +903:3:2034 +904:3:2042 +905:3:2047 +906:3:2051 +907:3:2052 +908:3:2059 +909:3:2060 +910:3:2071 +911:3:2079 +912:3:2080 +913:3:2084 +914:3:2089 +915:3:2090 +916:0:2565 +917:2:467 +918:0:2565 +919:3:2102 +920:0:2565 +921:3:2104 +922:0:2565 +923:3:2105 +924:3:2109 +925:3:2110 +926:3:2118 +927:3:2119 +928:3:2123 +929:3:2124 +930:3:2132 +931:3:2137 +932:3:2141 +933:3:2142 +934:3:2149 +935:3:2150 +936:3:2161 +937:3:2169 +938:3:2170 +939:3:2174 +940:3:2179 +941:3:2180 +942:0:2565 +943:3:2192 +944:0:2565 +945:3:2013 +946:0:2565 +947:3:2014 +948:0:2565 +949:1:196 +950:0:2565 +951:2:468 +952:0:2565 +953:3:2015 +954:3:2019 +955:3:2020 +956:3:2028 +957:3:2029 +958:3:2033 +959:3:2034 +960:3:2042 +961:3:2047 +962:3:2051 +963:3:2052 +964:3:2059 +965:3:2060 +966:3:2071 +967:3:2079 +968:3:2080 +969:3:2084 +970:3:2089 +971:3:2090 +972:0:2565 +973:3:2102 +974:0:2565 +975:3:2104 +976:0:2565 +977:3:2105 +978:3:2109 +979:3:2110 +980:3:2118 +981:3:2119 +982:3:2123 +983:3:2124 +984:3:2132 +985:3:2137 +986:3:2141 +987:3:2142 +988:3:2149 +989:3:2150 +990:3:2161 +991:3:2169 +992:3:2170 +993:3:2174 +994:3:2179 +995:3:2180 +996:0:2565 +997:3:2192 +998:0:2565 +999:3:2013 +1000:0:2565 +1001:3:2014 +1002:0:2565 +1003:2:469 +1004:0:2565 +1005:2:475 +1006:0:2565 +1007:2:476 +1008:0:2565 +1009:3:2015 +1010:3:2019 +1011:3:2020 +1012:3:2028 +1013:3:2029 +1014:3:2033 +1015:3:2034 +1016:3:2042 +1017:3:2047 +1018:3:2051 +1019:3:2052 +1020:3:2059 +1021:3:2060 +1022:3:2071 +1023:3:2079 +1024:3:2080 +1025:3:2084 +1026:3:2089 +1027:3:2090 +1028:0:2565 +1029:3:2102 +1030:0:2565 +1031:3:2104 +1032:0:2565 +1033:3:2105 +1034:3:2109 +1035:3:2110 +1036:3:2118 +1037:3:2119 +1038:3:2123 +1039:3:2124 +1040:3:2132 +1041:3:2137 +1042:3:2141 +1043:3:2142 +1044:3:2149 +1045:3:2150 +1046:3:2161 +1047:3:2169 +1048:3:2170 +1049:3:2174 +1050:3:2179 +1051:3:2180 +1052:0:2565 +1053:3:2192 +1054:0:2565 +1055:3:2013 +1056:0:2565 +1057:2:477 +1058:2:481 +1059:2:482 +1060:2:490 +1061:2:491 +1062:2:495 +1063:2:496 +1064:2:504 +1065:2:509 +1066:2:513 +1067:2:514 +1068:2:521 +1069:2:522 +1070:2:533 +1071:2:534 +1072:2:535 +1073:2:546 +1074:2:551 +1075:2:552 +1076:0:2565 +1077:3:2014 +1078:0:2565 +1079:3:2015 +1080:3:2019 +1081:3:2020 +1082:3:2028 +1083:3:2029 +1084:3:2033 +1085:3:2034 +1086:3:2042 +1087:3:2047 +1088:3:2051 +1089:3:2052 +1090:3:2059 +1091:3:2060 +1092:3:2071 +1093:3:2079 +1094:3:2080 +1095:3:2084 +1096:3:2089 +1097:3:2090 +1098:0:2565 +1099:3:2102 +1100:0:2565 +1101:3:2104 +1102:0:2565 +1103:3:2105 +1104:3:2109 +1105:3:2110 +1106:3:2118 +1107:3:2119 +1108:3:2123 +1109:3:2124 +1110:3:2132 +1111:3:2137 +1112:3:2141 +1113:3:2142 +1114:3:2149 +1115:3:2150 +1116:3:2161 +1117:3:2169 +1118:3:2170 +1119:3:2174 +1120:3:2179 +1121:3:2180 +1122:0:2565 +1123:3:2192 +1124:0:2565 +1125:2:564 +1126:0:2565 +1127:3:2013 +1128:0:2565 +1129:3:2014 +1130:0:2565 +1131:3:2015 +1132:3:2019 +1133:3:2020 +1134:3:2028 +1135:3:2029 +1136:3:2033 +1137:3:2034 +1138:3:2042 +1139:3:2047 +1140:3:2051 +1141:3:2052 +1142:3:2059 +1143:3:2060 +1144:3:2071 +1145:3:2079 +1146:3:2080 +1147:3:2084 +1148:3:2089 +1149:3:2090 +1150:0:2565 +1151:3:2102 +1152:0:2565 +1153:3:2104 +1154:0:2565 +1155:3:2105 +1156:3:2109 +1157:3:2110 +1158:3:2118 +1159:3:2119 +1160:3:2123 +1161:3:2124 +1162:3:2132 +1163:3:2137 +1164:3:2141 +1165:3:2142 +1166:3:2149 +1167:3:2150 +1168:3:2161 +1169:3:2169 +1170:3:2170 +1171:3:2174 +1172:3:2179 +1173:3:2180 +1174:0:2565 +1175:2:565 +1176:2:569 +1177:2:570 +1178:2:578 +1179:2:579 +1180:2:583 +1181:2:584 +1182:2:592 +1183:2:597 +1184:2:601 +1185:2:602 +1186:2:609 +1187:2:610 +1188:2:621 +1189:2:622 +1190:2:623 +1191:2:634 +1192:2:639 +1193:2:640 +1194:0:2565 +1195:3:2192 +1196:0:2565 +1197:3:2013 +1198:0:2565 +1199:2:652 +1200:0:2565 +1201:3:2014 +1202:0:2565 +1203:3:2015 +1204:3:2019 +1205:3:2020 +1206:3:2028 +1207:3:2029 +1208:3:2033 +1209:3:2034 +1210:3:2042 +1211:3:2047 +1212:3:2051 +1213:3:2052 +1214:3:2059 +1215:3:2060 +1216:3:2071 +1217:3:2079 +1218:3:2080 +1219:3:2084 +1220:3:2089 +1221:3:2090 +1222:0:2565 +1223:3:2102 +1224:0:2565 +1225:3:2104 +1226:0:2565 +1227:3:2105 +1228:3:2109 +1229:3:2110 +1230:3:2118 +1231:3:2119 +1232:3:2123 +1233:3:2124 +1234:3:2132 +1235:3:2137 +1236:3:2141 +1237:3:2142 +1238:3:2149 +1239:3:2150 +1240:3:2161 +1241:3:2169 +1242:3:2170 +1243:3:2174 +1244:3:2179 +1245:3:2180 +1246:0:2565 +1247:3:2192 +1248:0:2565 +1249:2:653 +1250:0:2565 +1251:3:2013 +1252:0:2565 +1253:3:2014 +1254:0:2565 +1255:3:2015 +1256:3:2019 +1257:3:2020 +1258:3:2028 +1259:3:2029 +1260:3:2033 +1261:3:2034 +1262:3:2042 +1263:3:2047 +1264:3:2051 +1265:3:2052 +1266:3:2059 +1267:3:2060 +1268:3:2071 +1269:3:2079 +1270:3:2080 +1271:3:2084 +1272:3:2089 +1273:3:2090 +1274:0:2565 +1275:3:2102 +1276:0:2565 +1277:3:2104 +1278:0:2565 +1279:3:2105 +1280:3:2109 +1281:3:2110 +1282:3:2118 +1283:3:2119 +1284:3:2123 +1285:3:2124 +1286:3:2132 +1287:3:2137 +1288:3:2141 +1289:3:2142 +1290:3:2149 +1291:3:2150 +1292:3:2161 +1293:3:2169 +1294:3:2170 +1295:3:2174 +1296:3:2179 +1297:3:2180 +1298:0:2565 +1299:2:654 +1300:2:658 +1301:2:659 +1302:2:667 +1303:2:668 +1304:2:672 +1305:2:673 +1306:2:681 +1307:2:686 +1308:2:690 +1309:2:691 +1310:2:698 +1311:2:699 +1312:2:710 +1313:2:711 +1314:2:712 +1315:2:723 +1316:2:728 +1317:2:729 +1318:0:2565 +1319:3:2192 +1320:0:2565 +1321:3:2013 +1322:0:2565 +1323:3:2014 +1324:0:2565 +1325:3:2015 +1326:3:2019 +1327:3:2020 +1328:3:2028 +1329:3:2029 +1330:3:2033 +1331:3:2034 +1332:3:2042 +1333:3:2047 +1334:3:2051 +1335:3:2052 +1336:3:2059 +1337:3:2060 +1338:3:2071 +1339:3:2079 +1340:3:2080 +1341:3:2084 +1342:3:2089 +1343:3:2090 +1344:0:2565 +1345:3:2102 +1346:0:2565 +1347:3:2104 +1348:0:2565 +1349:2:741 +1350:0:2565 +1351:2:750 +1352:0:2565 +1353:2:753 +1354:0:2565 +1355:3:2105 +1356:3:2109 +1357:3:2110 +1358:3:2118 +1359:3:2119 +1360:3:2123 +1361:3:2124 +1362:3:2132 +1363:3:2137 +1364:3:2141 +1365:3:2142 +1366:3:2149 +1367:3:2150 +1368:3:2161 +1369:3:2169 +1370:3:2170 +1371:3:2174 +1372:3:2179 +1373:3:2180 +1374:0:2565 +1375:3:2192 +1376:0:2565 +1377:3:2013 +1378:0:2565 +1379:3:2014 +1380:0:2565 +1381:3:2015 +1382:3:2019 +1383:3:2020 +1384:3:2028 +1385:3:2029 +1386:3:2033 +1387:3:2034 +1388:3:2042 +1389:3:2047 +1390:3:2051 +1391:3:2052 +1392:3:2059 +1393:3:2060 +1394:3:2071 +1395:3:2079 +1396:3:2080 +1397:3:2084 +1398:3:2089 +1399:3:2090 +1400:0:2565 +1401:3:2102 +1402:0:2565 +1403:2:758 +1404:0:2565 +1405:3:2104 +1406:0:2565 +1407:3:2105 +1408:3:2109 +1409:3:2110 +1410:3:2118 +1411:3:2119 +1412:3:2123 +1413:3:2124 +1414:3:2132 +1415:3:2137 +1416:3:2141 +1417:3:2142 +1418:3:2149 +1419:3:2150 +1420:3:2161 +1421:3:2169 +1422:3:2170 +1423:3:2174 +1424:3:2179 +1425:3:2180 +1426:0:2565 +1427:3:2192 +1428:0:2565 +1429:3:2013 +1430:0:2565 +1431:3:2014 +1432:0:2565 +1433:3:2015 +1434:3:2019 +1435:3:2020 +1436:3:2028 +1437:3:2029 +1438:3:2033 +1439:3:2034 +1440:3:2042 +1441:3:2047 +1442:3:2051 +1443:3:2052 +1444:3:2059 +1445:3:2060 +1446:3:2071 +1447:3:2079 +1448:3:2080 +1449:3:2084 +1450:3:2089 +1451:3:2090 +1452:0:2565 +1453:2:759 +1454:0:2565 +1455:3:2102 +1456:0:2565 +1457:3:2104 +1458:0:2565 +1459:3:2105 +1460:3:2109 +1461:3:2110 +1462:3:2118 +1463:3:2119 +1464:3:2123 +1465:3:2124 +1466:3:2132 +1467:3:2137 +1468:3:2141 +1469:3:2142 +1470:3:2149 +1471:3:2150 +1472:3:2161 +1473:3:2169 +1474:3:2170 +1475:3:2174 +1476:3:2179 +1477:3:2180 +1478:0:2565 +1479:3:2192 +1480:0:2565 +1481:3:2013 +1482:0:2565 +1483:3:2014 +1484:0:2565 +1485:2:760 +1486:0:2565 +1487:2:761 +1488:0:2565 +1489:2:762 +1490:0:2565 +1491:2:763 +1492:0:2565 +1493:3:2015 +1494:3:2019 +1495:3:2020 +1496:3:2028 +1497:3:2029 +1498:3:2033 +1499:3:2034 +1500:3:2042 +1501:3:2047 +1502:3:2051 +1503:3:2052 +1504:3:2059 +1505:3:2060 +1506:3:2071 +1507:3:2079 +1508:3:2080 +1509:3:2084 +1510:3:2089 +1511:3:2090 +1512:0:2565 +1513:3:2102 +1514:0:2565 +1515:3:2104 +1516:0:2565 +1517:3:2105 +1518:3:2109 +1519:3:2110 +1520:3:2118 +1521:3:2119 +1522:3:2123 +1523:3:2124 +1524:3:2132 +1525:3:2137 +1526:3:2141 +1527:3:2142 +1528:3:2149 +1529:3:2150 +1530:3:2161 +1531:3:2169 +1532:3:2170 +1533:3:2174 +1534:3:2179 +1535:3:2180 +1536:0:2565 +1537:3:2192 +1538:0:2565 +1539:3:2013 +1540:0:2565 +1541:2:765 +1542:0:2565 +1543:3:2014 +1544:0:2565 +1545:3:2015 +1546:3:2019 +1547:3:2020 +1548:3:2028 +1549:3:2029 +1550:3:2033 +1551:3:2034 +1552:3:2042 +1553:3:2047 +1554:3:2051 +1555:3:2052 +1556:3:2059 +1557:3:2060 +1558:3:2071 +1559:3:2079 +1560:3:2080 +1561:3:2084 +1562:3:2089 +1563:3:2090 +1564:0:2565 +1565:3:2102 +1566:0:2565 +1567:3:2104 +1568:0:2565 +1569:3:2105 +1570:3:2109 +1571:3:2110 +1572:3:2118 +1573:3:2119 +1574:3:2123 +1575:3:2124 +1576:3:2132 +1577:3:2137 +1578:3:2141 +1579:3:2142 +1580:3:2149 +1581:3:2150 +1582:3:2161 +1583:3:2169 +1584:3:2170 +1585:3:2174 +1586:3:2179 +1587:3:2180 +1588:0:2565 +1589:3:2192 +1590:0:2565 +1591:2:766 +1592:2:770 +1593:2:771 +1594:2:779 +1595:2:780 +1596:2:781 +1597:2:793 +1598:2:798 +1599:2:802 +1600:2:803 +1601:2:810 +1602:2:811 +1603:2:822 +1604:2:823 +1605:2:824 +1606:2:835 +1607:2:840 +1608:2:841 +1609:0:2565 +1610:3:2013 +1611:0:2565 +1612:3:2014 +1613:0:2565 +1614:3:2015 +1615:3:2019 +1616:3:2020 +1617:3:2028 +1618:3:2029 +1619:3:2033 +1620:3:2034 +1621:3:2042 +1622:3:2047 +1623:3:2051 +1624:3:2052 +1625:3:2059 +1626:3:2060 +1627:3:2071 +1628:3:2079 +1629:3:2080 +1630:3:2084 +1631:3:2089 +1632:3:2090 +1633:0:2565 +1634:3:2102 +1635:0:2565 +1636:3:2104 +1637:0:2565 +1638:3:2105 +1639:3:2109 +1640:3:2110 +1641:3:2118 +1642:3:2119 +1643:3:2123 +1644:3:2124 +1645:3:2132 +1646:3:2137 +1647:3:2141 +1648:3:2142 +1649:3:2149 +1650:3:2150 +1651:3:2161 +1652:3:2169 +1653:3:2170 +1654:3:2174 +1655:3:2179 +1656:3:2180 +1657:0:2565 +1658:2:853 +1659:0:2565 +1660:3:2192 +1661:0:2565 +1662:3:2013 +1663:0:2565 +1664:2:857 +1665:0:2565 +1666:2:465 +1667:0:2565 +1668:3:2014 +1669:0:2565 +1670:3:2015 +1671:3:2019 +1672:3:2020 +1673:3:2028 +1674:3:2029 +1675:3:2033 +1676:3:2034 +1677:3:2042 +1678:3:2047 +1679:3:2051 +1680:3:2052 +1681:3:2059 +1682:3:2060 +1683:3:2071 +1684:3:2079 +1685:3:2080 +1686:3:2084 +1687:3:2089 +1688:3:2090 +1689:0:2565 +1690:3:2102 +1691:0:2565 +1692:3:2104 +1693:0:2565 +1694:3:2105 +1695:3:2109 +1696:3:2110 +1697:3:2118 +1698:3:2119 +1699:3:2123 +1700:3:2124 +1701:3:2132 +1702:3:2137 +1703:3:2141 +1704:3:2142 +1705:3:2149 +1706:3:2150 +1707:3:2161 +1708:3:2169 +1709:3:2170 +1710:3:2174 +1711:3:2179 +1712:3:2180 +1713:0:2565 +1714:3:2192 +1715:0:2565 +1716:2:466 +1717:0:2565 +1718:3:2013 +1719:0:2565 +1720:3:2014 +1721:0:2565 +1722:3:2015 +1723:3:2019 +1724:3:2020 +1725:3:2028 +1726:3:2029 +1727:3:2033 +1728:3:2034 +1729:3:2042 +1730:3:2047 +1731:3:2051 +1732:3:2052 +1733:3:2059 +1734:3:2060 +1735:3:2071 +1736:3:2079 +1737:3:2080 +1738:3:2084 +1739:3:2089 +1740:3:2090 +1741:0:2565 +1742:3:2102 +1743:0:2565 +1744:3:2104 +1745:0:2565 +1746:3:2105 +1747:3:2109 +1748:3:2110 +1749:3:2118 +1750:3:2119 +1751:3:2123 +1752:3:2124 +1753:3:2132 +1754:3:2137 +1755:3:2141 +1756:3:2142 +1757:3:2149 +1758:3:2150 +1759:3:2161 +1760:3:2169 +1761:3:2170 +1762:3:2174 +1763:3:2179 +1764:3:2180 +1765:0:2565 +1766:2:467 +1767:0:2565 +1768:3:2192 +1769:0:2565 +1770:3:2013 +1771:0:2565 +1772:3:2014 +1773:0:2565 +1774:3:2015 +1775:3:2019 +1776:3:2020 +1777:3:2028 +1778:3:2029 +1779:3:2033 +1780:3:2034 +1781:3:2042 +1782:3:2047 +1783:3:2051 +1784:3:2052 +1785:3:2059 +1786:3:2060 +1787:3:2071 +1788:3:2079 +1789:3:2080 +1790:3:2084 +1791:3:2089 +1792:3:2090 +1793:0:2565 +1794:3:2102 +1795:0:2565 +1796:3:2104 +1797:0:2565 +1798:1:199 +1799:0:2565 +1800:2:468 +1801:0:2565 +1802:1:205 +1803:0:2565 +1804:3:2105 +1805:3:2109 +1806:3:2110 +1807:3:2118 +1808:3:2119 +1809:3:2123 +1810:3:2124 +1811:3:2132 +1812:3:2137 +1813:3:2141 +1814:3:2142 +1815:3:2149 +1816:3:2150 +1817:3:2161 +1818:3:2169 +1819:3:2170 +1820:3:2174 +1821:3:2179 +1822:3:2180 +1823:0:2565 +1824:3:2192 +1825:0:2565 +1826:3:2013 +1827:0:2565 +1828:3:2014 +1829:0:2565 +1830:3:2015 +1831:3:2019 +1832:3:2020 +1833:3:2028 +1834:3:2029 +1835:3:2033 +1836:3:2034 +1837:3:2042 +1838:3:2047 +1839:3:2051 +1840:3:2052 +1841:3:2059 +1842:3:2060 +1843:3:2071 +1844:3:2079 +1845:3:2080 +1846:3:2084 +1847:3:2089 +1848:3:2090 +1849:0:2565 +1850:3:2102 +1851:0:2565 +1852:3:2104 +1853:0:2565 +1854:2:467 +1855:0:2565 +1856:2:468 +1857:0:2565 +1858:3:2105 +1859:3:2109 +1860:3:2110 +1861:3:2118 +1862:3:2119 +1863:3:2123 +1864:3:2124 +1865:3:2132 +1866:3:2137 +1867:3:2141 +1868:3:2142 +1869:3:2149 +1870:3:2150 +1871:3:2161 +1872:3:2169 +1873:3:2170 +1874:3:2174 +1875:3:2179 +1876:3:2180 +1877:0:2565 +1878:3:2192 +1879:0:2565 +1880:3:2013 +1881:0:2565 +1882:3:2014 +1883:0:2565 +1884:3:2015 +1885:3:2019 +1886:3:2020 +1887:3:2028 +1888:3:2029 +1889:3:2033 +1890:3:2034 +1891:3:2042 +1892:3:2047 +1893:3:2051 +1894:3:2052 +1895:3:2059 +1896:3:2060 +1897:3:2071 +1898:3:2079 +1899:3:2080 +1900:3:2084 +1901:3:2089 +1902:3:2090 +1903:0:2565 +1904:3:2102 +1905:0:2565 +1906:2:467 +1907:0:2565 +1908:1:206 +1909:0:2565 +1910:2:468 +1911:0:2565 +1912:3:2104 +1913:0:2565 +1914:3:2105 +1915:3:2109 +1916:3:2110 +1917:3:2118 +1918:3:2119 +1919:3:2123 +1920:3:2124 +1921:3:2132 +1922:3:2137 +1923:3:2141 +1924:3:2142 +1925:3:2149 +1926:3:2150 +1927:3:2161 +1928:3:2169 +1929:3:2170 +1930:3:2174 +1931:3:2179 +1932:3:2180 +1933:0:2565 +1934:3:2192 +1935:0:2565 +1936:3:2013 +1937:0:2565 +1938:3:2014 +-1:-1:-1 +1939:0:2565 +1940:3:2015 +1941:3:2019 +1942:3:2020 +1943:3:2028 +1944:3:2029 +1945:3:2033 +1946:3:2034 +1947:3:2042 +1948:3:2047 +1949:3:2051 +1950:3:2052 +1951:3:2059 +1952:3:2060 +1953:3:2071 +1954:3:2079 +1955:3:2080 +1956:3:2084 +1957:3:2089 +1958:3:2090 +1959:0:2565 +1960:3:2102 +1961:0:2565 +1962:2:467 +1963:0:2565 +1964:2:468 +1965:0:2565 +1966:3:2104 +1967:0:2565 +1968:3:2105 +1969:3:2109 +1970:3:2110 +1971:3:2118 +1972:3:2119 +1973:3:2123 +1974:3:2124 +1975:3:2132 +1976:3:2137 +1977:3:2141 +1978:3:2142 +1979:3:2149 +1980:3:2150 +1981:3:2161 +1982:3:2169 +1983:3:2170 +1984:3:2174 +1985:3:2179 +1986:3:2180 +1987:0:2565 +1988:3:2192 +1989:0:2565 +1990:3:2013 +1991:0:2565 +1992:3:2014 +1993:0:2565 +1994:3:2015 +1995:3:2019 +1996:3:2020 +1997:3:2028 +1998:3:2029 +1999:3:2033 +2000:3:2034 +2001:3:2042 +2002:3:2047 +2003:3:2051 +2004:3:2052 +2005:3:2059 +2006:3:2060 +2007:3:2071 +2008:3:2079 +2009:3:2080 +2010:3:2084 +2011:3:2089 +2012:3:2090 +2013:0:2565 +2014:2:467 +2015:0:2565 +2016:1:207 +2017:1:211 +2018:1:212 +2019:1:220 +2020:1:221 +2021:1:222 +2022:1:234 +2023:1:239 +2024:1:243 +2025:1:244 +2026:1:251 +2027:1:252 +2028:1:263 +2029:1:264 +2030:1:265 +2031:1:276 +2032:1:281 +2033:1:282 +2034:0:2565 +2035:3:2102 +2036:0:2565 +2037:2:468 +2038:0:2565 +2039:3:2104 +2040:0:2565 +2041:3:2105 +2042:3:2109 +2043:3:2110 +2044:3:2118 +2045:3:2119 +2046:3:2123 +2047:3:2124 +2048:3:2132 +2049:3:2137 +2050:3:2141 +2051:3:2142 +2052:3:2149 +2053:3:2150 +2054:3:2161 +2055:3:2169 +2056:3:2170 +2057:3:2174 +2058:3:2179 +2059:3:2180 +2060:0:2565 +2061:3:2192 +2062:0:2565 +2063:3:2013 +2064:0:2565 +2065:3:2014 +2066:0:2565 +2067:3:2015 +2068:3:2019 +2069:3:2020 +2070:3:2028 +2071:3:2029 +2072:3:2033 +2073:3:2034 +2074:3:2042 +2075:3:2047 +2076:3:2051 +2077:3:2052 +2078:3:2059 +2079:3:2060 +2080:3:2071 +2081:3:2079 +2082:3:2080 +2083:3:2084 +2084:3:2089 +2085:3:2090 +2086:0:2565 +2087:2:467 +2088:0:2565 +2089:3:2102 +2090:0:2565 +2091:3:2104 +2092:0:2565 +2093:3:2105 +2094:3:2109 +2095:3:2110 +2096:3:2118 +2097:3:2119 +2098:3:2123 +2099:3:2124 +2100:3:2132 +2101:3:2137 +2102:3:2141 +2103:3:2142 +2104:3:2149 +2105:3:2150 +2106:3:2161 +2107:3:2169 +2108:3:2170 +2109:3:2174 +2110:3:2179 +2111:3:2180 +2112:0:2565 +2113:3:2192 +2114:0:2565 +2115:3:2013 +2116:0:2565 +2117:3:2014 +2118:0:2565 +2119:1:294 +2120:0:2565 +2121:2:468 +2122:0:2565 +2123:3:2015 +2124:3:2019 +2125:3:2020 +2126:3:2028 +2127:3:2029 +2128:3:2033 +2129:3:2034 +2130:3:2042 +2131:3:2047 +2132:3:2051 +2133:3:2052 +2134:3:2059 +2135:3:2060 +2136:3:2071 +2137:3:2079 +2138:3:2080 +2139:3:2084 +2140:3:2089 +2141:3:2090 +2142:0:2565 +2143:3:2102 +2144:0:2565 +2145:3:2104 +2146:0:2565 +2147:3:2105 +2148:3:2109 +2149:3:2110 +2150:3:2118 +2151:3:2119 +2152:3:2123 +2153:3:2124 +2154:3:2132 +2155:3:2137 +2156:3:2141 +2157:3:2142 +2158:3:2149 +2159:3:2150 +2160:3:2161 +2161:3:2169 +2162:3:2170 +2163:3:2174 +2164:3:2179 +2165:3:2180 +2166:0:2565 +2167:3:2192 +2168:0:2565 +2169:3:2013 +2170:0:2565 +2171:3:2014 +2172:0:2565 +2173:2:469 +2174:0:2565 +2175:2:475 +2176:0:2565 +2177:2:476 +2178:0:2565 +2179:3:2015 +2180:3:2019 +2181:3:2020 +2182:3:2028 +2183:3:2029 +2184:3:2033 +2185:3:2034 +2186:3:2042 +2187:3:2047 +2188:3:2051 +2189:3:2052 +2190:3:2059 +2191:3:2060 +2192:3:2071 +2193:3:2079 +2194:3:2080 +2195:3:2084 +2196:3:2089 +2197:3:2090 +2198:0:2565 +2199:3:2102 +2200:0:2565 +2201:3:2104 +2202:0:2565 +2203:3:2105 +2204:3:2109 +2205:3:2110 +2206:3:2118 +2207:3:2119 +2208:3:2123 +2209:3:2124 +2210:3:2132 +2211:3:2137 +2212:3:2141 +2213:3:2142 +2214:3:2149 +2215:3:2150 +2216:3:2161 +2217:3:2169 +2218:3:2170 +2219:3:2174 +2220:3:2179 +2221:3:2180 +2222:0:2565 +2223:3:2192 +2224:0:2565 +2225:3:2013 +2226:0:2565 +2227:2:477 +2228:2:481 +2229:2:482 +2230:2:490 +2231:2:491 +2232:2:495 +2233:2:496 +2234:2:504 +2235:2:509 +2236:2:513 +2237:2:514 +2238:2:521 +2239:2:522 +2240:2:533 +2241:2:534 +2242:2:535 +2243:2:546 +2244:2:551 +2245:2:552 +2246:0:2565 +2247:3:2014 +2248:0:2565 +2249:3:2015 +2250:3:2019 +2251:3:2020 +2252:3:2028 +2253:3:2029 +2254:3:2033 +2255:3:2034 +2256:3:2042 +2257:3:2047 +2258:3:2051 +2259:3:2052 +2260:3:2059 +2261:3:2060 +2262:3:2071 +2263:3:2079 +2264:3:2080 +2265:3:2084 +2266:3:2089 +2267:3:2090 +2268:0:2565 +2269:3:2102 +2270:0:2565 +2271:3:2104 +2272:0:2565 +2273:3:2105 +2274:3:2109 +2275:3:2110 +2276:3:2118 +2277:3:2119 +2278:3:2123 +2279:3:2124 +2280:3:2132 +2281:3:2137 +2282:3:2141 +2283:3:2142 +2284:3:2149 +2285:3:2150 +2286:3:2161 +2287:3:2169 +2288:3:2170 +2289:3:2174 +2290:3:2179 +2291:3:2180 +2292:0:2565 +2293:3:2192 +2294:0:2565 +2295:2:564 +2296:0:2565 +2297:3:2013 +2298:0:2565 +2299:3:2014 +2300:0:2565 +2301:3:2015 +2302:3:2019 +2303:3:2020 +2304:3:2028 +2305:3:2029 +2306:3:2033 +2307:3:2034 +2308:3:2042 +2309:3:2047 +2310:3:2051 +2311:3:2052 +2312:3:2059 +2313:3:2060 +2314:3:2071 +2315:3:2079 +2316:3:2080 +2317:3:2084 +2318:3:2089 +2319:3:2090 +2320:0:2565 +2321:3:2102 +2322:0:2565 +2323:3:2104 +2324:0:2565 +2325:3:2105 +2326:3:2109 +2327:3:2110 +2328:3:2118 +2329:3:2119 +2330:3:2123 +2331:3:2124 +2332:3:2132 +2333:3:2137 +2334:3:2141 +2335:3:2142 +2336:3:2149 +2337:3:2150 +2338:3:2161 +2339:3:2169 +2340:3:2170 +2341:3:2174 +2342:3:2179 +2343:3:2180 +2344:0:2565 +2345:2:565 +2346:2:569 +2347:2:570 +2348:2:578 +2349:2:579 +2350:2:583 +2351:2:584 +2352:2:592 +2353:2:597 +2354:2:601 +2355:2:602 +2356:2:609 +2357:2:610 +2358:2:621 +2359:2:622 +2360:2:623 +2361:2:634 +2362:2:639 +2363:2:640 +2364:0:2565 +2365:3:2192 +2366:0:2565 +2367:3:2013 +2368:0:2565 +2369:2:652 +2370:0:2565 +2371:3:2014 +2372:0:2565 +2373:3:2015 +2374:3:2019 +2375:3:2020 +2376:3:2028 +2377:3:2029 +2378:3:2033 +2379:3:2034 +2380:3:2042 +2381:3:2047 +2382:3:2051 +2383:3:2052 +2384:3:2059 +2385:3:2060 +2386:3:2071 +2387:3:2079 +2388:3:2080 +2389:3:2084 +2390:3:2089 +2391:3:2090 +2392:0:2565 +2393:3:2102 +2394:0:2565 +2395:3:2104 +2396:0:2565 +2397:3:2105 +2398:3:2109 +2399:3:2110 +2400:3:2118 +2401:3:2119 +2402:3:2123 +2403:3:2124 +2404:3:2132 +2405:3:2137 +2406:3:2141 +2407:3:2142 +2408:3:2149 +2409:3:2150 +2410:3:2161 +2411:3:2169 +2412:3:2170 +2413:3:2174 +2414:3:2179 +2415:3:2180 +2416:0:2565 +2417:3:2192 +2418:0:2565 +2419:2:653 +2420:0:2565 +2421:3:2013 +2422:0:2565 +2423:3:2014 +2424:0:2565 +2425:3:2015 +2426:3:2019 +2427:3:2020 +2428:3:2028 +2429:3:2029 +2430:3:2033 +2431:3:2034 +2432:3:2042 +2433:3:2047 +2434:3:2051 +2435:3:2052 +2436:3:2059 +2437:3:2060 +2438:3:2071 +2439:3:2079 +2440:3:2080 +2441:3:2084 +2442:3:2089 +2443:3:2090 +2444:0:2565 +2445:3:2102 +2446:0:2565 +2447:3:2104 +2448:0:2565 +2449:3:2105 +2450:3:2109 +2451:3:2110 +2452:3:2118 +2453:3:2119 +2454:3:2123 +2455:3:2124 +2456:3:2132 +2457:3:2137 +2458:3:2141 +2459:3:2142 +2460:3:2149 +2461:3:2150 +2462:3:2161 +2463:3:2169 +2464:3:2170 +2465:3:2174 +2466:3:2179 +2467:3:2180 +2468:0:2565 +2469:2:654 +2470:2:658 +2471:2:659 +2472:2:667 +2473:2:668 +2474:2:672 +2475:2:673 +2476:2:681 +2477:2:686 +2478:2:690 +2479:2:691 +2480:2:698 +2481:2:699 +2482:2:710 +2483:2:711 +2484:2:712 +2485:2:723 +2486:2:728 +2487:2:729 +2488:0:2565 +2489:3:2192 +2490:0:2565 +2491:3:2013 +2492:0:2565 +2493:3:2014 +2494:0:2565 +2495:3:2015 +2496:3:2019 +2497:3:2020 +2498:3:2028 +2499:3:2029 +2500:3:2033 +2501:3:2034 +2502:3:2042 +2503:3:2047 +2504:3:2051 +2505:3:2052 +2506:3:2059 +2507:3:2060 +2508:3:2071 +2509:3:2079 +2510:3:2080 +2511:3:2084 +2512:3:2089 +2513:3:2090 +2514:0:2565 +2515:3:2102 +2516:0:2565 +2517:3:2104 +2518:0:2565 +2519:2:741 +2520:0:2565 +2521:2:750 +2522:0:2565 +2523:2:753 +2524:0:2565 +2525:3:2105 +2526:3:2109 +2527:3:2110 +2528:3:2118 +2529:3:2119 +2530:3:2123 +2531:3:2124 +2532:3:2132 +2533:3:2137 +2534:3:2141 +2535:3:2142 +2536:3:2149 +2537:3:2150 +2538:3:2161 +2539:3:2169 +2540:3:2170 +2541:3:2174 +2542:3:2179 +2543:3:2180 +2544:0:2565 +2545:3:2192 +2546:0:2565 +2547:3:2013 +2548:0:2565 +2549:3:2014 +2550:0:2565 +2551:3:2015 +2552:3:2019 +2553:3:2020 +2554:3:2028 +2555:3:2029 +2556:3:2033 +2557:3:2034 +2558:3:2042 +2559:3:2047 +2560:3:2051 +2561:3:2052 +2562:3:2059 +2563:3:2060 +2564:3:2071 +2565:3:2079 +2566:3:2080 +2567:3:2084 +2568:3:2089 +2569:3:2090 +2570:0:2565 +2571:3:2102 +2572:0:2565 +2573:2:758 +2574:0:2565 +2575:3:2104 +2576:0:2565 +2577:3:2105 +2578:3:2109 +2579:3:2110 +2580:3:2118 +2581:3:2119 +2582:3:2123 +2583:3:2124 +2584:3:2132 +2585:3:2137 +2586:3:2141 +2587:3:2142 +2588:3:2149 +2589:3:2150 +2590:3:2161 +2591:3:2169 +2592:3:2170 +2593:3:2174 +2594:3:2179 +2595:3:2180 +2596:0:2565 +2597:3:2192 +2598:0:2565 +2599:3:2013 +2600:0:2565 +2601:3:2014 +2602:0:2565 +2603:3:2015 +2604:3:2019 +2605:3:2020 +2606:3:2028 +2607:3:2029 +2608:3:2033 +2609:3:2034 +2610:3:2042 +2611:3:2047 +2612:3:2051 +2613:3:2052 +2614:3:2059 +2615:3:2060 +2616:3:2071 +2617:3:2079 +2618:3:2080 +2619:3:2084 +2620:3:2089 +2621:3:2090 +2622:0:2565 +2623:2:759 +2624:0:2565 +2625:3:2102 +2626:0:2565 +2627:3:2104 +2628:0:2565 +2629:3:2105 +2630:3:2109 +2631:3:2110 +2632:3:2118 +2633:3:2119 +2634:3:2123 +2635:3:2124 +2636:3:2132 +2637:3:2137 +2638:3:2141 +2639:3:2142 +2640:3:2149 +2641:3:2150 +2642:3:2161 +2643:3:2169 +2644:3:2170 +2645:3:2174 +2646:3:2179 +2647:3:2180 +2648:0:2565 +2649:3:2192 +2650:0:2565 +2651:3:2013 +2652:0:2565 +2653:3:2014 +2654:0:2565 +2655:2:760 +2656:0:2565 +2657:2:761 +2658:0:2565 +2659:2:762 +2660:0:2565 +2661:2:763 +2662:0:2565 +2663:3:2015 +2664:3:2019 +2665:3:2020 +2666:3:2028 +2667:3:2029 +2668:3:2033 +2669:3:2034 +2670:3:2042 +2671:3:2047 +2672:3:2051 +2673:3:2052 +2674:3:2059 +2675:3:2060 +2676:3:2071 +2677:3:2079 +2678:3:2080 +2679:3:2084 +2680:3:2089 +2681:3:2090 +2682:0:2565 +2683:3:2102 +2684:0:2565 +2685:3:2104 +2686:0:2565 +2687:3:2105 +2688:3:2109 +2689:3:2110 +2690:3:2118 +2691:3:2119 +2692:3:2123 +2693:3:2124 +2694:3:2132 +2695:3:2137 +2696:3:2141 +2697:3:2142 +2698:3:2149 +2699:3:2150 +2700:3:2161 +2701:3:2169 +2702:3:2170 +2703:3:2174 +2704:3:2179 +2705:3:2180 +2706:0:2565 +2707:3:2192 +2708:0:2565 +2709:3:2013 +2710:0:2565 +2711:2:765 +2712:0:2565 +2713:3:2014 +2714:0:2565 +2715:3:2015 +2716:3:2019 +2717:3:2020 +2718:3:2028 +2719:3:2029 +2720:3:2033 +2721:3:2034 +2722:3:2042 +2723:3:2047 +2724:3:2051 +2725:3:2052 +2726:3:2059 +2727:3:2060 +2728:3:2071 +2729:3:2079 +2730:3:2080 +2731:3:2084 +2732:3:2089 +2733:3:2090 +2734:0:2565 +2735:3:2102 +2736:0:2565 +2737:3:2104 +2738:0:2565 +2739:3:2105 +2740:3:2109 +2741:3:2110 +2742:3:2118 +2743:3:2119 +2744:3:2123 +2745:3:2124 +2746:3:2132 +2747:3:2137 +2748:3:2141 +2749:3:2142 +2750:3:2149 +2751:3:2150 +2752:3:2161 +2753:3:2169 +2754:3:2170 +2755:3:2174 +2756:3:2179 +2757:3:2180 +2758:0:2565 +2759:3:2192 +2760:0:2565 +2761:2:766 +2762:2:770 +2763:2:771 +2764:2:779 +2765:2:780 +2766:2:781 +2767:2:793 +2768:2:798 +2769:2:802 +2770:2:803 +2771:2:810 +2772:2:811 +2773:2:822 +2774:2:823 +2775:2:824 +2776:2:835 +2777:2:840 +2778:2:841 +2779:0:2565 +2780:3:2013 +2781:0:2565 +2782:3:2014 +2783:0:2565 +2784:3:2015 +2785:3:2019 +2786:3:2020 +2787:3:2028 +2788:3:2029 +2789:3:2033 +2790:3:2034 +2791:3:2042 +2792:3:2047 +2793:3:2051 +2794:3:2052 +2795:3:2059 +2796:3:2060 +2797:3:2071 +2798:3:2079 +2799:3:2080 +2800:3:2084 +2801:3:2089 +2802:3:2090 +2803:0:2565 +2804:3:2102 +2805:0:2565 +2806:3:2104 +2807:0:2565 +2808:3:2105 +2809:3:2109 +2810:3:2110 +2811:3:2118 +2812:3:2119 +2813:3:2123 +2814:3:2124 +2815:3:2132 +2816:3:2137 +2817:3:2141 +2818:3:2142 +2819:3:2149 +2820:3:2150 +2821:3:2161 +2822:3:2169 +2823:3:2170 +2824:3:2174 +2825:3:2179 +2826:3:2180 +2827:0:2565 +2828:2:853 +2829:0:2565 +2830:3:2192 +2831:0:2565 +2832:3:2013 +2833:0:2565 +2834:2:857 +2835:0:2565 +2836:2:465 +2837:0:2565 +2838:3:2014 +2839:0:2565 +2840:3:2015 +2841:3:2019 +2842:3:2020 +2843:3:2028 +2844:3:2029 +2845:3:2033 +2846:3:2034 +2847:3:2042 +2848:3:2047 +2849:3:2051 +2850:3:2052 +2851:3:2059 +2852:3:2060 +2853:3:2071 +2854:3:2079 +2855:3:2080 +2856:3:2084 +2857:3:2089 +2858:3:2090 +2859:0:2565 +2860:3:2102 +2861:0:2565 +2862:3:2104 +2863:0:2565 +2864:3:2105 +2865:3:2109 +2866:3:2110 +2867:3:2118 +2868:3:2119 +2869:3:2123 +2870:3:2124 +2871:3:2132 +2872:3:2137 +2873:3:2141 +2874:3:2142 +2875:3:2149 +2876:3:2150 +2877:3:2161 +2878:3:2169 +2879:3:2170 +2880:3:2174 +2881:3:2179 +2882:3:2180 +2883:0:2565 +2884:3:2192 +2885:0:2565 +2886:2:466 +2887:0:2565 +2888:3:2013 +2889:0:2565 +2890:3:2014 +2891:0:2565 +2892:3:2015 +2893:3:2019 +2894:3:2020 +2895:3:2028 +2896:3:2029 +2897:3:2033 +2898:3:2034 +2899:3:2042 +2900:3:2047 +2901:3:2051 +2902:3:2052 +2903:3:2059 +2904:3:2060 +2905:3:2071 +2906:3:2079 +2907:3:2080 +2908:3:2084 +2909:3:2089 +2910:3:2090 +2911:0:2565 +2912:3:2102 +2913:0:2565 +2914:3:2104 +2915:0:2565 +2916:3:2105 +2917:3:2109 +2918:3:2110 +2919:3:2118 +2920:3:2119 +2921:3:2123 +2922:3:2124 +2923:3:2132 +2924:3:2137 +2925:3:2141 +2926:3:2142 +2927:3:2149 +2928:3:2150 +2929:3:2161 +2930:3:2169 +2931:3:2170 +2932:3:2174 +2933:3:2179 +2934:3:2180 +2935:0:2565 +2936:2:467 +2937:0:2565 +2938:3:2192 +2939:0:2565 +2940:3:2013 +2941:0:2565 +2942:3:2014 +2943:0:2565 +2944:3:2015 +2945:3:2019 +2946:3:2020 +2947:3:2028 +2948:3:2029 +2949:3:2033 +2950:3:2034 +2951:3:2042 +2952:3:2047 +2953:3:2051 +2954:3:2052 +2955:3:2059 +2956:3:2060 +2957:3:2071 +2958:3:2079 +2959:3:2080 +2960:3:2084 +2961:3:2089 +2962:3:2090 +2963:0:2565 +2964:3:2102 +2965:0:2565 +2966:3:2104 +2967:0:2565 +2968:1:297 +2969:0:2565 +2970:2:468 +2971:0:2565 +2972:3:2105 +2973:3:2109 +2974:3:2110 +2975:3:2118 +2976:3:2119 +2977:3:2123 +2978:3:2124 +2979:3:2132 +2980:3:2137 +2981:3:2141 +2982:3:2142 +2983:3:2149 +2984:3:2150 +2985:3:2161 +2986:3:2169 +2987:3:2170 +2988:3:2174 +2989:3:2179 +2990:3:2180 +2991:0:2565 +2992:3:2192 +2993:0:2565 +2994:3:2013 +2995:0:2565 +2996:3:2014 +2997:0:2565 +2998:3:2015 +2999:3:2019 +3000:3:2020 +3001:3:2028 +3002:3:2029 +3003:3:2033 +3004:3:2034 +3005:3:2042 +3006:3:2047 +3007:3:2051 +3008:3:2052 +3009:3:2059 +3010:3:2060 +3011:3:2071 +3012:3:2079 +3013:3:2080 +3014:3:2084 +3015:3:2089 +3016:3:2090 +3017:0:2565 +3018:3:2102 +3019:0:2565 +3020:3:2104 +3021:0:2565 +3022:2:467 +3023:0:2565 +3024:2:468 +3025:0:2565 +3026:3:2105 +3027:3:2109 +3028:3:2110 +3029:3:2118 +3030:3:2119 +3031:3:2123 +3032:3:2124 +3033:3:2132 +3034:3:2137 +3035:3:2141 +3036:3:2142 +3037:3:2149 +3038:3:2150 +3039:3:2161 +3040:3:2169 +3041:3:2170 +3042:3:2174 +3043:3:2179 +3044:3:2180 +3045:0:2565 +3046:3:2192 +3047:0:2565 +3048:3:2013 +3049:0:2565 +3050:3:2014 +3051:0:2565 +3052:3:2015 +3053:3:2019 +3054:3:2020 +3055:3:2028 +3056:3:2029 +3057:3:2033 +3058:3:2034 +3059:3:2042 +3060:3:2047 +3061:3:2051 +3062:3:2052 +3063:3:2059 +3064:3:2060 +3065:3:2071 +3066:3:2079 +3067:3:2080 +3068:3:2084 +3069:3:2089 +3070:3:2090 +3071:0:2565 +3072:3:2102 +3073:0:2565 +3074:2:467 +3075:0:2565 +3076:1:303 +3077:0:2565 +3078:2:468 +3079:0:2565 +3080:1:312 +3081:0:2565 +3082:3:2104 +3083:0:2565 +3084:3:2105 +3085:3:2109 +3086:3:2110 +3087:3:2118 +3088:3:2119 +3089:3:2123 +3090:3:2124 +3091:3:2132 +3092:3:2137 +3093:3:2141 +3094:3:2142 +3095:3:2149 +3096:3:2150 +3097:3:2161 +3098:3:2169 +3099:3:2170 +3100:3:2174 +3101:3:2179 +3102:3:2180 +3103:0:2565 +3104:3:2192 +3105:0:2565 +3106:3:2013 +3107:0:2565 +3108:3:2014 +3109:0:2565 +3110:3:2015 +3111:3:2019 +3112:3:2020 +3113:3:2028 +3114:3:2029 +3115:3:2033 +3116:3:2034 +3117:3:2042 +3118:3:2047 +3119:3:2051 +3120:3:2052 +3121:3:2059 +3122:3:2060 +3123:3:2071 +3124:3:2079 +3125:3:2080 +3126:3:2084 +3127:3:2089 +3128:3:2090 +3129:0:2565 +3130:3:2102 +3131:0:2565 +3132:2:467 +3133:0:2565 +3134:2:468 +3135:0:2565 +3136:3:2104 +3137:0:2565 +3138:3:2105 +3139:3:2109 +3140:3:2110 +3141:3:2118 +3142:3:2119 +3143:3:2123 +3144:3:2124 +3145:3:2132 +3146:3:2137 +3147:3:2141 +3148:3:2142 +3149:3:2149 +3150:3:2150 +3151:3:2161 +3152:3:2169 +3153:3:2170 +3154:3:2174 +3155:3:2179 +3156:3:2180 +3157:0:2565 +3158:3:2192 +3159:0:2565 +3160:3:2013 +3161:0:2565 +3162:3:2014 +3163:0:2565 +3164:3:2015 +3165:3:2019 +3166:3:2020 +3167:3:2028 +3168:3:2029 +3169:3:2033 +3170:3:2034 +3171:3:2042 +3172:3:2047 +3173:3:2051 +3174:3:2052 +3175:3:2059 +3176:3:2060 +3177:3:2071 +3178:3:2079 +3179:3:2080 +3180:3:2084 +3181:3:2089 +3182:3:2090 +3183:0:2565 +3184:2:467 +3185:0:2565 +3186:1:314 +3187:0:2565 +3188:3:2102 +3189:0:2565 +3190:2:468 +3191:0:2565 +3192:3:2104 +3193:0:2565 +3194:3:2105 +3195:3:2109 +3196:3:2110 +3197:3:2118 +3198:3:2119 +3199:3:2123 +3200:3:2124 +3201:3:2132 +3202:3:2137 +3203:3:2141 +3204:3:2142 +3205:3:2149 +3206:3:2150 +3207:3:2161 +3208:3:2169 +3209:3:2170 +3210:3:2174 +3211:3:2179 +3212:3:2180 +3213:0:2565 +3214:3:2192 +3215:0:2565 +3216:3:2013 +3217:0:2565 +3218:3:2014 +3219:0:2565 +3220:3:2015 +3221:3:2019 +3222:3:2020 +3223:3:2028 +3224:3:2029 +3225:3:2033 +3226:3:2034 +3227:3:2042 +3228:3:2047 +3229:3:2051 +3230:3:2052 +3231:3:2059 +3232:3:2060 +3233:3:2071 +3234:3:2079 +3235:3:2080 +3236:3:2084 +3237:3:2089 +3238:3:2090 +3239:0:2565 +3240:2:469 +3241:0:2565 +3242:3:2102 +3243:0:2565 +3244:2:475 +3245:0:2565 +3246:2:476 +3247:0:2565 +3248:3:2104 +3249:0:2565 +3250:3:2105 +3251:3:2109 +3252:3:2110 +3253:3:2118 +3254:3:2119 +3255:3:2123 +3256:3:2124 +3257:3:2132 +3258:3:2137 +3259:3:2141 +3260:3:2142 +3261:3:2149 +3262:3:2150 +3263:3:2161 +3264:3:2169 +3265:3:2170 +3266:3:2174 +3267:3:2179 +3268:3:2180 +3269:0:2565 +3270:3:2192 +3271:0:2565 +3272:3:2013 +3273:0:2565 +3274:3:2014 +3275:0:2565 +3276:3:2015 +3277:3:2019 +3278:3:2020 +3279:3:2028 +3280:3:2029 +3281:3:2033 +3282:3:2034 +3283:3:2042 +3284:3:2047 +3285:3:2051 +3286:3:2052 +3287:3:2059 +3288:3:2060 +3289:3:2071 +3290:3:2079 +3291:3:2080 +3292:3:2084 +3293:3:2089 +3294:3:2090 +3295:0:2565 +3296:2:477 +3297:2:481 +3298:2:482 +3299:2:490 +3300:2:491 +3301:2:492 +3302:2:504 +3303:2:509 +3304:2:513 +3305:2:514 +3306:2:521 +3307:2:522 +3308:2:533 +3309:2:534 +3310:2:535 +3311:2:546 +3312:2:551 +3313:2:552 +3314:0:2565 +3315:3:2102 +3316:0:2565 +3317:3:2104 +3318:0:2565 +3319:3:2105 +3320:3:2109 +3321:3:2110 +3322:3:2118 +3323:3:2119 +3324:3:2123 +3325:3:2124 +3326:3:2132 +3327:3:2137 +3328:3:2141 +3329:3:2142 +3330:3:2149 +3331:3:2150 +3332:3:2161 +3333:3:2169 +3334:3:2170 +3335:3:2174 +3336:3:2179 +3337:3:2180 +3338:0:2565 +3339:3:2192 +3340:0:2565 +3341:3:2013 +3342:0:2565 +3343:3:2014 +3344:0:2565 +3345:2:564 +3346:0:2565 +3347:3:2015 +3348:3:2019 +3349:3:2020 +3350:3:2028 +3351:3:2029 +3352:3:2033 +3353:3:2034 +3354:3:2042 +3355:3:2047 +3356:3:2051 +3357:3:2052 +3358:3:2059 +3359:3:2060 +3360:3:2071 +3361:3:2079 +3362:3:2080 +3363:3:2084 +3364:3:2089 +3365:3:2090 +3366:0:2565 +3367:3:2102 +3368:0:2565 +3369:3:2104 +3370:0:2565 +3371:3:2105 +3372:3:2109 +3373:3:2110 +3374:3:2118 +3375:3:2119 +3376:3:2123 +3377:3:2124 +3378:3:2132 +3379:3:2137 +3380:3:2141 +3381:3:2142 +3382:3:2149 +3383:3:2150 +3384:3:2161 +3385:3:2169 +3386:3:2170 +3387:3:2174 +3388:3:2179 +3389:3:2180 +3390:0:2565 +3391:3:2192 +3392:0:2565 +3393:3:2013 +3394:0:2565 +3395:2:565 +3396:2:569 +3397:2:570 +3398:2:578 +3399:2:579 +3400:2:583 +3401:2:584 +3402:2:592 +3403:2:597 +3404:2:601 +3405:2:602 +3406:2:609 +3407:2:610 +3408:2:621 +3409:2:622 +3410:2:623 +3411:2:634 +3412:2:639 +3413:2:640 +3414:0:2565 +3415:2:744 +3416:0:2565 +3417:3:2014 +3418:0:2565 +3419:3:2015 +3420:3:2019 +3421:3:2020 +3422:3:2028 +3423:3:2029 +3424:3:2033 +3425:3:2034 +3426:3:2042 +3427:3:2047 +3428:3:2051 +3429:3:2052 +3430:3:2059 +3431:3:2060 +3432:3:2071 +3433:3:2079 +3434:3:2080 +3435:3:2084 +3436:3:2089 +3437:3:2090 +3438:0:2565 +3439:3:2102 +3440:0:2565 +3441:3:2104 +3442:0:2565 +3443:3:2105 +3444:3:2109 +3445:3:2110 +3446:3:2118 +3447:3:2119 +3448:3:2123 +3449:3:2124 +3450:3:2132 +3451:3:2137 +3452:3:2141 +3453:3:2142 +3454:3:2149 +3455:3:2150 +3456:3:2161 +3457:3:2169 +3458:3:2170 +3459:3:2174 +3460:3:2179 +3461:3:2180 +3462:0:2565 +3463:3:2192 +3464:0:2565 +3465:2:745 +3466:0:2565 +3467:3:2013 +3468:0:2565 +3469:2:750 +3470:0:2565 +3471:2:753 +3472:0:2565 +3473:3:2014 +3474:0:2565 +3475:3:2015 +3476:3:2019 +3477:3:2020 +3478:3:2028 +3479:3:2029 +3480:3:2033 +3481:3:2034 +3482:3:2042 +3483:3:2047 +3484:3:2051 +3485:3:2052 +3486:3:2059 +3487:3:2060 +3488:3:2071 +3489:3:2079 +3490:3:2080 +3491:3:2084 +3492:3:2089 +3493:3:2090 +3494:0:2565 +3495:3:2102 +3496:0:2565 +3497:3:2104 +3498:0:2565 +3499:3:2105 +3500:3:2109 +3501:3:2110 +3502:3:2118 +3503:3:2119 +3504:3:2123 +3505:3:2124 +3506:3:2132 +3507:3:2137 +3508:3:2141 +3509:3:2142 +3510:3:2149 +3511:3:2150 +3512:3:2161 +3513:3:2169 +3514:3:2170 +3515:3:2174 +3516:3:2179 +3517:3:2180 +3518:0:2565 +3519:3:2192 +3520:0:2565 +3521:2:758 +3522:0:2565 +3523:3:2013 +3524:0:2565 +3525:3:2014 +3526:0:2565 +3527:3:2015 +3528:3:2019 +3529:3:2020 +3530:3:2028 +3531:3:2029 +3532:3:2033 +3533:3:2034 +3534:3:2042 +3535:3:2047 +3536:3:2051 +3537:3:2052 +3538:3:2059 +3539:3:2060 +3540:3:2071 +3541:3:2079 +3542:3:2080 +3543:3:2084 +3544:3:2089 +3545:3:2090 +3546:0:2565 +3547:3:2102 +3548:0:2565 +3549:3:2104 +3550:0:2565 +3551:3:2105 +3552:3:2109 +3553:3:2110 +3554:3:2118 +3555:3:2119 +3556:3:2123 +3557:3:2124 +3558:3:2132 +3559:3:2137 +3560:3:2141 +3561:3:2142 +3562:3:2149 +3563:3:2150 +3564:3:2161 +3565:3:2169 +3566:3:2170 +3567:3:2174 +3568:3:2179 +3569:3:2180 +3570:0:2565 +3571:2:759 +3572:0:2565 +3573:3:2192 +3574:0:2565 +3575:3:2013 +3576:0:2565 +3577:3:2014 +3578:0:2565 +3579:3:2015 +3580:3:2019 +3581:3:2020 +3582:3:2028 +3583:3:2029 +3584:3:2033 +3585:3:2034 +3586:3:2042 +3587:3:2047 +3588:3:2051 +3589:3:2052 +3590:3:2059 +3591:3:2060 +3592:3:2071 +3593:3:2079 +3594:3:2080 +3595:3:2084 +3596:3:2089 +3597:3:2090 +3598:0:2565 +3599:3:2102 +3600:0:2565 +3601:3:2104 +3602:0:2565 +3603:2:760 +3604:0:2565 +3605:2:761 +3606:0:2565 +3607:2:762 +3608:0:2565 +3609:2:763 +3610:0:2565 +3611:3:2105 +3612:3:2109 +3613:3:2110 +3614:3:2118 +3615:3:2119 +3616:3:2123 +3617:3:2124 +3618:3:2132 +3619:3:2137 +3620:3:2141 +3621:3:2142 +3622:3:2149 +3623:3:2150 +3624:3:2161 +3625:3:2169 +3626:3:2170 +3627:3:2174 +3628:3:2179 +3629:3:2180 +3630:0:2565 +3631:3:2192 +3632:0:2565 +3633:3:2013 +3634:0:2565 +3635:3:2014 +3636:0:2565 +3637:3:2015 +3638:3:2019 +3639:3:2020 +3640:3:2028 +3641:3:2029 +3642:3:2033 +3643:3:2034 +3644:3:2042 +3645:3:2047 +3646:3:2051 +3647:3:2052 +3648:3:2059 +3649:3:2060 +3650:3:2071 +3651:3:2079 +3652:3:2080 +3653:3:2084 +3654:3:2089 +3655:3:2090 +3656:0:2565 +3657:3:2102 +3658:0:2565 +3659:2:765 +3660:0:2565 +3661:3:2104 +3662:0:2565 +3663:3:2105 +3664:3:2109 +3665:3:2110 +3666:3:2118 +3667:3:2119 +3668:3:2123 +3669:3:2124 +3670:3:2132 +3671:3:2137 +3672:3:2141 +3673:3:2142 +3674:3:2149 +3675:3:2150 +3676:3:2161 +3677:3:2169 +3678:3:2170 +3679:3:2174 +3680:3:2179 +3681:3:2180 +3682:0:2565 +3683:3:2192 +3684:0:2565 +3685:3:2013 +3686:0:2565 +3687:3:2014 +3688:0:2565 +3689:3:2015 +3690:3:2019 +3691:3:2020 +3692:3:2028 +3693:3:2029 +3694:3:2033 +3695:3:2034 +3696:3:2042 +3697:3:2047 +3698:3:2051 +3699:3:2052 +3700:3:2059 +3701:3:2060 +3702:3:2071 +3703:3:2079 +3704:3:2080 +3705:3:2084 +3706:3:2089 +3707:3:2090 +3708:0:2565 +3709:2:766 +3710:2:770 +3711:2:771 +3712:2:779 +3713:2:780 +3714:2:781 +3715:2:793 +3716:2:798 +3717:2:802 +3718:2:803 +3719:2:810 +3720:2:811 +3721:2:822 +3722:2:823 +3723:2:824 +3724:2:835 +3725:2:840 +3726:2:841 +3727:0:2565 +3728:3:2102 +3729:0:2565 +3730:3:2104 +3731:0:2565 +3732:3:2105 +3733:3:2109 +3734:3:2110 +3735:3:2118 +3736:3:2119 +3737:3:2123 +3738:3:2124 +3739:3:2132 +3740:3:2137 +3741:3:2141 +3742:3:2142 +3743:3:2149 +3744:3:2150 +3745:3:2161 +3746:3:2169 +3747:3:2170 +3748:3:2174 +3749:3:2179 +3750:3:2180 +3751:0:2565 +3752:3:2192 +3753:0:2565 +3754:3:2013 +3755:0:2565 +3756:3:2014 +3757:0:2565 +3758:2:853 +3759:0:2565 +3760:2:857 +3761:0:2565 +3762:2:465 +3763:0:2565 +3764:3:2015 +3765:3:2019 +3766:3:2020 +3767:3:2028 +3768:3:2029 +3769:3:2033 +3770:3:2034 +3771:3:2042 +3772:3:2047 +3773:3:2051 +3774:3:2052 +3775:3:2059 +3776:3:2060 +3777:3:2071 +3778:3:2079 +3779:3:2080 +3780:3:2084 +3781:3:2089 +3782:3:2090 +3783:0:2565 +3784:3:2102 +3785:0:2565 +3786:3:2104 +3787:0:2565 +3788:3:2105 +3789:3:2109 +3790:3:2110 +3791:3:2118 +3792:3:2119 +3793:3:2123 +3794:3:2124 +3795:3:2132 +3796:3:2137 +3797:3:2141 +3798:3:2142 +3799:3:2149 +3800:3:2150 +3801:3:2161 +3802:3:2169 +3803:3:2170 +3804:3:2174 +3805:3:2179 +3806:3:2180 +3807:0:2565 +3808:3:2192 +3809:0:2565 +3810:3:2013 +3811:0:2565 +3812:2:466 +3813:0:2565 +3814:3:2014 +3815:0:2565 +3816:3:2015 +3817:3:2019 +3818:3:2020 +3819:3:2028 +3820:3:2029 +3821:3:2033 +3822:3:2034 +3823:3:2042 +3824:3:2047 +3825:3:2051 +3826:3:2052 +3827:3:2059 +3828:3:2060 +3829:3:2071 +3830:3:2079 +3831:3:2080 +3832:3:2084 +3833:3:2089 +3834:3:2090 +3835:0:2565 +3836:3:2102 +3837:0:2565 +3838:3:2104 +3839:0:2565 +3840:3:2105 +3841:3:2109 +3842:3:2110 +3843:3:2118 +3844:3:2119 +3845:3:2123 +3846:3:2124 +3847:3:2132 +3848:3:2137 +3849:3:2141 +3850:3:2142 +3851:3:2149 +3852:3:2150 +3853:3:2161 +3854:3:2169 +3855:3:2170 +3856:3:2174 +3857:3:2179 +3858:3:2180 +3859:0:2565 +3860:3:2192 +3861:0:2565 +3862:2:467 +3863:0:2565 +3864:3:2013 +3865:0:2565 +3866:3:2014 +3867:0:2565 +3868:3:2015 +3869:3:2019 +3870:3:2020 +3871:3:2028 +3872:3:2029 +3873:3:2033 +3874:3:2034 +3875:3:2042 +3876:3:2047 +3877:3:2051 +3878:3:2052 +3879:3:2059 +3880:3:2060 +3881:3:2071 +3882:3:2079 +3883:3:2080 +3884:3:2084 +3885:3:2089 +3886:3:2090 +3887:0:2565 +3888:3:2102 +3889:0:2565 +3890:3:2104 +3891:0:2565 +3892:3:2105 +3893:3:2109 +3894:3:2110 +3895:3:2118 +3896:3:2119 +3897:3:2123 +3898:3:2124 +3899:3:2132 +3900:3:2137 +3901:3:2141 +3902:3:2142 +3903:3:2149 +3904:3:2150 +3905:3:2161 +3906:3:2169 +3907:3:2170 +3908:3:2174 +3909:3:2179 +3910:3:2180 +3911:0:2565 +3912:1:317 +3913:0:2565 +3914:3:2192 +3915:0:2565 +3916:3:2013 +3917:0:2565 +3918:2:468 +3919:0:2565 +3920:1:323 +3921:0:2565 +3922:1:324 +3923:0:2565 +3924:3:2014 +3925:0:2565 +3926:3:2015 +3927:3:2019 +3928:3:2020 +3929:3:2028 +3930:3:2029 +3931:3:2033 +3932:3:2034 +3933:3:2042 +3934:3:2047 +3935:3:2051 +3936:3:2052 +3937:3:2059 +3938:3:2060 +3939:3:2071 +3940:3:2079 +3941:3:2080 +3942:3:2084 +3943:3:2089 +3944:3:2090 +3945:0:2565 +3946:3:2102 +3947:0:2565 +3948:3:2104 +3949:0:2565 +3950:3:2105 +3951:3:2109 +3952:3:2110 +3953:3:2118 +3954:3:2119 +3955:3:2123 +3956:3:2124 +3957:3:2132 +3958:3:2137 +3959:3:2141 +3960:3:2142 +3961:3:2149 +3962:3:2150 +3963:3:2161 +3964:3:2169 +3965:3:2170 +3966:3:2174 +3967:3:2179 +3968:3:2180 +3969:0:2565 +3970:3:2192 +3971:0:2565 +3972:3:2013 +3973:0:2565 +3974:2:467 +3975:0:2565 +3976:2:468 +3977:0:2565 +3978:3:2014 +3979:0:2565 +3980:3:2015 +3981:3:2019 +3982:3:2020 +3983:3:2028 +3984:3:2029 +3985:3:2033 +3986:3:2034 +3987:3:2042 +3988:3:2047 +3989:3:2051 +3990:3:2052 +3991:3:2059 +3992:3:2060 +3993:3:2071 +3994:3:2079 +3995:3:2080 +3996:3:2084 +3997:3:2089 +3998:3:2090 +3999:0:2565 +4000:3:2102 +4001:0:2565 +4002:3:2104 +4003:0:2565 +4004:3:2105 +4005:3:2109 +4006:3:2110 +4007:3:2118 +4008:3:2119 +4009:3:2123 +4010:3:2124 +4011:3:2132 +4012:3:2137 +4013:3:2141 +4014:3:2142 +4015:3:2149 +4016:3:2150 +4017:3:2161 +4018:3:2169 +4019:3:2170 +4020:3:2174 +4021:3:2179 +4022:3:2180 +4023:0:2565 +4024:3:2192 +4025:0:2565 +4026:2:467 +4027:0:2565 +4028:1:329 +4029:0:2565 +4030:3:2013 +4031:0:2565 +4032:2:468 +4033:0:2565 +4034:3:2014 +4035:0:2565 +4036:3:2015 +4037:3:2019 +4038:3:2020 +4039:3:2028 +4040:3:2029 +4041:3:2033 +4042:3:2034 +4043:3:2042 +4044:3:2047 +4045:3:2051 +4046:3:2052 +4047:3:2059 +4048:3:2060 +4049:3:2071 +4050:3:2079 +4051:3:2080 +4052:3:2084 +4053:3:2089 +4054:3:2090 +4055:0:2565 +4056:3:2102 +4057:0:2565 +4058:3:2104 +4059:0:2565 +4060:3:2105 +4061:3:2109 +4062:3:2110 +4063:3:2118 +4064:3:2119 +4065:3:2123 +4066:3:2124 +4067:3:2132 +4068:3:2137 +4069:3:2141 +4070:3:2142 +4071:3:2149 +4072:3:2150 +4073:3:2161 +4074:3:2169 +4075:3:2170 +4076:3:2174 +4077:3:2179 +4078:3:2180 +4079:0:2565 +4080:3:2192 +4081:0:2565 +4082:2:467 +4083:0:2565 +4084:3:2013 +4085:0:2565 +4086:3:2014 +4087:0:2565 +4088:3:2015 +4089:3:2019 +4090:3:2020 +4091:3:2028 +4092:3:2029 +4093:3:2033 +4094:3:2034 +4095:3:2042 +4096:3:2047 +4097:3:2051 +4098:3:2052 +4099:3:2059 +4100:3:2060 +4101:3:2071 +4102:3:2079 +4103:3:2080 +4104:3:2084 +4105:3:2089 +4106:3:2090 +4107:0:2565 +4108:3:2102 +4109:0:2565 +4110:3:2104 +4111:0:2565 +4112:3:2105 +4113:3:2109 +4114:3:2110 +4115:3:2118 +4116:3:2119 +4117:3:2123 +4118:3:2124 +4119:3:2132 +4120:3:2137 +4121:3:2141 +4122:3:2142 +4123:3:2149 +4124:3:2150 +4125:3:2161 +4126:3:2169 +4127:3:2170 +4128:3:2174 +4129:3:2179 +4130:3:2180 +4131:0:2565 +4132:1:330 +4133:0:2565 +4134:3:2192 +4135:0:2565 +4136:3:2013 +4137:0:2565 +4138:2:468 +4139:0:2565 +4140:3:2014 +4141:0:2565 +4142:3:2015 +4143:3:2019 +4144:3:2020 +4145:3:2028 +4146:3:2029 +4147:3:2033 +4148:3:2034 +4149:3:2042 +4150:3:2047 +4151:3:2051 +4152:3:2052 +4153:3:2059 +4154:3:2060 +4155:3:2071 +4156:3:2079 +4157:3:2080 +4158:3:2084 +4159:3:2089 +4160:3:2090 +4161:0:2565 +4162:3:2102 +4163:0:2565 +4164:3:2104 +4165:0:2565 +4166:3:2105 +4167:3:2109 +4168:3:2110 +4169:3:2118 +4170:3:2119 +4171:3:2123 +4172:3:2124 +4173:3:2132 +4174:3:2137 +4175:3:2141 +4176:3:2142 +4177:3:2149 +4178:3:2150 +4179:3:2161 +4180:3:2169 +4181:3:2170 +4182:3:2174 +4183:3:2179 +4184:3:2180 +4185:0:2565 +4186:3:2192 +4187:0:2565 +4188:2:467 +4189:0:2565 +4190:3:2013 +4191:0:2565 +4192:3:2014 +4193:0:2565 +4194:3:2015 +4195:3:2019 +4196:3:2020 +4197:3:2028 +4198:3:2029 +4199:3:2033 +4200:3:2034 +4201:3:2042 +4202:3:2047 +4203:3:2051 +4204:3:2052 +4205:3:2059 +4206:3:2060 +4207:3:2071 +4208:3:2079 +4209:3:2080 +4210:3:2084 +4211:3:2089 +4212:3:2090 +4213:0:2565 +4214:3:2102 +4215:0:2565 +4216:3:2104 +4217:0:2565 +4218:3:2105 +4219:3:2109 +4220:3:2110 +4221:3:2118 +4222:3:2119 +4223:3:2123 +4224:3:2124 +4225:3:2132 +4226:3:2137 +4227:3:2141 +4228:3:2142 +4229:3:2149 +4230:3:2150 +4231:3:2161 +4232:3:2169 +4233:3:2170 +4234:3:2174 +4235:3:2179 +4236:3:2180 +4237:0:2565 +4238:1:331 +4239:0:2565 +4240:3:2192 +4241:0:2565 +4242:3:2013 +4243:0:2565 +4244:2:468 +4245:0:2565 +4246:1:332 +4247:0:2565 +4248:1:333 +4249:0:2565 +4250:1:334 +4251:0:2565 +4252:3:2014 +4253:0:2565 +4254:3:2015 +4255:3:2019 +4256:3:2020 +4257:3:2028 +4258:3:2029 +4259:3:2033 +4260:3:2034 +4261:3:2042 +4262:3:2047 +4263:3:2051 +4264:3:2052 +4265:3:2059 +4266:3:2060 +4267:3:2071 +4268:3:2079 +4269:3:2080 +4270:3:2084 +4271:3:2089 +4272:3:2090 +4273:0:2565 +4274:3:2102 +4275:0:2565 +4276:3:2104 +4277:0:2565 +4278:3:2105 +4279:3:2109 +4280:3:2110 +4281:3:2118 +4282:3:2119 +4283:3:2123 +4284:3:2124 +4285:3:2132 +4286:3:2137 +4287:3:2141 +4288:3:2142 +4289:3:2149 +4290:3:2150 +4291:3:2161 +4292:3:2169 +4293:3:2170 +4294:3:2174 +4295:3:2179 +4296:3:2180 +4297:0:2565 +4298:3:2192 +4299:0:2565 +4300:3:2013 +4301:0:2565 +4302:2:467 +4303:0:2565 +4304:2:468 +4305:0:2565 +4306:3:2014 +4307:0:2565 +4308:3:2015 +4309:3:2019 +4310:3:2020 +4311:3:2028 +4312:3:2029 +4313:3:2033 +4314:3:2034 +4315:3:2042 +4316:3:2047 +4317:3:2051 +4318:3:2052 +4319:3:2059 +4320:3:2060 +4321:3:2071 +4322:3:2079 +4323:3:2080 +4324:3:2084 +4325:3:2089 +4326:3:2090 +4327:0:2565 +4328:3:2102 +4329:0:2565 +4330:3:2104 +4331:0:2565 +4332:3:2105 +4333:3:2109 +4334:3:2110 +4335:3:2118 +4336:3:2119 +4337:3:2123 +4338:3:2124 +4339:3:2132 +4340:3:2137 +4341:3:2141 +4342:3:2142 +4343:3:2149 +4344:3:2150 +4345:3:2161 +4346:3:2169 +4347:3:2170 +4348:3:2174 +4349:3:2179 +4350:3:2180 +4351:0:2565 +4352:3:2192 +4353:0:2565 +4354:2:467 +4355:0:2565 +4356:1:336 +4357:0:2565 +4358:3:2013 +4359:0:2565 +4360:2:468 +4361:0:2565 +4362:3:2014 +4363:0:2565 +4364:3:2015 +4365:3:2019 +4366:3:2020 +4367:3:2028 +4368:3:2029 +4369:3:2033 +4370:3:2034 +4371:3:2042 +4372:3:2047 +4373:3:2051 +4374:3:2052 +4375:3:2059 +4376:3:2060 +4377:3:2071 +4378:3:2079 +4379:3:2080 +4380:3:2084 +4381:3:2089 +4382:3:2090 +4383:0:2565 +4384:3:2102 +4385:0:2565 +4386:3:2104 +4387:0:2565 +4388:3:2105 +4389:3:2109 +4390:3:2110 +4391:3:2118 +4392:3:2119 +4393:3:2123 +4394:3:2124 +4395:3:2132 +4396:3:2137 +4397:3:2141 +4398:3:2142 +4399:3:2149 +4400:3:2150 +4401:3:2161 +4402:3:2169 +4403:3:2170 +4404:3:2174 +4405:3:2179 +4406:3:2180 +4407:0:2565 +4408:3:2192 +4409:0:2565 +4410:2:469 +4411:0:2565 +4412:3:2013 +4413:0:2565 +4414:2:475 +4415:0:2565 +4416:2:476 +4417:0:2565 +4418:3:2014 +4419:0:2565 +4420:3:2015 +4421:3:2019 +4422:3:2020 +4423:3:2028 +4424:3:2029 +4425:3:2033 +4426:3:2034 +4427:3:2042 +4428:3:2047 +4429:3:2051 +4430:3:2052 +4431:3:2059 +4432:3:2060 +4433:3:2071 +4434:3:2079 +4435:3:2080 +4436:3:2084 +4437:3:2089 +4438:3:2090 +4439:0:2565 +4440:3:2102 +4441:0:2565 +4442:3:2104 +4443:0:2565 +4444:3:2105 +4445:3:2109 +4446:3:2110 +4447:3:2118 +4448:3:2119 +4449:3:2123 +4450:3:2124 +4451:3:2132 +4452:3:2137 +4453:3:2141 +4454:3:2142 +4455:3:2149 +4456:3:2150 +4457:3:2161 +4458:3:2169 +4459:3:2170 +4460:3:2174 +4461:3:2179 +4462:3:2180 +4463:0:2565 +4464:3:2192 +4465:0:2565 +4466:2:477 +4467:2:481 +4468:2:482 +4469:2:490 +4470:2:491 +4471:2:492 +4472:2:504 +4473:2:509 +4474:2:513 +4475:2:514 +4476:2:521 +4477:2:522 +4478:2:533 +4479:2:534 +4480:2:535 +4481:2:546 +4482:2:551 +4483:2:552 +4484:0:2565 +4485:3:2013 +4486:0:2565 +4487:3:2014 +4488:0:2565 +4489:3:2015 +4490:3:2019 +4491:3:2020 +4492:3:2028 +4493:3:2029 +4494:3:2033 +4495:3:2034 +4496:3:2042 +4497:3:2047 +4498:3:2051 +4499:3:2052 +4500:3:2059 +4501:3:2060 +4502:3:2071 +4503:3:2079 +4504:3:2080 +4505:3:2084 +4506:3:2089 +4507:3:2090 +4508:0:2565 +4509:3:2102 +4510:0:2565 +4511:3:2104 +4512:0:2565 +4513:3:2105 +4514:3:2109 +4515:3:2110 +4516:3:2118 +4517:3:2119 +4518:3:2123 +4519:3:2124 +4520:3:2132 +4521:3:2137 +4522:3:2141 +4523:3:2142 +4524:3:2149 +4525:3:2150 +4526:3:2161 +4527:3:2169 +4528:3:2170 +4529:3:2174 +4530:3:2179 +4531:3:2180 +4532:0:2565 +4533:2:564 +4534:0:2565 +4535:3:2192 +4536:0:2565 +4537:3:2013 +4538:0:2565 +4539:3:2014 +4540:0:2565 +4541:3:2015 +4542:3:2019 +4543:3:2020 +4544:3:2028 +4545:3:2029 +4546:3:2033 +4547:3:2034 +4548:3:2042 +4549:3:2047 +4550:3:2051 +4551:3:2052 +4552:3:2059 +4553:3:2060 +4554:3:2071 +4555:3:2079 +4556:3:2080 +4557:3:2084 +4558:3:2089 +4559:3:2090 +4560:0:2565 +4561:3:2102 +4562:0:2565 +4563:3:2104 +4564:0:2565 +4565:2:565 +4566:2:569 +4567:2:570 +4568:2:578 +4569:2:579 +4570:2:583 +4571:2:584 +4572:2:592 +4573:2:597 +4574:2:601 +4575:2:602 +4576:2:609 +4577:2:610 +4578:2:621 +4579:2:622 +4580:2:623 +4581:2:634 +4582:2:639 +4583:2:640 +4584:0:2565 +4585:2:744 +4586:0:2565 +4587:3:2105 +4588:3:2109 +4589:3:2110 +4590:3:2118 +4591:3:2119 +4592:3:2123 +4593:3:2124 +4594:3:2132 +4595:3:2137 +4596:3:2141 +4597:3:2142 +4598:3:2149 +4599:3:2150 +4600:3:2161 +4601:3:2169 +4602:3:2170 +4603:3:2174 +4604:3:2179 +4605:3:2180 +4606:0:2565 +4607:3:2192 +4608:0:2565 +4609:3:2013 +4610:0:2565 +4611:3:2014 +4612:0:2565 +4613:3:2015 +4614:3:2019 +4615:3:2020 +4616:3:2028 +4617:3:2029 +4618:3:2033 +4619:3:2034 +4620:3:2042 +4621:3:2047 +4622:3:2051 +4623:3:2052 +4624:3:2059 +4625:3:2060 +4626:3:2071 +4627:3:2079 +4628:3:2080 +4629:3:2084 +4630:3:2089 +4631:3:2090 +4632:0:2565 +4633:3:2102 +4634:0:2565 +4635:2:745 +4636:0:2565 +4637:2:750 +4638:0:2565 +4639:2:753 +4640:0:2565 +4641:3:2104 +4642:0:2565 +4643:3:2105 +4644:3:2109 +4645:3:2110 +4646:3:2118 +4647:3:2119 +4648:3:2123 +4649:3:2124 +4650:3:2132 +4651:3:2137 +4652:3:2141 +4653:3:2142 +4654:3:2149 +4655:3:2150 +4656:3:2161 +4657:3:2169 +4658:3:2170 +4659:3:2174 +4660:3:2179 +4661:3:2180 +4662:0:2565 +4663:3:2192 +4664:0:2565 +4665:3:2013 +4666:0:2565 +4667:3:2014 +4668:0:2565 +4669:3:2015 +4670:3:2019 +4671:3:2020 +4672:3:2028 +4673:3:2029 +4674:3:2033 +4675:3:2034 +4676:3:2042 +4677:3:2047 +4678:3:2051 +4679:3:2052 +4680:3:2059 +4681:3:2060 +4682:3:2071 +4683:3:2079 +4684:3:2080 +4685:3:2084 +4686:3:2089 +4687:3:2090 +4688:0:2565 +4689:2:758 +4690:0:2565 +4691:3:2102 +4692:0:2565 +4693:3:2104 +4694:0:2565 +4695:3:2105 +4696:3:2109 +4697:3:2110 +4698:3:2118 +4699:3:2119 +4700:3:2123 +4701:3:2124 +4702:3:2132 +4703:3:2137 +4704:3:2141 +4705:3:2142 +4706:3:2149 +4707:3:2150 +4708:3:2161 +4709:3:2169 +4710:3:2170 +4711:3:2174 +4712:3:2179 +4713:3:2180 +4714:0:2565 +4715:3:2192 +4716:0:2565 +4717:3:2013 +4718:0:2565 +4719:3:2014 +4720:0:2565 +4721:2:759 +4722:0:2565 +4723:3:2015 +4724:3:2019 +4725:3:2020 +4726:3:2028 +4727:3:2029 +4728:3:2033 +4729:3:2034 +4730:3:2042 +4731:3:2047 +4732:3:2051 +4733:3:2052 +4734:3:2059 +4735:3:2060 +4736:3:2071 +4737:3:2079 +4738:3:2080 +4739:3:2084 +4740:3:2089 +4741:3:2090 +4742:0:2565 +4743:3:2102 +4744:0:2565 +4745:3:2104 +4746:0:2565 +4747:3:2105 +4748:3:2109 +4749:3:2110 +4750:3:2118 +4751:3:2119 +4752:3:2123 +4753:3:2124 +4754:3:2132 +4755:3:2137 +4756:3:2141 +4757:3:2142 +4758:3:2149 +4759:3:2150 +4760:3:2161 +4761:3:2169 +4762:3:2170 +4763:3:2174 +4764:3:2179 +4765:3:2180 +4766:0:2565 +4767:3:2192 +4768:0:2565 +4769:3:2013 +4770:0:2565 +4771:2:760 +4772:0:2565 +4773:2:761 +4774:0:2565 +4775:2:762 +4776:0:2565 +4777:2:763 +4778:0:2565 +4779:3:2014 +4780:0:2565 +4781:3:2015 +4782:3:2019 +4783:3:2020 +4784:3:2028 +4785:3:2029 +4786:3:2033 +4787:3:2034 +4788:3:2042 +4789:3:2047 +4790:3:2051 +4791:3:2052 +4792:3:2059 +4793:3:2060 +4794:3:2071 +4795:3:2079 +4796:3:2080 +4797:3:2084 +4798:3:2089 +4799:3:2090 +4800:0:2565 +4801:3:2102 +4802:0:2565 +4803:3:2104 +4804:0:2565 +4805:3:2105 +4806:3:2109 +4807:3:2110 +4808:3:2118 +4809:3:2119 +4810:3:2123 +4811:3:2124 +4812:3:2132 +4813:3:2137 +4814:3:2141 +4815:3:2142 +4816:3:2149 +4817:3:2150 +4818:3:2161 +4819:3:2169 +4820:3:2170 +4821:3:2174 +4822:3:2179 +4823:3:2180 +4824:0:2565 +4825:3:2192 +4826:0:2565 +4827:2:765 +4828:0:2565 +4829:3:2013 +4830:0:2565 +4831:3:2014 +4832:0:2565 +4833:3:2015 +4834:3:2019 +4835:3:2020 +4836:3:2028 +4837:3:2029 +4838:3:2033 +4839:3:2034 +4840:3:2042 +4841:3:2047 +4842:3:2051 +4843:3:2052 +4844:3:2059 +4845:3:2060 +4846:3:2071 +4847:3:2079 +4848:3:2080 +4849:3:2084 +4850:3:2089 +4851:3:2090 +4852:0:2565 +4853:3:2102 +4854:0:2565 +4855:3:2104 +4856:0:2565 +4857:3:2105 +4858:3:2109 +4859:3:2110 +4860:3:2118 +4861:3:2119 +4862:3:2123 +4863:3:2124 +4864:3:2132 +4865:3:2137 +4866:3:2141 +4867:3:2142 +4868:3:2149 +4869:3:2150 +4870:3:2161 +4871:3:2169 +4872:3:2170 +4873:3:2174 +4874:3:2179 +4875:3:2180 +4876:0:2565 +4877:2:766 +4878:2:770 +4879:2:771 +4880:2:779 +4881:2:780 +4882:2:781 +4883:2:793 +4884:2:798 +4885:2:802 +4886:2:803 +4887:2:810 +4888:2:811 +4889:2:822 +4890:2:823 +4891:2:824 +4892:2:835 +4893:2:840 +4894:2:841 +4895:0:2565 +4896:3:2192 +4897:0:2565 +4898:3:2013 +4899:0:2565 +4900:3:2014 +4901:0:2565 +4902:3:2015 +4903:3:2019 +4904:3:2020 +4905:3:2028 +4906:3:2029 +4907:3:2033 +4908:3:2034 +4909:3:2042 +4910:3:2047 +4911:3:2051 +4912:3:2052 +4913:3:2059 +4914:3:2060 +4915:3:2071 +4916:3:2079 +4917:3:2080 +4918:3:2084 +4919:3:2089 +4920:3:2090 +4921:0:2565 +4922:3:2102 +4923:0:2565 +4924:3:2104 +4925:0:2565 +4926:2:853 +4927:0:2565 +4928:2:857 +4929:0:2565 +4930:2:465 +4931:0:2565 +4932:3:2105 +4933:3:2109 +4934:3:2110 +4935:3:2118 +4936:3:2119 +4937:3:2123 +4938:3:2124 +4939:3:2132 +4940:3:2137 +4941:3:2141 +4942:3:2142 +4943:3:2149 +4944:3:2150 +4945:3:2161 +4946:3:2169 +4947:3:2170 +4948:3:2174 +4949:3:2179 +4950:3:2180 +4951:0:2565 +4952:3:2192 +4953:0:2565 +4954:3:2013 +4955:0:2565 +4956:3:2014 +4957:0:2565 +4958:3:2015 +4959:3:2019 +4960:3:2020 +4961:3:2028 +4962:3:2029 +4963:3:2033 +4964:3:2034 +4965:3:2042 +4966:3:2047 +4967:3:2051 +4968:3:2052 +4969:3:2059 +4970:3:2060 +4971:3:2071 +4972:3:2079 +4973:3:2080 +4974:3:2084 +4975:3:2089 +4976:3:2090 +4977:0:2565 +4978:3:2102 +4979:0:2565 +4980:2:466 +4981:0:2565 +4982:3:2104 +4983:0:2565 +4984:3:2105 +4985:3:2109 +4986:3:2110 +4987:3:2118 +4988:3:2119 +4989:3:2123 +4990:3:2124 +4991:3:2132 +4992:3:2137 +4993:3:2141 +4994:3:2142 +4995:3:2149 +4996:3:2150 +4997:3:2161 +4998:3:2169 +4999:3:2170 +5000:3:2174 +5001:3:2179 +5002:3:2180 +5003:0:2565 +5004:3:2192 +5005:0:2565 +5006:3:2013 +5007:0:2565 +5008:3:2014 +5009:0:2565 +5010:3:2015 +5011:3:2019 +5012:3:2020 +5013:3:2028 +5014:3:2029 +5015:3:2033 +5016:3:2034 +5017:3:2042 +5018:3:2047 +5019:3:2051 +5020:3:2052 +5021:3:2059 +5022:3:2060 +5023:3:2071 +5024:3:2079 +5025:3:2080 +5026:3:2084 +5027:3:2089 +5028:3:2090 +5029:0:2565 +5030:2:467 +5031:0:2565 +5032:3:2102 +5033:0:2565 +5034:3:2104 +5035:0:2565 +5036:3:2105 +5037:3:2109 +5038:3:2110 +5039:3:2118 +5040:3:2119 +5041:3:2123 +5042:3:2124 +5043:3:2132 +5044:3:2137 +5045:3:2141 +5046:3:2142 +5047:3:2149 +5048:3:2150 +5049:3:2161 +5050:3:2169 +5051:3:2170 +5052:3:2174 +5053:3:2179 +5054:3:2180 +5055:0:2565 +5056:3:2192 +5057:0:2565 +5058:3:2013 +5059:0:2565 +5060:3:2014 +5061:0:2565 +5062:1:339 +5063:0:2565 +5064:2:468 +5065:0:2565 +5066:3:2015 +5067:3:2019 +5068:3:2020 +5069:3:2028 +5070:3:2029 +5071:3:2033 +5072:3:2034 +5073:3:2042 +5074:3:2047 +5075:3:2051 +5076:3:2052 +5077:3:2059 +5078:3:2060 +5079:3:2071 +5080:3:2079 +5081:3:2080 +5082:3:2084 +5083:3:2089 +5084:3:2090 +5085:0:2565 +5086:3:2102 +5087:0:2565 +5088:3:2104 +5089:0:2565 +5090:3:2105 +5091:3:2109 +5092:3:2110 +5093:3:2118 +5094:3:2119 +5095:3:2123 +5096:3:2124 +5097:3:2132 +5098:3:2137 +5099:3:2141 +5100:3:2142 +5101:3:2149 +5102:3:2150 +5103:3:2161 +5104:3:2169 +5105:3:2170 +5106:3:2174 +5107:3:2179 +5108:3:2180 +5109:0:2565 +5110:3:2192 +5111:0:2565 +5112:3:2013 +5113:0:2565 +5114:3:2014 +5115:0:2565 +5116:2:467 +5117:0:2565 +5118:2:468 +5119:0:2565 +5120:3:2015 +5121:3:2019 +5122:3:2020 +5123:3:2028 +5124:3:2029 +5125:3:2033 +5126:3:2034 +5127:3:2042 +5128:3:2047 +5129:3:2051 +5130:3:2052 +5131:3:2059 +5132:3:2060 +5133:3:2071 +5134:3:2079 +5135:3:2080 +5136:3:2084 +5137:3:2089 +5138:3:2090 +5139:0:2565 +5140:3:2102 +5141:0:2565 +5142:3:2104 +5143:0:2565 +5144:3:2105 +5145:3:2109 +5146:3:2110 +5147:3:2118 +5148:3:2119 +5149:3:2123 +5150:3:2124 +5151:3:2132 +5152:3:2137 +5153:3:2141 +5154:3:2142 +5155:3:2149 +5156:3:2150 +5157:3:2161 +5158:3:2169 +5159:3:2170 +5160:3:2174 +5161:3:2179 +5162:3:2180 +5163:0:2565 +5164:3:2192 +5165:0:2565 +5166:3:2013 +5167:0:2565 +5168:2:467 +5169:0:2565 +5170:1:345 +5171:0:2565 +5172:2:468 +5173:0:2565 +5174:3:2014 +5175:0:2565 +5176:3:2015 +5177:3:2019 +5178:3:2020 +5179:3:2028 +5180:3:2029 +5181:3:2033 +5182:3:2034 +5183:3:2042 +5184:3:2047 +5185:3:2051 +5186:3:2052 +5187:3:2059 +5188:3:2060 +5189:3:2071 +5190:3:2079 +5191:3:2080 +5192:3:2084 +5193:3:2089 +5194:3:2090 +5195:0:2565 +5196:3:2102 +5197:0:2565 +5198:3:2104 +5199:0:2565 +5200:3:2105 +5201:3:2109 +5202:3:2110 +5203:3:2118 +5204:3:2119 +5205:3:2123 +5206:3:2124 +5207:3:2132 +5208:3:2137 +5209:3:2141 +5210:3:2142 +5211:3:2149 +5212:3:2150 +5213:3:2161 +5214:3:2169 +5215:3:2170 +5216:3:2174 +5217:3:2179 +5218:3:2180 +5219:0:2565 +5220:3:2192 +5221:0:2565 +5222:3:2013 +5223:0:2565 +5224:2:467 +5225:0:2565 +5226:2:468 +5227:0:2565 +5228:3:2014 +5229:0:2565 +5230:3:2015 +5231:3:2019 +5232:3:2020 +5233:3:2028 +5234:3:2029 +5235:3:2033 +5236:3:2034 +5237:3:2042 +5238:3:2047 +5239:3:2051 +5240:3:2052 +5241:3:2059 +5242:3:2060 +5243:3:2071 +5244:3:2079 +5245:3:2080 +5246:3:2084 +5247:3:2089 +5248:3:2090 +5249:0:2565 +5250:3:2102 +5251:0:2565 +5252:3:2104 +5253:0:2565 +5254:3:2105 +5255:3:2109 +5256:3:2110 +5257:3:2118 +5258:3:2119 +5259:3:2123 +5260:3:2124 +5261:3:2132 +5262:3:2137 +5263:3:2141 +5264:3:2142 +5265:3:2149 +5266:3:2150 +5267:3:2161 +5268:3:2169 +5269:3:2170 +5270:3:2174 +5271:3:2179 +5272:3:2180 +5273:0:2565 +5274:3:2192 +5275:0:2565 +5276:2:467 +5277:0:2565 +5278:1:346 +5279:1:350 +5280:1:351 +5281:1:359 +5282:1:360 +5283:1:361 +5284:1:373 +5285:1:378 +5286:1:382 +5287:1:383 +5288:1:390 +5289:1:391 +5290:1:402 +5291:1:403 +5292:1:404 +5293:1:415 +5294:1:420 +5295:1:421 +5296:0:2565 +5297:3:2013 +5298:0:2565 +5299:2:468 +5300:0:2565 +5301:3:2014 +5302:0:2565 +5303:3:2015 +5304:3:2019 +5305:3:2020 +5306:3:2028 +5307:3:2029 +5308:3:2033 +5309:3:2034 +5310:3:2042 +5311:3:2047 +5312:3:2051 +5313:3:2052 +5314:3:2059 +5315:3:2060 +5316:3:2071 +5317:3:2079 +5318:3:2080 +5319:3:2084 +5320:3:2089 +5321:3:2090 +5322:0:2565 +5323:3:2102 +5324:0:2565 +5325:3:2104 +5326:0:2565 +5327:3:2105 +5328:3:2109 +5329:3:2110 +5330:3:2118 +5331:3:2119 +5332:3:2123 +5333:3:2124 +5334:3:2132 +5335:3:2137 +5336:3:2141 +5337:3:2142 +5338:3:2149 +5339:3:2150 +5340:3:2161 +5341:3:2169 +5342:3:2170 +5343:3:2174 +5344:3:2179 +5345:3:2180 +5346:0:2565 +5347:3:2192 +5348:0:2565 +5349:2:467 +5350:0:2565 +5351:3:2013 +5352:0:2565 +5353:3:2014 +5354:0:2565 +5355:3:2015 +5356:3:2019 +5357:3:2020 +5358:3:2028 +5359:3:2029 +5360:3:2033 +5361:3:2034 +5362:3:2042 +5363:3:2047 +5364:3:2051 +5365:3:2052 +5366:3:2059 +5367:3:2060 +5368:3:2071 +5369:3:2079 +5370:3:2080 +5371:3:2084 +5372:3:2089 +5373:3:2090 +5374:0:2565 +5375:3:2102 +5376:0:2565 +5377:3:2104 +5378:0:2565 +5379:3:2105 +5380:3:2109 +5381:3:2110 +5382:3:2118 +5383:3:2119 +5384:3:2123 +5385:3:2124 +5386:3:2132 +5387:3:2137 +5388:3:2141 +5389:3:2142 +5390:3:2149 +5391:3:2150 +5392:3:2161 +5393:3:2169 +5394:3:2170 +5395:3:2174 +5396:3:2179 +5397:3:2180 +5398:0:2565 +5399:1:433 +5400:0:2565 +5401:3:2192 +5402:0:2565 +5403:3:2013 +5404:0:2565 +5405:2:468 +5406:0:2565 +5407:3:2014 +5408:0:2565 +5409:3:2015 +5410:3:2019 +5411:3:2020 +5412:3:2028 +5413:3:2029 +5414:3:2033 +5415:3:2034 +5416:3:2042 +5417:3:2047 +5418:3:2051 +5419:3:2052 +5420:3:2059 +5421:3:2060 +5422:3:2071 +5423:3:2079 +5424:3:2080 +5425:3:2084 +5426:3:2089 +5427:3:2090 +5428:0:2565 +5429:3:2102 +5430:0:2565 +5431:3:2104 +5432:0:2565 +5433:3:2105 +5434:3:2109 +5435:3:2110 +5436:3:2118 +5437:3:2119 +5438:3:2123 +5439:3:2124 +5440:3:2132 +5441:3:2137 +5442:3:2141 +5443:3:2142 +5444:3:2149 +5445:3:2150 +5446:3:2161 +5447:3:2169 +5448:3:2170 +5449:3:2174 +5450:3:2179 +5451:3:2180 +5452:0:2565 +5453:3:2192 +5454:0:2565 +5455:2:469 +5456:0:2565 +5457:3:2013 +5458:0:2565 +5459:2:475 +5460:0:2565 +5461:2:476 +5462:0:2565 +5463:3:2014 +5464:0:2565 +5465:3:2015 +5466:3:2019 +5467:3:2020 +5468:3:2028 +5469:3:2029 +5470:3:2033 +5471:3:2034 +5472:3:2042 +5473:3:2047 +5474:3:2051 +5475:3:2052 +5476:3:2059 +5477:3:2060 +5478:3:2071 +5479:3:2079 +5480:3:2080 +5481:3:2084 +5482:3:2089 +5483:3:2090 +5484:0:2565 +5485:3:2102 +5486:0:2565 +5487:3:2104 +5488:0:2565 +5489:3:2105 +5490:3:2109 +5491:3:2110 +5492:3:2118 +5493:3:2119 +5494:3:2123 +5495:3:2124 +5496:3:2132 +5497:3:2137 +5498:3:2141 +5499:3:2142 +5500:3:2149 +5501:3:2150 +5502:3:2161 +5503:3:2169 +5504:3:2170 +5505:3:2174 +5506:3:2179 +5507:3:2180 +5508:0:2565 +5509:3:2192 +5510:0:2565 +5511:2:477 +5512:2:481 +5513:2:482 +5514:2:490 +5515:2:491 +5516:2:495 +5517:2:496 +5518:2:504 +5519:2:509 +5520:2:513 +5521:2:514 +5522:2:521 +5523:2:522 +5524:2:533 +5525:2:534 +5526:2:535 +5527:2:546 +5528:2:551 +5529:2:552 +5530:0:2565 +5531:3:2013 +5532:0:2565 +5533:3:2014 +5534:0:2565 +5535:3:2015 +5536:3:2019 +5537:3:2020 +5538:3:2028 +5539:3:2029 +5540:3:2033 +5541:3:2034 +5542:3:2042 +5543:3:2047 +5544:3:2051 +5545:3:2052 +5546:3:2059 +5547:3:2060 +5548:3:2071 +5549:3:2079 +5550:3:2080 +5551:3:2084 +5552:3:2089 +5553:3:2090 +5554:0:2565 +5555:3:2102 +5556:0:2565 +5557:3:2104 +5558:0:2565 +5559:3:2105 +5560:3:2109 +5561:3:2110 +5562:3:2118 +5563:3:2119 +5564:3:2123 +5565:3:2124 +5566:3:2132 +5567:3:2137 +5568:3:2141 +5569:3:2142 +5570:3:2149 +5571:3:2150 +5572:3:2161 +5573:3:2169 +5574:3:2170 +5575:3:2174 +5576:3:2179 +5577:3:2180 +5578:0:2565 +5579:2:564 +5580:0:2565 +5581:3:2192 +5582:0:2565 +5583:3:2013 +5584:0:2565 +5585:3:2014 +5586:0:2565 +5587:3:2015 +5588:3:2019 +5589:3:2020 +5590:3:2028 +5591:3:2029 +5592:3:2033 +5593:3:2034 +5594:3:2042 +5595:3:2047 +5596:3:2051 +5597:3:2052 +5598:3:2059 +5599:3:2060 +5600:3:2071 +5601:3:2079 +5602:3:2080 +5603:3:2084 +5604:3:2089 +5605:3:2090 +5606:0:2565 +5607:3:2102 +5608:0:2565 +5609:3:2104 +5610:0:2565 +5611:2:565 +5612:2:569 +5613:2:570 +5614:2:578 +5615:2:579 +5616:2:583 +5617:2:584 +5618:2:592 +5619:2:597 +5620:2:601 +5621:2:602 +5622:2:609 +5623:2:610 +5624:2:621 +5625:2:622 +5626:2:623 +5627:2:634 +5628:2:639 +5629:2:640 +5630:0:2565 +5631:2:744 +5632:0:2565 +5633:3:2105 +5634:3:2109 +5635:3:2110 +5636:3:2118 +5637:3:2119 +5638:3:2123 +5639:3:2124 +5640:3:2132 +5641:3:2137 +5642:3:2141 +5643:3:2142 +5644:3:2149 +5645:3:2150 +5646:3:2161 +5647:3:2169 +5648:3:2170 +5649:3:2174 +5650:3:2179 +5651:3:2180 +5652:0:2565 +5653:3:2192 +5654:0:2565 +5655:3:2013 +5656:0:2565 +5657:3:2014 +5658:0:2565 +5659:3:2015 +5660:3:2019 +5661:3:2020 +5662:3:2028 +5663:3:2029 +5664:3:2033 +5665:3:2034 +5666:3:2042 +5667:3:2047 +5668:3:2051 +5669:3:2052 +5670:3:2059 +5671:3:2060 +5672:3:2071 +5673:3:2079 +5674:3:2080 +5675:3:2084 +5676:3:2089 +5677:3:2090 +5678:0:2565 +5679:3:2102 +5680:0:2565 +5681:2:745 +5682:0:2565 +5683:2:750 +5684:0:2565 +5685:2:753 +5686:0:2565 +5687:3:2104 +5688:0:2565 +5689:3:2105 +5690:3:2109 +5691:3:2110 +5692:3:2118 +5693:3:2119 +5694:3:2123 +5695:3:2124 +5696:3:2132 +5697:3:2137 +5698:3:2141 +5699:3:2142 +5700:3:2149 +5701:3:2150 +5702:3:2161 +5703:3:2169 +5704:3:2170 +5705:3:2174 +5706:3:2179 +5707:3:2180 +5708:0:2565 +5709:3:2192 +5710:0:2565 +5711:3:2013 +5712:0:2565 +5713:3:2014 +5714:0:2565 +5715:3:2015 +5716:3:2019 +5717:3:2020 +5718:3:2028 +5719:3:2029 +5720:3:2033 +5721:3:2034 +5722:3:2042 +5723:3:2047 +5724:3:2051 +5725:3:2052 +5726:3:2059 +5727:3:2060 +5728:3:2071 +5729:3:2079 +5730:3:2080 +5731:3:2084 +5732:3:2089 +5733:3:2090 +5734:0:2565 +5735:2:758 +5736:0:2565 +5737:3:2102 +5738:0:2565 +5739:3:2104 +5740:0:2565 +5741:3:2105 +5742:3:2109 +5743:3:2110 +5744:3:2118 +5745:3:2119 +5746:3:2123 +5747:3:2124 +5748:3:2132 +5749:3:2137 +5750:3:2141 +5751:3:2142 +5752:3:2149 +5753:3:2150 +5754:3:2161 +5755:3:2169 +5756:3:2170 +5757:3:2174 +5758:3:2179 +5759:3:2180 +5760:0:2565 +5761:3:2192 +5762:0:2565 +5763:3:2013 +5764:0:2565 +5765:3:2014 +5766:0:2565 +5767:2:759 +5768:0:2565 +5769:3:2015 +5770:3:2019 +5771:3:2020 +5772:3:2028 +5773:3:2029 +5774:3:2033 +5775:3:2034 +5776:3:2042 +5777:3:2047 +5778:3:2051 +5779:3:2052 +5780:3:2059 +5781:3:2060 +5782:3:2071 +5783:3:2079 +5784:3:2080 +5785:3:2084 +5786:3:2089 +5787:3:2090 +5788:0:2565 +5789:3:2102 +5790:0:2565 +5791:3:2104 +5792:0:2565 +5793:3:2105 +5794:3:2109 +5795:3:2110 +5796:3:2118 +5797:3:2119 +5798:3:2123 +5799:3:2124 +5800:3:2132 +5801:3:2137 +5802:3:2141 +5803:3:2142 +5804:3:2149 +5805:3:2150 +5806:3:2161 +5807:3:2169 +5808:3:2170 +5809:3:2174 +5810:3:2179 +5811:3:2180 +5812:0:2565 +5813:3:2192 +5814:0:2565 +5815:3:2013 +5816:0:2565 +5817:2:760 +5818:0:2565 +5819:2:761 +5820:0:2565 +5821:2:762 +5822:0:2565 +5823:2:763 +5824:0:2565 +5825:3:2014 +5826:0:2565 +5827:3:2015 +5828:3:2019 +5829:3:2020 +5830:3:2028 +5831:3:2029 +5832:3:2033 +5833:3:2034 +5834:3:2042 +5835:3:2047 +5836:3:2051 +5837:3:2052 +5838:3:2059 +5839:3:2060 +5840:3:2071 +5841:3:2079 +5842:3:2080 +5843:3:2084 +5844:3:2089 +5845:3:2090 +5846:0:2565 +5847:3:2102 +5848:0:2565 +5849:3:2104 +5850:0:2565 +5851:3:2105 +5852:3:2109 +5853:3:2110 +5854:3:2118 +5855:3:2119 +5856:3:2123 +5857:3:2124 +5858:3:2132 +5859:3:2137 +5860:3:2141 +5861:3:2142 +5862:3:2149 +5863:3:2150 +5864:3:2161 +5865:3:2169 +5866:3:2170 +5867:3:2174 +5868:3:2179 +5869:3:2180 +5870:0:2565 +5871:3:2192 +5872:0:2565 +5873:2:765 +5874:0:2565 +5875:3:2013 +5876:0:2565 +5877:3:2014 +5878:0:2565 +5879:3:2015 +5880:3:2019 +5881:3:2020 +5882:3:2028 +5883:3:2029 +5884:3:2033 +5885:3:2034 +5886:3:2042 +5887:3:2047 +5888:3:2051 +5889:3:2052 +5890:3:2059 +5891:3:2060 +5892:3:2071 +5893:3:2079 +5894:3:2080 +5895:3:2084 +5896:3:2089 +5897:3:2090 +5898:0:2565 +5899:3:2102 +5900:0:2565 +5901:3:2104 +5902:0:2565 +5903:3:2105 +5904:3:2109 +5905:3:2110 +5906:3:2118 +5907:3:2119 +5908:3:2123 +5909:3:2124 +5910:3:2132 +5911:3:2137 +5912:3:2141 +5913:3:2142 +5914:3:2149 +5915:3:2150 +5916:3:2161 +5917:3:2169 +5918:3:2170 +5919:3:2174 +5920:3:2179 +5921:3:2180 +5922:0:2565 +5923:2:766 +5924:2:770 +5925:2:771 +5926:2:779 +5927:2:780 +5928:2:781 +5929:2:793 +5930:2:798 +5931:2:802 +5932:2:803 +5933:2:810 +5934:2:811 +5935:2:822 +5936:2:823 +5937:2:824 +5938:2:835 +5939:2:840 +5940:2:841 +5941:0:2565 +5942:3:2192 +5943:0:2565 +5944:3:2013 +5945:0:2565 +5946:3:2014 +5947:0:2565 +5948:3:2015 +5949:3:2019 +5950:3:2020 +5951:3:2028 +5952:3:2029 +5953:3:2033 +5954:3:2034 +5955:3:2042 +5956:3:2047 +5957:3:2051 +5958:3:2052 +5959:3:2059 +5960:3:2060 +5961:3:2071 +5962:3:2079 +5963:3:2080 +5964:3:2084 +5965:3:2089 +5966:3:2090 +5967:0:2565 +5968:3:2102 +5969:0:2565 +5970:3:2104 +5971:0:2565 +5972:2:853 +5973:0:2565 +5974:2:857 +5975:0:2565 +5976:2:465 +5977:0:2565 +5978:3:2105 +5979:3:2109 +5980:3:2110 +5981:3:2118 +5982:3:2119 +5983:3:2123 +5984:3:2124 +5985:3:2132 +5986:3:2137 +5987:3:2141 +5988:3:2142 +5989:3:2149 +5990:3:2150 +5991:3:2161 +5992:3:2169 +5993:3:2170 +5994:3:2174 +5995:3:2179 +5996:3:2180 +5997:0:2565 +5998:3:2192 +5999:0:2565 +6000:3:2013 +6001:0:2565 +6002:3:2014 +6003:0:2565 +6004:3:2015 +6005:3:2019 +6006:3:2020 +6007:3:2028 +6008:3:2029 +6009:3:2033 +6010:3:2034 +6011:3:2042 +6012:3:2047 +6013:3:2051 +6014:3:2052 +6015:3:2059 +6016:3:2060 +6017:3:2071 +6018:3:2079 +6019:3:2080 +6020:3:2084 +6021:3:2089 +6022:3:2090 +6023:0:2565 +6024:3:2102 +6025:0:2565 +6026:2:466 +6027:0:2565 +6028:3:2104 +6029:0:2565 +6030:3:2105 +6031:3:2109 +6032:3:2110 +6033:3:2118 +6034:3:2119 +6035:3:2123 +6036:3:2124 +6037:3:2132 +6038:3:2137 +6039:3:2141 +6040:3:2142 +6041:3:2149 +6042:3:2150 +6043:3:2161 +6044:3:2169 +6045:3:2170 +6046:3:2174 +6047:3:2179 +6048:3:2180 +6049:0:2565 +6050:3:2192 +6051:0:2565 +6052:3:2013 +6053:0:2565 +6054:3:2014 +6055:0:2565 +6056:3:2015 +6057:3:2019 +6058:3:2020 +6059:3:2028 +6060:3:2029 +6061:3:2033 +6062:3:2034 +6063:3:2042 +6064:3:2047 +6065:3:2051 +6066:3:2052 +6067:3:2059 +6068:3:2060 +6069:3:2071 +6070:3:2079 +6071:3:2080 +6072:3:2084 +6073:3:2089 +6074:3:2090 +6075:0:2565 +6076:2:467 +6077:0:2565 +6078:3:2102 +6079:0:2565 +6080:3:2104 +6081:0:2565 +6082:3:2105 +6083:3:2109 +6084:3:2110 +6085:3:2118 +6086:3:2119 +6087:3:2123 +6088:3:2124 +6089:3:2132 +6090:3:2137 +6091:3:2141 +6092:3:2142 +6093:3:2149 +6094:3:2150 +6095:3:2161 +6096:3:2169 +6097:3:2170 +6098:3:2174 +6099:3:2179 +6100:3:2180 +6101:0:2565 +6102:3:2192 +6103:0:2565 +6104:3:2013 +6105:0:2565 +6106:3:2014 +6107:0:2565 +6108:1:436 +6109:0:2565 +6110:2:468 +6111:0:2565 +6112:3:2015 +6113:3:2019 +6114:3:2020 +6115:3:2028 +6116:3:2029 +6117:3:2033 +6118:3:2034 +6119:3:2042 +6120:3:2047 +6121:3:2051 +6122:3:2052 +6123:3:2059 +6124:3:2060 +6125:3:2071 +6126:3:2079 +6127:3:2080 +6128:3:2084 +6129:3:2089 +6130:3:2090 +6131:0:2565 +6132:3:2102 +6133:0:2565 +6134:3:2104 +6135:0:2565 +6136:3:2105 +6137:3:2109 +6138:3:2110 +6139:3:2118 +6140:3:2119 +6141:3:2123 +6142:3:2124 +6143:3:2132 +6144:3:2137 +6145:3:2141 +6146:3:2142 +6147:3:2149 +6148:3:2150 +6149:3:2161 +6150:3:2169 +6151:3:2170 +6152:3:2174 +6153:3:2179 +6154:3:2180 +6155:0:2565 +6156:3:2192 +6157:0:2565 +6158:3:2013 +6159:0:2565 +6160:3:2014 +6161:0:2565 +6162:2:467 +6163:0:2565 +6164:2:468 +6165:0:2565 +6166:3:2015 +6167:3:2019 +6168:3:2020 +6169:3:2028 +6170:3:2029 +6171:3:2033 +6172:3:2034 +6173:3:2042 +6174:3:2047 +6175:3:2051 +6176:3:2052 +6177:3:2059 +6178:3:2060 +6179:3:2071 +6180:3:2079 +6181:3:2080 +6182:3:2084 +6183:3:2089 +6184:3:2090 +6185:0:2565 +6186:3:2102 +6187:0:2565 +6188:3:2104 +6189:0:2565 +6190:3:2105 +6191:3:2109 +6192:3:2110 +6193:3:2118 +6194:3:2119 +6195:3:2123 +6196:3:2124 +6197:3:2132 +6198:3:2137 +6199:3:2141 +6200:3:2142 +6201:3:2149 +6202:3:2150 +6203:3:2161 +6204:3:2169 +6205:3:2170 +6206:3:2174 +6207:3:2179 +6208:3:2180 +6209:0:2565 +6210:3:2192 +6211:0:2565 +6212:3:2013 +6213:0:2565 +6214:2:467 +6215:0:2565 +6216:1:442 +6217:0:2565 +6218:2:468 +6219:0:2565 +6220:1:446 +6221:0:2565 +6222:1:9 +6223:0:2565 +6224:1:10 +6225:0:2565 +6226:1:11 +6227:0:2565 +6228:3:2014 +6229:0:2565 +6230:3:2015 +6231:3:2019 +6232:3:2020 +6233:3:2028 +6234:3:2029 +6235:3:2033 +6236:3:2034 +6237:3:2042 +6238:3:2047 +6239:3:2051 +6240:3:2052 +6241:3:2059 +6242:3:2060 +6243:3:2071 +6244:3:2079 +6245:3:2080 +6246:3:2084 +6247:3:2089 +6248:3:2090 +6249:0:2565 +6250:3:2102 +6251:0:2565 +6252:3:2104 +6253:0:2565 +6254:3:2105 +6255:3:2109 +6256:3:2110 +6257:3:2118 +6258:3:2119 +6259:3:2123 +6260:3:2124 +6261:3:2132 +6262:3:2137 +6263:3:2141 +6264:3:2142 +6265:3:2149 +6266:3:2150 +6267:3:2161 +6268:3:2169 +6269:3:2170 +6270:3:2174 +6271:3:2179 +6272:3:2180 +6273:0:2565 +6274:3:2192 +6275:0:2565 +6276:3:2013 +6277:0:2565 +6278:2:467 +6279:0:2565 +6280:2:468 +6281:0:2565 +6282:3:2014 +6283:0:2565 +6284:3:2015 +6285:3:2019 +6286:3:2020 +6287:3:2028 +6288:3:2029 +6289:3:2033 +6290:3:2034 +6291:3:2042 +6292:3:2047 +6293:3:2051 +6294:3:2052 +6295:3:2059 +6296:3:2060 +6297:3:2071 +6298:3:2079 +6299:3:2080 +6300:3:2084 +6301:3:2089 +6302:3:2090 +6303:0:2565 +6304:3:2102 +6305:0:2565 +6306:3:2104 +6307:0:2565 +6308:3:2105 +6309:3:2109 +6310:3:2110 +6311:3:2118 +6312:3:2119 +6313:3:2123 +6314:3:2124 +6315:3:2132 +6316:3:2137 +6317:3:2141 +6318:3:2142 +6319:3:2149 +6320:3:2150 +6321:3:2161 +6322:3:2169 +6323:3:2170 +6324:3:2174 +6325:3:2179 +6326:3:2180 +6327:0:2565 +6328:3:2192 +6329:0:2565 +6330:2:467 +6331:0:2565 +6332:1:12 +6333:1:16 +6334:1:17 +6335:1:25 +6336:1:26 +6337:1:27 +6338:1:39 +6339:1:44 +6340:1:48 +6341:1:49 +6342:1:56 +6343:1:57 +6344:1:68 +6345:1:69 +6346:1:70 +6347:1:81 +6348:1:86 +6349:1:87 +6350:0:2565 +6351:3:2013 +6352:0:2565 +6353:2:468 +6354:0:2565 +6355:3:2014 +6356:0:2565 +6357:3:2015 +6358:3:2019 +6359:3:2020 +6360:3:2028 +6361:3:2029 +6362:3:2033 +6363:3:2034 +6364:3:2042 +6365:3:2047 +6366:3:2051 +6367:3:2052 +6368:3:2059 +6369:3:2060 +6370:3:2071 +6371:3:2079 +6372:3:2080 +6373:3:2084 +6374:3:2089 +6375:3:2090 +6376:0:2565 +6377:3:2102 +6378:0:2565 +6379:3:2104 +6380:0:2565 +6381:3:2105 +6382:3:2109 +6383:3:2110 +6384:3:2118 +6385:3:2119 +6386:3:2123 +6387:3:2124 +6388:3:2132 +6389:3:2137 +6390:3:2141 +6391:3:2142 +6392:3:2149 +6393:3:2150 +6394:3:2161 +6395:3:2169 +6396:3:2170 +6397:3:2174 +6398:3:2179 +6399:3:2180 +6400:0:2565 +6401:3:2192 +6402:0:2565 +6403:2:467 +6404:0:2565 +6405:3:2013 +6406:0:2565 +6407:3:2014 +6408:0:2565 +6409:3:2015 +6410:3:2019 +6411:3:2020 +6412:3:2028 +6413:3:2029 +6414:3:2033 +6415:3:2034 +6416:3:2042 +6417:3:2047 +6418:3:2051 +6419:3:2052 +6420:3:2059 +6421:3:2060 +6422:3:2071 +6423:3:2079 +6424:3:2080 +6425:3:2084 +6426:3:2089 +6427:3:2090 +6428:0:2565 +6429:3:2102 +6430:0:2565 +6431:3:2104 +6432:0:2565 +6433:3:2105 +6434:3:2109 +6435:3:2110 +6436:3:2118 +6437:3:2119 +6438:3:2123 +6439:3:2124 +6440:3:2132 +6441:3:2137 +6442:3:2141 +6443:3:2142 +6444:3:2149 +6445:3:2150 +6446:3:2161 +6447:3:2169 +6448:3:2170 +6449:3:2174 +6450:3:2179 +6451:3:2180 +6452:0:2565 +6453:1:99 +6454:0:2565 +6455:3:2192 +6456:0:2565 +6457:3:2013 +6458:0:2565 +6459:2:468 +6460:0:2565 +6461:3:2014 +6462:0:2565 +6463:3:2015 +6464:3:2019 +6465:3:2020 +6466:3:2028 +6467:3:2029 +6468:3:2033 +6469:3:2034 +6470:3:2042 +6471:3:2047 +6472:3:2051 +6473:3:2052 +6474:3:2059 +6475:3:2060 +6476:3:2071 +6477:3:2079 +6478:3:2080 +6479:3:2084 +6480:3:2089 +6481:3:2090 +6482:0:2565 +6483:3:2102 +6484:0:2565 +6485:3:2104 +6486:0:2565 +6487:3:2105 +6488:3:2109 +6489:3:2110 +6490:3:2118 +6491:3:2119 +6492:3:2123 +6493:3:2124 +6494:3:2132 +6495:3:2137 +6496:3:2141 +6497:3:2142 +6498:3:2149 +6499:3:2150 +6500:3:2161 +6501:3:2169 +6502:3:2170 +6503:3:2174 +6504:3:2179 +6505:3:2180 +6506:0:2565 +6507:3:2192 +6508:0:2565 +6509:2:469 +6510:0:2565 +6511:3:2013 +6512:0:2565 +6513:2:475 +6514:0:2565 +6515:2:476 +6516:0:2565 +6517:3:2014 +6518:0:2565 +6519:3:2015 +6520:3:2019 +6521:3:2020 +6522:3:2028 +6523:3:2029 +6524:3:2033 +6525:3:2034 +6526:3:2042 +6527:3:2047 +6528:3:2051 +6529:3:2052 +6530:3:2059 +6531:3:2060 +6532:3:2071 +6533:3:2079 +6534:3:2080 +6535:3:2084 +6536:3:2089 +6537:3:2090 +6538:0:2565 +6539:3:2102 +6540:0:2565 +6541:3:2104 +6542:0:2565 +6543:3:2105 +6544:3:2109 +6545:3:2110 +6546:3:2118 +6547:3:2119 +6548:3:2123 +6549:3:2124 +6550:3:2132 +6551:3:2137 +6552:3:2141 +6553:3:2142 +6554:3:2149 +6555:3:2150 +6556:3:2161 +6557:3:2169 +6558:3:2170 +6559:3:2174 +6560:3:2179 +6561:3:2180 +6562:0:2565 +6563:3:2192 +6564:0:2565 +6565:2:477 +6566:2:481 +6567:2:482 +6568:2:490 +6569:2:491 +6570:2:495 +6571:2:496 +6572:2:504 +6573:2:509 +6574:2:513 +6575:2:514 +6576:2:521 +6577:2:522 +6578:2:533 +6579:2:534 +6580:2:535 +6581:2:546 +6582:2:551 +6583:2:552 +6584:0:2565 +6585:3:2013 +6586:0:2565 +6587:3:2014 +6588:0:2565 +6589:3:2015 +6590:3:2019 +6591:3:2020 +6592:3:2028 +6593:3:2029 +6594:3:2033 +6595:3:2034 +6596:3:2042 +6597:3:2047 +6598:3:2051 +6599:3:2052 +6600:3:2059 +6601:3:2060 +6602:3:2071 +6603:3:2079 +6604:3:2080 +6605:3:2084 +6606:3:2089 +6607:3:2090 +6608:0:2565 +6609:3:2102 +6610:0:2565 +6611:3:2104 +6612:0:2565 +6613:3:2105 +6614:3:2109 +6615:3:2110 +6616:3:2118 +6617:3:2119 +6618:3:2123 +6619:3:2124 +6620:3:2132 +6621:3:2137 +6622:3:2141 +6623:3:2142 +6624:3:2149 +6625:3:2150 +6626:3:2161 +6627:3:2169 +6628:3:2170 +6629:3:2174 +6630:3:2179 +6631:3:2180 +6632:0:2565 +6633:2:564 +6634:0:2565 +6635:3:2192 +6636:0:2565 +6637:3:2013 +6638:0:2565 +6639:3:2014 +6640:0:2565 +6641:3:2015 +6642:3:2019 +6643:3:2020 +6644:3:2028 +6645:3:2029 +6646:3:2033 +6647:3:2034 +6648:3:2042 +6649:3:2047 +6650:3:2051 +6651:3:2052 +6652:3:2059 +6653:3:2060 +6654:3:2071 +6655:3:2079 +6656:3:2080 +6657:3:2084 +6658:3:2089 +6659:3:2090 +6660:0:2565 +6661:3:2102 +6662:0:2565 +6663:3:2104 +6664:0:2565 +6665:2:565 +6666:2:569 +6667:2:570 +6668:2:578 +6669:2:579 +6670:2:583 +6671:2:584 +6672:2:592 +6673:2:597 +6674:2:601 +6675:2:602 +6676:2:609 +6677:2:610 +6678:2:621 +6679:2:622 +6680:2:623 +6681:2:634 +6682:2:639 +6683:2:640 +6684:0:2565 +6685:2:652 +6686:0:2565 +6687:3:2105 +6688:3:2109 +6689:3:2110 +6690:3:2118 +6691:3:2119 +6692:3:2123 +6693:3:2124 +6694:3:2132 +6695:3:2137 +6696:3:2141 +6697:3:2142 +6698:3:2149 +6699:3:2150 +6700:3:2161 +6701:3:2169 +6702:3:2170 +6703:3:2174 +6704:3:2179 +6705:3:2180 +6706:0:2565 +6707:3:2192 +6708:0:2565 +6709:3:2013 +6710:0:2565 +6711:3:2014 +6712:0:2565 +6713:3:2015 +6714:3:2019 +6715:3:2020 +6716:3:2028 +6717:3:2029 +6718:3:2033 +6719:3:2034 +6720:3:2042 +6721:3:2047 +6722:3:2051 +6723:3:2052 +6724:3:2059 +6725:3:2060 +6726:3:2071 +6727:3:2079 +6728:3:2080 +6729:3:2084 +6730:3:2089 +6731:3:2090 +6732:0:2565 +6733:3:2102 +6734:0:2565 +6735:2:653 +6736:0:2565 +6737:3:2104 +6738:0:2565 +6739:3:2105 +6740:3:2109 +6741:3:2110 +6742:3:2118 +6743:3:2119 +6744:3:2123 +6745:3:2124 +6746:3:2132 +6747:3:2137 +6748:3:2141 +6749:3:2142 +6750:3:2149 +6751:3:2150 +6752:3:2161 +6753:3:2169 +6754:3:2170 +6755:3:2174 +6756:3:2179 +6757:3:2180 +6758:0:2565 +6759:3:2192 +6760:0:2565 +6761:3:2013 +6762:0:2565 +6763:3:2014 +6764:0:2565 +6765:3:2015 +6766:3:2019 +6767:3:2020 +6768:3:2028 +6769:3:2029 +6770:3:2033 +6771:3:2034 +6772:3:2042 +6773:3:2047 +6774:3:2051 +6775:3:2052 +6776:3:2059 +6777:3:2060 +6778:3:2071 +6779:3:2079 +6780:3:2080 +6781:3:2084 +6782:3:2089 +6783:3:2090 +6784:0:2565 +6785:2:654 +6786:2:658 +6787:2:659 +6788:2:667 +6789:2:668 +6790:2:672 +6791:2:673 +6792:2:681 +6793:2:686 +6794:2:690 +6795:2:691 +6796:2:698 +6797:2:699 +6798:2:710 +6799:2:711 +6800:2:712 +6801:2:723 +6802:2:728 +6803:2:729 +6804:0:2565 +6805:3:2102 +6806:0:2565 +6807:3:2104 +6808:0:2565 +6809:3:2105 +6810:3:2109 +6811:3:2110 +6812:3:2118 +6813:3:2119 +6814:3:2123 +6815:3:2124 +6816:3:2132 +6817:3:2137 +6818:3:2141 +6819:3:2142 +6820:3:2149 +6821:3:2150 +6822:3:2161 +6823:3:2169 +6824:3:2170 +6825:3:2174 +6826:3:2179 +6827:3:2180 +6828:0:2565 +6829:3:2192 +6830:0:2565 +6831:3:2013 +6832:0:2565 +6833:3:2014 +6834:0:2565 +6835:2:741 +6836:0:2565 +6837:2:750 +6838:0:2565 +6839:2:753 +6840:0:2565 +6841:3:2015 +6842:3:2019 +6843:3:2020 +6844:3:2028 +6845:3:2029 +6846:3:2033 +6847:3:2034 +6848:3:2042 +6849:3:2047 +6850:3:2051 +6851:3:2052 +6852:3:2059 +6853:3:2060 +6854:3:2071 +6855:3:2079 +6856:3:2080 +6857:3:2084 +6858:3:2089 +6859:3:2090 +6860:0:2565 +6861:3:2102 +6862:0:2565 +6863:3:2104 +6864:0:2565 +6865:3:2105 +6866:3:2109 +6867:3:2110 +6868:3:2118 +6869:3:2119 +6870:3:2123 +6871:3:2124 +6872:3:2132 +6873:3:2137 +6874:3:2141 +6875:3:2142 +6876:3:2149 +6877:3:2150 +6878:3:2161 +6879:3:2169 +6880:3:2170 +6881:3:2174 +6882:3:2179 +6883:3:2180 +6884:0:2565 +6885:3:2192 +6886:0:2565 +6887:3:2013 +6888:0:2565 +6889:2:758 +6890:0:2565 +6891:3:2014 +6892:0:2565 +6893:3:2015 +6894:3:2019 +6895:3:2020 +6896:3:2028 +6897:3:2029 +6898:3:2033 +6899:3:2034 +6900:3:2042 +6901:3:2047 +6902:3:2051 +6903:3:2052 +6904:3:2059 +6905:3:2060 +6906:3:2071 +6907:3:2079 +6908:3:2080 +6909:3:2084 +6910:3:2089 +6911:3:2090 +6912:0:2565 +6913:3:2102 +6914:0:2565 +6915:3:2104 +6916:0:2565 +6917:3:2105 +6918:3:2109 +6919:3:2110 +6920:3:2118 +6921:3:2119 +6922:3:2123 +6923:3:2124 +6924:3:2132 +6925:3:2137 +6926:3:2141 +6927:3:2142 +6928:3:2149 +6929:3:2150 +6930:3:2161 +6931:3:2169 +6932:3:2170 +6933:3:2174 +6934:3:2179 +6935:3:2180 +6936:0:2565 +6937:3:2192 +6938:0:2565 +6939:2:759 +6940:0:2565 +6941:3:2013 +6942:0:2565 +6943:3:2014 +6944:0:2565 +6945:3:2015 +6946:3:2019 +6947:3:2020 +6948:3:2028 +6949:3:2029 +6950:3:2033 +6951:3:2034 +6952:3:2042 +6953:3:2047 +6954:3:2051 +6955:3:2052 +6956:3:2059 +6957:3:2060 +6958:3:2071 +6959:3:2079 +6960:3:2080 +6961:3:2084 +6962:3:2089 +6963:3:2090 +6964:0:2565 +6965:3:2102 +6966:0:2565 +6967:3:2104 +6968:0:2565 +6969:3:2105 +6970:3:2109 +6971:3:2110 +6972:3:2118 +6973:3:2119 +6974:3:2123 +6975:3:2124 +6976:3:2132 +6977:3:2137 +6978:3:2141 +6979:3:2142 +6980:3:2149 +6981:3:2150 +6982:3:2161 +6983:3:2169 +6984:3:2170 +6985:3:2174 +6986:3:2179 +6987:3:2180 +6988:0:2565 +6989:2:760 +6990:0:2565 +6991:3:2192 +6992:0:2565 +6993:3:2013 +6994:0:2565 +6995:2:761 +6996:0:2565 +6997:2:762 +6998:0:2565 +6999:2:763 +7000:0:2565 +7001:3:2014 +7002:0:2565 +7003:3:2015 +7004:3:2019 +7005:3:2020 +7006:3:2028 +7007:3:2029 +7008:3:2033 +7009:3:2034 +7010:3:2042 +7011:3:2047 +7012:3:2051 +7013:3:2052 +7014:3:2059 +7015:3:2060 +7016:3:2071 +7017:3:2079 +7018:3:2080 +7019:3:2084 +7020:3:2089 +7021:3:2090 +7022:0:2565 +7023:3:2102 +7024:0:2565 +7025:3:2104 +7026:0:2565 +7027:3:2105 +7028:3:2109 +7029:3:2110 +7030:3:2118 +7031:3:2119 +7032:3:2123 +7033:3:2124 +7034:3:2132 +7035:3:2137 +7036:3:2141 +7037:3:2142 +7038:3:2149 +7039:3:2150 +7040:3:2161 +7041:3:2169 +7042:3:2170 +7043:3:2174 +7044:3:2179 +7045:3:2180 +7046:0:2565 +7047:3:2192 +7048:0:2565 +7049:2:765 +7050:0:2565 +7051:3:2013 +7052:0:2565 +7053:3:2014 +7054:0:2565 +7055:3:2015 +7056:3:2019 +7057:3:2020 +7058:3:2028 +7059:3:2029 +7060:3:2033 +7061:3:2034 +7062:3:2042 +7063:3:2047 +7064:3:2051 +7065:3:2052 +7066:3:2059 +7067:3:2060 +7068:3:2071 +7069:3:2079 +7070:3:2080 +7071:3:2084 +7072:3:2089 +7073:3:2090 +7074:0:2565 +7075:3:2102 +7076:0:2565 +7077:3:2104 +7078:0:2565 +7079:3:2105 +7080:3:2109 +7081:3:2110 +7082:3:2118 +7083:3:2119 +7084:3:2123 +7085:3:2124 +7086:3:2132 +7087:3:2137 +7088:3:2141 +7089:3:2142 +7090:3:2149 +7091:3:2150 +7092:3:2161 +7093:3:2169 +7094:3:2170 +7095:3:2174 +7096:3:2179 +7097:3:2180 +7098:0:2565 +7099:2:766 +7100:2:770 +7101:2:771 +7102:2:779 +7103:2:780 +7104:2:781 +7105:2:793 +7106:2:798 +7107:2:802 +7108:2:803 +7109:2:810 +7110:2:811 +7111:2:822 +7112:2:823 +7113:2:824 +7114:2:835 +7115:2:840 +7116:2:841 +7117:0:2565 +7118:3:2192 +7119:0:2565 +7120:3:2013 +7121:0:2565 +7122:3:2014 +7123:0:2565 +7124:3:2015 +7125:3:2019 +7126:3:2020 +7127:3:2028 +7128:3:2029 +7129:3:2033 +7130:3:2034 +7131:3:2042 +7132:3:2047 +7133:3:2051 +7134:3:2052 +7135:3:2059 +7136:3:2060 +7137:3:2071 +7138:3:2079 +7139:3:2080 +7140:3:2084 +7141:3:2089 +7142:3:2090 +7143:0:2565 +7144:3:2102 +7145:0:2565 +7146:3:2104 +7147:0:2565 +7148:2:853 +7149:0:2565 +7150:2:857 +7151:0:2565 +7152:2:465 +7153:0:2565 +7154:3:2105 +7155:3:2109 +7156:3:2110 +7157:3:2118 +7158:3:2119 +7159:3:2123 +7160:3:2124 +7161:3:2132 +7162:3:2137 +7163:3:2141 +7164:3:2142 +7165:3:2149 +7166:3:2150 +7167:3:2161 +7168:3:2169 +7169:3:2170 +7170:3:2174 +7171:3:2179 +7172:3:2180 +7173:0:2565 +7174:3:2192 +7175:0:2565 +7176:3:2013 +7177:0:2565 +7178:3:2014 +7179:0:2565 +7180:3:2015 +7181:3:2019 +7182:3:2020 +7183:3:2028 +7184:3:2029 +7185:3:2033 +7186:3:2034 +7187:3:2042 +7188:3:2047 +7189:3:2051 +7190:3:2052 +7191:3:2059 +7192:3:2060 +7193:3:2071 +7194:3:2079 +7195:3:2080 +7196:3:2084 +7197:3:2089 +7198:3:2090 +7199:0:2565 +7200:3:2102 +7201:0:2565 +7202:2:466 +7203:0:2565 +7204:3:2104 +7205:0:2565 +7206:3:2105 +7207:3:2109 +7208:3:2110 +7209:3:2118 +7210:3:2119 +7211:3:2123 +7212:3:2124 +7213:3:2132 +7214:3:2137 +7215:3:2141 +7216:3:2142 +7217:3:2149 +7218:3:2150 +7219:3:2161 +7220:3:2169 +7221:3:2170 +7222:3:2174 +7223:3:2179 +7224:3:2180 +7225:0:2565 +7226:3:2192 +7227:0:2565 +7228:3:2013 +7229:0:2565 +7230:3:2014 +7231:0:2565 +7232:3:2015 +7233:3:2019 +7234:3:2020 +7235:3:2028 +7236:3:2029 +7237:3:2033 +7238:3:2034 +7239:3:2042 +7240:3:2047 +7241:3:2051 +7242:3:2052 +7243:3:2059 +7244:3:2060 +7245:3:2071 +7246:3:2079 +7247:3:2080 +7248:3:2084 +7249:3:2089 +7250:3:2090 +7251:0:2565 +7252:2:467 +7253:0:2565 +7254:3:2102 +7255:0:2565 +7256:3:2104 +7257:0:2565 +7258:3:2105 +7259:3:2109 +7260:3:2110 +7261:3:2118 +7262:3:2119 +7263:3:2123 +7264:3:2124 +7265:3:2132 +7266:3:2137 +7267:3:2141 +7268:3:2142 +7269:3:2149 +7270:3:2150 +7271:3:2161 +7272:3:2169 +7273:3:2170 +7274:3:2174 +7275:3:2179 +7276:3:2180 +7277:0:2565 +7278:3:2192 +7279:0:2565 +7280:3:2013 +7281:0:2565 +7282:3:2014 +7283:0:2565 +7284:1:102 +7285:0:2565 +7286:2:468 +7287:0:2565 +7288:3:2015 +7289:3:2019 +7290:3:2020 +7291:3:2028 +7292:3:2029 +7293:3:2033 +7294:3:2034 +7295:3:2042 +7296:3:2047 +7297:3:2051 +7298:3:2052 +7299:3:2059 +7300:3:2060 +7301:3:2071 +7302:3:2079 +7303:3:2080 +7304:3:2084 +7305:3:2089 +7306:3:2090 +7307:0:2565 +7308:3:2102 +7309:0:2565 +7310:3:2104 +7311:0:2565 +7312:3:2105 +7313:3:2109 +7314:3:2110 +7315:3:2118 +7316:3:2119 +7317:3:2123 +7318:3:2124 +7319:3:2132 +7320:3:2137 +7321:3:2141 +7322:3:2142 +7323:3:2149 +7324:3:2150 +7325:3:2161 +7326:3:2169 +7327:3:2170 +7328:3:2174 +7329:3:2179 +7330:3:2180 +7331:0:2565 +7332:3:2192 +7333:0:2565 +7334:3:2013 +7335:0:2565 +7336:3:2014 +7337:0:2565 +7338:2:467 +7339:0:2565 +7340:2:468 +7341:0:2565 +7342:3:2015 +7343:3:2019 +7344:3:2020 +7345:3:2028 +7346:3:2029 +7347:3:2033 +7348:3:2034 +7349:3:2042 +7350:3:2047 +7351:3:2051 +7352:3:2052 +7353:3:2059 +7354:3:2060 +7355:3:2071 +7356:3:2079 +7357:3:2080 +7358:3:2084 +7359:3:2089 +7360:3:2090 +7361:0:2565 +7362:3:2102 +7363:0:2565 +7364:3:2104 +7365:0:2565 +7366:3:2105 +7367:3:2109 +7368:3:2110 +7369:3:2118 +7370:3:2119 +7371:3:2123 +7372:3:2124 +7373:3:2132 +7374:3:2137 +7375:3:2141 +7376:3:2142 +7377:3:2149 +7378:3:2150 +7379:3:2161 +7380:3:2169 +7381:3:2170 +7382:3:2174 +7383:3:2179 +7384:3:2180 +7385:0:2565 +7386:3:2192 +7387:0:2565 +7388:3:2013 +7389:0:2565 +7390:2:467 +7391:0:2565 +7392:1:108 +7393:0:2565 +7394:2:468 +7395:0:2565 +7396:3:2014 +7397:0:2565 +7398:3:2015 +7399:3:2019 +7400:3:2020 +7401:3:2028 +7402:3:2029 +7403:3:2033 +7404:3:2034 +7405:3:2042 +7406:3:2047 +7407:3:2051 +7408:3:2052 +7409:3:2059 +7410:3:2060 +7411:3:2071 +7412:3:2079 +7413:3:2080 +7414:3:2084 +7415:3:2089 +7416:3:2090 +7417:0:2565 +7418:3:2102 +7419:0:2565 +7420:3:2104 +7421:0:2565 +7422:3:2105 +7423:3:2109 +7424:3:2110 +7425:3:2118 +7426:3:2119 +7427:3:2123 +7428:3:2124 +7429:3:2132 +7430:3:2137 +7431:3:2141 +7432:3:2142 +7433:3:2149 +7434:3:2150 +7435:3:2161 +7436:3:2169 +7437:3:2170 +7438:3:2174 +7439:3:2179 +7440:3:2180 +7441:0:2565 +7442:3:2192 +7443:0:2565 +7444:3:2013 +7445:0:2565 +7446:2:467 +7447:0:2565 +7448:2:468 +7449:0:2565 +7450:3:2014 +7451:0:2565 +7452:3:2015 +7453:3:2019 +7454:3:2020 +7455:3:2028 +7456:3:2029 +7457:3:2033 +7458:3:2034 +7459:3:2042 +7460:3:2047 +7461:3:2051 +7462:3:2052 +7463:3:2059 +7464:3:2060 +7465:3:2071 +7466:3:2079 +7467:3:2080 +7468:3:2084 +7469:3:2089 +7470:3:2090 +7471:0:2565 +7472:3:2102 +7473:0:2565 +7474:3:2104 +7475:0:2565 +7476:3:2105 +7477:3:2109 +7478:3:2110 +7479:3:2118 +7480:3:2119 +7481:3:2123 +7482:3:2124 +7483:3:2132 +7484:3:2137 +7485:3:2141 +7486:3:2142 +7487:3:2149 +7488:3:2150 +7489:3:2161 +7490:3:2169 +7491:3:2170 +7492:3:2174 +7493:3:2179 +7494:3:2180 +7495:0:2565 +7496:3:2192 +7497:0:2565 +7498:2:467 +7499:0:2565 +7500:1:109 +7501:1:113 +7502:1:114 +7503:1:122 +7504:1:123 +7505:1:124 +7506:1:136 +7507:1:141 +7508:1:145 +7509:1:146 +7510:1:153 +7511:1:154 +7512:1:165 +7513:1:166 +7514:1:167 +7515:1:178 +7516:1:183 +7517:1:184 +7518:0:2565 +7519:3:2013 +7520:0:2565 +7521:2:468 +7522:0:2565 +7523:3:2014 +7524:0:2565 +7525:3:2015 +7526:3:2019 +7527:3:2020 +7528:3:2028 +7529:3:2029 +7530:3:2033 +7531:3:2034 +7532:3:2042 +7533:3:2047 +7534:3:2051 +7535:3:2052 +7536:3:2059 +7537:3:2060 +7538:3:2071 +7539:3:2079 +7540:3:2080 +7541:3:2084 +7542:3:2089 +7543:3:2090 +7544:0:2565 +7545:3:2102 +7546:0:2565 +7547:3:2104 +7548:0:2565 +7549:3:2105 +7550:3:2109 +7551:3:2110 +7552:3:2118 +7553:3:2119 +7554:3:2123 +7555:3:2124 +7556:3:2132 +7557:3:2137 +7558:3:2141 +7559:3:2142 +7560:3:2149 +7561:3:2150 +7562:3:2161 +7563:3:2169 +7564:3:2170 +7565:3:2174 +7566:3:2179 +7567:3:2180 +7568:0:2565 +7569:3:2192 +7570:0:2565 +7571:2:467 +7572:0:2565 +7573:3:2013 +7574:0:2565 +7575:3:2014 +7576:0:2565 +7577:3:2015 +7578:3:2019 +7579:3:2020 +7580:3:2028 +7581:3:2029 +7582:3:2033 +7583:3:2034 +7584:3:2042 +7585:3:2047 +7586:3:2051 +7587:3:2052 +7588:3:2059 +7589:3:2060 +7590:3:2071 +7591:3:2079 +7592:3:2080 +7593:3:2084 +7594:3:2089 +7595:3:2090 +7596:0:2565 +7597:3:2102 +7598:0:2565 +7599:3:2104 +7600:0:2565 +7601:3:2105 +7602:3:2109 +7603:3:2110 +7604:3:2118 +7605:3:2119 +7606:3:2123 +7607:3:2124 +7608:3:2132 +7609:3:2137 +7610:3:2141 +7611:3:2142 +7612:3:2149 +7613:3:2150 +7614:3:2161 +7615:3:2169 +7616:3:2170 +7617:3:2174 +7618:3:2179 +7619:3:2180 +7620:0:2565 +7621:1:196 +7622:0:2565 +7623:3:2192 +7624:0:2565 +7625:3:2013 +7626:0:2565 +7627:2:468 +7628:0:2565 +7629:3:2014 +7630:0:2565 +7631:3:2015 +7632:3:2019 +7633:3:2020 +7634:3:2028 +7635:3:2029 +7636:3:2033 +7637:3:2034 +7638:3:2042 +7639:3:2047 +7640:3:2051 +7641:3:2052 +7642:3:2059 +7643:3:2060 +7644:3:2071 +7645:3:2079 +7646:3:2080 +7647:3:2084 +7648:3:2089 +7649:3:2090 +7650:0:2565 +7651:3:2102 +7652:0:2565 +7653:3:2104 +7654:0:2565 +7655:3:2105 +7656:3:2109 +7657:3:2110 +7658:3:2118 +7659:3:2119 +7660:3:2123 +7661:3:2124 +7662:3:2132 +7663:3:2137 +7664:3:2141 +7665:3:2142 +7666:3:2149 +7667:3:2150 +7668:3:2161 +7669:3:2169 +7670:3:2170 +7671:3:2174 +7672:3:2179 +7673:3:2180 +7674:0:2565 +7675:3:2192 +7676:0:2565 +7677:2:469 +7678:0:2565 +7679:3:2013 +7680:0:2565 +7681:2:475 +7682:0:2565 +7683:2:476 +7684:0:2565 +7685:3:2014 +7686:0:2565 +7687:3:2015 +7688:3:2019 +7689:3:2020 +7690:3:2028 +7691:3:2029 +7692:3:2033 +7693:3:2034 +7694:3:2042 +7695:3:2047 +7696:3:2051 +7697:3:2052 +7698:3:2059 +7699:3:2060 +7700:3:2071 +7701:3:2079 +7702:3:2080 +7703:3:2084 +7704:3:2089 +7705:3:2090 +7706:0:2565 +7707:3:2102 +7708:0:2565 +7709:3:2104 +7710:0:2565 +7711:3:2105 +7712:3:2109 +7713:3:2110 +7714:3:2118 +7715:3:2119 +7716:3:2123 +7717:3:2124 +7718:3:2132 +7719:3:2137 +7720:3:2141 +7721:3:2142 +7722:3:2149 +7723:3:2150 +7724:3:2161 +7725:3:2169 +7726:3:2170 +7727:3:2174 +7728:3:2179 +7729:3:2180 +7730:0:2565 +7731:3:2192 +7732:0:2565 +7733:2:477 +7734:2:481 +7735:2:482 +7736:2:490 +7737:2:491 +7738:2:495 +7739:2:496 +7740:2:504 +7741:2:509 +7742:2:513 +7743:2:514 +7744:2:521 +7745:2:522 +7746:2:533 +7747:2:534 +7748:2:535 +7749:2:546 +7750:2:551 +7751:2:552 +7752:0:2565 +7753:3:2013 +7754:0:2565 +7755:3:2014 +7756:0:2565 +7757:3:2015 +7758:3:2019 +7759:3:2020 +7760:3:2028 +7761:3:2029 +7762:3:2033 +7763:3:2034 +7764:3:2042 +7765:3:2047 +7766:3:2051 +7767:3:2052 +7768:3:2059 +7769:3:2060 +7770:3:2071 +7771:3:2079 +7772:3:2080 +7773:3:2084 +7774:3:2089 +7775:3:2090 +7776:0:2565 +7777:3:2102 +7778:0:2565 +7779:3:2104 +7780:0:2565 +7781:3:2105 +7782:3:2109 +7783:3:2110 +7784:3:2118 +7785:3:2119 +7786:3:2123 +7787:3:2124 +7788:3:2132 +7789:3:2137 +7790:3:2141 +7791:3:2142 +7792:3:2149 +7793:3:2150 +7794:3:2161 +7795:3:2169 +7796:3:2170 +7797:3:2174 +7798:3:2179 +7799:3:2180 +7800:0:2565 +7801:2:564 +7802:0:2565 +7803:3:2192 +7804:0:2565 +7805:3:2013 +7806:0:2565 +7807:3:2014 +7808:0:2565 +7809:3:2015 +7810:3:2019 +7811:3:2020 +7812:3:2028 +7813:3:2029 +7814:3:2033 +7815:3:2034 +7816:3:2042 +7817:3:2047 +7818:3:2051 +7819:3:2052 +7820:3:2059 +7821:3:2060 +7822:3:2071 +7823:3:2079 +7824:3:2080 +7825:3:2084 +7826:3:2089 +7827:3:2090 +7828:0:2565 +7829:3:2102 +7830:0:2565 +7831:3:2104 +7832:0:2565 +7833:2:565 +7834:2:569 +7835:2:570 +7836:2:578 +7837:2:579 +7838:2:583 +7839:2:584 +7840:2:592 +7841:2:597 +7842:2:601 +7843:2:602 +7844:2:609 +7845:2:610 +7846:2:621 +7847:2:622 +7848:2:623 +7849:2:634 +7850:2:639 +7851:2:640 +7852:0:2565 +7853:2:652 +7854:0:2565 +7855:3:2105 +7856:3:2109 +7857:3:2110 +7858:3:2118 +7859:3:2119 +7860:3:2123 +7861:3:2124 +7862:3:2132 +7863:3:2137 +7864:3:2141 +7865:3:2142 +7866:3:2149 +7867:3:2150 +7868:3:2161 +7869:3:2169 +7870:3:2170 +7871:3:2174 +7872:3:2179 +7873:3:2180 +7874:0:2565 +7875:3:2192 +7876:0:2565 +7877:3:2013 +7878:0:2565 +7879:3:2014 +7880:0:2565 +7881:3:2015 +7882:3:2019 +7883:3:2020 +7884:3:2028 +7885:3:2029 +7886:3:2033 +7887:3:2034 +7888:3:2042 +7889:3:2047 +7890:3:2051 +7891:3:2052 +7892:3:2059 +7893:3:2060 +7894:3:2071 +7895:3:2079 +7896:3:2080 +7897:3:2084 +7898:3:2089 +7899:3:2090 +7900:0:2565 +7901:3:2102 +7902:0:2565 +7903:2:653 +7904:0:2565 +7905:3:2104 +7906:0:2565 +7907:3:2105 +7908:3:2109 +7909:3:2110 +7910:3:2118 +7911:3:2119 +7912:3:2123 +7913:3:2124 +7914:3:2132 +7915:3:2137 +7916:3:2141 +7917:3:2142 +7918:3:2149 +7919:3:2150 +7920:3:2161 +7921:3:2169 +7922:3:2170 +7923:3:2174 +7924:3:2179 +7925:3:2180 +7926:0:2565 +7927:3:2192 +7928:0:2565 +7929:3:2013 +7930:0:2565 +7931:3:2014 +7932:0:2565 +7933:3:2015 +7934:3:2019 +7935:3:2020 +7936:3:2028 +7937:3:2029 +7938:3:2033 +7939:3:2034 +7940:3:2042 +7941:3:2047 +7942:3:2051 +7943:3:2052 +7944:3:2059 +7945:3:2060 +7946:3:2071 +7947:3:2079 +7948:3:2080 +7949:3:2084 +7950:3:2089 +7951:3:2090 +7952:0:2565 +7953:2:654 +7954:2:658 +7955:2:659 +7956:2:667 +7957:2:668 +7958:2:672 +7959:2:673 +7960:2:681 +7961:2:686 +7962:2:690 +7963:2:691 +7964:2:698 +7965:2:699 +7966:2:710 +7967:2:711 +7968:2:712 +7969:2:723 +7970:2:728 +7971:2:729 +7972:0:2565 +7973:3:2102 +7974:0:2565 +7975:3:2104 +7976:0:2565 +7977:3:2105 +7978:3:2109 +7979:3:2110 +7980:3:2118 +7981:3:2119 +7982:3:2123 +7983:3:2124 +7984:3:2132 +7985:3:2137 +7986:3:2141 +7987:3:2142 +7988:3:2149 +7989:3:2150 +7990:3:2161 +7991:3:2169 +7992:3:2170 +7993:3:2174 +7994:3:2179 +7995:3:2180 +7996:0:2565 +7997:3:2192 +7998:0:2565 +7999:3:2013 +8000:0:2565 +8001:3:2014 +8002:0:2565 +8003:2:741 +8004:0:2565 +8005:2:750 +8006:0:2565 +8007:2:753 +8008:0:2565 +8009:3:2015 +8010:3:2019 +8011:3:2020 +8012:3:2028 +8013:3:2029 +8014:3:2033 +8015:3:2034 +8016:3:2042 +8017:3:2047 +8018:3:2051 +8019:3:2052 +8020:3:2059 +8021:3:2060 +8022:3:2071 +8023:3:2079 +8024:3:2080 +8025:3:2084 +8026:3:2089 +8027:3:2090 +8028:0:2565 +8029:3:2102 +8030:0:2565 +8031:3:2104 +8032:0:2565 +8033:3:2105 +8034:3:2109 +8035:3:2110 +8036:3:2118 +8037:3:2119 +8038:3:2123 +8039:3:2124 +8040:3:2132 +8041:3:2137 +8042:3:2141 +8043:3:2142 +8044:3:2149 +8045:3:2150 +8046:3:2161 +8047:3:2169 +8048:3:2170 +8049:3:2174 +8050:3:2179 +8051:3:2180 +8052:0:2565 +8053:3:2192 +8054:0:2565 +8055:3:2013 +8056:0:2565 +8057:2:758 +8058:0:2565 +8059:3:2014 +8060:0:2565 +8061:3:2015 +8062:3:2019 +8063:3:2020 +8064:3:2028 +8065:3:2029 +8066:3:2033 +8067:3:2034 +8068:3:2042 +8069:3:2047 +8070:3:2051 +8071:3:2052 +8072:3:2059 +8073:3:2060 +8074:3:2071 +8075:3:2079 +8076:3:2080 +8077:3:2084 +8078:3:2089 +8079:3:2090 +8080:0:2565 +8081:3:2102 +8082:0:2565 +8083:3:2104 +8084:0:2565 +8085:3:2105 +8086:3:2109 +8087:3:2110 +8088:3:2118 +8089:3:2119 +8090:3:2123 +8091:3:2124 +8092:3:2132 +8093:3:2137 +8094:3:2141 +8095:3:2142 +8096:3:2149 +8097:3:2150 +8098:3:2161 +8099:3:2169 +8100:3:2170 +8101:3:2174 +8102:3:2179 +8103:3:2180 +8104:0:2565 +8105:3:2192 +8106:0:2565 +8107:2:759 +8108:0:2565 +8109:3:2013 +8110:0:2565 +8111:3:2014 +8112:0:2565 +8113:3:2015 +8114:3:2019 +8115:3:2020 +8116:3:2028 +8117:3:2029 +8118:3:2033 +8119:3:2034 +8120:3:2042 +8121:3:2047 +8122:3:2051 +8123:3:2052 +8124:3:2059 +8125:3:2060 +8126:3:2071 +8127:3:2079 +8128:3:2080 +8129:3:2084 +8130:3:2089 +8131:3:2090 +8132:0:2565 +8133:3:2102 +8134:0:2565 +8135:3:2104 +8136:0:2565 +8137:3:2105 +8138:3:2109 +8139:3:2110 +8140:3:2118 +8141:3:2119 +8142:3:2123 +8143:3:2124 +8144:3:2132 +8145:3:2137 +8146:3:2141 +8147:3:2142 +8148:3:2149 +8149:3:2150 +8150:3:2161 +8151:3:2169 +8152:3:2170 +8153:3:2174 +8154:3:2179 +8155:3:2180 +8156:0:2565 +8157:2:760 +8158:0:2565 +8159:3:2192 +8160:0:2565 +8161:3:2013 +8162:0:2565 +8163:2:761 +8164:0:2565 +8165:2:762 +8166:0:2565 +8167:2:763 +8168:0:2565 +8169:3:2014 +8170:0:2565 +8171:3:2015 +8172:3:2019 +8173:3:2020 +8174:3:2028 +8175:3:2029 +8176:3:2033 +8177:3:2034 +8178:3:2042 +8179:3:2047 +8180:3:2051 +8181:3:2052 +8182:3:2059 +8183:3:2060 +8184:3:2071 +8185:3:2079 +8186:3:2080 +8187:3:2084 +8188:3:2089 +8189:3:2090 +8190:0:2565 +8191:3:2102 +8192:0:2565 +8193:3:2104 +8194:0:2565 +8195:3:2105 +8196:3:2109 +8197:3:2110 +8198:3:2118 +8199:3:2119 +8200:3:2123 +8201:3:2124 +8202:3:2132 +8203:3:2137 +8204:3:2141 +8205:3:2142 +8206:3:2149 +8207:3:2150 +8208:3:2161 +8209:3:2169 +8210:3:2170 +8211:3:2174 +8212:3:2179 +8213:3:2180 +8214:0:2565 +8215:3:2192 +8216:0:2565 +8217:2:765 +8218:0:2565 +8219:3:2013 +8220:0:2565 +8221:3:2014 +8222:0:2565 +8223:3:2015 +8224:3:2019 +8225:3:2020 +8226:3:2028 +8227:3:2029 +8228:3:2033 +8229:3:2034 +8230:3:2042 +8231:3:2047 +8232:3:2051 +8233:3:2052 +8234:3:2059 +8235:3:2060 +8236:3:2071 +8237:3:2079 +8238:3:2080 +8239:3:2084 +8240:3:2089 +8241:3:2090 +8242:0:2565 +8243:3:2102 +8244:0:2565 +8245:3:2104 +8246:0:2565 +8247:3:2105 +8248:3:2109 +8249:3:2110 +8250:3:2118 +8251:3:2119 +8252:3:2123 +8253:3:2124 +8254:3:2132 +8255:3:2137 +8256:3:2141 +8257:3:2142 +8258:3:2149 +8259:3:2150 +8260:3:2161 +8261:3:2169 +8262:3:2170 +8263:3:2174 +8264:3:2179 +8265:3:2180 +8266:0:2565 +8267:2:766 +8268:2:770 +8269:2:771 +8270:2:779 +8271:2:780 +8272:2:781 +8273:2:793 +8274:2:798 +8275:2:802 +8276:2:803 +8277:2:810 +8278:2:811 +8279:2:822 +8280:2:823 +8281:2:824 +8282:2:835 +8283:2:840 +8284:2:841 +8285:0:2565 +8286:3:2192 +8287:0:2565 +8288:3:2013 +8289:0:2565 +8290:3:2014 +8291:0:2565 +8292:3:2015 +8293:3:2019 +8294:3:2020 +8295:3:2028 +8296:3:2029 +8297:3:2033 +8298:3:2034 +8299:3:2042 +8300:3:2047 +8301:3:2051 +8302:3:2052 +8303:3:2059 +8304:3:2060 +8305:3:2071 +8306:3:2079 +8307:3:2080 +8308:3:2084 +8309:3:2089 +8310:3:2090 +8311:0:2565 +8312:3:2102 +8313:0:2565 +8314:3:2104 +8315:0:2565 +8316:2:853 +8317:0:2565 +8318:2:857 +8319:0:2565 +8320:2:465 +8321:0:2565 +8322:3:2105 +8323:3:2109 +8324:3:2110 +8325:3:2118 +8326:3:2119 +8327:3:2123 +8328:3:2124 +8329:3:2132 +8330:3:2137 +8331:3:2141 +8332:3:2142 +8333:3:2149 +8334:3:2150 +8335:3:2161 +8336:3:2169 +8337:3:2170 +8338:3:2174 +8339:3:2179 +8340:3:2180 +8341:0:2565 +8342:3:2192 +8343:0:2565 +8344:3:2013 +8345:0:2565 +8346:3:2014 +8347:0:2565 +8348:3:2015 +8349:3:2019 +8350:3:2020 +8351:3:2028 +8352:3:2029 +8353:3:2033 +8354:3:2034 +8355:3:2042 +8356:3:2047 +8357:3:2051 +8358:3:2052 +8359:3:2059 +8360:3:2060 +8361:3:2071 +8362:3:2079 +8363:3:2080 +8364:3:2084 +8365:3:2089 +8366:3:2090 +8367:0:2565 +8368:3:2102 +8369:0:2565 +8370:2:466 +8371:0:2565 +8372:3:2104 +8373:0:2565 +8374:3:2105 +8375:3:2109 +8376:3:2110 +8377:3:2118 +8378:3:2119 +8379:3:2123 +8380:3:2124 +8381:3:2132 +8382:3:2137 +8383:3:2141 +8384:3:2142 +8385:3:2149 +8386:3:2150 +8387:3:2161 +8388:3:2169 +8389:3:2170 +8390:3:2174 +8391:3:2179 +8392:3:2180 +8393:0:2565 +8394:3:2192 +8395:0:2565 +8396:3:2013 +8397:0:2565 +8398:3:2014 +8399:0:2565 +8400:3:2015 +8401:3:2019 +8402:3:2020 +8403:3:2028 +8404:3:2029 +8405:3:2033 +8406:3:2034 +8407:3:2042 +8408:3:2047 +8409:3:2051 +8410:3:2052 +8411:3:2059 +8412:3:2060 +8413:3:2071 +8414:3:2079 +8415:3:2080 +8416:3:2084 +8417:3:2089 +8418:3:2090 +8419:0:2565 +8420:2:467 +8421:0:2565 +8422:3:2102 +8423:0:2565 +8424:3:2104 +8425:0:2565 +8426:3:2105 +8427:3:2109 +8428:3:2110 +8429:3:2118 +8430:3:2119 +8431:3:2123 +8432:3:2124 +8433:3:2132 +8434:3:2137 +8435:3:2141 +8436:3:2142 +8437:3:2149 +8438:3:2150 +8439:3:2161 +8440:3:2169 +8441:3:2170 +8442:3:2174 +8443:3:2179 +8444:3:2180 +8445:0:2565 +8446:3:2192 +8447:0:2565 +8448:3:2013 +8449:0:2565 +8450:3:2014 +8451:0:2565 +8452:1:199 +8453:0:2565 +8454:2:468 +8455:0:2565 +8456:1:205 +8457:0:2565 +8458:3:2015 +8459:3:2019 +8460:3:2020 +8461:3:2028 +8462:3:2029 +8463:3:2033 +8464:3:2034 +8465:3:2042 +8466:3:2047 +8467:3:2051 +8468:3:2052 +8469:3:2059 +8470:3:2060 +8471:3:2071 +8472:3:2079 +8473:3:2080 +8474:3:2084 +8475:3:2089 +8476:3:2090 +8477:0:2565 +8478:3:2102 +8479:0:2565 +8480:3:2104 +8481:0:2565 +8482:3:2105 +8483:3:2109 +8484:3:2110 +8485:3:2118 +8486:3:2119 +8487:3:2123 +8488:3:2124 +8489:3:2132 +8490:3:2137 +8491:3:2141 +8492:3:2142 +8493:3:2149 +8494:3:2150 +8495:3:2161 +8496:3:2169 +8497:3:2170 +8498:3:2174 +8499:3:2179 +8500:3:2180 +8501:0:2565 +8502:3:2192 +8503:0:2565 +8504:3:2013 +8505:0:2565 +8506:3:2014 +8507:0:2565 +8508:2:467 +8509:0:2565 +8510:2:468 +8511:0:2565 +8512:3:2015 +8513:3:2019 +8514:3:2020 +8515:3:2028 +8516:3:2029 +8517:3:2033 +8518:3:2034 +8519:3:2042 +8520:3:2047 +8521:3:2051 +8522:3:2052 +8523:3:2059 +8524:3:2060 +8525:3:2071 +8526:3:2079 +8527:3:2080 +8528:3:2084 +8529:3:2089 +8530:3:2090 +8531:0:2565 +8532:3:2102 +8533:0:2565 +8534:3:2104 +8535:0:2565 +8536:3:2105 +8537:3:2109 +8538:3:2110 +8539:3:2118 +8540:3:2119 +8541:3:2123 +8542:3:2124 +8543:3:2132 +8544:3:2137 +8545:3:2141 +8546:3:2142 +8547:3:2149 +8548:3:2150 +8549:3:2161 +8550:3:2169 +8551:3:2170 +8552:3:2174 +8553:3:2179 +8554:3:2180 +8555:0:2565 +8556:3:2192 +8557:0:2565 +8558:3:2013 +8559:0:2565 +8560:2:467 +8561:0:2565 +8562:1:206 +8563:0:2565 +8564:2:468 +8565:0:2565 +8566:2:467 +8567:0:2565 +8568:3:2014 +8569:0:2565 +8570:3:2015 +8571:3:2019 +8572:3:2020 +8573:3:2028 +8574:3:2029 +8575:3:2033 +8576:3:2034 +8577:3:2042 +8578:3:2047 +8579:3:2051 +8580:3:2052 +8581:3:2059 +8582:3:2060 +8583:3:2071 +8584:3:2079 +8585:3:2080 +8586:3:2084 +8587:3:2089 +8588:3:2090 +8589:0:2565 +8590:3:2102 +8591:0:2565 +8592:3:2104 +8593:0:2565 +8594:3:2105 +8595:3:2109 +8596:3:2110 +8597:3:2118 +8598:3:2119 +8599:3:2123 +8600:3:2124 +8601:3:2132 +8602:3:2137 +8603:3:2141 +8604:3:2142 +8605:3:2149 +8606:3:2150 +8607:3:2161 +8608:3:2169 +8609:3:2170 +8610:3:2174 +8611:3:2179 +8612:3:2180 +8613:0:2565 +8614:3:2192 +8615:0:2565 +8616:3:2013 +8617:0:2565 +8618:1:207 +8619:1:211 +8620:1:212 +8621:1:220 +8622:1:221 +8623:1:222 +8624:1:234 +8625:1:239 +8626:1:243 +8627:1:244 +8628:1:251 +8629:1:252 +8630:1:263 +8631:1:264 +8632:1:265 +8633:1:276 +8634:1:281 +8635:1:282 +8636:0:2565 +8637:3:2014 +8638:0:2565 +8639:3:2015 +8640:3:2019 +8641:3:2020 +8642:3:2028 +8643:3:2029 +8644:3:2033 +8645:3:2034 +8646:3:2042 +8647:3:2047 +8648:3:2051 +8649:3:2052 +8650:3:2059 +8651:3:2060 +8652:3:2071 +8653:3:2079 +8654:3:2080 +8655:3:2084 +8656:3:2089 +8657:3:2090 +8658:0:2565 +8659:1:294 +8660:0:2565 +8661:3:2102 +8662:0:2565 +8663:2:468 +8664:0:2565 +8665:3:2104 +8666:0:2565 +8667:3:2105 +8668:3:2109 +8669:3:2110 +8670:3:2118 +8671:3:2119 +8672:3:2123 +8673:3:2124 +8674:3:2132 +8675:3:2137 +8676:3:2141 +8677:3:2142 +8678:3:2149 +8679:3:2150 +8680:3:2161 +8681:3:2169 +8682:3:2170 +8683:3:2174 +8684:3:2179 +8685:3:2180 +8686:0:2565 +8687:3:2192 +8688:0:2565 +8689:3:2013 +8690:0:2565 +8691:3:2014 +8692:0:2565 +8693:3:2015 +8694:3:2019 +8695:3:2020 +8696:3:2028 +8697:3:2029 +8698:3:2033 +8699:3:2034 +8700:3:2042 +8701:3:2047 +8702:3:2051 +8703:3:2052 +8704:3:2059 +8705:3:2060 +8706:3:2071 +8707:3:2079 +8708:3:2080 +8709:3:2084 +8710:3:2089 +8711:3:2090 +8712:0:2565 +8713:2:469 +8714:0:2565 +8715:3:2102 +8716:0:2565 +8717:2:475 +8718:0:2565 +8719:3:2104 +8720:0:2565 +8721:3:2105 +8722:3:2109 +8723:3:2110 +8724:3:2118 +8725:3:2119 +8726:3:2123 +8727:3:2124 +8728:3:2132 +8729:3:2137 +8730:3:2141 +8731:3:2142 +8732:3:2149 +8733:3:2150 +8734:3:2161 +8735:3:2169 +8736:3:2170 +8737:3:2174 +8738:3:2179 +8739:3:2180 +8740:0:2565 +8741:3:2192 +8742:0:2565 +8743:3:2013 +8744:0:2565 +8745:1:295 +8746:0:2565 +8747:2:476 +8748:0:2565 +8749:1:296 +8750:0:2565 +8751:3:2014 +8752:0:2565 +8753:3:2015 +8754:3:2019 +8755:3:2020 +8756:3:2028 +8757:3:2029 +8758:3:2033 +8759:3:2034 +8760:3:2042 +8761:3:2047 +8762:3:2051 +8763:3:2052 +8764:3:2059 +8765:3:2060 +8766:3:2071 +8767:3:2079 +8768:3:2080 +8769:3:2084 +8770:3:2089 +8771:3:2090 +8772:0:2565 +8773:3:2102 +8774:0:2565 +8775:3:2104 +8776:0:2565 +8777:3:2105 +8778:3:2109 +8779:3:2110 +8780:3:2118 +8781:3:2119 +8782:3:2123 +8783:3:2124 +8784:3:2132 +8785:3:2137 +8786:3:2141 +8787:3:2142 +8788:3:2149 +8789:3:2150 +8790:3:2161 +8791:3:2169 +8792:3:2170 +8793:3:2174 +8794:3:2179 +8795:3:2180 +8796:0:2565 +8797:3:2192 +8798:0:2565 +8799:3:2013 +8800:0:2565 +8801:1:295 +8802:0:2565 +8803:3:2014 +8804:0:2565 +8805:3:2015 +8806:3:2019 +8807:3:2020 +8808:3:2028 +8809:3:2029 +8810:3:2033 +8811:3:2034 +8812:3:2042 +8813:3:2047 +8814:3:2051 +8815:3:2052 +8816:3:2059 +8817:3:2060 +8818:3:2071 +8819:3:2079 +8820:3:2080 +8821:3:2084 +8822:3:2089 +8823:3:2090 +8824:0:2565 +8825:3:2102 +8826:0:2565 +8827:3:2104 +8828:0:2565 +8829:3:2105 +8830:3:2109 +8831:3:2110 +8832:3:2118 +8833:3:2119 +8834:3:2123 +8835:3:2124 +8836:3:2132 +8837:3:2137 +8838:3:2141 +8839:3:2142 +8840:3:2149 +8841:3:2150 +8842:3:2161 +8843:3:2169 +8844:3:2170 +8845:3:2174 +8846:3:2179 +8847:3:2180 +8848:0:2565 +8849:3:2192 +8850:0:2565 +8851:2:477 +8852:2:481 +8853:2:482 +8854:2:490 +8855:2:491 +8856:2:495 +8857:2:496 +8858:2:504 +8859:2:509 +8860:2:513 +8861:2:514 +8862:2:521 +8863:2:522 +8864:2:533 +8865:2:534 +8866:2:535 +8867:2:546 +8868:2:551 +8869:2:552 +8870:0:2565 +8871:3:2013 +8872:0:2565 +8873:1:296 +8874:0:2565 +8875:3:2014 +8876:0:2565 +8877:3:2015 +8878:3:2019 +8879:3:2020 +8880:3:2028 +8881:3:2029 +8882:3:2033 +8883:3:2034 +8884:3:2042 +8885:3:2047 +8886:3:2051 +8887:3:2052 +8888:3:2059 +8889:3:2060 +8890:3:2071 +8891:3:2079 +8892:3:2080 +8893:3:2084 +8894:3:2089 +8895:3:2090 +8896:0:2565 +8897:3:2102 +8898:0:2565 +8899:3:2104 +8900:0:2565 +8901:3:2105 +8902:3:2109 +8903:3:2110 +8904:3:2118 +8905:3:2119 +8906:3:2123 +8907:3:2124 +8908:3:2132 +8909:3:2137 +8910:3:2141 +8911:3:2142 +8912:3:2149 +8913:3:2150 +8914:3:2161 +8915:3:2169 +8916:3:2170 +8917:3:2174 +8918:3:2179 +8919:3:2180 +8920:0:2565 +8921:3:2192 +8922:0:2565 +8923:3:2013 +8924:0:2565 +8925:1:295 +8926:0:2565 +8927:3:2014 +8928:0:2565 +8929:3:2015 +8930:3:2019 +8931:3:2020 +8932:3:2028 +8933:3:2029 +8934:3:2033 +8935:3:2034 +8936:3:2042 +8937:3:2047 +8938:3:2051 +8939:3:2052 +8940:3:2059 +8941:3:2060 +8942:3:2071 +8943:3:2079 +8944:3:2080 +8945:3:2084 +8946:3:2089 +8947:3:2090 +8948:0:2565 +8949:3:2102 +8950:0:2565 +8951:3:2104 +8952:0:2565 +8953:3:2105 +8954:3:2109 +8955:3:2110 +8956:3:2118 +8957:3:2119 +8958:3:2123 +8959:3:2124 +8960:3:2132 +8961:3:2137 +8962:3:2141 +8963:3:2142 +8964:3:2149 +8965:3:2150 +8966:3:2161 +8967:3:2169 +8968:3:2170 +8969:3:2174 +8970:3:2179 +8971:3:2180 +8972:0:2565 +8973:3:2192 +8974:0:2565 +8975:2:564 +8976:0:2565 +8977:3:2013 +8978:0:2565 +8979:1:296 +8980:0:2565 +8981:3:2014 +8982:0:2565 +8983:3:2015 +8984:3:2019 +8985:3:2020 +8986:3:2028 +8987:3:2029 +8988:3:2033 +8989:3:2034 +8990:3:2042 +8991:3:2047 +8992:3:2051 +8993:3:2052 +8994:3:2059 +8995:3:2060 +8996:3:2071 +8997:3:2079 +8998:3:2080 +8999:3:2084 +9000:3:2089 +9001:3:2090 +9002:0:2565 +9003:3:2102 +9004:0:2565 +9005:3:2104 +9006:0:2565 +9007:3:2105 +9008:3:2109 +9009:3:2110 +9010:3:2118 +9011:3:2119 +9012:3:2123 +9013:3:2124 +9014:3:2132 +9015:3:2137 +9016:3:2141 +9017:3:2142 +9018:3:2149 +9019:3:2150 +9020:3:2161 +9021:3:2169 +9022:3:2170 +9023:3:2174 +9024:3:2179 +9025:3:2180 +9026:0:2565 +9027:3:2192 +9028:0:2565 +9029:3:2013 +9030:0:2565 +9031:1:295 +9032:0:2565 +9033:3:2014 +9034:0:2565 +9035:3:2015 +9036:3:2019 +9037:3:2020 +9038:3:2028 +9039:3:2029 +9040:3:2033 +9041:3:2034 +9042:3:2042 +9043:3:2047 +9044:3:2051 +9045:3:2052 +9046:3:2059 +9047:3:2060 +9048:3:2071 +9049:3:2079 +9050:3:2080 +9051:3:2084 +9052:3:2089 +9053:3:2090 +9054:0:2565 +9055:3:2102 +9056:0:2565 +9057:3:2104 +9058:0:2565 +9059:3:2105 +9060:3:2109 +9061:3:2110 +9062:3:2118 +9063:3:2119 +9064:3:2123 +9065:3:2124 +9066:3:2132 +9067:3:2137 +9068:3:2141 +9069:3:2142 +9070:3:2149 +9071:3:2150 +9072:3:2161 +9073:3:2169 +9074:3:2170 +9075:3:2174 +9076:3:2179 +9077:3:2180 +9078:0:2565 +9079:3:2192 +9080:0:2565 +9081:2:565 +9082:2:569 +9083:2:570 +9084:2:578 +9085:2:579 +9086:2:583 +9087:2:584 +9088:2:592 +9089:2:597 +9090:2:601 +9091:2:602 +9092:2:609 +9093:2:610 +9094:2:621 +9095:2:622 +9096:2:623 +9097:2:634 +9098:2:639 +9099:2:640 +9100:0:2565 +9101:3:2013 +9102:0:2565 +9103:2:652 +9104:0:2565 +9105:1:296 +9106:0:2565 +9107:3:2014 +9108:0:2565 +9109:3:2015 +9110:3:2019 +9111:3:2020 +9112:3:2028 +9113:3:2029 +9114:3:2033 +9115:3:2034 +9116:3:2042 +9117:3:2047 +9118:3:2051 +9119:3:2052 +9120:3:2059 +9121:3:2060 +9122:3:2071 +9123:3:2079 +9124:3:2080 +9125:3:2084 +9126:3:2089 +9127:3:2090 +9128:0:2565 +9129:3:2102 +9130:0:2565 +9131:3:2104 +9132:0:2565 +9133:3:2105 +9134:3:2109 +9135:3:2110 +9136:3:2118 +9137:3:2119 +9138:3:2123 +9139:3:2124 +9140:3:2132 +9141:3:2137 +9142:3:2141 +9143:3:2142 +9144:3:2149 +9145:3:2150 +9146:3:2161 +9147:3:2169 +9148:3:2170 +9149:3:2174 +9150:3:2179 +9151:3:2180 +9152:0:2565 +9153:3:2192 +9154:0:2565 +9155:3:2013 +9156:0:2565 +9157:1:295 +9158:0:2565 +9159:3:2014 +9160:0:2565 +9161:3:2015 +9162:3:2019 +9163:3:2020 +9164:3:2028 +9165:3:2029 +9166:3:2033 +9167:3:2034 +9168:3:2042 +9169:3:2047 +9170:3:2051 +9171:3:2052 +9172:3:2059 +9173:3:2060 +9174:3:2071 +9175:3:2079 +9176:3:2080 +9177:3:2084 +9178:3:2089 +9179:3:2090 +9180:0:2565 +9181:3:2102 +9182:0:2565 +9183:3:2104 +9184:0:2565 +9185:3:2105 +9186:3:2109 +9187:3:2110 +9188:3:2118 +9189:3:2119 +9190:3:2123 +9191:3:2124 +9192:3:2132 +9193:3:2137 +9194:3:2141 +9195:3:2142 +9196:3:2149 +9197:3:2150 +9198:3:2161 +9199:3:2169 +9200:3:2170 +9201:3:2174 +9202:3:2179 +9203:3:2180 +9204:0:2565 +9205:3:2192 +9206:0:2565 +9207:2:653 +9208:0:2565 +9209:3:2013 +9210:0:2565 +9211:1:296 +9212:0:2565 +9213:3:2014 +9214:0:2565 +9215:3:2015 +9216:3:2019 +9217:3:2020 +9218:3:2028 +9219:3:2029 +9220:3:2033 +9221:3:2034 +9222:3:2042 +9223:3:2047 +9224:3:2051 +9225:3:2052 +9226:3:2059 +9227:3:2060 +9228:3:2071 +9229:3:2079 +9230:3:2080 +9231:3:2084 +9232:3:2089 +9233:3:2090 +9234:0:2565 +9235:3:2102 +9236:0:2565 +9237:3:2104 +9238:0:2565 +9239:3:2105 +9240:3:2109 +9241:3:2110 +9242:3:2118 +9243:3:2119 +9244:3:2123 +9245:3:2124 +9246:3:2132 +9247:3:2137 +9248:3:2141 +9249:3:2142 +9250:3:2149 +9251:3:2150 +9252:3:2161 +9253:3:2169 +9254:3:2170 +9255:3:2174 +9256:3:2179 +9257:3:2180 +9258:0:2565 +9259:3:2192 +9260:0:2565 +9261:3:2013 +9262:0:2565 +9263:1:295 +9264:0:2565 +9265:3:2014 +9266:0:2565 +9267:3:2015 +9268:3:2019 +9269:3:2020 +9270:3:2028 +9271:3:2029 +9272:3:2033 +9273:3:2034 +9274:3:2042 +9275:3:2047 +9276:3:2051 +9277:3:2052 +9278:3:2059 +9279:3:2060 +9280:3:2071 +9281:3:2079 +9282:3:2080 +9283:3:2084 +9284:3:2089 +9285:3:2090 +9286:0:2565 +9287:3:2102 +9288:0:2565 +9289:3:2104 +9290:0:2565 +9291:3:2105 +9292:3:2109 +9293:3:2110 +9294:3:2118 +9295:3:2119 +9296:3:2123 +9297:3:2124 +9298:3:2132 +9299:3:2137 +9300:3:2141 +9301:3:2142 +9302:3:2149 +9303:3:2150 +9304:3:2161 +9305:3:2169 +9306:3:2170 +9307:3:2174 +9308:3:2179 +9309:3:2180 +9310:0:2565 +9311:3:2192 +9312:0:2565 +9313:2:654 +9314:2:658 +9315:2:659 +9316:2:667 +9317:2:668 +9318:2:672 +9319:2:673 +9320:2:681 +9321:2:686 +9322:2:690 +9323:2:691 +9324:2:698 +9325:2:699 +9326:2:710 +9327:2:711 +9328:2:712 +9329:2:723 +9330:2:728 +9331:2:729 +9332:0:2565 +9333:3:2013 +9334:0:2565 +9335:1:296 +9336:0:2565 +9337:3:2014 +9338:0:2565 +9339:3:2015 +9340:3:2019 +9341:3:2020 +9342:3:2028 +9343:3:2029 +9344:3:2033 +9345:3:2034 +9346:3:2042 +9347:3:2047 +9348:3:2051 +9349:3:2052 +9350:3:2059 +9351:3:2060 +9352:3:2071 +9353:3:2079 +9354:3:2080 +9355:3:2084 +9356:3:2089 +9357:3:2090 +9358:0:2565 +9359:3:2102 +9360:0:2565 +9361:3:2104 +9362:0:2565 +9363:3:2105 +9364:3:2109 +9365:3:2110 +9366:3:2118 +9367:3:2119 +9368:3:2123 +9369:3:2124 +9370:3:2132 +9371:3:2137 +9372:3:2141 +9373:3:2142 +9374:3:2149 +9375:3:2150 +9376:3:2161 +9377:3:2169 +9378:3:2170 +9379:3:2174 +9380:3:2179 +9381:3:2180 +9382:0:2565 +9383:3:2192 +9384:0:2565 +9385:3:2013 +9386:0:2565 +9387:2:741 +9388:0:2565 +9389:2:750 +9390:0:2565 +9391:3:2014 +9392:0:2565 +9393:3:2015 +9394:3:2019 +9395:3:2020 +9396:3:2028 +9397:3:2029 +9398:3:2033 +9399:3:2034 +9400:3:2042 +9401:3:2047 +9402:3:2051 +9403:3:2052 +9404:3:2059 +9405:3:2060 +9406:3:2071 +9407:3:2079 +9408:3:2080 +9409:3:2084 +9410:3:2089 +9411:3:2090 +9412:0:2565 +9413:3:2102 +9414:0:2565 +9415:1:295 +9416:0:2565 +9417:2:753 +9418:0:2565 +9419:1:296 +9420:0:2565 +9421:3:2104 +9422:0:2565 +9423:3:2105 +9424:3:2109 +9425:3:2110 +9426:3:2118 +9427:3:2119 +9428:3:2123 +9429:3:2124 +9430:3:2132 +9431:3:2137 +9432:3:2141 +9433:3:2142 +9434:3:2149 +9435:3:2150 +9436:3:2161 +9437:3:2169 +9438:3:2170 +9439:3:2174 +9440:3:2179 +9441:3:2180 +9442:0:2565 +9443:3:2192 +9444:0:2565 +9445:3:2013 +9446:0:2565 +9447:3:2014 +9448:0:2565 +9449:3:2015 +9450:3:2019 +9451:3:2020 +9452:3:2028 +9453:3:2029 +9454:3:2033 +9455:3:2034 +9456:3:2042 +9457:3:2047 +9458:3:2051 +9459:3:2052 +9460:3:2059 +9461:3:2060 +9462:3:2071 +9463:3:2079 +9464:3:2080 +9465:3:2084 +9466:3:2089 +9467:3:2090 +9468:0:2565 +9469:3:2102 +9470:0:2565 +9471:1:295 +9472:0:2565 +9473:3:2104 +9474:0:2565 +9475:3:2105 +9476:3:2109 +9477:3:2110 +9478:3:2118 +9479:3:2119 +9480:3:2123 +9481:3:2124 +9482:3:2132 +9483:3:2137 +9484:3:2141 +9485:3:2142 +9486:3:2149 +9487:3:2150 +9488:3:2161 +9489:3:2169 +9490:3:2170 +9491:3:2174 +9492:3:2179 +9493:3:2180 +9494:0:2565 +9495:3:2192 +9496:0:2565 +9497:3:2013 +9498:0:2565 +9499:3:2014 +9500:0:2565 +9501:3:2015 +9502:3:2019 +9503:3:2020 +9504:3:2028 +9505:3:2029 +9506:3:2033 +9507:3:2034 +9508:3:2042 +9509:3:2047 +9510:3:2051 +9511:3:2052 +9512:3:2059 +9513:3:2060 +9514:3:2071 +9515:3:2079 +9516:3:2080 +9517:3:2084 +9518:3:2089 +9519:3:2090 +9520:0:2565 +9521:2:758 +9522:0:2565 +9523:3:2102 +9524:0:2565 +9525:1:296 +9526:0:2565 +9527:3:2104 +9528:0:2565 +9529:3:2105 +9530:3:2109 +9531:3:2110 +9532:3:2118 +9533:3:2119 +9534:3:2123 +9535:3:2124 +9536:3:2132 +9537:3:2137 +9538:3:2141 +9539:3:2142 +9540:3:2149 +9541:3:2150 +9542:3:2161 +9543:3:2169 +9544:3:2170 +9545:3:2174 +9546:3:2179 +9547:3:2180 +9548:0:2565 +9549:3:2192 +9550:0:2565 +9551:3:2013 +9552:0:2565 +9553:3:2014 +9554:0:2565 +9555:3:2015 +9556:3:2019 +9557:3:2020 +9558:3:2028 +9559:3:2029 +9560:3:2033 +9561:3:2034 +9562:3:2042 +9563:3:2047 +9564:3:2051 +9565:3:2052 +9566:3:2059 +9567:3:2060 +9568:3:2071 +9569:3:2079 +9570:3:2080 +9571:3:2084 +9572:3:2089 +9573:3:2090 +9574:0:2565 +9575:3:2102 +9576:0:2565 +9577:1:295 +9578:0:2565 +9579:3:2104 +9580:0:2565 +9581:3:2105 +9582:3:2109 +9583:3:2110 +9584:3:2118 +9585:3:2119 +9586:3:2123 +9587:3:2124 +9588:3:2132 +9589:3:2137 +9590:3:2141 +9591:3:2142 +9592:3:2149 +9593:3:2150 +9594:3:2161 +9595:3:2169 +9596:3:2170 +9597:3:2174 +9598:3:2179 +9599:3:2180 +9600:0:2565 +9601:3:2192 +9602:0:2565 +9603:3:2013 +9604:0:2565 +9605:3:2014 +9606:0:2565 +9607:3:2015 +9608:3:2019 +9609:3:2020 +9610:3:2028 +9611:3:2029 +9612:3:2033 +9613:3:2034 +9614:3:2042 +9615:3:2047 +9616:3:2051 +9617:3:2052 +9618:3:2059 +9619:3:2060 +9620:3:2071 +9621:3:2079 +9622:3:2080 +9623:3:2084 +9624:3:2089 +9625:3:2090 +9626:0:2565 +9627:2:759 +9628:0:2565 +9629:3:2102 +9630:0:2565 +9631:1:296 +9632:0:2565 +9633:3:2104 +9634:0:2565 +9635:3:2105 +9636:3:2109 +9637:3:2110 +9638:3:2118 +9639:3:2119 +9640:3:2123 +9641:3:2124 +9642:3:2132 +9643:3:2137 +9644:3:2141 +9645:3:2142 +9646:3:2149 +9647:3:2150 +9648:3:2161 +9649:3:2169 +9650:3:2170 +9651:3:2174 +9652:3:2179 +9653:3:2180 +9654:0:2565 +9655:3:2192 +9656:0:2565 +9657:3:2013 +9658:0:2565 +9659:3:2014 +9660:0:2565 +9661:3:2015 +9662:3:2019 +9663:3:2020 +9664:3:2028 +9665:3:2029 +9666:3:2033 +9667:3:2034 +9668:3:2042 +9669:3:2047 +9670:3:2051 +9671:3:2052 +9672:3:2059 +9673:3:2060 +9674:3:2071 +9675:3:2079 +9676:3:2080 +9677:3:2084 +9678:3:2089 +9679:3:2090 +9680:0:2565 +9681:3:2102 +9682:0:2565 +9683:2:760 +9684:0:2565 +9685:2:761 +9686:0:2565 +9687:2:762 +9688:0:2565 +9689:3:2104 +9690:0:2565 +9691:3:2105 +9692:3:2109 +9693:3:2110 +9694:3:2118 +9695:3:2119 +9696:3:2123 +9697:3:2124 +9698:3:2132 +9699:3:2137 +9700:3:2141 +9701:3:2142 +9702:3:2149 +9703:3:2150 +9704:3:2161 +9705:3:2169 +9706:3:2170 +9707:3:2174 +9708:3:2179 +9709:3:2180 +9710:0:2565 +9711:3:2192 +9712:0:2565 +9713:3:2013 +9714:0:2565 +9715:1:295 +9716:0:2565 +9717:2:763 +9718:0:2565 +9719:1:296 +9720:0:2565 +9721:3:2014 +9722:0:2565 +9723:3:2015 +9724:3:2019 +9725:3:2020 +9726:3:2028 +9727:3:2029 +9728:3:2033 +9729:3:2034 +9730:3:2042 +9731:3:2047 +9732:3:2051 +9733:3:2052 +9734:3:2059 +9735:3:2060 +9736:3:2071 +9737:3:2079 +9738:3:2080 +9739:3:2084 +9740:3:2089 +9741:3:2090 +9742:0:2565 +9743:3:2102 +9744:0:2565 +9745:3:2104 +9746:0:2565 +9747:3:2105 +9748:3:2109 +9749:3:2110 +9750:3:2118 +9751:3:2119 +9752:3:2123 +9753:3:2124 +9754:3:2132 +9755:3:2137 +9756:3:2141 +9757:3:2142 +9758:3:2149 +9759:3:2150 +9760:3:2161 +9761:3:2169 +9762:3:2170 +9763:3:2174 +9764:3:2179 +9765:3:2180 +9766:0:2565 +9767:3:2192 +9768:0:2565 +9769:3:2013 +9770:0:2565 +9771:1:295 +9772:0:2565 +9773:3:2014 +9774:0:2565 +9775:3:2015 +9776:3:2019 +9777:3:2020 +9778:3:2028 +9779:3:2029 +9780:3:2033 +9781:3:2034 +9782:3:2042 +9783:3:2047 +9784:3:2051 +9785:3:2052 +9786:3:2059 +9787:3:2060 +9788:3:2071 +9789:3:2079 +9790:3:2080 +9791:3:2084 +9792:3:2089 +9793:3:2090 +9794:0:2565 +9795:3:2102 +9796:0:2565 +9797:3:2104 +9798:0:2565 +9799:3:2105 +9800:3:2109 +9801:3:2110 +9802:3:2118 +9803:3:2119 +9804:3:2123 +9805:3:2124 +9806:3:2132 +9807:3:2137 +9808:3:2141 +9809:3:2142 +9810:3:2149 +9811:3:2150 +9812:3:2161 +9813:3:2169 +9814:3:2170 +9815:3:2174 +9816:3:2179 +9817:3:2180 +9818:0:2565 +9819:3:2192 +9820:0:2565 +9821:2:765 +9822:0:2565 +9823:3:2013 +9824:0:2565 +9825:1:296 +9826:0:2565 +9827:3:2014 +9828:0:2565 +9829:3:2015 +9830:3:2019 +9831:3:2020 +9832:3:2028 +9833:3:2029 +9834:3:2033 +9835:3:2034 +9836:3:2042 +9837:3:2047 +9838:3:2051 +9839:3:2052 +9840:3:2059 +9841:3:2060 +9842:3:2071 +9843:3:2079 +9844:3:2080 +9845:3:2084 +9846:3:2089 +9847:3:2090 +9848:0:2565 +9849:3:2102 +9850:0:2565 +9851:3:2104 +9852:0:2565 +9853:3:2105 +9854:3:2109 +9855:3:2110 +9856:3:2118 +9857:3:2119 +9858:3:2123 +9859:3:2124 +9860:3:2132 +9861:3:2137 +9862:3:2141 +9863:3:2142 +9864:3:2149 +9865:3:2150 +9866:3:2161 +9867:3:2169 +9868:3:2170 +9869:3:2174 +9870:3:2179 +9871:3:2180 +9872:0:2565 +9873:3:2192 +9874:0:2565 +9875:3:2013 +9876:0:2565 +9877:2:766 +9878:2:770 +9879:2:771 +9880:2:779 +9881:2:788 +9882:2:789 +9883:2:793 +9884:2:798 +9885:2:802 +9886:2:803 +9887:2:810 +9888:2:811 +9889:2:822 +9890:2:823 +9891:2:826 +9892:2:827 +9893:2:835 +9894:2:840 +9895:2:841 +9896:0:2565 +9897:3:2014 +9898:0:2565 +9899:3:2015 +9900:3:2019 +9901:3:2020 +9902:3:2028 +9903:3:2029 +9904:3:2033 +9905:3:2034 +9906:3:2042 +9907:3:2047 +9908:3:2051 +9909:3:2052 +9910:3:2059 +9911:3:2060 +9912:3:2071 +9913:3:2079 +9914:3:2080 +9915:3:2084 +9916:3:2089 +9917:3:2090 +9918:0:2565 +9919:3:2102 +9920:0:2565 +9921:3:2104 +9922:0:2565 +9923:3:2105 +9924:3:2109 +9925:3:2110 +9926:3:2118 +9927:3:2119 +9928:3:2123 +9929:3:2124 +9930:3:2132 +9931:3:2137 +9932:3:2141 +9933:3:2142 +9934:3:2149 +9935:3:2150 +9936:3:2161 +9937:3:2169 +9938:3:2170 +9939:3:2174 +9940:3:2179 +9941:3:2180 +9942:0:2565 +9943:3:2192 +9944:0:2565 +9945:2:853 +9946:0:2565 +9947:3:2013 +9948:0:2565 +9949:2:857 +9950:0:2565 +9951:2:465 +9952:0:2565 +9953:3:2014 +9954:0:2565 +9955:3:2015 +9956:3:2019 +9957:3:2020 +9958:3:2028 +9959:3:2029 +9960:3:2033 +9961:3:2034 +9962:3:2042 +9963:3:2047 +9964:3:2051 +9965:3:2052 +9966:3:2059 +9967:3:2060 +9968:3:2071 +9969:3:2079 +9970:3:2080 +9971:3:2084 +9972:3:2089 +9973:3:2090 +9974:0:2565 +9975:3:2102 +9976:0:2565 +9977:3:2104 +9978:0:2565 +9979:3:2105 +9980:3:2109 +9981:3:2110 +9982:3:2118 +9983:3:2119 +9984:3:2123 +9985:3:2124 +9986:3:2132 +9987:3:2137 +9988:3:2141 +9989:3:2142 +9990:3:2149 +9991:3:2150 +9992:3:2161 +9993:3:2169 +9994:3:2170 +9995:3:2174 +9996:3:2179 +9997:3:2180 +9998:0:2565 +9999:3:2192 +10000:0:2565 +10001:2:466 +10002:0:2565 +10003:3:2013 +10004:0:2565 +10005:3:2014 +10006:0:2565 +10007:3:2015 +10008:3:2019 +10009:3:2020 +10010:3:2028 +10011:3:2029 +10012:3:2033 +10013:3:2034 +10014:3:2042 +10015:3:2047 +10016:3:2051 +10017:3:2052 +10018:3:2059 +10019:3:2060 +10020:3:2071 +10021:3:2079 +10022:3:2080 +10023:3:2084 +10024:3:2089 +10025:3:2090 +10026:0:2565 +10027:3:2102 +10028:0:2565 +10029:3:2104 +10030:0:2565 +10031:3:2105 +10032:3:2109 +10033:3:2110 +10034:3:2118 +10035:3:2119 +10036:3:2123 +10037:3:2124 +10038:3:2132 +10039:3:2137 +10040:3:2141 +10041:3:2142 +10042:3:2149 +10043:3:2150 +10044:3:2161 +10045:3:2169 +10046:3:2170 +10047:3:2174 +10048:3:2179 +10049:3:2180 +10050:0:2565 +10051:2:467 +10052:0:2565 +10053:3:2192 +10054:0:2565 +10055:3:2013 +10056:0:2565 +10057:3:2014 +10058:0:2565 +10059:3:2015 +10060:3:2019 +10061:3:2020 +10062:3:2028 +10063:3:2029 +10064:3:2033 +10065:3:2034 +10066:3:2042 +10067:3:2047 +10068:3:2051 +10069:3:2052 +10070:3:2059 +10071:3:2060 +10072:3:2071 +10073:3:2079 +10074:3:2080 +10075:3:2084 +10076:3:2089 +10077:3:2090 +10078:0:2565 +10079:3:2102 +10080:0:2565 +10081:3:2104 +10082:0:2565 +10083:1:297 +10084:0:2565 +10085:2:468 +10086:0:2565 +10087:3:2105 +10088:3:2109 +10089:3:2110 +10090:3:2118 +10091:3:2119 +10092:3:2123 +10093:3:2124 +10094:3:2132 +10095:3:2137 +10096:3:2141 +10097:3:2142 +10098:3:2149 +10099:3:2150 +10100:3:2161 +10101:3:2169 +10102:3:2170 +10103:3:2174 +10104:3:2179 +10105:3:2180 +10106:0:2565 +10107:3:2192 +10108:0:2565 +10109:3:2013 +10110:0:2565 +10111:3:2014 +10112:0:2565 +10113:3:2015 +10114:3:2019 +10115:3:2020 +10116:3:2028 +10117:3:2029 +10118:3:2033 +10119:3:2034 +10120:3:2042 +10121:3:2047 +10122:3:2051 +10123:3:2052 +10124:3:2059 +10125:3:2060 +10126:3:2071 +10127:3:2079 +10128:3:2080 +10129:3:2084 +10130:3:2089 +10131:3:2090 +10132:0:2565 +10133:3:2102 +10134:0:2565 +10135:3:2104 +10136:0:2565 +10137:2:467 +10138:0:2565 +10139:2:468 +10140:0:2565 +10141:3:2105 +10142:3:2109 +10143:3:2110 +10144:3:2118 +10145:3:2119 +10146:3:2123 +10147:3:2124 +10148:3:2132 +10149:3:2137 +10150:3:2141 +10151:3:2142 +10152:3:2149 +10153:3:2150 +10154:3:2161 +10155:3:2169 +10156:3:2170 +10157:3:2174 +10158:3:2179 +10159:3:2180 +10160:0:2565 +10161:3:2192 +10162:0:2565 +10163:3:2013 +10164:0:2565 +10165:3:2014 +10166:0:2565 +10167:3:2015 +10168:3:2019 +10169:3:2020 +10170:3:2028 +10171:3:2029 +10172:3:2033 +10173:3:2034 +10174:3:2042 +10175:3:2047 +10176:3:2051 +10177:3:2052 +10178:3:2059 +10179:3:2060 +10180:3:2071 +10181:3:2079 +10182:3:2080 +10183:3:2084 +10184:3:2089 +10185:3:2090 +10186:0:2565 +10187:3:2102 +10188:0:2565 +10189:2:467 +10190:0:2565 +10191:1:303 +10192:0:2565 +10193:2:468 +10194:0:2565 +10195:1:312 +10196:0:2565 +10197:3:2104 +10198:0:2565 +10199:3:2105 +10200:3:2109 +10201:3:2110 +10202:3:2118 +10203:3:2119 +10204:3:2123 +10205:3:2124 +10206:3:2132 +10207:3:2137 +10208:3:2141 +10209:3:2142 +10210:3:2149 +10211:3:2150 +10212:3:2161 +10213:3:2169 +10214:3:2170 +10215:3:2174 +10216:3:2179 +10217:3:2180 +10218:0:2565 +10219:3:2192 +10220:0:2565 +10221:3:2013 +10222:0:2565 +10223:3:2014 +10224:0:2565 +10225:3:2015 +10226:3:2019 +10227:3:2020 +10228:3:2028 +10229:3:2029 +10230:3:2033 +10231:3:2034 +10232:3:2042 +10233:3:2047 +10234:3:2051 +10235:3:2052 +10236:3:2059 +10237:3:2060 +10238:3:2071 +10239:3:2079 +10240:3:2080 +10241:3:2084 +10242:3:2089 +10243:3:2090 +10244:0:2565 +10245:3:2102 +10246:0:2565 +10247:2:467 +10248:0:2565 +10249:2:468 +10250:0:2565 +10251:3:2104 +10252:0:2565 +10253:3:2105 +10254:3:2109 +10255:3:2110 +10256:3:2118 +10257:3:2119 +10258:3:2123 +10259:3:2124 +10260:3:2132 +10261:3:2137 +10262:3:2141 +10263:3:2142 +10264:3:2149 +10265:3:2150 +10266:3:2161 +10267:3:2169 +10268:3:2170 +10269:3:2174 +10270:3:2179 +10271:3:2180 +10272:0:2565 +10273:3:2192 +10274:0:2565 +10275:3:2013 +10276:0:2565 +10277:3:2014 +10278:0:2565 +10279:3:2015 +10280:3:2019 +10281:3:2020 +10282:3:2028 +10283:3:2029 +10284:3:2033 +10285:3:2034 +10286:3:2042 +10287:3:2047 +10288:3:2051 +10289:3:2052 +10290:3:2059 +10291:3:2060 +10292:3:2071 +10293:3:2079 +10294:3:2080 +10295:3:2084 +10296:3:2089 +10297:3:2090 +10298:0:2565 +10299:2:467 +10300:0:2565 +10301:1:314 +10302:0:2565 +10303:3:2102 +10304:0:2565 +10305:2:468 +10306:0:2565 +10307:3:2104 +10308:0:2565 +10309:3:2105 +10310:3:2109 +10311:3:2110 +10312:3:2118 +10313:3:2119 +10314:3:2123 +10315:3:2124 +10316:3:2132 +10317:3:2137 +10318:3:2141 +10319:3:2142 +10320:3:2149 +10321:3:2150 +10322:3:2161 +10323:3:2169 +10324:3:2170 +10325:3:2174 +10326:3:2179 +10327:3:2180 +10328:0:2565 +10329:3:2192 +10330:0:2565 +10331:3:2013 +10332:0:2565 +10333:3:2014 +10334:0:2565 +10335:3:2015 +10336:3:2019 +10337:3:2020 +10338:3:2028 +10339:3:2029 +10340:3:2033 +10341:3:2034 +10342:3:2042 +10343:3:2047 +10344:3:2051 +10345:3:2052 +10346:3:2059 +10347:3:2060 +10348:3:2071 +10349:3:2079 +10350:3:2080 +10351:3:2084 +10352:3:2089 +10353:3:2090 +10354:0:2565 +10355:2:469 +10356:0:2565 +10357:3:2102 +10358:0:2565 +10359:2:475 +10360:0:2565 +10361:2:476 +10362:0:2565 +10363:3:2104 +10364:0:2565 +10365:3:2105 +10366:3:2109 +10367:3:2110 +10368:3:2118 +10369:3:2119 +10370:3:2123 +10371:3:2124 +10372:3:2132 +10373:3:2137 +10374:3:2141 +10375:3:2142 +10376:3:2149 +10377:3:2150 +10378:3:2161 +10379:3:2169 +10380:3:2170 +10381:3:2174 +10382:3:2179 +10383:3:2180 +10384:0:2565 +10385:3:2192 +10386:0:2565 +10387:3:2013 +10388:0:2565 +10389:3:2014 +10390:0:2565 +10391:3:2015 +10392:3:2019 +10393:3:2020 +10394:3:2028 +10395:3:2029 +10396:3:2033 +10397:3:2034 +10398:3:2042 +10399:3:2047 +10400:3:2051 +10401:3:2052 +10402:3:2059 +10403:3:2060 +10404:3:2071 +10405:3:2079 +10406:3:2080 +10407:3:2084 +10408:3:2089 +10409:3:2090 +10410:0:2565 +10411:2:477 +10412:2:481 +10413:2:482 +10414:2:490 +10415:2:499 +10416:2:500 +10417:2:504 +10418:2:509 +10419:2:513 +10420:2:514 +10421:2:521 +10422:2:522 +10423:2:533 +10424:2:534 +10425:2:537 +10426:2:538 +10427:2:546 +10428:2:551 +10429:2:552 +10430:0:2565 +10431:3:2102 +10432:0:2565 +10433:3:2104 +10434:0:2565 +10435:3:2105 +10436:3:2109 +10437:3:2110 +10438:3:2118 +10439:3:2119 +10440:3:2123 +10441:3:2124 +10442:3:2132 +10443:3:2137 +10444:3:2141 +10445:3:2142 +10446:3:2149 +10447:3:2150 +10448:3:2161 +10449:3:2169 +10450:3:2170 +10451:3:2174 +10452:3:2179 +10453:3:2180 +10454:0:2565 +10455:3:2192 +10456:0:2565 +10457:3:2013 +10458:0:2565 +10459:3:2014 +10460:0:2565 +10461:2:564 +10462:0:2565 +10463:3:2015 +10464:3:2019 +10465:3:2020 +10466:3:2028 +10467:3:2029 +10468:3:2033 +10469:3:2034 +10470:3:2042 +10471:3:2047 +10472:3:2051 +10473:3:2052 +10474:3:2059 +10475:3:2060 +10476:3:2071 +10477:3:2079 +10478:3:2080 +10479:3:2084 +10480:3:2089 +10481:3:2090 +10482:0:2565 +10483:3:2102 +10484:0:2565 +10485:3:2104 +10486:0:2565 +10487:3:2105 +10488:3:2109 +10489:3:2110 +10490:3:2118 +10491:3:2119 +10492:3:2123 +10493:3:2124 +10494:3:2132 +10495:3:2137 +10496:3:2141 +10497:3:2142 +10498:3:2149 +10499:3:2150 +10500:3:2161 +10501:3:2169 +10502:3:2170 +10503:3:2174 +10504:3:2179 +10505:3:2180 +10506:0:2565 +10507:3:2192 +10508:0:2565 +10509:3:2013 +10510:0:2565 +10511:2:565 +10512:2:569 +10513:2:570 +10514:2:578 +10515:2:587 +10516:2:588 +10517:2:592 +10518:2:597 +10519:2:601 +10520:2:602 +10521:2:609 +10522:2:610 +10523:2:621 +10524:2:622 +10525:2:625 +10526:2:626 +10527:2:634 +10528:2:639 +10529:2:640 +10530:0:2565 +10531:2:744 +10532:0:2565 +10533:3:2014 +10534:0:2565 +10535:3:2015 +10536:3:2019 +10537:3:2020 +10538:3:2028 +10539:3:2029 +10540:3:2033 +10541:3:2034 +10542:3:2042 +10543:3:2047 +10544:3:2051 +10545:3:2052 +10546:3:2059 +10547:3:2060 +10548:3:2071 +10549:3:2079 +10550:3:2080 +10551:3:2084 +10552:3:2089 +10553:3:2090 +10554:0:2565 +10555:3:2102 +10556:0:2565 +10557:3:2104 +10558:0:2565 +10559:3:2105 +10560:3:2109 +10561:3:2110 +10562:3:2118 +10563:3:2119 +10564:3:2123 +10565:3:2124 +10566:3:2132 +10567:3:2137 +10568:3:2141 +10569:3:2142 +10570:3:2149 +10571:3:2150 +10572:3:2161 +10573:3:2169 +10574:3:2170 +10575:3:2174 +10576:3:2179 +10577:3:2180 +10578:0:2565 +10579:3:2192 +10580:0:2565 +10581:2:745 +10582:0:2565 +10583:3:2013 +10584:0:2565 +10585:2:750 +10586:0:2565 +10587:2:753 +10588:0:2565 +10589:3:2014 +10590:0:2565 +10591:3:2015 +10592:3:2019 +10593:3:2020 +10594:3:2028 +10595:3:2029 +10596:3:2033 +10597:3:2034 +10598:3:2042 +10599:3:2047 +10600:3:2051 +10601:3:2052 +10602:3:2059 +10603:3:2060 +10604:3:2071 +10605:3:2079 +10606:3:2080 +10607:3:2084 +10608:3:2089 +10609:3:2090 +10610:0:2565 +10611:3:2102 +10612:0:2565 +10613:3:2104 +10614:0:2565 +10615:3:2105 +10616:3:2109 +10617:3:2110 +10618:3:2118 +10619:3:2119 +10620:3:2123 +10621:3:2124 +10622:3:2132 +10623:3:2137 +10624:3:2141 +10625:3:2142 +10626:3:2149 +10627:3:2150 +10628:3:2161 +10629:3:2169 +10630:3:2170 +10631:3:2174 +10632:3:2179 +10633:3:2180 +10634:0:2565 +10635:3:2192 +10636:0:2565 +10637:2:758 +10638:0:2565 +10639:3:2013 +10640:0:2565 +10641:3:2014 +10642:0:2565 +10643:3:2015 +10644:3:2019 +10645:3:2020 +10646:3:2028 +10647:3:2029 +10648:3:2033 +10649:3:2034 +10650:3:2042 +10651:3:2047 +10652:3:2051 +10653:3:2052 +10654:3:2059 +10655:3:2060 +10656:3:2071 +10657:3:2079 +10658:3:2080 +10659:3:2084 +10660:3:2089 +10661:3:2090 +10662:0:2565 +10663:3:2102 +10664:0:2565 +10665:3:2104 +10666:0:2565 +10667:3:2105 +10668:3:2109 +10669:3:2110 +10670:3:2118 +10671:3:2119 +10672:3:2123 +10673:3:2124 +10674:3:2132 +10675:3:2137 +10676:3:2141 +10677:3:2142 +10678:3:2149 +10679:3:2150 +10680:3:2161 +10681:3:2169 +10682:3:2170 +10683:3:2174 +10684:3:2179 +10685:3:2180 +10686:0:2565 +10687:2:759 +10688:0:2565 +10689:3:2192 +10690:0:2565 +10691:3:2013 +10692:0:2565 +10693:3:2014 +10694:0:2565 +10695:3:2015 +10696:3:2019 +10697:3:2020 +10698:3:2028 +10699:3:2029 +10700:3:2033 +10701:3:2034 +10702:3:2042 +10703:3:2047 +10704:3:2051 +10705:3:2052 +10706:3:2059 +10707:3:2060 +10708:3:2071 +10709:3:2079 +10710:3:2080 +10711:3:2084 +10712:3:2089 +10713:3:2090 +10714:0:2565 +10715:3:2102 +10716:0:2565 +10717:3:2104 +10718:0:2565 +10719:2:760 +10720:0:2565 +10721:2:761 +10722:0:2565 +10723:2:762 +10724:0:2565 +10725:2:763 +10726:0:2565 +10727:3:2105 +10728:3:2109 +10729:3:2110 +10730:3:2118 +10731:3:2119 +10732:3:2123 +10733:3:2124 +10734:3:2132 +10735:3:2137 +10736:3:2141 +10737:3:2142 +10738:3:2149 +10739:3:2150 +10740:3:2161 +10741:3:2169 +10742:3:2170 +10743:3:2174 +10744:3:2179 +10745:3:2180 +10746:0:2565 +10747:3:2192 +10748:0:2565 +10749:3:2013 +10750:0:2565 +10751:3:2014 +10752:0:2565 +10753:3:2015 +10754:3:2019 +10755:3:2020 +10756:3:2028 +10757:3:2029 +10758:3:2033 +10759:3:2034 +10760:3:2042 +10761:3:2047 +10762:3:2051 +10763:3:2052 +10764:3:2059 +10765:3:2060 +10766:3:2071 +10767:3:2079 +10768:3:2080 +10769:3:2084 +10770:3:2089 +10771:3:2090 +10772:0:2565 +10773:3:2102 +10774:0:2565 +10775:2:765 +10776:0:2565 +10777:3:2104 +10778:0:2565 +10779:3:2105 +10780:3:2109 +10781:3:2110 +10782:3:2118 +10783:3:2119 +10784:3:2123 +10785:3:2124 +10786:3:2132 +10787:3:2137 +10788:3:2141 +10789:3:2142 +10790:3:2149 +10791:3:2150 +10792:3:2161 +10793:3:2169 +10794:3:2170 +10795:3:2174 +10796:3:2179 +10797:3:2180 +10798:0:2565 +10799:3:2192 +10800:0:2565 +10801:3:2013 +10802:0:2565 +10803:3:2014 +10804:0:2565 +10805:3:2015 +10806:3:2019 +10807:3:2020 +10808:3:2028 +10809:3:2029 +10810:3:2033 +10811:3:2034 +10812:3:2042 +10813:3:2047 +10814:3:2051 +10815:3:2052 +10816:3:2059 +10817:3:2060 +10818:3:2071 +10819:3:2079 +10820:3:2080 +10821:3:2084 +10822:3:2089 +10823:3:2090 +10824:0:2565 +10825:2:766 +10826:2:770 +10827:2:771 +10828:2:779 +10829:2:788 +10830:2:789 +10831:2:793 +10832:2:798 +10833:2:802 +10834:2:803 +10835:2:810 +10836:2:811 +10837:2:822 +10838:2:823 +10839:2:826 +10840:2:827 +10841:2:835 +10842:2:840 +10843:2:841 +10844:0:2565 +10845:3:2102 +10846:0:2565 +10847:3:2104 +10848:0:2565 +10849:3:2105 +10850:3:2109 +10851:3:2110 +10852:3:2118 +10853:3:2119 +10854:3:2123 +10855:3:2124 +10856:3:2132 +10857:3:2137 +10858:3:2141 +10859:3:2142 +10860:3:2149 +10861:3:2150 +10862:3:2161 +10863:3:2169 +10864:3:2170 +10865:3:2174 +10866:3:2179 +10867:3:2180 +10868:0:2565 +10869:3:2192 +10870:0:2565 +10871:3:2013 +10872:0:2565 +10873:3:2014 +10874:0:2565 +10875:2:853 +10876:0:2565 +10877:2:857 +10878:0:2565 +10879:2:465 +10880:0:2565 +10881:3:2015 +10882:3:2019 +10883:3:2020 +10884:3:2028 +10885:3:2029 +10886:3:2033 +10887:3:2034 +10888:3:2042 +10889:3:2047 +10890:3:2051 +10891:3:2052 +10892:3:2059 +10893:3:2060 +10894:3:2071 +10895:3:2079 +10896:3:2080 +10897:3:2084 +10898:3:2089 +10899:3:2090 +10900:0:2565 +10901:3:2102 +10902:0:2565 +10903:3:2104 +10904:0:2565 +10905:3:2105 +10906:3:2109 +10907:3:2110 +10908:3:2118 +10909:3:2119 +10910:3:2123 +10911:3:2124 +10912:3:2132 +10913:3:2137 +10914:3:2141 +10915:3:2142 +10916:3:2149 +10917:3:2150 +10918:3:2161 +10919:3:2169 +10920:3:2170 +10921:3:2174 +10922:3:2179 +10923:3:2180 +10924:0:2565 +10925:3:2192 +10926:0:2565 +10927:3:2013 +10928:0:2565 +10929:2:466 +10930:0:2565 +10931:3:2014 +10932:0:2565 +10933:3:2015 +10934:3:2019 +10935:3:2020 +10936:3:2028 +10937:3:2029 +10938:3:2033 +10939:3:2034 +10940:3:2042 +10941:3:2047 +10942:3:2051 +10943:3:2052 +10944:3:2059 +10945:3:2060 +10946:3:2071 +10947:3:2079 +10948:3:2080 +10949:3:2084 +10950:3:2089 +10951:3:2090 +10952:0:2565 +10953:3:2102 +10954:0:2565 +10955:3:2104 +10956:0:2565 +10957:3:2105 +10958:3:2109 +10959:3:2110 +10960:3:2118 +10961:3:2119 +10962:3:2123 +10963:3:2124 +10964:3:2132 +10965:3:2137 +10966:3:2141 +10967:3:2142 +10968:3:2149 +10969:3:2150 +10970:3:2161 +10971:3:2169 +10972:3:2170 +10973:3:2174 +10974:3:2179 +10975:3:2180 +10976:0:2565 +10977:3:2192 +10978:0:2565 +10979:2:467 +10980:0:2565 +10981:3:2013 +10982:0:2565 +10983:3:2014 +10984:0:2565 +10985:3:2015 +10986:3:2019 +10987:3:2020 +10988:3:2028 +10989:3:2029 +10990:3:2033 +10991:3:2034 +10992:3:2042 +10993:3:2047 +10994:3:2051 +10995:3:2052 +10996:3:2059 +10997:3:2060 +10998:3:2071 +10999:3:2079 +11000:3:2080 +11001:3:2084 +11002:3:2089 +11003:3:2090 +11004:0:2565 +11005:3:2102 +11006:0:2565 +11007:3:2104 +11008:0:2565 +11009:3:2105 +11010:3:2109 +11011:3:2110 +11012:3:2118 +11013:3:2119 +11014:3:2123 +11015:3:2124 +11016:3:2132 +11017:3:2137 +11018:3:2141 +11019:3:2142 +11020:3:2149 +11021:3:2150 +11022:3:2161 +11023:3:2169 +11024:3:2170 +11025:3:2174 +11026:3:2179 +11027:3:2180 +11028:0:2565 +11029:1:317 +11030:0:2565 +11031:3:2192 +11032:0:2565 +11033:3:2013 +11034:0:2565 +11035:2:468 +11036:0:2565 +11037:1:323 +11038:0:2565 +11039:1:324 +11040:0:2565 +11041:3:2014 +11042:0:2565 +11043:3:2015 +11044:3:2019 +11045:3:2020 +11046:3:2028 +11047:3:2029 +11048:3:2033 +11049:3:2034 +11050:3:2042 +11051:3:2047 +11052:3:2051 +11053:3:2052 +11054:3:2059 +11055:3:2060 +11056:3:2071 +11057:3:2079 +11058:3:2080 +11059:3:2084 +11060:3:2089 +11061:3:2090 +11062:0:2565 +11063:3:2102 +11064:0:2565 +11065:3:2104 +11066:0:2565 +11067:3:2105 +11068:3:2109 +11069:3:2110 +11070:3:2118 +11071:3:2119 +11072:3:2123 +11073:3:2124 +11074:3:2132 +11075:3:2137 +11076:3:2141 +11077:3:2142 +11078:3:2149 +11079:3:2150 +11080:3:2161 +11081:3:2169 +11082:3:2170 +11083:3:2174 +11084:3:2179 +11085:3:2180 +11086:0:2565 +11087:3:2192 +11088:0:2565 +11089:3:2013 +11090:0:2565 +11091:2:467 +11092:0:2565 +11093:2:468 +11094:0:2565 +11095:3:2014 +11096:0:2565 +11097:3:2015 +11098:3:2019 +11099:3:2020 +11100:3:2028 +11101:3:2029 +11102:3:2033 +11103:3:2034 +11104:3:2042 +11105:3:2047 +11106:3:2051 +11107:3:2052 +11108:3:2059 +11109:3:2060 +11110:3:2071 +11111:3:2079 +11112:3:2080 +11113:3:2084 +11114:3:2089 +11115:3:2090 +11116:0:2565 +11117:3:2102 +11118:0:2565 +11119:3:2104 +11120:0:2565 +11121:3:2105 +11122:3:2109 +11123:3:2110 +11124:3:2118 +11125:3:2119 +11126:3:2123 +11127:3:2124 +11128:3:2132 +11129:3:2137 +11130:3:2141 +11131:3:2142 +11132:3:2149 +11133:3:2150 +11134:3:2161 +11135:3:2169 +11136:3:2170 +11137:3:2174 +11138:3:2179 +11139:3:2180 +11140:0:2565 +11141:3:2192 +11142:0:2565 +11143:2:467 +11144:0:2565 +11145:1:329 +11146:0:2565 +11147:3:2013 +11148:0:2565 +11149:2:468 +11150:0:2565 +11151:3:2014 +11152:0:2565 +11153:3:2015 +11154:3:2019 +11155:3:2020 +11156:3:2028 +11157:3:2029 +11158:3:2033 +11159:3:2034 +11160:3:2042 +11161:3:2047 +11162:3:2051 +11163:3:2052 +11164:3:2059 +11165:3:2060 +11166:3:2071 +11167:3:2079 +11168:3:2080 +11169:3:2084 +11170:3:2089 +11171:3:2090 +11172:0:2565 +11173:3:2102 +11174:0:2565 +11175:3:2104 +11176:0:2565 +11177:3:2105 +11178:3:2109 +11179:3:2110 +11180:3:2118 +11181:3:2119 +11182:3:2123 +11183:3:2124 +11184:3:2132 +11185:3:2137 +11186:3:2141 +11187:3:2142 +11188:3:2149 +11189:3:2150 +11190:3:2161 +11191:3:2169 +11192:3:2170 +11193:3:2174 +11194:3:2179 +11195:3:2180 +11196:0:2565 +11197:3:2192 +11198:0:2565 +11199:2:467 +11200:0:2565 +11201:3:2013 +11202:0:2565 +11203:3:2014 +11204:0:2565 +11205:3:2015 +11206:3:2019 +11207:3:2020 +11208:3:2028 +11209:3:2029 +11210:3:2033 +11211:3:2034 +11212:3:2042 +11213:3:2047 +11214:3:2051 +11215:3:2052 +11216:3:2059 +11217:3:2060 +11218:3:2071 +11219:3:2079 +11220:3:2080 +11221:3:2084 +11222:3:2089 +11223:3:2090 +11224:0:2565 +11225:3:2102 +11226:0:2565 +11227:3:2104 +11228:0:2565 +11229:3:2105 +11230:3:2109 +11231:3:2110 +11232:3:2118 +11233:3:2119 +11234:3:2123 +11235:3:2124 +11236:3:2132 +11237:3:2137 +11238:3:2141 +11239:3:2142 +11240:3:2149 +11241:3:2150 +11242:3:2161 +11243:3:2169 +11244:3:2170 +11245:3:2174 +11246:3:2179 +11247:3:2180 +11248:0:2565 +11249:1:330 +11250:0:2565 +11251:3:2192 +11252:0:2565 +11253:3:2013 +11254:0:2565 +11255:2:468 +11256:0:2565 +11257:3:2014 +11258:0:2565 +11259:3:2015 +11260:3:2019 +11261:3:2020 +11262:3:2028 +11263:3:2029 +11264:3:2033 +11265:3:2034 +11266:3:2042 +11267:3:2047 +11268:3:2051 +11269:3:2052 +11270:3:2059 +11271:3:2060 +11272:3:2071 +11273:3:2079 +11274:3:2080 +11275:3:2084 +11276:3:2089 +11277:3:2090 +11278:0:2565 +11279:3:2102 +11280:0:2565 +11281:3:2104 +11282:0:2565 +11283:3:2105 +11284:3:2109 +11285:3:2110 +11286:3:2118 +11287:3:2119 +11288:3:2123 +11289:3:2124 +11290:3:2132 +11291:3:2137 +11292:3:2141 +11293:3:2142 +11294:3:2149 +11295:3:2150 +11296:3:2161 +11297:3:2169 +11298:3:2170 +11299:3:2174 +11300:3:2179 +11301:3:2180 +11302:0:2565 +11303:3:2192 +11304:0:2565 +11305:2:467 +11306:0:2565 +11307:3:2013 +11308:0:2565 +11309:3:2014 +11310:0:2565 +11311:3:2015 +11312:3:2019 +11313:3:2020 +11314:3:2028 +11315:3:2029 +11316:3:2033 +11317:3:2034 +11318:3:2042 +11319:3:2047 +11320:3:2051 +11321:3:2052 +11322:3:2059 +11323:3:2060 +11324:3:2071 +11325:3:2079 +11326:3:2080 +11327:3:2084 +11328:3:2089 +11329:3:2090 +11330:0:2565 +11331:3:2102 +11332:0:2565 +11333:3:2104 +11334:0:2565 +11335:3:2105 +11336:3:2109 +11337:3:2110 +11338:3:2118 +11339:3:2119 +11340:3:2123 +11341:3:2124 +11342:3:2132 +11343:3:2137 +11344:3:2141 +11345:3:2142 +11346:3:2149 +11347:3:2150 +11348:3:2161 +11349:3:2169 +11350:3:2170 +11351:3:2174 +11352:3:2179 +11353:3:2180 +11354:0:2565 +11355:1:331 +11356:0:2565 +11357:3:2192 +11358:0:2565 +11359:3:2013 +11360:0:2565 +11361:2:468 +11362:0:2565 +11363:1:332 +11364:0:2565 +11365:1:333 +11366:0:2565 +11367:1:334 +11368:0:2565 +11369:3:2014 +11370:0:2565 +11371:3:2015 +11372:3:2019 +11373:3:2020 +11374:3:2028 +11375:3:2029 +11376:3:2033 +11377:3:2034 +11378:3:2042 +11379:3:2047 +11380:3:2051 +11381:3:2052 +11382:3:2059 +11383:3:2060 +11384:3:2071 +11385:3:2079 +11386:3:2080 +11387:3:2084 +11388:3:2089 +11389:3:2090 +11390:0:2565 +11391:3:2102 +11392:0:2565 +11393:3:2104 +11394:0:2565 +11395:3:2105 +11396:3:2109 +11397:3:2110 +11398:3:2118 +11399:3:2119 +11400:3:2123 +11401:3:2124 +11402:3:2132 +11403:3:2137 +11404:3:2141 +11405:3:2142 +11406:3:2149 +11407:3:2150 +11408:3:2161 +11409:3:2169 +11410:3:2170 +11411:3:2174 +11412:3:2179 +11413:3:2180 +11414:0:2565 +11415:3:2192 +11416:0:2565 +11417:3:2013 +11418:0:2565 +11419:2:467 +11420:0:2565 +11421:2:468 +11422:0:2565 +11423:3:2014 +11424:0:2565 +11425:3:2015 +11426:3:2019 +11427:3:2020 +11428:3:2028 +11429:3:2029 +11430:3:2033 +11431:3:2034 +11432:3:2042 +11433:3:2047 +11434:3:2051 +11435:3:2052 +11436:3:2059 +11437:3:2060 +11438:3:2071 +11439:3:2079 +11440:3:2080 +11441:3:2084 +11442:3:2089 +11443:3:2090 +11444:0:2565 +11445:3:2102 +11446:0:2565 +11447:3:2104 +11448:0:2565 +11449:3:2105 +11450:3:2109 +11451:3:2110 +11452:3:2118 +11453:3:2119 +11454:3:2123 +11455:3:2124 +11456:3:2132 +11457:3:2137 +11458:3:2141 +11459:3:2142 +11460:3:2149 +11461:3:2150 +11462:3:2161 +11463:3:2169 +11464:3:2170 +11465:3:2174 +11466:3:2179 +11467:3:2180 +11468:0:2565 +11469:3:2192 +11470:0:2565 +11471:2:467 +11472:0:2565 +11473:1:336 +11474:0:2565 +11475:3:2013 +11476:0:2565 +11477:2:468 +11478:0:2565 +11479:3:2014 +11480:0:2565 +11481:3:2015 +11482:3:2019 +11483:3:2020 +11484:3:2028 +11485:3:2029 +11486:3:2033 +11487:3:2034 +11488:3:2042 +11489:3:2047 +11490:3:2051 +11491:3:2052 +11492:3:2059 +11493:3:2060 +11494:3:2071 +11495:3:2079 +11496:3:2080 +11497:3:2084 +11498:3:2089 +11499:3:2090 +11500:0:2565 +11501:3:2102 +11502:0:2565 +11503:3:2104 +11504:0:2565 +11505:3:2105 +11506:3:2109 +11507:3:2110 +11508:3:2118 +11509:3:2119 +11510:3:2123 +11511:3:2124 +11512:3:2132 +11513:3:2137 +11514:3:2141 +11515:3:2142 +11516:3:2149 +11517:3:2150 +11518:3:2161 +11519:3:2169 +11520:3:2170 +11521:3:2174 +11522:3:2179 +11523:3:2180 +11524:0:2565 +11525:3:2192 +11526:0:2565 +11527:2:469 +11528:0:2565 +11529:3:2013 +11530:0:2565 +11531:2:475 +11532:0:2565 +11533:2:476 +11534:0:2565 +11535:3:2014 +11536:0:2565 +11537:3:2015 +11538:3:2019 +11539:3:2020 +11540:3:2028 +11541:3:2029 +11542:3:2033 +11543:3:2034 +11544:3:2042 +11545:3:2047 +11546:3:2051 +11547:3:2052 +11548:3:2059 +11549:3:2060 +11550:3:2071 +11551:3:2079 +11552:3:2080 +11553:3:2084 +11554:3:2089 +11555:3:2090 +11556:0:2565 +11557:3:2102 +11558:0:2565 +11559:3:2104 +11560:0:2565 +11561:3:2105 +11562:3:2109 +11563:3:2110 +11564:3:2118 +11565:3:2119 +11566:3:2123 +11567:3:2124 +11568:3:2132 +11569:3:2137 +11570:3:2141 +11571:3:2142 +11572:3:2149 +11573:3:2150 +11574:3:2161 +11575:3:2169 +11576:3:2170 +11577:3:2174 +11578:3:2179 +11579:3:2180 +11580:0:2565 +11581:3:2192 +11582:0:2565 +11583:2:477 +11584:2:481 +11585:2:482 +11586:2:490 +11587:2:499 +11588:2:500 +11589:2:504 +11590:2:509 +11591:2:513 +11592:2:514 +11593:2:521 +11594:2:522 +11595:2:533 +11596:2:534 +11597:2:537 +11598:2:538 +11599:2:546 +11600:2:551 +11601:2:552 +11602:0:2565 +11603:3:2013 +11604:0:2565 +11605:3:2014 +11606:0:2565 +11607:3:2015 +11608:3:2019 +11609:3:2020 +11610:3:2028 +11611:3:2029 +11612:3:2033 +11613:3:2034 +11614:3:2042 +11615:3:2047 +11616:3:2051 +11617:3:2052 +11618:3:2059 +11619:3:2060 +11620:3:2071 +11621:3:2079 +11622:3:2080 +11623:3:2084 +11624:3:2089 +11625:3:2090 +11626:0:2565 +11627:3:2102 +11628:0:2565 +11629:3:2104 +11630:0:2565 +11631:3:2105 +11632:3:2109 +11633:3:2110 +11634:3:2118 +11635:3:2119 +11636:3:2123 +11637:3:2124 +11638:3:2132 +11639:3:2137 +11640:3:2141 +11641:3:2142 +11642:3:2149 +11643:3:2150 +11644:3:2161 +11645:3:2169 +11646:3:2170 +11647:3:2174 +11648:3:2179 +11649:3:2180 +11650:0:2565 +11651:2:564 +11652:0:2565 +11653:3:2192 +11654:0:2565 +11655:3:2013 +11656:0:2565 +11657:3:2014 +11658:0:2565 +11659:3:2015 +11660:3:2019 +11661:3:2020 +11662:3:2028 +11663:3:2029 +11664:3:2033 +11665:3:2034 +11666:3:2042 +11667:3:2047 +11668:3:2051 +11669:3:2052 +11670:3:2059 +11671:3:2060 +11672:3:2071 +11673:3:2079 +11674:3:2080 +11675:3:2084 +11676:3:2089 +11677:3:2090 +11678:0:2565 +11679:3:2102 +11680:0:2565 +11681:3:2104 +11682:0:2565 +11683:2:565 +11684:2:569 +11685:2:570 +11686:2:578 +11687:2:587 +11688:2:588 +11689:2:592 +11690:2:597 +11691:2:601 +11692:2:602 +11693:2:609 +11694:2:610 +11695:2:621 +11696:2:622 +11697:2:625 +11698:2:626 +11699:2:634 +11700:2:639 +11701:2:640 +11702:0:2565 +11703:2:744 +11704:0:2565 +11705:3:2105 +11706:3:2109 +11707:3:2110 +11708:3:2118 +11709:3:2119 +11710:3:2123 +11711:3:2124 +11712:3:2132 +11713:3:2137 +11714:3:2141 +11715:3:2142 +11716:3:2149 +11717:3:2150 +11718:3:2161 +11719:3:2169 +11720:3:2170 +11721:3:2174 +11722:3:2179 +11723:3:2180 +11724:0:2565 +11725:3:2192 +11726:0:2565 +11727:3:2013 +11728:0:2565 +11729:3:2014 +11730:0:2565 +11731:3:2015 +11732:3:2019 +11733:3:2020 +11734:3:2028 +11735:3:2029 +11736:3:2033 +11737:3:2034 +11738:3:2042 +11739:3:2047 +11740:3:2051 +11741:3:2052 +11742:3:2059 +11743:3:2060 +11744:3:2071 +11745:3:2079 +11746:3:2080 +11747:3:2084 +11748:3:2089 +11749:3:2090 +11750:0:2565 +11751:3:2102 +11752:0:2565 +11753:2:745 +11754:0:2565 +11755:2:750 +11756:0:2565 +11757:2:753 +11758:0:2565 +11759:3:2104 +11760:0:2565 +11761:3:2105 +11762:3:2109 +11763:3:2110 +11764:3:2118 +11765:3:2119 +11766:3:2123 +11767:3:2124 +11768:3:2132 +11769:3:2137 +11770:3:2141 +11771:3:2142 +11772:3:2149 +11773:3:2150 +11774:3:2161 +11775:3:2169 +11776:3:2170 +11777:3:2174 +11778:3:2179 +11779:3:2180 +11780:0:2565 +11781:3:2192 +11782:0:2565 +11783:3:2013 +11784:0:2565 +11785:3:2014 +11786:0:2565 +11787:3:2015 +11788:3:2019 +11789:3:2020 +11790:3:2028 +11791:3:2029 +11792:3:2033 +11793:3:2034 +11794:3:2042 +11795:3:2047 +11796:3:2051 +11797:3:2052 +11798:3:2059 +11799:3:2060 +11800:3:2071 +11801:3:2079 +11802:3:2080 +11803:3:2084 +11804:3:2089 +11805:3:2090 +11806:0:2565 +11807:2:758 +11808:0:2565 +11809:3:2102 +11810:0:2565 +11811:3:2104 +11812:0:2565 +11813:3:2105 +11814:3:2109 +11815:3:2110 +11816:3:2118 +11817:3:2119 +11818:3:2123 +11819:3:2124 +11820:3:2132 +11821:3:2137 +11822:3:2141 +11823:3:2142 +11824:3:2149 +11825:3:2150 +11826:3:2161 +11827:3:2169 +11828:3:2170 +11829:3:2174 +11830:3:2179 +11831:3:2180 +11832:0:2565 +11833:3:2192 +11834:0:2565 +11835:3:2013 +11836:0:2565 +11837:3:2014 +11838:0:2565 +11839:2:759 +11840:0:2565 +11841:3:2015 +11842:3:2019 +11843:3:2020 +11844:3:2028 +11845:3:2029 +11846:3:2033 +11847:3:2034 +11848:3:2042 +11849:3:2047 +11850:3:2051 +11851:3:2052 +11852:3:2059 +11853:3:2060 +11854:3:2071 +11855:3:2079 +11856:3:2080 +11857:3:2084 +11858:3:2089 +11859:3:2090 +11860:0:2565 +11861:3:2102 +11862:0:2565 +11863:3:2104 +11864:0:2565 +11865:3:2105 +11866:3:2109 +11867:3:2110 +11868:3:2118 +11869:3:2119 +11870:3:2123 +11871:3:2124 +11872:3:2132 +11873:3:2137 +11874:3:2141 +11875:3:2142 +11876:3:2149 +11877:3:2150 +11878:3:2161 +11879:3:2169 +11880:3:2170 +11881:3:2174 +11882:3:2179 +11883:3:2180 +11884:0:2565 +11885:3:2192 +11886:0:2565 +11887:3:2013 +11888:0:2565 +11889:2:760 +11890:0:2565 +11891:2:761 +11892:0:2565 +11893:2:762 +11894:0:2565 +11895:2:763 +11896:0:2565 +11897:3:2014 +11898:0:2565 +11899:3:2015 +11900:3:2019 +11901:3:2020 +11902:3:2028 +11903:3:2029 +11904:3:2033 +11905:3:2034 +11906:3:2042 +11907:3:2047 +11908:3:2051 +11909:3:2052 +11910:3:2059 +11911:3:2060 +11912:3:2071 +11913:3:2079 +11914:3:2080 +11915:3:2084 +11916:3:2089 +11917:3:2090 +11918:0:2565 +11919:3:2102 +11920:0:2565 +11921:3:2104 +11922:0:2565 +11923:3:2105 +11924:3:2109 +11925:3:2110 +11926:3:2118 +11927:3:2119 +11928:3:2123 +11929:3:2124 +11930:3:2132 +11931:3:2137 +11932:3:2141 +11933:3:2142 +11934:3:2149 +11935:3:2150 +11936:3:2161 +11937:3:2169 +11938:3:2170 +11939:3:2174 +11940:3:2179 +11941:3:2180 +11942:0:2565 +11943:3:2192 +11944:0:2565 +11945:2:765 +11946:0:2565 +11947:3:2013 +11948:0:2565 +11949:3:2014 +11950:0:2565 +11951:3:2015 +11952:3:2019 +11953:3:2020 +11954:3:2028 +11955:3:2029 +11956:3:2033 +11957:3:2034 +11958:3:2042 +11959:3:2047 +11960:3:2051 +11961:3:2052 +11962:3:2059 +11963:3:2060 +11964:3:2071 +11965:3:2079 +11966:3:2080 +11967:3:2084 +11968:3:2089 +11969:3:2090 +11970:0:2565 +11971:3:2102 +11972:0:2565 +11973:3:2104 +11974:0:2565 +11975:3:2105 +11976:3:2109 +11977:3:2110 +11978:3:2118 +11979:3:2119 +11980:3:2123 +11981:3:2124 +11982:3:2132 +11983:3:2137 +11984:3:2141 +11985:3:2142 +11986:3:2149 +11987:3:2150 +11988:3:2161 +11989:3:2169 +11990:3:2170 +11991:3:2174 +11992:3:2179 +11993:3:2180 +11994:0:2565 +11995:2:766 +11996:2:770 +11997:2:771 +11998:2:779 +11999:2:788 +12000:2:789 +12001:2:793 +12002:2:798 +12003:2:802 +12004:2:803 +12005:2:810 +12006:2:811 +12007:2:822 +12008:2:823 +12009:2:826 +12010:2:827 +12011:2:835 +12012:2:840 +12013:2:841 +12014:0:2565 +12015:3:2192 +12016:0:2565 +12017:3:2013 +12018:0:2565 +12019:3:2014 +12020:0:2565 +12021:3:2015 +12022:3:2019 +12023:3:2020 +12024:3:2028 +12025:3:2029 +12026:3:2033 +12027:3:2034 +12028:3:2042 +12029:3:2047 +12030:3:2051 +12031:3:2052 +12032:3:2059 +12033:3:2060 +12034:3:2071 +12035:3:2079 +12036:3:2080 +12037:3:2084 +12038:3:2089 +12039:3:2090 +12040:0:2565 +12041:3:2102 +12042:0:2565 +12043:3:2104 +12044:0:2565 +12045:2:853 +12046:0:2565 +12047:2:857 +12048:0:2565 +12049:2:465 +12050:0:2565 +12051:3:2105 +12052:3:2109 +12053:3:2110 +12054:3:2118 +12055:3:2119 +12056:3:2123 +12057:3:2124 +12058:3:2132 +12059:3:2137 +12060:3:2141 +12061:3:2142 +12062:3:2149 +12063:3:2150 +12064:3:2161 +12065:3:2169 +12066:3:2170 +12067:3:2174 +12068:3:2179 +12069:3:2180 +12070:0:2565 +12071:3:2192 +12072:0:2565 +12073:3:2013 +12074:0:2565 +12075:3:2014 +12076:0:2565 +12077:3:2015 +12078:3:2019 +12079:3:2020 +12080:3:2028 +12081:3:2029 +12082:3:2033 +12083:3:2034 +12084:3:2042 +12085:3:2047 +12086:3:2051 +12087:3:2052 +12088:3:2059 +12089:3:2060 +12090:3:2071 +12091:3:2079 +12092:3:2080 +12093:3:2084 +12094:3:2089 +12095:3:2090 +12096:0:2565 +12097:3:2102 +12098:0:2565 +12099:2:466 +12100:0:2565 +12101:3:2104 +12102:0:2565 +12103:3:2105 +12104:3:2109 +12105:3:2110 +12106:3:2118 +12107:3:2119 +12108:3:2123 +12109:3:2124 +12110:3:2132 +12111:3:2137 +12112:3:2141 +12113:3:2142 +12114:3:2149 +12115:3:2150 +12116:3:2161 +12117:3:2169 +12118:3:2170 +12119:3:2174 +12120:3:2179 +12121:3:2180 +12122:0:2565 +12123:3:2192 +12124:0:2565 +12125:3:2013 +12126:0:2565 +12127:3:2014 +12128:0:2565 +12129:3:2015 +12130:3:2019 +12131:3:2020 +12132:3:2028 +12133:3:2029 +12134:3:2033 +12135:3:2034 +12136:3:2042 +12137:3:2047 +12138:3:2051 +12139:3:2052 +12140:3:2059 +12141:3:2060 +12142:3:2071 +12143:3:2079 +12144:3:2080 +12145:3:2084 +12146:3:2089 +12147:3:2090 +12148:0:2565 +12149:2:467 +12150:0:2565 +12151:3:2102 +12152:0:2565 +12153:3:2104 +12154:0:2565 +12155:3:2105 +12156:3:2109 +12157:3:2110 +12158:3:2118 +12159:3:2119 +12160:3:2123 +12161:3:2124 +12162:3:2132 +12163:3:2137 +12164:3:2141 +12165:3:2142 +12166:3:2149 +12167:3:2150 +12168:3:2161 +12169:3:2169 +12170:3:2170 +12171:3:2174 +12172:3:2179 +12173:3:2180 +12174:0:2565 +12175:3:2192 +12176:0:2565 +12177:3:2013 +12178:0:2565 +12179:3:2014 +12180:0:2565 +12181:1:339 +12182:0:2565 +12183:2:468 +12184:0:2565 +12185:3:2015 +12186:3:2019 +12187:3:2020 +12188:3:2028 +12189:3:2029 +12190:3:2033 +12191:3:2034 +12192:3:2042 +12193:3:2047 +12194:3:2051 +12195:3:2052 +12196:3:2059 +12197:3:2060 +12198:3:2071 +12199:3:2079 +12200:3:2080 +12201:3:2084 +12202:3:2089 +12203:3:2090 +12204:0:2565 +12205:3:2102 +12206:0:2565 +12207:3:2104 +12208:0:2565 +12209:3:2105 +12210:3:2109 +12211:3:2110 +12212:3:2118 +12213:3:2119 +12214:3:2123 +12215:3:2124 +12216:3:2132 +12217:3:2137 +12218:3:2141 +12219:3:2142 +12220:3:2149 +12221:3:2150 +12222:3:2161 +12223:3:2169 +12224:3:2170 +12225:3:2174 +12226:3:2179 +12227:3:2180 +12228:0:2565 +12229:3:2192 +12230:0:2565 +12231:3:2013 +12232:0:2565 +12233:3:2014 +12234:0:2565 +12235:2:467 +12236:0:2565 +12237:2:468 +12238:0:2565 +12239:3:2015 +12240:3:2019 +12241:3:2020 +12242:3:2028 +12243:3:2029 +12244:3:2033 +12245:3:2034 +12246:3:2042 +12247:3:2047 +12248:3:2051 +12249:3:2052 +12250:3:2059 +12251:3:2060 +12252:3:2071 +12253:3:2079 +12254:3:2080 +12255:3:2084 +12256:3:2089 +12257:3:2090 +12258:0:2565 +12259:3:2102 +12260:0:2565 +12261:3:2104 +12262:0:2565 +12263:3:2105 +12264:3:2109 +12265:3:2110 +12266:3:2118 +12267:3:2119 +12268:3:2123 +12269:3:2124 +12270:3:2132 +12271:3:2137 +12272:3:2141 +12273:3:2142 +12274:3:2149 +12275:3:2150 +12276:3:2161 +12277:3:2169 +12278:3:2170 +12279:3:2174 +12280:3:2179 +12281:3:2180 +12282:0:2565 +12283:3:2192 +12284:0:2565 +12285:3:2013 +12286:0:2565 +12287:2:467 +12288:0:2565 +12289:1:345 +12290:0:2565 +12291:2:468 +12292:0:2565 +12293:3:2014 +12294:0:2565 +12295:3:2015 +12296:3:2019 +12297:3:2020 +12298:3:2028 +12299:3:2029 +12300:3:2033 +12301:3:2034 +12302:3:2042 +12303:3:2047 +12304:3:2051 +12305:3:2052 +12306:3:2059 +12307:3:2060 +12308:3:2071 +12309:3:2079 +12310:3:2080 +12311:3:2084 +12312:3:2089 +12313:3:2090 +12314:0:2565 +12315:3:2102 +12316:0:2565 +12317:3:2104 +12318:0:2565 +12319:3:2105 +12320:3:2109 +12321:3:2110 +12322:3:2118 +12323:3:2119 +12324:3:2123 +12325:3:2124 +12326:3:2132 +12327:3:2137 +12328:3:2141 +12329:3:2142 +12330:3:2149 +12331:3:2150 +12332:3:2161 +12333:3:2169 +12334:3:2170 +12335:3:2174 +12336:3:2179 +12337:3:2180 +12338:0:2565 +12339:3:2192 +12340:0:2565 +12341:3:2013 +12342:0:2565 +12343:2:467 +12344:0:2565 +12345:2:468 +12346:0:2565 +12347:3:2014 +12348:0:2565 +12349:3:2015 +12350:3:2019 +12351:3:2020 +12352:3:2028 +12353:3:2029 +12354:3:2033 +12355:3:2034 +12356:3:2042 +12357:3:2047 +12358:3:2051 +12359:3:2052 +12360:3:2059 +12361:3:2060 +12362:3:2071 +12363:3:2079 +12364:3:2080 +12365:3:2084 +12366:3:2089 +12367:3:2090 +12368:0:2565 +12369:3:2102 +12370:0:2565 +12371:3:2104 +12372:0:2565 +12373:3:2105 +12374:3:2109 +12375:3:2110 +12376:3:2118 +12377:3:2119 +12378:3:2123 +12379:3:2124 +12380:3:2132 +12381:3:2137 +12382:3:2141 +12383:3:2142 +12384:3:2149 +12385:3:2150 +12386:3:2161 +12387:3:2169 +12388:3:2170 +12389:3:2174 +12390:3:2179 +12391:3:2180 +12392:0:2565 +12393:3:2192 +12394:0:2565 +12395:2:467 +12396:0:2565 +12397:1:346 +12398:1:350 +12399:1:351 +12400:1:359 +12401:1:368 +12402:1:369 +12403:1:373 +12404:1:378 +12405:1:382 +12406:1:383 +12407:1:390 +12408:1:391 +12409:1:402 +12410:1:403 +12411:1:406 +12412:1:407 +12413:1:415 +12414:1:420 +12415:1:421 +12416:0:2565 +12417:3:2013 +12418:0:2565 +12419:2:468 +12420:0:2565 +12421:3:2014 +12422:0:2565 +12423:3:2015 +12424:3:2019 +12425:3:2020 +12426:3:2028 +12427:3:2029 +12428:3:2033 +12429:3:2034 +12430:3:2042 +12431:3:2047 +12432:3:2051 +12433:3:2052 +12434:3:2059 +12435:3:2060 +12436:3:2071 +12437:3:2079 +12438:3:2080 +12439:3:2084 +12440:3:2089 +12441:3:2090 +12442:0:2565 +12443:3:2102 +12444:0:2565 +12445:3:2104 +12446:0:2565 +12447:3:2105 +12448:3:2109 +12449:3:2110 +12450:3:2118 +12451:3:2119 +12452:3:2123 +12453:3:2124 +12454:3:2132 +12455:3:2137 +12456:3:2141 +12457:3:2142 +12458:3:2149 +12459:3:2150 +12460:3:2161 +12461:3:2169 +12462:3:2170 +12463:3:2174 +12464:3:2179 +12465:3:2180 +12466:0:2565 +12467:3:2192 +12468:0:2565 +12469:2:467 +12470:0:2565 +12471:3:2013 +12472:0:2565 +12473:3:2014 +12474:0:2565 +12475:3:2015 +12476:3:2019 +12477:3:2020 +12478:3:2028 +12479:3:2029 +12480:3:2033 +12481:3:2034 +12482:3:2042 +12483:3:2047 +12484:3:2051 +12485:3:2052 +12486:3:2059 +12487:3:2060 +12488:3:2071 +12489:3:2079 +12490:3:2080 +12491:3:2084 +12492:3:2089 +12493:3:2090 +12494:0:2565 +12495:3:2102 +12496:0:2565 +12497:3:2104 +12498:0:2565 +12499:3:2105 +12500:3:2109 +12501:3:2110 +12502:3:2118 +12503:3:2119 +12504:3:2123 +12505:3:2124 +12506:3:2132 +12507:3:2137 +12508:3:2141 +12509:3:2142 +12510:3:2149 +12511:3:2150 +12512:3:2161 +12513:3:2169 +12514:3:2170 +12515:3:2174 +12516:3:2179 +12517:3:2180 +12518:0:2565 +12519:1:433 +12520:0:2565 +12521:3:2192 +12522:0:2565 +12523:3:2013 +12524:0:2565 +12525:2:468 +12526:0:2565 +12527:3:2014 +12528:0:2565 +12529:3:2015 +12530:3:2019 +12531:3:2020 +12532:3:2028 +12533:3:2029 +12534:3:2033 +12535:3:2034 +12536:3:2042 +12537:3:2047 +12538:3:2051 +12539:3:2052 +12540:3:2059 +12541:3:2060 +12542:3:2071 +12543:3:2079 +12544:3:2080 +12545:3:2084 +12546:3:2089 +12547:3:2090 +12548:0:2565 +12549:3:2102 +12550:0:2565 +12551:3:2104 +12552:0:2565 +12553:3:2105 +12554:3:2109 +12555:3:2110 +12556:3:2118 +12557:3:2119 +12558:3:2123 +12559:3:2124 +12560:3:2132 +12561:3:2137 +12562:3:2141 +12563:3:2142 +12564:3:2149 +12565:3:2150 +12566:3:2161 +12567:3:2169 +12568:3:2170 +12569:3:2174 +12570:3:2179 +12571:3:2180 +12572:0:2565 +12573:3:2192 +12574:0:2565 +12575:2:469 +12576:0:2565 +12577:3:2013 +12578:0:2565 +12579:2:475 +12580:0:2565 +12581:2:476 +12582:0:2565 +12583:3:2014 +12584:0:2565 +12585:3:2015 +12586:3:2019 +12587:3:2020 +12588:3:2028 +12589:3:2029 +12590:3:2033 +12591:3:2034 +12592:3:2042 +12593:3:2047 +12594:3:2051 +12595:3:2052 +12596:3:2059 +12597:3:2060 +12598:3:2071 +12599:3:2079 +12600:3:2080 +12601:3:2084 +12602:3:2089 +12603:3:2090 +12604:0:2565 +12605:3:2102 +12606:0:2565 +12607:3:2104 +12608:0:2565 +12609:3:2105 +12610:3:2109 +12611:3:2110 +12612:3:2118 +12613:3:2119 +12614:3:2123 +12615:3:2124 +12616:3:2132 +12617:3:2137 +12618:3:2141 +12619:3:2142 +12620:3:2149 +12621:3:2150 +12622:3:2161 +12623:3:2169 +12624:3:2170 +12625:3:2174 +12626:3:2179 +12627:3:2180 +12628:0:2565 +12629:3:2192 +12630:0:2565 +12631:2:477 +12632:2:481 +12633:2:482 +12634:2:490 +12635:2:499 +12636:2:500 +12637:2:504 +12638:2:509 +12639:2:513 +12640:2:514 +12641:2:521 +12642:2:522 +12643:2:533 +12644:2:534 +12645:2:537 +12646:2:538 +12647:2:546 +12648:2:551 +12649:2:552 +12650:0:2565 +12651:3:2013 +12652:0:2565 +12653:3:2014 +12654:0:2565 +12655:3:2015 +12656:3:2019 +12657:3:2020 +12658:3:2028 +12659:3:2029 +12660:3:2033 +12661:3:2034 +12662:3:2042 +12663:3:2047 +12664:3:2051 +12665:3:2052 +12666:3:2059 +12667:3:2060 +12668:3:2071 +12669:3:2079 +12670:3:2080 +12671:3:2084 +12672:3:2089 +12673:3:2090 +12674:0:2565 +12675:3:2102 +12676:0:2565 +12677:3:2104 +12678:0:2565 +12679:3:2105 +12680:3:2109 +12681:3:2110 +12682:3:2118 +12683:3:2119 +12684:3:2123 +12685:3:2124 +12686:3:2132 +12687:3:2137 +12688:3:2141 +12689:3:2142 +12690:3:2149 +12691:3:2150 +12692:3:2161 +12693:3:2169 +12694:3:2170 +12695:3:2174 +12696:3:2179 +12697:3:2180 +12698:0:2565 +12699:2:564 +12700:0:2565 +12701:3:2192 +12702:0:2565 +12703:3:2013 +12704:0:2565 +12705:3:2014 +12706:0:2565 +12707:3:2015 +12708:3:2019 +12709:3:2020 +12710:3:2028 +12711:3:2029 +12712:3:2033 +12713:3:2034 +12714:3:2042 +12715:3:2047 +12716:3:2051 +12717:3:2052 +12718:3:2059 +12719:3:2060 +12720:3:2071 +12721:3:2079 +12722:3:2080 +12723:3:2084 +12724:3:2089 +12725:3:2090 +12726:0:2565 +12727:3:2102 +12728:0:2565 +12729:3:2104 +12730:0:2565 +12731:2:565 +12732:2:569 +12733:2:570 +12734:2:578 +12735:2:587 +12736:2:588 +12737:2:592 +12738:2:597 +12739:2:601 +12740:2:602 +12741:2:609 +12742:2:610 +12743:2:621 +12744:2:622 +12745:2:625 +12746:2:626 +12747:2:634 +12748:2:639 +12749:2:640 +12750:0:2565 +12751:2:744 +12752:0:2565 +12753:3:2105 +12754:3:2109 +12755:3:2110 +12756:3:2118 +12757:3:2119 +12758:3:2123 +12759:3:2124 +12760:3:2132 +12761:3:2137 +12762:3:2141 +12763:3:2142 +12764:3:2149 +12765:3:2150 +12766:3:2161 +12767:3:2169 +12768:3:2170 +12769:3:2174 +12770:3:2179 +12771:3:2180 +12772:0:2565 +12773:3:2192 +12774:0:2565 +12775:3:2013 +12776:0:2565 +12777:3:2014 +12778:0:2565 +12779:3:2015 +12780:3:2019 +12781:3:2020 +12782:3:2028 +12783:3:2029 +12784:3:2033 +12785:3:2034 +12786:3:2042 +12787:3:2047 +12788:3:2051 +12789:3:2052 +12790:3:2059 +12791:3:2060 +12792:3:2071 +12793:3:2079 +12794:3:2080 +12795:3:2084 +12796:3:2089 +12797:3:2090 +12798:0:2565 +12799:3:2102 +12800:0:2565 +12801:2:745 +12802:0:2565 +12803:2:750 +12804:0:2565 +12805:2:753 +12806:0:2565 +12807:3:2104 +12808:0:2565 +12809:3:2105 +12810:3:2109 +12811:3:2110 +12812:3:2118 +12813:3:2119 +12814:3:2123 +12815:3:2124 +12816:3:2132 +12817:3:2137 +12818:3:2141 +12819:3:2142 +12820:3:2149 +12821:3:2150 +12822:3:2161 +12823:3:2169 +12824:3:2170 +12825:3:2174 +12826:3:2179 +12827:3:2180 +12828:0:2565 +12829:3:2192 +12830:0:2565 +12831:3:2013 +12832:0:2565 +12833:3:2014 +12834:0:2565 +12835:3:2015 +12836:3:2019 +12837:3:2020 +12838:3:2028 +12839:3:2029 +12840:3:2033 +12841:3:2034 +12842:3:2042 +12843:3:2047 +12844:3:2051 +12845:3:2052 +12846:3:2059 +12847:3:2060 +12848:3:2071 +12849:3:2079 +12850:3:2080 +12851:3:2084 +12852:3:2089 +12853:3:2090 +12854:0:2565 +12855:2:758 +12856:0:2565 +12857:3:2102 +12858:0:2565 +12859:3:2104 +12860:0:2565 +12861:3:2105 +12862:3:2109 +12863:3:2110 +12864:3:2118 +12865:3:2119 +12866:3:2123 +12867:3:2124 +12868:3:2132 +12869:3:2137 +12870:3:2141 +12871:3:2142 +12872:3:2149 +12873:3:2150 +12874:3:2161 +12875:3:2169 +12876:3:2170 +12877:3:2174 +12878:3:2179 +12879:3:2180 +12880:0:2565 +12881:3:2192 +12882:0:2565 +12883:3:2013 +12884:0:2565 +12885:3:2014 +12886:0:2565 +12887:2:759 +12888:0:2565 +12889:3:2015 +12890:3:2019 +12891:3:2020 +12892:3:2028 +12893:3:2029 +12894:3:2033 +12895:3:2034 +12896:3:2042 +12897:3:2047 +12898:3:2051 +12899:3:2052 +12900:3:2059 +12901:3:2060 +12902:3:2071 +12903:3:2079 +12904:3:2080 +12905:3:2084 +12906:3:2089 +12907:3:2090 +12908:0:2565 +12909:3:2102 +12910:0:2565 +12911:3:2104 +12912:0:2565 +12913:3:2105 +12914:3:2109 +12915:3:2110 +12916:3:2118 +12917:3:2119 +12918:3:2123 +12919:3:2124 +12920:3:2132 +12921:3:2137 +12922:3:2141 +12923:3:2142 +12924:3:2149 +12925:3:2150 +12926:3:2161 +12927:3:2169 +12928:3:2170 +12929:3:2174 +12930:3:2179 +12931:3:2180 +12932:0:2565 +12933:3:2192 +12934:0:2565 +12935:3:2013 +12936:0:2565 +12937:2:760 +12938:0:2565 +12939:2:761 +12940:0:2565 +12941:2:762 +12942:0:2565 +12943:2:763 +12944:0:2565 +12945:3:2014 +12946:0:2565 +12947:3:2015 +12948:3:2019 +12949:3:2020 +12950:3:2028 +12951:3:2029 +12952:3:2033 +12953:3:2034 +12954:3:2042 +12955:3:2047 +12956:3:2051 +12957:3:2052 +12958:3:2059 +12959:3:2060 +12960:3:2071 +12961:3:2079 +12962:3:2080 +12963:3:2084 +12964:3:2089 +12965:3:2090 +12966:0:2565 +12967:3:2102 +12968:0:2565 +12969:3:2104 +12970:0:2565 +12971:3:2105 +12972:3:2109 +12973:3:2110 +12974:3:2118 +12975:3:2119 +12976:3:2123 +12977:3:2124 +12978:3:2132 +12979:3:2137 +12980:3:2141 +12981:3:2142 +12982:3:2149 +12983:3:2150 +12984:3:2161 +12985:3:2169 +12986:3:2170 +12987:3:2174 +12988:3:2179 +12989:3:2180 +12990:0:2565 +12991:3:2192 +12992:0:2565 +12993:2:765 +12994:0:2565 +12995:3:2013 +12996:0:2565 +12997:3:2014 +12998:0:2565 +12999:3:2015 +13000:3:2019 +13001:3:2020 +13002:3:2028 +13003:3:2029 +13004:3:2033 +13005:3:2034 +13006:3:2042 +13007:3:2047 +13008:3:2051 +13009:3:2052 +13010:3:2059 +13011:3:2060 +13012:3:2071 +13013:3:2079 +13014:3:2080 +13015:3:2084 +13016:3:2089 +13017:3:2090 +13018:0:2565 +13019:3:2102 +13020:0:2565 +13021:3:2104 +13022:0:2565 +13023:3:2105 +13024:3:2109 +13025:3:2110 +13026:3:2118 +13027:3:2119 +13028:3:2123 +13029:3:2124 +13030:3:2132 +13031:3:2137 +13032:3:2141 +13033:3:2142 +13034:3:2149 +13035:3:2150 +13036:3:2161 +13037:3:2169 +13038:3:2170 +13039:3:2174 +13040:3:2179 +13041:3:2180 +13042:0:2565 +13043:2:766 +13044:2:770 +13045:2:771 +13046:2:779 +13047:2:788 +13048:2:789 +13049:2:793 +13050:2:798 +13051:2:802 +13052:2:803 +13053:2:810 +13054:2:811 +13055:2:822 +13056:2:823 +13057:2:826 +13058:2:827 +13059:2:835 +13060:2:840 +13061:2:841 +13062:0:2565 +13063:3:2192 +13064:0:2565 +13065:3:2013 +13066:0:2565 +13067:3:2014 +13068:0:2565 +13069:3:2015 +13070:3:2019 +13071:3:2020 +13072:3:2028 +13073:3:2029 +13074:3:2033 +13075:3:2034 +13076:3:2042 +13077:3:2047 +13078:3:2051 +13079:3:2052 +13080:3:2059 +13081:3:2060 +13082:3:2071 +13083:3:2079 +13084:3:2080 +13085:3:2084 +13086:3:2089 +13087:3:2090 +13088:0:2565 +13089:3:2102 +13090:0:2565 +13091:3:2104 +13092:0:2565 +13093:2:853 +13094:0:2565 +13095:2:857 +13096:0:2565 +13097:2:465 +13098:0:2565 +13099:3:2105 +13100:3:2109 +13101:3:2110 +13102:3:2118 +13103:3:2119 +13104:3:2123 +13105:3:2124 +13106:3:2132 +13107:3:2137 +13108:3:2141 +13109:3:2142 +13110:3:2149 +13111:3:2150 +13112:3:2161 +13113:3:2169 +13114:3:2170 +13115:3:2174 +13116:3:2179 +13117:3:2180 +13118:0:2565 +13119:3:2192 +13120:0:2565 +13121:3:2013 +13122:0:2565 +13123:3:2014 +13124:0:2565 +13125:3:2015 +13126:3:2019 +13127:3:2020 +13128:3:2028 +13129:3:2029 +13130:3:2033 +13131:3:2034 +13132:3:2042 +13133:3:2047 +13134:3:2051 +13135:3:2052 +13136:3:2059 +13137:3:2060 +13138:3:2071 +13139:3:2079 +13140:3:2080 +13141:3:2084 +13142:3:2089 +13143:3:2090 +13144:0:2565 +13145:3:2102 +13146:0:2565 +13147:2:466 +13148:0:2565 +13149:3:2104 +13150:0:2565 +13151:3:2105 +13152:3:2109 +13153:3:2110 +13154:3:2118 +13155:3:2119 +13156:3:2123 +13157:3:2124 +13158:3:2132 +13159:3:2137 +13160:3:2141 +13161:3:2142 +13162:3:2149 +13163:3:2150 +13164:3:2161 +13165:3:2169 +13166:3:2170 +13167:3:2174 +13168:3:2179 +13169:3:2180 +13170:0:2565 +13171:3:2192 +13172:0:2565 +13173:3:2013 +13174:0:2565 +13175:3:2014 +13176:0:2565 +13177:3:2015 +13178:3:2019 +13179:3:2020 +13180:3:2028 +13181:3:2029 +13182:3:2033 +13183:3:2034 +13184:3:2042 +13185:3:2047 +13186:3:2051 +13187:3:2052 +13188:3:2059 +13189:3:2060 +13190:3:2071 +13191:3:2079 +13192:3:2080 +13193:3:2084 +13194:3:2089 +13195:3:2090 +13196:0:2565 +13197:2:467 +13198:0:2565 +13199:3:2102 +13200:0:2565 +13201:3:2104 +13202:0:2565 +13203:3:2105 +13204:3:2109 +13205:3:2110 +13206:3:2118 +13207:3:2119 +13208:3:2123 +13209:3:2124 +13210:3:2132 +13211:3:2137 +13212:3:2141 +13213:3:2142 +13214:3:2149 +13215:3:2150 +13216:3:2161 +13217:3:2169 +13218:3:2170 +13219:3:2174 +13220:3:2179 +13221:3:2180 +13222:0:2565 +13223:3:2192 +13224:0:2565 +13225:3:2013 +13226:0:2565 +13227:3:2014 +13228:0:2565 +13229:1:436 +13230:0:2565 +13231:2:468 +13232:0:2565 +13233:3:2015 +13234:3:2019 +13235:3:2020 +13236:3:2028 +13237:3:2029 +13238:3:2033 +13239:3:2034 +13240:3:2042 +13241:3:2047 +13242:3:2051 +13243:3:2052 +13244:3:2059 +13245:3:2060 +13246:3:2071 +13247:3:2079 +13248:3:2080 +13249:3:2084 +13250:3:2089 +13251:3:2090 +13252:0:2565 +13253:3:2102 +13254:0:2565 +13255:3:2104 +13256:0:2565 +13257:3:2105 +13258:3:2109 +13259:3:2110 +13260:3:2118 +13261:3:2119 +13262:3:2123 +13263:3:2124 +13264:3:2132 +13265:3:2137 +13266:3:2141 +13267:3:2142 +13268:3:2149 +13269:3:2150 +13270:3:2161 +13271:3:2169 +13272:3:2170 +13273:3:2174 +13274:3:2179 +13275:3:2180 +13276:0:2565 +13277:3:2192 +13278:0:2565 +13279:3:2013 +13280:0:2565 +13281:3:2014 +13282:0:2565 +13283:2:467 +13284:0:2565 +13285:2:468 +13286:0:2565 +13287:3:2015 +13288:3:2019 +13289:3:2020 +13290:3:2028 +13291:3:2029 +13292:3:2033 +13293:3:2034 +13294:3:2042 +13295:3:2047 +13296:3:2051 +13297:3:2052 +13298:3:2059 +13299:3:2060 +13300:3:2071 +13301:3:2079 +13302:3:2080 +13303:3:2084 +13304:3:2089 +13305:3:2090 +13306:0:2565 +13307:3:2102 +13308:0:2565 +13309:3:2104 +13310:0:2565 +13311:3:2105 +13312:3:2109 +13313:3:2110 +13314:3:2118 +13315:3:2119 +13316:3:2123 +13317:3:2124 +13318:3:2132 +13319:3:2137 +13320:3:2141 +13321:3:2142 +13322:3:2149 +13323:3:2150 +13324:3:2161 +13325:3:2169 +13326:3:2170 +13327:3:2174 +13328:3:2179 +13329:3:2180 +13330:0:2565 +13331:3:2192 +13332:0:2565 +13333:3:2013 +13334:0:2565 +13335:2:467 +13336:0:2565 +13337:1:442 +13338:0:2565 +13339:2:468 +13340:0:2565 +13341:1:446 +13342:0:2565 +13343:1:9 +13344:0:2565 +13345:1:10 +13346:0:2565 +13347:1:11 +13348:0:2565 +13349:3:2014 +13350:0:2565 +13351:3:2015 +13352:3:2019 +13353:3:2020 +13354:3:2028 +13355:3:2029 +13356:3:2033 +13357:3:2034 +13358:3:2042 +13359:3:2047 +13360:3:2051 +13361:3:2052 +13362:3:2059 +13363:3:2060 +13364:3:2071 +13365:3:2079 +13366:3:2080 +13367:3:2084 +13368:3:2089 +13369:3:2090 +13370:0:2565 +13371:3:2102 +13372:0:2565 +13373:3:2104 +13374:0:2565 +13375:3:2105 +13376:3:2109 +13377:3:2110 +13378:3:2118 +13379:3:2119 +13380:3:2123 +13381:3:2124 +13382:3:2132 +13383:3:2137 +13384:3:2141 +13385:3:2142 +13386:3:2149 +13387:3:2150 +13388:3:2161 +13389:3:2169 +13390:3:2170 +13391:3:2174 +13392:3:2179 +13393:3:2180 +13394:0:2565 +13395:3:2192 +13396:0:2565 +13397:3:2013 +13398:0:2565 +13399:2:467 +13400:0:2565 +13401:2:468 +13402:0:2565 +13403:3:2014 +13404:0:2565 +13405:3:2015 +13406:3:2019 +13407:3:2020 +13408:3:2028 +13409:3:2029 +13410:3:2033 +13411:3:2034 +13412:3:2042 +13413:3:2047 +13414:3:2051 +13415:3:2052 +13416:3:2059 +13417:3:2060 +13418:3:2071 +13419:3:2079 +13420:3:2080 +13421:3:2084 +13422:3:2089 +13423:3:2090 +13424:0:2565 +13425:3:2102 +13426:0:2565 +13427:3:2104 +13428:0:2565 +13429:3:2105 +13430:3:2109 +13431:3:2110 +13432:3:2118 +13433:3:2119 +13434:3:2123 +13435:3:2124 +13436:3:2132 +13437:3:2137 +13438:3:2141 +13439:3:2142 +13440:3:2149 +13441:3:2150 +13442:3:2161 +13443:3:2169 +13444:3:2170 +13445:3:2174 +13446:3:2179 +13447:3:2180 +13448:0:2565 +13449:3:2192 +13450:0:2565 +13451:2:467 +13452:0:2565 +13453:1:12 +13454:1:16 +13455:1:17 +13456:1:25 +13457:1:34 +13458:1:35 +13459:1:39 +13460:1:44 +13461:1:48 +13462:1:49 +13463:1:56 +13464:1:57 +13465:1:68 +13466:1:69 +13467:1:72 +13468:1:73 +13469:1:81 +13470:1:86 +13471:1:87 +13472:0:2565 +13473:3:2013 +13474:0:2565 +13475:2:468 +13476:0:2565 +13477:3:2014 +13478:0:2565 +13479:3:2015 +13480:3:2019 +13481:3:2020 +13482:3:2028 +13483:3:2029 +13484:3:2033 +13485:3:2034 +13486:3:2042 +13487:3:2047 +13488:3:2051 +13489:3:2052 +13490:3:2059 +13491:3:2060 +13492:3:2071 +13493:3:2079 +13494:3:2080 +13495:3:2084 +13496:3:2089 +13497:3:2090 +13498:0:2565 +13499:3:2102 +13500:0:2565 +13501:3:2104 +13502:0:2565 +13503:3:2105 +13504:3:2109 +13505:3:2110 +13506:3:2118 +13507:3:2119 +13508:3:2123 +13509:3:2124 +13510:3:2132 +13511:3:2137 +13512:3:2141 +13513:3:2142 +13514:3:2149 +13515:3:2150 +13516:3:2161 +13517:3:2169 +13518:3:2170 +13519:3:2174 +13520:3:2179 +13521:3:2180 +13522:0:2565 +13523:3:2192 +13524:0:2565 +13525:2:467 +13526:0:2565 +13527:3:2013 +13528:0:2565 +13529:3:2014 +13530:0:2565 +13531:3:2015 +13532:3:2019 +13533:3:2020 +13534:3:2028 +13535:3:2029 +13536:3:2033 +13537:3:2034 +13538:3:2042 +13539:3:2047 +13540:3:2051 +13541:3:2052 +13542:3:2059 +13543:3:2060 +13544:3:2071 +13545:3:2079 +13546:3:2080 +13547:3:2084 +13548:3:2089 +13549:3:2090 +13550:0:2565 +13551:3:2102 +13552:0:2565 +13553:3:2104 +13554:0:2565 +13555:3:2105 +13556:3:2109 +13557:3:2110 +13558:3:2118 +13559:3:2119 +13560:3:2123 +13561:3:2124 +13562:3:2132 +13563:3:2137 +13564:3:2141 +13565:3:2142 +13566:3:2149 +13567:3:2150 +13568:3:2161 +13569:3:2169 +13570:3:2170 +13571:3:2174 +13572:3:2179 +13573:3:2180 +13574:0:2565 +13575:1:99 +13576:0:2565 +13577:3:2192 +13578:0:2565 +13579:3:2013 +13580:0:2565 +13581:2:468 +13582:0:2565 +13583:3:2014 +13584:0:2565 +13585:3:2015 +13586:3:2019 +13587:3:2020 +13588:3:2028 +13589:3:2029 +13590:3:2033 +13591:3:2034 +13592:3:2042 +13593:3:2047 +13594:3:2051 +13595:3:2052 +13596:3:2059 +13597:3:2060 +13598:3:2071 +13599:3:2079 +13600:3:2080 +13601:3:2084 +13602:3:2089 +13603:3:2090 +13604:0:2565 +13605:3:2102 +13606:0:2565 +13607:3:2104 +13608:0:2565 +13609:3:2105 +13610:3:2109 +13611:3:2110 +13612:3:2118 +13613:3:2119 +13614:3:2123 +13615:3:2124 +13616:3:2132 +13617:3:2137 +13618:3:2141 +13619:3:2142 +13620:3:2149 +13621:3:2150 +13622:3:2161 +13623:3:2169 +13624:3:2170 +13625:3:2174 +13626:3:2179 +13627:3:2180 +13628:0:2565 +13629:3:2192 +13630:0:2565 +13631:2:469 +13632:0:2565 +13633:3:2013 +13634:0:2565 +13635:2:475 +13636:0:2565 +13637:2:476 +13638:0:2565 +13639:3:2014 +13640:0:2565 +13641:3:2015 +13642:3:2019 +13643:3:2020 +13644:3:2028 +13645:3:2029 +13646:3:2033 +13647:3:2034 +13648:3:2042 +13649:3:2047 +13650:3:2051 +13651:3:2052 +13652:3:2059 +13653:3:2060 +13654:3:2071 +13655:3:2079 +13656:3:2080 +13657:3:2084 +13658:3:2089 +13659:3:2090 +13660:0:2565 +13661:3:2102 +13662:0:2565 +13663:3:2104 +13664:0:2565 +13665:3:2105 +13666:3:2109 +13667:3:2110 +13668:3:2118 +13669:3:2119 +13670:3:2123 +13671:3:2124 +13672:3:2132 +13673:3:2137 +13674:3:2141 +13675:3:2142 +13676:3:2149 +13677:3:2150 +13678:3:2161 +13679:3:2169 +13680:3:2170 +13681:3:2174 +13682:3:2179 +13683:3:2180 +13684:0:2565 +13685:3:2192 +13686:0:2565 +13687:2:477 +13688:2:481 +13689:2:482 +13690:2:490 +13691:2:499 +13692:2:500 +13693:2:504 +13694:2:509 +13695:2:513 +13696:2:514 +13697:2:521 +13698:2:522 +13699:2:533 +13700:2:534 +13701:2:537 +13702:2:538 +13703:2:546 +13704:2:551 +13705:2:552 +13706:0:2565 +13707:3:2013 +13708:0:2565 +13709:3:2014 +13710:0:2565 +13711:3:2015 +13712:3:2019 +13713:3:2020 +13714:3:2028 +13715:3:2029 +13716:3:2033 +13717:3:2034 +13718:3:2042 +13719:3:2047 +13720:3:2051 +13721:3:2052 +13722:3:2059 +13723:3:2060 +13724:3:2071 +13725:3:2079 +13726:3:2080 +13727:3:2084 +13728:3:2089 +13729:3:2090 +13730:0:2565 +13731:3:2102 +13732:0:2565 +13733:3:2104 +13734:0:2565 +13735:3:2105 +13736:3:2109 +13737:3:2110 +13738:3:2118 +13739:3:2119 +13740:3:2123 +13741:3:2124 +13742:3:2132 +13743:3:2137 +13744:3:2141 +13745:3:2142 +13746:3:2149 +13747:3:2150 +13748:3:2161 +13749:3:2169 +13750:3:2170 +13751:3:2174 +13752:3:2179 +13753:3:2180 +13754:0:2565 +13755:2:564 +13756:0:2565 +13757:3:2192 +13758:0:2565 +13759:3:2013 +13760:0:2565 +13761:3:2014 +13762:0:2565 +13763:3:2015 +13764:3:2019 +13765:3:2020 +13766:3:2028 +13767:3:2029 +13768:3:2033 +13769:3:2034 +13770:3:2042 +13771:3:2047 +13772:3:2051 +13773:3:2052 +13774:3:2059 +13775:3:2060 +13776:3:2071 +13777:3:2079 +13778:3:2080 +13779:3:2084 +13780:3:2089 +13781:3:2090 +13782:0:2565 +13783:3:2102 +13784:0:2565 +13785:3:2104 +13786:0:2565 +13787:2:565 +13788:2:569 +13789:2:570 +13790:2:578 +13791:2:587 +13792:2:588 +13793:2:592 +13794:2:597 +13795:2:601 +13796:2:602 +13797:2:609 +13798:2:610 +13799:2:621 +13800:2:622 +13801:2:625 +13802:2:626 +13803:2:634 +13804:2:639 +13805:2:640 +13806:0:2565 +13807:2:652 +13808:0:2565 +13809:3:2105 +13810:3:2109 +13811:3:2110 +13812:3:2118 +13813:3:2119 +13814:3:2123 +13815:3:2124 +13816:3:2132 +13817:3:2137 +13818:3:2141 +13819:3:2142 +13820:3:2149 +13821:3:2150 +13822:3:2161 +13823:3:2169 +13824:3:2170 +13825:3:2174 +13826:3:2179 +13827:3:2180 +13828:0:2565 +13829:3:2192 +13830:0:2565 +13831:3:2013 +13832:0:2565 +13833:3:2014 +13834:0:2565 +13835:3:2015 +13836:3:2019 +13837:3:2020 +13838:3:2028 +13839:3:2029 +13840:3:2033 +13841:3:2034 +13842:3:2042 +13843:3:2047 +13844:3:2051 +13845:3:2052 +13846:3:2059 +13847:3:2060 +13848:3:2071 +13849:3:2079 +13850:3:2080 +13851:3:2084 +13852:3:2089 +13853:3:2090 +13854:0:2565 +13855:3:2102 +13856:0:2565 +13857:2:653 +13858:0:2565 +13859:3:2104 +13860:0:2565 +13861:3:2105 +13862:3:2109 +13863:3:2110 +13864:3:2118 +13865:3:2119 +13866:3:2123 +13867:3:2124 +13868:3:2132 +13869:3:2137 +13870:3:2141 +13871:3:2142 +13872:3:2149 +13873:3:2150 +13874:3:2161 +13875:3:2169 +13876:3:2170 +13877:3:2174 +13878:3:2179 +13879:3:2180 +13880:0:2565 +13881:3:2192 +13882:0:2565 +13883:3:2013 +13884:0:2565 +13885:3:2014 +13886:0:2565 +13887:3:2015 +13888:3:2019 +13889:3:2020 +13890:3:2028 +13891:3:2029 +13892:3:2033 +13893:3:2034 +13894:3:2042 +13895:3:2047 +13896:3:2051 +13897:3:2052 +13898:3:2059 +13899:3:2060 +13900:3:2071 +13901:3:2079 +13902:3:2080 +13903:3:2084 +13904:3:2089 +13905:3:2090 +13906:0:2565 +13907:2:654 +13908:2:658 +13909:2:659 +13910:2:667 +13911:2:676 +13912:2:677 +13913:2:681 +13914:2:686 +13915:2:690 +13916:2:691 +13917:2:698 +13918:2:699 +13919:2:710 +13920:2:711 +13921:2:714 +13922:2:715 +13923:2:723 +13924:2:728 +13925:2:729 +13926:0:2565 +13927:3:2102 +13928:0:2565 +13929:3:2104 +13930:0:2565 +13931:3:2105 +13932:3:2109 +13933:3:2110 +13934:3:2118 +13935:3:2119 +13936:3:2123 +13937:3:2124 +13938:3:2132 +13939:3:2137 +13940:3:2141 +13941:3:2142 +13942:3:2149 +13943:3:2150 +13944:3:2161 +13945:3:2169 +13946:3:2170 +13947:3:2174 +13948:3:2179 +13949:3:2180 +13950:0:2565 +13951:3:2192 +13952:0:2565 +13953:3:2013 +13954:0:2565 +13955:3:2014 +13956:0:2565 +13957:1:100 +13958:0:2565 +13959:1:101 +13960:0:2565 +13961:3:2015 +13962:3:2019 +13963:3:2020 +13964:3:2028 +13965:3:2029 +13966:3:2033 +13967:3:2034 +13968:3:2042 +13969:3:2047 +13970:3:2051 +13971:3:2052 +13972:3:2059 +13973:3:2060 +13974:3:2071 +13975:3:2079 +13976:3:2080 +13977:3:2084 +13978:3:2089 +13979:3:2090 +13980:0:2565 +13981:3:2102 +13982:0:2565 +13983:3:2104 +13984:0:2565 +13985:3:2105 +13986:3:2109 +13987:3:2110 +13988:3:2118 +13989:3:2119 +13990:3:2123 +13991:3:2124 +13992:3:2132 +13993:3:2137 +13994:3:2141 +13995:3:2142 +13996:3:2149 +13997:3:2150 +13998:3:2161 +13999:3:2169 +14000:3:2170 +14001:3:2174 +14002:3:2179 +14003:3:2180 +14004:0:2565 +14005:3:2192 +14006:0:2565 +14007:3:2013 +14008:0:2565 +14009:3:2014 +14010:0:2565 +14011:1:100 +14012:0:2565 +14013:3:2015 +14014:3:2019 +14015:3:2020 +14016:3:2028 +14017:3:2029 +14018:3:2033 +14019:3:2034 +14020:3:2042 +14021:3:2047 +14022:3:2051 +14023:3:2052 +14024:3:2059 +14025:3:2060 +14026:3:2071 +14027:3:2079 +14028:3:2080 +14029:3:2084 +14030:3:2089 +14031:3:2090 +14032:0:2565 +14033:3:2102 +14034:0:2565 +14035:3:2104 +14036:0:2565 +14037:3:2105 +14038:3:2109 +14039:3:2110 +14040:3:2118 +14041:3:2119 +14042:3:2123 +14043:3:2124 +14044:3:2132 +14045:3:2137 +14046:3:2141 +14047:3:2142 +14048:3:2149 +14049:3:2150 +14050:3:2161 +14051:3:2169 +14052:3:2170 +14053:3:2174 +14054:3:2179 +14055:3:2180 +14056:0:2565 +14057:3:2192 +14058:0:2565 +14059:3:2013 +14060:0:2565 +14061:2:741 +14062:0:2565 +14063:2:750 +14064:0:2565 +14065:2:753 +14066:0:2565 +14067:1:101 +14068:0:2565 +14069:3:2014 +14070:0:2565 +14071:3:2015 +14072:3:2019 +14073:3:2020 +14074:3:2028 +14075:3:2029 +14076:3:2033 +14077:3:2034 +14078:3:2042 +14079:3:2047 +14080:3:2051 +14081:3:2052 +14082:3:2059 +14083:3:2060 +14084:3:2071 +14085:3:2079 +14086:3:2080 +14087:3:2084 +14088:3:2089 +14089:3:2090 +14090:0:2565 +14091:3:2102 +14092:0:2565 +14093:3:2104 +14094:0:2565 +14095:3:2105 +14096:3:2109 +14097:3:2110 +14098:3:2118 +14099:3:2119 +14100:3:2123 +14101:3:2124 +14102:3:2132 +14103:3:2137 +14104:3:2141 +14105:3:2142 +14106:3:2149 +14107:3:2150 +14108:3:2161 +14109:3:2169 +14110:3:2170 +14111:3:2174 +14112:3:2179 +14113:3:2180 +14114:0:2565 +14115:3:2192 +14116:0:2565 +14117:3:2013 +14118:0:2565 +14119:1:100 +14120:0:2565 +14121:3:2014 +14122:0:2565 +14123:3:2015 +14124:3:2019 +14125:3:2020 +14126:3:2028 +14127:3:2029 +14128:3:2033 +14129:3:2034 +14130:3:2042 +14131:3:2047 +14132:3:2051 +14133:3:2052 +14134:3:2059 +14135:3:2060 +14136:3:2071 +14137:3:2079 +14138:3:2080 +14139:3:2084 +14140:3:2089 +14141:3:2090 +14142:0:2565 +14143:3:2102 +14144:0:2565 +14145:3:2104 +14146:0:2565 +14147:3:2105 +14148:3:2109 +14149:3:2110 +14150:3:2118 +14151:3:2119 +14152:3:2123 +14153:3:2124 +14154:3:2132 +14155:3:2137 +14156:3:2141 +14157:3:2142 +14158:3:2149 +14159:3:2150 +14160:3:2161 +14161:3:2169 +14162:3:2170 +14163:3:2174 +14164:3:2179 +14165:3:2180 +14166:0:2565 +14167:3:2192 +14168:0:2565 +14169:2:758 +14170:0:2565 +14171:3:2013 +14172:0:2565 +14173:1:101 +14174:0:2565 +14175:3:2014 +14176:0:2565 +14177:3:2015 +14178:3:2019 +14179:3:2020 +14180:3:2028 +14181:3:2029 +14182:3:2033 +14183:3:2034 +14184:3:2042 +14185:3:2047 +14186:3:2051 +14187:3:2052 +14188:3:2059 +14189:3:2060 +14190:3:2071 +14191:3:2079 +14192:3:2080 +14193:3:2084 +14194:3:2089 +14195:3:2090 +14196:0:2565 +14197:3:2102 +14198:0:2565 +14199:3:2104 +14200:0:2565 +14201:3:2105 +14202:3:2109 +14203:3:2110 +14204:3:2118 +14205:3:2119 +14206:3:2123 +14207:3:2124 +14208:3:2132 +14209:3:2137 +14210:3:2141 +14211:3:2142 +14212:3:2149 +14213:3:2150 +14214:3:2161 +14215:3:2169 +14216:3:2170 +14217:3:2174 +14218:3:2179 +14219:3:2180 +14220:0:2565 +14221:3:2192 +14222:0:2565 +14223:3:2013 +14224:0:2565 +14225:1:100 +14226:0:2565 +14227:3:2014 +14228:0:2565 +14229:3:2015 +14230:3:2019 +14231:3:2020 +14232:3:2028 +14233:3:2029 +14234:3:2033 +14235:3:2034 +14236:3:2042 +14237:3:2047 +14238:3:2051 +14239:3:2052 +14240:3:2059 +14241:3:2060 +14242:3:2071 +14243:3:2079 +14244:3:2080 +14245:3:2084 +14246:3:2089 +14247:3:2090 +14248:0:2565 +14249:3:2102 +14250:0:2565 +14251:3:2104 +14252:0:2565 +14253:3:2105 +14254:3:2109 +14255:3:2110 +14256:3:2118 +14257:3:2119 +14258:3:2123 +14259:3:2124 +14260:3:2132 +14261:3:2137 +14262:3:2141 +14263:3:2142 +14264:3:2149 +14265:3:2150 +14266:3:2161 +14267:3:2169 +14268:3:2170 +14269:3:2174 +14270:3:2179 +14271:3:2180 +14272:0:2565 +14273:3:2192 +14274:0:2565 +14275:2:759 +14276:0:2565 +14277:3:2013 +14278:0:2565 +14279:1:101 +14280:0:2565 +14281:3:2014 +14282:0:2565 +14283:3:2015 +14284:3:2019 +14285:3:2020 +14286:3:2028 +14287:3:2029 +14288:3:2033 +14289:3:2034 +14290:3:2042 +14291:3:2047 +14292:3:2051 +14293:3:2052 +14294:3:2059 +14295:3:2060 +14296:3:2071 +14297:3:2079 +14298:3:2080 +14299:3:2084 +14300:3:2089 +14301:3:2090 +14302:0:2565 +14303:3:2102 +14304:0:2565 +14305:3:2104 +14306:0:2565 +14307:3:2105 +14308:3:2109 +14309:3:2110 +14310:3:2118 +14311:3:2119 +14312:3:2123 +14313:3:2124 +14314:3:2132 +14315:3:2137 +14316:3:2141 +14317:3:2142 +14318:3:2149 +14319:3:2150 +14320:3:2161 +14321:3:2169 +14322:3:2170 +14323:3:2174 +14324:3:2179 +14325:3:2180 +14326:0:2565 +14327:3:2192 +14328:0:2565 +14329:3:2013 +14330:0:2565 +14331:1:100 +14332:0:2565 +14333:3:2014 +14334:0:2565 +14335:3:2015 +14336:3:2019 +14337:3:2020 +14338:3:2028 +14339:3:2029 +14340:3:2033 +14341:3:2034 +14342:3:2042 +14343:3:2047 +14344:3:2051 +14345:3:2052 +14346:3:2059 +14347:3:2060 +14348:3:2071 +14349:3:2079 +14350:3:2080 +14351:3:2084 +14352:3:2089 +14353:3:2090 +14354:0:2565 +14355:3:2102 +14356:0:2565 +14357:3:2104 +14358:0:2565 +14359:3:2105 +14360:3:2109 +14361:3:2110 +14362:3:2118 +14363:3:2119 +14364:3:2123 +14365:3:2124 +14366:3:2132 +14367:3:2137 +14368:3:2141 +14369:3:2142 +14370:3:2149 +14371:3:2150 +14372:3:2161 +14373:3:2169 +14374:3:2170 +14375:3:2174 +14376:3:2179 +14377:3:2180 +14378:0:2565 +14379:3:2192 +14380:0:2565 +14381:2:760 +14382:0:2565 +14383:3:2013 +14384:0:2565 +14385:2:761 +14386:0:2565 +14387:2:762 +14388:0:2565 +14389:2:763 +14390:0:2565 +14391:1:101 +14392:0:2565 +14393:3:2014 +14394:0:2565 +14395:3:2015 +14396:3:2019 +14397:3:2020 +14398:3:2028 +14399:3:2029 +14400:3:2033 +14401:3:2034 +14402:3:2042 +14403:3:2047 +14404:3:2051 +14405:3:2052 +14406:3:2059 +14407:3:2060 +14408:3:2071 +14409:3:2079 +14410:3:2080 +14411:3:2084 +14412:3:2089 +14413:3:2090 +14414:0:2565 +14415:3:2102 +14416:0:2565 +14417:3:2104 +14418:0:2565 +14419:3:2105 +14420:3:2109 +14421:3:2110 +14422:3:2118 +14423:3:2119 +14424:3:2123 +14425:3:2124 +14426:3:2132 +14427:3:2137 +14428:3:2141 +14429:3:2142 +14430:3:2149 +14431:3:2150 +14432:3:2161 +14433:3:2169 +14434:3:2170 +14435:3:2174 +14436:3:2179 +14437:3:2180 +14438:0:2565 +14439:3:2192 +14440:0:2565 +14441:3:2013 +14442:0:2565 +14443:1:100 +14444:0:2565 +14445:3:2014 +14446:0:2565 +14447:3:2015 +14448:3:2019 +14449:3:2020 +14450:3:2028 +14451:3:2029 +14452:3:2033 +14453:3:2034 +14454:3:2042 +14455:3:2047 +14456:3:2051 +14457:3:2052 +14458:3:2059 +14459:3:2060 +14460:3:2071 +14461:3:2079 +14462:3:2080 +14463:3:2084 +14464:3:2089 +14465:3:2090 +14466:0:2565 +14467:3:2102 +14468:0:2565 +14469:3:2104 +14470:0:2565 +14471:3:2105 +14472:3:2109 +14473:3:2110 +14474:3:2118 +14475:3:2119 +14476:3:2123 +14477:3:2124 +14478:3:2132 +14479:3:2137 +14480:3:2141 +14481:3:2142 +14482:3:2149 +14483:3:2150 +14484:3:2161 +14485:3:2169 +14486:3:2170 +14487:3:2174 +14488:3:2179 +14489:3:2180 +14490:0:2565 +14491:3:2192 +14492:0:2565 +14493:2:765 +14494:0:2565 +14495:3:2013 +14496:0:2565 +14497:1:101 +14498:0:2565 +14499:3:2014 +14500:0:2565 +14501:3:2015 +14502:3:2019 +14503:3:2020 +14504:3:2028 +14505:3:2029 +14506:3:2033 +14507:3:2034 +14508:3:2042 +14509:3:2047 +14510:3:2051 +14511:3:2052 +14512:3:2059 +14513:3:2060 +14514:3:2071 +14515:3:2079 +14516:3:2080 +14517:3:2084 +14518:3:2089 +14519:3:2090 +14520:0:2565 +14521:3:2102 +14522:0:2565 +14523:3:2104 +14524:0:2565 +14525:3:2105 +14526:3:2109 +14527:3:2110 +14528:3:2118 +14529:3:2119 +14530:3:2123 +14531:3:2124 +14532:3:2132 +14533:3:2137 +14534:3:2141 +14535:3:2142 +14536:3:2149 +14537:3:2150 +14538:3:2161 +14539:3:2169 +14540:3:2170 +14541:3:2174 +14542:3:2179 +14543:3:2180 +14544:0:2565 +14545:3:2192 +14546:0:2565 +14547:3:2013 +14548:0:2565 +14549:2:766 +14550:2:770 +14551:2:771 +14552:2:779 +14553:2:788 +14554:2:789 +14555:2:793 +14556:2:798 +14557:2:802 +14558:2:803 +14559:2:810 +14560:2:811 +14561:2:822 +14562:2:823 +14563:2:826 +14564:2:827 +14565:2:835 +14566:2:840 +14567:2:841 +14568:0:2565 +14569:3:2014 +14570:0:2565 +14571:3:2015 +14572:3:2019 +14573:3:2020 +14574:3:2028 +14575:3:2029 +14576:3:2033 +14577:3:2034 +14578:3:2042 +14579:3:2047 +14580:3:2051 +14581:3:2052 +14582:3:2059 +14583:3:2060 +14584:3:2071 +14585:3:2079 +14586:3:2080 +14587:3:2084 +14588:3:2089 +14589:3:2090 +14590:0:2565 +14591:3:2102 +14592:0:2565 +14593:3:2104 +14594:0:2565 +14595:3:2105 +14596:3:2109 +14597:3:2110 +14598:3:2118 +14599:3:2119 +14600:3:2123 +14601:3:2124 +14602:3:2132 +14603:3:2137 +14604:3:2141 +14605:3:2142 +14606:3:2149 +14607:3:2150 +14608:3:2161 +14609:3:2169 +14610:3:2170 +14611:3:2174 +14612:3:2179 +14613:3:2180 +14614:0:2565 +14615:3:2192 +14616:0:2565 +14617:2:853 +14618:0:2565 +14619:3:2013 +14620:0:2565 +14621:2:857 +14622:0:2565 +14623:2:465 +14624:0:2565 +14625:3:2014 +14626:0:2565 +14627:3:2015 +14628:3:2019 +14629:3:2020 +14630:3:2028 +14631:3:2029 +14632:3:2033 +14633:3:2034 +14634:3:2042 +14635:3:2047 +14636:3:2051 +14637:3:2052 +14638:3:2059 +14639:3:2060 +14640:3:2071 +14641:3:2079 +14642:3:2080 +14643:3:2084 +14644:3:2089 +14645:3:2090 +14646:0:2565 +14647:3:2102 +14648:0:2565 +14649:3:2104 +14650:0:2565 +14651:3:2105 +14652:3:2109 +14653:3:2110 +14654:3:2118 +14655:3:2119 +14656:3:2123 +14657:3:2124 +14658:3:2132 +14659:3:2137 +14660:3:2141 +14661:3:2142 +14662:3:2149 +14663:3:2150 +14664:3:2161 +14665:3:2169 +14666:3:2170 +14667:3:2174 +14668:3:2179 +14669:3:2180 +14670:0:2565 +14671:3:2192 +14672:0:2565 +14673:2:466 +14674:0:2565 +14675:3:2013 +14676:0:2565 +14677:3:2014 +14678:0:2565 +14679:3:2015 +14680:3:2019 +14681:3:2020 +14682:3:2028 +14683:3:2029 +14684:3:2033 +14685:3:2034 +14686:3:2042 +14687:3:2047 +14688:3:2051 +14689:3:2052 +14690:3:2059 +14691:3:2060 +14692:3:2071 +14693:3:2079 +14694:3:2080 +14695:3:2084 +14696:3:2089 +14697:3:2090 +14698:0:2565 +14699:3:2102 +14700:0:2565 +14701:3:2104 +14702:0:2565 +14703:3:2105 +14704:3:2109 +14705:3:2110 +14706:3:2118 +14707:3:2119 +14708:3:2123 +14709:3:2124 +14710:3:2132 +14711:3:2137 +14712:3:2141 +14713:3:2142 +14714:3:2149 +14715:3:2150 +14716:3:2161 +14717:3:2169 +14718:3:2170 +14719:3:2174 +14720:3:2179 +14721:3:2180 +14722:0:2565 +14723:2:467 +14724:0:2565 +14725:3:2192 +14726:0:2565 +14727:3:2013 +14728:0:2565 +14729:3:2014 +14730:0:2565 +14731:3:2015 +14732:3:2019 +14733:3:2020 +14734:3:2028 +14735:3:2029 +14736:3:2033 +14737:3:2034 +14738:3:2042 +14739:3:2047 +14740:3:2051 +14741:3:2052 +14742:3:2059 +14743:3:2060 +14744:3:2071 +14745:3:2079 +14746:3:2080 +14747:3:2084 +14748:3:2089 +14749:3:2090 +14750:0:2565 +14751:3:2102 +14752:0:2565 +14753:3:2104 +14754:0:2565 +14755:1:102 +14756:0:2565 +14757:2:468 +14758:0:2565 +14759:3:2105 +14760:3:2109 +14761:3:2110 +14762:3:2118 +14763:3:2119 +14764:3:2123 +14765:3:2124 +14766:3:2132 +14767:3:2137 +14768:3:2141 +14769:3:2142 +14770:3:2149 +14771:3:2150 +14772:3:2161 +14773:3:2169 +14774:3:2170 +14775:3:2174 +14776:3:2179 +14777:3:2180 +14778:0:2565 +14779:3:2192 +14780:0:2565 +14781:3:2013 +14782:0:2565 +14783:3:2014 +14784:0:2565 +14785:3:2015 +14786:3:2019 +14787:3:2020 +14788:3:2028 +14789:3:2029 +14790:3:2033 +14791:3:2034 +14792:3:2042 +14793:3:2047 +14794:3:2051 +14795:3:2052 +14796:3:2059 +14797:3:2060 +14798:3:2071 +14799:3:2079 +14800:3:2080 +14801:3:2084 +14802:3:2089 +14803:3:2090 +14804:0:2565 +14805:3:2102 +14806:0:2565 +14807:3:2104 +14808:0:2565 +14809:2:467 +14810:0:2565 +14811:2:468 +14812:0:2565 +14813:3:2105 +14814:3:2109 +14815:3:2110 +14816:3:2118 +14817:3:2119 +14818:3:2123 +14819:3:2124 +14820:3:2132 +14821:3:2137 +14822:3:2141 +14823:3:2142 +14824:3:2149 +14825:3:2150 +14826:3:2161 +14827:3:2169 +14828:3:2170 +14829:3:2174 +14830:3:2179 +14831:3:2180 +14832:0:2565 +14833:3:2192 +14834:0:2565 +14835:3:2013 +14836:0:2565 +14837:3:2014 +14838:0:2565 +14839:3:2015 +14840:3:2019 +14841:3:2020 +14842:3:2028 +14843:3:2029 +14844:3:2033 +14845:3:2034 +14846:3:2042 +14847:3:2047 +14848:3:2051 +14849:3:2052 +14850:3:2059 +14851:3:2060 +14852:3:2071 +14853:3:2079 +14854:3:2080 +14855:3:2084 +14856:3:2089 +14857:3:2090 +14858:0:2565 +14859:3:2102 +14860:0:2565 +14861:2:467 +14862:0:2565 +14863:1:108 +14864:0:2565 +14865:2:468 +14866:0:2565 +14867:3:2104 +14868:0:2565 +14869:3:2105 +14870:3:2109 +14871:3:2110 +14872:3:2118 +14873:3:2119 +14874:3:2123 +14875:3:2124 +14876:3:2132 +14877:3:2137 +14878:3:2141 +14879:3:2142 +14880:3:2149 +14881:3:2150 +14882:3:2161 +14883:3:2169 +14884:3:2170 +14885:3:2174 +14886:3:2179 +14887:3:2180 +14888:0:2565 +14889:3:2192 +14890:0:2565 +14891:3:2013 +14892:0:2565 +14893:3:2014 +14894:0:2565 +14895:3:2015 +14896:3:2019 +14897:3:2020 +14898:3:2028 +14899:3:2029 +14900:3:2033 +14901:3:2034 +14902:3:2042 +14903:3:2047 +14904:3:2051 +14905:3:2052 +14906:3:2059 +14907:3:2060 +14908:3:2071 +14909:3:2079 +14910:3:2080 +14911:3:2084 +14912:3:2089 +14913:3:2090 +14914:0:2565 +14915:3:2102 +14916:0:2565 +14917:2:467 +14918:0:2565 +14919:2:468 +14920:0:2565 +14921:3:2104 +14922:0:2565 +14923:3:2105 +14924:3:2109 +14925:3:2110 +14926:3:2118 +14927:3:2119 +14928:3:2123 +14929:3:2124 +14930:3:2132 +14931:3:2137 +14932:3:2141 +14933:3:2142 +14934:3:2149 +14935:3:2150 +14936:3:2161 +14937:3:2169 +14938:3:2170 +14939:3:2174 +14940:3:2179 +14941:3:2180 +14942:0:2565 +14943:3:2192 +14944:0:2565 +14945:3:2013 +14946:0:2565 +14947:3:2014 +14948:0:2565 +14949:3:2015 +14950:3:2019 +14951:3:2020 +14952:3:2028 +14953:3:2029 +14954:3:2033 +14955:3:2034 +14956:3:2042 +14957:3:2047 +14958:3:2051 +14959:3:2052 +14960:3:2059 +14961:3:2060 +14962:3:2071 +14963:3:2079 +14964:3:2080 +14965:3:2084 +14966:3:2089 +14967:3:2090 +14968:0:2565 +14969:2:467 +14970:0:2565 +14971:1:109 +14972:1:113 +14973:1:114 +14974:1:122 +14975:1:123 +14976:1:124 +14977:1:136 +14978:1:141 +14979:1:145 +14980:1:146 +14981:1:153 +14982:1:154 +14983:1:165 +14984:1:166 +14985:1:167 +14986:1:178 +14987:1:183 +14988:1:184 +14989:0:2565 +14990:3:2102 +14991:0:2565 +14992:3:2104 +14993:0:2565 +14994:1:196 +14995:0:2565 +14996:3:2105 +14997:3:2109 +14998:3:2110 +14999:3:2118 +15000:3:2119 +15001:3:2123 +15002:3:2124 +15003:3:2132 +15004:3:2137 +15005:3:2141 +15006:3:2142 +15007:3:2149 +15008:3:2150 +15009:3:2161 +15010:3:2169 +15011:3:2170 +15012:3:2174 +15013:3:2179 +15014:3:2180 +15015:0:2565 +15016:1:197 +15017:0:2565 +15018:3:2192 +15019:0:2565 +15020:3:2013 +15021:0:2565 +15022:2:468 +15023:0:2565 +15024:1:198 +15025:0:2565 +15026:3:2014 +15027:0:2565 +15028:3:2015 +15029:3:2019 +15030:3:2020 +15031:3:2028 +15032:3:2029 +15033:3:2033 +15034:3:2034 +15035:3:2042 +15036:3:2047 +15037:3:2051 +15038:3:2052 +15039:3:2059 +15040:3:2060 +15041:3:2071 +15042:3:2079 +15043:3:2080 +15044:3:2084 +15045:3:2089 +15046:3:2090 +15047:0:2565 +15048:3:2102 +15049:0:2565 +15050:3:2104 +15051:0:2565 +15052:3:2105 +15053:3:2109 +15054:3:2110 +15055:3:2118 +15056:3:2119 +15057:3:2123 +15058:3:2124 +15059:3:2132 +15060:3:2137 +15061:3:2141 +15062:3:2142 +15063:3:2149 +15064:3:2150 +15065:3:2161 +15066:3:2169 +15067:3:2170 +15068:3:2174 +15069:3:2179 +15070:3:2180 +15071:0:2565 +15072:3:2192 +15073:0:2565 +15074:3:2013 +15075:0:2565 +15076:1:197 +15077:0:2565 +15078:3:2014 +15079:0:2565 +15080:3:2015 +15081:3:2019 +15082:3:2020 +15083:3:2028 +15084:3:2029 +15085:3:2033 +15086:3:2034 +15087:3:2042 +15088:3:2047 +15089:3:2051 +15090:3:2052 +15091:3:2059 +15092:3:2060 +15093:3:2071 +15094:3:2079 +15095:3:2080 +15096:3:2084 +15097:3:2089 +15098:3:2090 +15099:0:2565 +15100:3:2102 +15101:0:2565 +15102:3:2104 +15103:0:2565 +15104:3:2105 +15105:3:2109 +15106:3:2110 +15107:3:2118 +15108:3:2119 +15109:3:2123 +15110:3:2124 +15111:3:2132 +15112:3:2137 +15113:3:2141 +15114:3:2142 +15115:3:2149 +15116:3:2150 +15117:3:2161 +15118:3:2169 +15119:3:2170 +15120:3:2174 +15121:3:2179 +15122:3:2180 +15123:0:2565 +15124:3:2192 +15125:0:2565 +15126:2:469 +15127:0:2565 +15128:3:2013 +15129:0:2565 +15130:2:475 +15131:0:2565 +15132:2:476 +15133:0:2565 +15134:1:198 +15135:0:2565 +15136:3:2014 +15137:0:2565 +15138:3:2015 +15139:3:2019 +15140:3:2020 +15141:3:2028 +15142:3:2029 +15143:3:2033 +15144:3:2034 +15145:3:2042 +15146:3:2047 +15147:3:2051 +15148:3:2052 +15149:3:2059 +15150:3:2060 +15151:3:2071 +15152:3:2079 +15153:3:2080 +15154:3:2084 +15155:3:2089 +15156:3:2090 +15157:0:2565 +15158:3:2102 +15159:0:2565 +15160:3:2104 +15161:0:2565 +15162:3:2105 +15163:3:2109 +15164:3:2110 +15165:3:2118 +15166:3:2119 +15167:3:2123 +15168:3:2124 +15169:3:2132 +15170:3:2137 +15171:3:2141 +15172:3:2142 +15173:3:2149 +15174:3:2150 +15175:3:2161 +15176:3:2169 +15177:3:2170 +15178:3:2174 +15179:3:2179 +15180:3:2180 +15181:0:2565 +15182:3:2192 +15183:0:2565 +15184:3:2013 +15185:0:2565 +15186:1:197 +15187:0:2565 +15188:3:2014 +15189:0:2565 +15190:3:2015 +15191:3:2019 +15192:3:2020 +15193:3:2028 +15194:3:2029 +15195:3:2033 +15196:3:2034 +15197:3:2042 +15198:3:2047 +15199:3:2051 +15200:3:2052 +15201:3:2059 +15202:3:2060 +15203:3:2071 +15204:3:2079 +15205:3:2080 +15206:3:2084 +15207:3:2089 +15208:3:2090 +15209:0:2565 +15210:3:2102 +15211:0:2565 +15212:3:2104 +15213:0:2565 +15214:3:2105 +15215:3:2109 +15216:3:2110 +15217:3:2118 +15218:3:2119 +15219:3:2123 +15220:3:2124 +15221:3:2132 +15222:3:2137 +15223:3:2141 +15224:3:2142 +15225:3:2149 +15226:3:2150 +15227:3:2161 +15228:3:2169 +15229:3:2170 +15230:3:2174 +15231:3:2179 +15232:3:2180 +15233:0:2565 +15234:3:2192 +15235:0:2565 +15236:2:477 +15237:2:481 +15238:2:482 +15239:2:490 +15240:2:491 +15241:2:495 +15242:2:496 +15243:2:504 +15244:2:509 +15245:2:513 +15246:2:514 +15247:2:521 +15248:2:522 +15249:2:533 +15250:2:534 +15251:2:535 +15252:2:546 +15253:2:551 +15254:2:552 +15255:0:2565 +15256:3:2013 +15257:0:2565 +15258:1:198 +15259:0:2565 +15260:3:2014 +15261:0:2565 +15262:3:2015 +15263:3:2019 +15264:3:2020 +15265:3:2028 +15266:3:2029 +15267:3:2033 +15268:3:2034 +15269:3:2042 +15270:3:2047 +15271:3:2051 +15272:3:2052 +15273:3:2059 +15274:3:2060 +15275:3:2071 +15276:3:2079 +15277:3:2080 +15278:3:2084 +15279:3:2089 +15280:3:2090 +15281:0:2565 +15282:3:2102 +15283:0:2565 +15284:3:2104 +15285:0:2565 +15286:3:2105 +15287:3:2109 +15288:3:2110 +15289:3:2118 +15290:3:2119 +15291:3:2123 +15292:3:2124 +15293:3:2132 +15294:3:2137 +15295:3:2141 +15296:3:2142 +15297:3:2149 +15298:3:2150 +15299:3:2161 +15300:3:2169 +15301:3:2170 +15302:3:2174 +15303:3:2179 +15304:3:2180 +15305:0:2565 +15306:3:2192 +15307:0:2565 +15308:3:2013 +15309:0:2565 +15310:1:197 +15311:0:2565 +15312:3:2014 +15313:0:2565 +15314:3:2015 +15315:3:2019 +15316:3:2020 +15317:3:2028 +15318:3:2029 +15319:3:2033 +15320:3:2034 +15321:3:2042 +15322:3:2047 +15323:3:2051 +15324:3:2052 +15325:3:2059 +15326:3:2060 +15327:3:2071 +15328:3:2079 +15329:3:2080 +15330:3:2084 +15331:3:2089 +15332:3:2090 +15333:0:2565 +15334:3:2102 +15335:0:2565 +15336:3:2104 +15337:0:2565 +15338:3:2105 +15339:3:2109 +15340:3:2110 +15341:3:2118 +15342:3:2119 +15343:3:2123 +15344:3:2124 +15345:3:2132 +15346:3:2137 +15347:3:2141 +15348:3:2142 +15349:3:2149 +15350:3:2150 +15351:3:2161 +15352:3:2169 +15353:3:2170 +15354:3:2174 +15355:3:2179 +15356:3:2180 +15357:0:2565 +15358:3:2192 +15359:0:2565 +15360:2:564 +15361:0:2565 +15362:3:2013 +15363:0:2565 +15364:1:198 +15365:0:2565 +15366:3:2014 +15367:0:2565 +15368:3:2015 +15369:3:2019 +15370:3:2020 +15371:3:2028 +15372:3:2029 +15373:3:2033 +15374:3:2034 +15375:3:2042 +15376:3:2047 +15377:3:2051 +15378:3:2052 +15379:3:2059 +15380:3:2060 +15381:3:2071 +15382:3:2079 +15383:3:2080 +15384:3:2084 +15385:3:2089 +15386:3:2090 +15387:0:2565 +15388:3:2102 +15389:0:2565 +15390:3:2104 +15391:0:2565 +15392:3:2105 +15393:3:2109 +15394:3:2110 +15395:3:2118 +15396:3:2119 +15397:3:2123 +15398:3:2124 +15399:3:2132 +15400:3:2137 +15401:3:2141 +15402:3:2142 +15403:3:2149 +15404:3:2150 +15405:3:2161 +15406:3:2169 +15407:3:2170 +15408:3:2174 +15409:3:2179 +15410:3:2180 +15411:0:2565 +15412:3:2192 +15413:0:2565 +15414:3:2013 +15415:0:2565 +15416:2:565 +15417:2:569 +15418:2:570 +15419:2:578 +15420:2:579 +15421:2:583 +15422:2:584 +15423:2:592 +15424:2:597 +15425:2:601 +15426:2:602 +15427:2:609 +15428:2:610 +15429:2:621 +15430:2:622 +15431:2:623 +15432:2:634 +15433:2:639 +15434:2:640 +15435:0:2565 +15436:3:2014 +15437:0:2565 +15438:3:2015 +15439:3:2019 +15440:3:2020 +15441:3:2028 +15442:3:2029 +15443:3:2033 +15444:3:2034 +15445:3:2042 +15446:3:2047 +15447:3:2051 +15448:3:2052 +15449:3:2059 +15450:3:2060 +15451:3:2071 +15452:3:2079 +15453:3:2080 +15454:3:2084 +15455:3:2089 +15456:3:2090 +15457:0:2565 +15458:3:2102 +15459:0:2565 +15460:1:197 +15461:0:2565 +15462:2:652 +15463:0:2565 +15464:1:198 +15465:0:2565 +15466:3:2104 +15467:0:2565 +15468:3:2105 +15469:3:2109 +15470:3:2110 +15471:3:2118 +15472:3:2119 +15473:3:2123 +15474:3:2124 +15475:3:2132 +15476:3:2137 +15477:3:2141 +15478:3:2142 +15479:3:2149 +15480:3:2150 +15481:3:2161 +15482:3:2169 +15483:3:2170 +15484:3:2174 +15485:3:2179 +15486:3:2180 +15487:0:2565 +15488:3:2192 +15489:0:2565 +15490:3:2013 +15491:0:2565 +15492:3:2014 +15493:0:2565 +15494:3:2015 +15495:3:2019 +15496:3:2020 +15497:3:2028 +15498:3:2029 +15499:3:2033 +15500:3:2034 +15501:3:2042 +15502:3:2047 +15503:3:2051 +15504:3:2052 +15505:3:2059 +15506:3:2060 +15507:3:2071 +15508:3:2079 +15509:3:2080 +15510:3:2084 +15511:3:2089 +15512:3:2090 +15513:0:2565 +15514:3:2102 +15515:0:2565 +15516:1:197 +15517:0:2565 +15518:3:2104 +15519:0:2565 +15520:3:2105 +15521:3:2109 +15522:3:2110 +15523:3:2118 +15524:3:2119 +15525:3:2123 +15526:3:2124 +15527:3:2132 +15528:3:2137 +15529:3:2141 +15530:3:2142 +15531:3:2149 +15532:3:2150 +15533:3:2161 +15534:3:2169 +15535:3:2170 +15536:3:2174 +15537:3:2179 +15538:3:2180 +15539:0:2565 +15540:3:2192 +15541:0:2565 +15542:3:2013 +15543:0:2565 +15544:3:2014 +15545:0:2565 +15546:3:2015 +15547:3:2019 +15548:3:2020 +15549:3:2028 +15550:3:2029 +15551:3:2033 +15552:3:2034 +15553:3:2042 +15554:3:2047 +15555:3:2051 +15556:3:2052 +15557:3:2059 +15558:3:2060 +15559:3:2071 +15560:3:2079 +15561:3:2080 +15562:3:2084 +15563:3:2089 +15564:3:2090 +15565:0:2565 +15566:2:653 +15567:0:2565 +15568:3:2102 +15569:0:2565 +15570:1:198 +15571:0:2565 +15572:3:2104 +15573:0:2565 +15574:3:2105 +15575:3:2109 +15576:3:2110 +15577:3:2118 +15578:3:2119 +15579:3:2123 +15580:3:2124 +15581:3:2132 +15582:3:2137 +15583:3:2141 +15584:3:2142 +15585:3:2149 +15586:3:2150 +15587:3:2161 +15588:3:2169 +15589:3:2170 +15590:3:2174 +15591:3:2179 +15592:3:2180 +15593:0:2565 +15594:3:2192 +15595:0:2565 +15596:3:2013 +15597:0:2565 +15598:3:2014 +15599:0:2565 +15600:3:2015 +15601:3:2019 +15602:3:2020 +15603:3:2028 +15604:3:2029 +15605:3:2033 +15606:3:2034 +15607:3:2042 +15608:3:2047 +15609:3:2051 +15610:3:2052 +15611:3:2059 +15612:3:2060 +15613:3:2071 +15614:3:2079 +15615:3:2080 +15616:3:2084 +15617:3:2089 +15618:3:2090 +15619:0:2565 +15620:3:2102 +15621:0:2565 +15622:1:197 +15623:0:2565 +15624:3:2104 +15625:0:2565 +15626:3:2105 +15627:3:2109 +15628:3:2110 +15629:3:2118 +15630:3:2119 +15631:3:2123 +15632:3:2124 +15633:3:2132 +15634:3:2137 +15635:3:2141 +15636:3:2142 +15637:3:2149 +15638:3:2150 +15639:3:2161 +15640:3:2169 +15641:3:2170 +15642:3:2174 +15643:3:2179 +15644:3:2180 +15645:0:2565 +15646:3:2192 +15647:0:2565 +15648:3:2013 +15649:0:2565 +15650:3:2014 +15651:0:2565 +15652:3:2015 +15653:3:2019 +15654:3:2020 +15655:3:2028 +15656:3:2029 +15657:3:2033 +15658:3:2034 +15659:3:2042 +15660:3:2047 +15661:3:2051 +15662:3:2052 +15663:3:2059 +15664:3:2060 +15665:3:2071 +15666:3:2079 +15667:3:2080 +15668:3:2084 +15669:3:2089 +15670:3:2090 +15671:0:2565 +15672:2:654 +15673:2:658 +15674:2:659 +15675:2:667 +15676:2:668 +15677:2:672 +15678:2:673 +15679:2:681 +15680:2:686 +15681:2:690 +15682:2:691 +15683:2:698 +15684:2:699 +15685:2:710 +15686:2:711 +15687:2:712 +15688:2:723 +15689:2:728 +15690:2:729 +15691:0:2565 +15692:3:2102 +15693:0:2565 +15694:1:198 +15695:0:2565 +15696:3:2104 +15697:0:2565 +15698:3:2105 +15699:3:2109 +15700:3:2110 +15701:3:2118 +15702:3:2119 +15703:3:2123 +15704:3:2124 +15705:3:2132 +15706:3:2137 +15707:3:2141 +15708:3:2142 +15709:3:2149 +15710:3:2150 +15711:3:2161 +15712:3:2169 +15713:3:2170 +15714:3:2174 +15715:3:2179 +15716:3:2180 +15717:0:2565 +15718:3:2192 +15719:0:2565 +15720:3:2013 +15721:0:2565 +15722:3:2014 +15723:0:2565 +15724:3:2015 +15725:3:2019 +15726:3:2020 +15727:3:2028 +15728:3:2029 +15729:3:2033 +15730:3:2034 +15731:3:2042 +15732:3:2047 +15733:3:2051 +15734:3:2052 +15735:3:2059 +15736:3:2060 +15737:3:2071 +15738:3:2079 +15739:3:2080 +15740:3:2084 +15741:3:2089 +15742:3:2090 +15743:0:2565 +15744:3:2102 +15745:0:2565 +15746:2:741 +15747:0:2565 +15748:2:750 +15749:0:2565 +15750:3:2104 +15751:0:2565 +15752:3:2105 +15753:3:2109 +15754:3:2110 +15755:3:2118 +15756:3:2119 +15757:3:2123 +15758:3:2124 +15759:3:2132 +15760:3:2137 +15761:3:2141 +15762:3:2142 +15763:3:2149 +15764:3:2150 +15765:3:2161 +15766:3:2169 +15767:3:2170 +15768:3:2174 +15769:3:2179 +15770:3:2180 +15771:0:2565 +15772:3:2192 +15773:0:2565 +15774:3:2013 +15775:0:2565 +15776:1:197 +15777:0:2565 +15778:2:753 +15779:0:2565 +15780:1:198 +15781:0:2565 +15782:3:2014 +15783:0:2565 +15784:3:2015 +15785:3:2019 +15786:3:2020 +15787:3:2028 +15788:3:2029 +15789:3:2033 +15790:3:2034 +15791:3:2042 +15792:3:2047 +15793:3:2051 +15794:3:2052 +15795:3:2059 +15796:3:2060 +15797:3:2071 +15798:3:2079 +15799:3:2080 +15800:3:2084 +15801:3:2089 +15802:3:2090 +15803:0:2565 +15804:3:2102 +15805:0:2565 +15806:3:2104 +15807:0:2565 +15808:3:2105 +15809:3:2109 +15810:3:2110 +15811:3:2118 +15812:3:2119 +15813:3:2123 +15814:3:2124 +15815:3:2132 +15816:3:2137 +15817:3:2141 +15818:3:2142 +15819:3:2149 +15820:3:2150 +15821:3:2161 +15822:3:2169 +15823:3:2170 +15824:3:2174 +15825:3:2179 +15826:3:2180 +15827:0:2565 +15828:3:2192 +15829:0:2565 +15830:3:2013 +15831:0:2565 +15832:1:197 +15833:0:2565 +15834:3:2014 +15835:0:2565 +15836:3:2015 +15837:3:2019 +15838:3:2020 +15839:3:2028 +15840:3:2029 +15841:3:2033 +15842:3:2034 +15843:3:2042 +15844:3:2047 +15845:3:2051 +15846:3:2052 +15847:3:2059 +15848:3:2060 +15849:3:2071 +15850:3:2079 +15851:3:2080 +15852:3:2084 +15853:3:2089 +15854:3:2090 +15855:0:2565 +15856:3:2102 +15857:0:2565 +15858:3:2104 +15859:0:2565 +15860:3:2105 +15861:3:2109 +15862:3:2110 +15863:3:2118 +15864:3:2119 +15865:3:2123 +15866:3:2124 +15867:3:2132 +15868:3:2137 +15869:3:2141 +15870:3:2142 +15871:3:2149 +15872:3:2150 +15873:3:2161 +15874:3:2169 +15875:3:2170 +15876:3:2174 +15877:3:2179 +15878:3:2180 +15879:0:2565 +15880:3:2192 +15881:0:2565 +15882:2:758 +15883:0:2565 +15884:3:2013 +15885:0:2565 +15886:1:198 +15887:0:2565 +15888:3:2014 +15889:0:2565 +15890:3:2015 +15891:3:2019 +15892:3:2020 +15893:3:2028 +15894:3:2029 +15895:3:2033 +15896:3:2034 +15897:3:2042 +15898:3:2047 +15899:3:2051 +15900:3:2052 +15901:3:2059 +15902:3:2060 +15903:3:2071 +15904:3:2079 +15905:3:2080 +15906:3:2084 +15907:3:2089 +15908:3:2090 +15909:0:2565 +15910:3:2102 +15911:0:2565 +15912:3:2104 +15913:0:2565 +15914:3:2105 +15915:3:2109 +15916:3:2110 +15917:3:2118 +15918:3:2119 +15919:3:2123 +15920:3:2124 +15921:3:2132 +15922:3:2137 +15923:3:2141 +15924:3:2142 +15925:3:2149 +15926:3:2150 +15927:3:2161 +15928:3:2169 +15929:3:2170 +15930:3:2174 +15931:3:2179 +15932:3:2180 +15933:0:2565 +15934:3:2192 +15935:0:2565 +15936:3:2013 +15937:0:2565 +15938:1:197 +15939:0:2565 +15940:3:2014 +15941:0:2565 +15942:3:2015 +15943:3:2019 +15944:3:2020 +15945:3:2028 +15946:3:2029 +15947:3:2033 +15948:3:2034 +15949:3:2042 +15950:3:2047 +15951:3:2051 +15952:3:2052 +15953:3:2059 +15954:3:2060 +15955:3:2071 +15956:3:2079 +15957:3:2080 +15958:3:2084 +15959:3:2089 +15960:3:2090 +15961:0:2565 +15962:3:2102 +15963:0:2565 +15964:3:2104 +15965:0:2565 +15966:3:2105 +15967:3:2109 +15968:3:2110 +15969:3:2118 +15970:3:2119 +15971:3:2123 +15972:3:2124 +15973:3:2132 +15974:3:2137 +15975:3:2141 +15976:3:2142 +15977:3:2149 +15978:3:2150 +15979:3:2161 +15980:3:2169 +15981:3:2170 +15982:3:2174 +15983:3:2179 +15984:3:2180 +15985:0:2565 +15986:3:2192 +15987:0:2565 +15988:2:759 +15989:0:2565 +15990:3:2013 +15991:0:2565 +15992:1:198 +15993:0:2565 +15994:3:2014 +15995:0:2565 +15996:3:2015 +15997:3:2019 +15998:3:2020 +15999:3:2028 +16000:3:2029 +16001:3:2033 +16002:3:2034 +16003:3:2042 +16004:3:2047 +16005:3:2051 +16006:3:2052 +16007:3:2059 +16008:3:2060 +16009:3:2071 +16010:3:2079 +16011:3:2080 +16012:3:2084 +16013:3:2089 +16014:3:2090 +16015:0:2565 +16016:3:2102 +16017:0:2565 +16018:3:2104 +16019:0:2565 +16020:3:2105 +16021:3:2109 +16022:3:2110 +16023:3:2118 +16024:3:2119 +16025:3:2123 +16026:3:2124 +16027:3:2132 +16028:3:2137 +16029:3:2141 +16030:3:2142 +16031:3:2149 +16032:3:2150 +16033:3:2161 +16034:3:2169 +16035:3:2170 +16036:3:2174 +16037:3:2179 +16038:3:2180 +16039:0:2565 +16040:3:2192 +16041:0:2565 +16042:3:2013 +16043:0:2565 +16044:1:197 +16045:0:2565 +16046:3:2014 +16047:0:2565 +16048:3:2015 +16049:3:2019 +16050:3:2020 +16051:3:2028 +16052:3:2029 +16053:3:2033 +16054:3:2034 +16055:3:2042 +16056:3:2047 +16057:3:2051 +16058:3:2052 +16059:3:2059 +16060:3:2060 +16061:3:2071 +16062:3:2079 +16063:3:2080 +16064:3:2084 +16065:3:2089 +16066:3:2090 +16067:0:2565 +16068:3:2102 +16069:0:2565 +16070:3:2104 +16071:0:2565 +16072:3:2105 +16073:3:2109 +16074:3:2110 +16075:3:2118 +16076:3:2119 +16077:3:2123 +16078:3:2124 +16079:3:2132 +16080:3:2137 +16081:3:2141 +16082:3:2142 +16083:3:2149 +16084:3:2150 +16085:3:2161 +16086:3:2169 +16087:3:2170 +16088:3:2174 +16089:3:2179 +16090:3:2180 +16091:0:2565 +16092:3:2192 +16093:0:2565 +16094:2:760 +16095:0:2565 +16096:3:2013 +16097:0:2565 +16098:2:761 +16099:0:2565 +16100:2:762 +16101:0:2565 +16102:2:763 +16103:0:2565 +16104:1:198 +16105:0:2565 +16106:3:2014 +16107:0:2565 +16108:3:2015 +16109:3:2019 +16110:3:2020 +16111:3:2028 +16112:3:2029 +16113:3:2033 +16114:3:2034 +16115:3:2042 +16116:3:2047 +16117:3:2051 +16118:3:2052 +16119:3:2059 +16120:3:2060 +16121:3:2071 +16122:3:2079 +16123:3:2080 +16124:3:2084 +16125:3:2089 +16126:3:2090 +16127:0:2565 +16128:3:2102 +16129:0:2565 +16130:3:2104 +16131:0:2565 +16132:3:2105 +16133:3:2109 +16134:3:2110 +16135:3:2118 +16136:3:2119 +16137:3:2123 +16138:3:2124 +16139:3:2132 +16140:3:2137 +16141:3:2141 +16142:3:2142 +16143:3:2149 +16144:3:2150 +16145:3:2161 +16146:3:2169 +16147:3:2170 +16148:3:2174 +16149:3:2179 +16150:3:2180 +16151:0:2565 +16152:3:2192 +16153:0:2565 +16154:3:2013 +16155:0:2565 +16156:1:197 +16157:0:2565 +16158:3:2014 +16159:0:2565 +16160:3:2015 +16161:3:2019 +16162:3:2020 +16163:3:2028 +16164:3:2029 +16165:3:2033 +16166:3:2034 +16167:3:2042 +16168:3:2047 +16169:3:2051 +16170:3:2052 +16171:3:2059 +16172:3:2060 +16173:3:2071 +16174:3:2079 +16175:3:2080 +16176:3:2084 +16177:3:2089 +16178:3:2090 +16179:0:2565 +16180:3:2102 +16181:0:2565 +16182:3:2104 +16183:0:2565 +16184:3:2105 +16185:3:2109 +16186:3:2110 +16187:3:2118 +16188:3:2119 +16189:3:2123 +16190:3:2124 +16191:3:2132 +16192:3:2137 +16193:3:2141 +16194:3:2142 +16195:3:2149 +16196:3:2150 +16197:3:2161 +16198:3:2169 +16199:3:2170 +16200:3:2174 +16201:3:2179 +16202:3:2180 +16203:0:2565 +16204:3:2192 +16205:0:2565 +16206:2:765 +16207:0:2565 +16208:3:2013 +16209:0:2565 +16210:1:198 +16211:0:2565 +16212:3:2014 +16213:0:2565 +16214:3:2015 +16215:3:2019 +16216:3:2020 +16217:3:2028 +16218:3:2029 +16219:3:2033 +16220:3:2034 +16221:3:2042 +16222:3:2047 +16223:3:2051 +16224:3:2052 +16225:3:2059 +16226:3:2060 +16227:3:2071 +16228:3:2079 +16229:3:2080 +16230:3:2084 +16231:3:2089 +16232:3:2090 +16233:0:2565 +16234:3:2102 +16235:0:2565 +16236:3:2104 +16237:0:2565 +16238:3:2105 +16239:3:2109 +16240:3:2110 +16241:3:2118 +16242:3:2119 +16243:3:2123 +16244:3:2124 +16245:3:2132 +16246:3:2137 +16247:3:2141 +16248:3:2142 +16249:3:2149 +16250:3:2150 +16251:3:2161 +16252:3:2169 +16253:3:2170 +16254:3:2174 +16255:3:2179 +16256:3:2180 +16257:0:2565 +16258:3:2192 +16259:0:2565 +16260:3:2013 +16261:0:2565 +16262:2:766 +16263:2:770 +16264:2:771 +16265:2:779 +16266:2:788 +16267:2:789 +16268:2:793 +16269:2:798 +16270:2:802 +16271:2:803 +16272:2:810 +16273:2:811 +16274:2:822 +16275:2:823 +16276:2:826 +16277:2:827 +16278:2:835 +16279:2:840 +16280:2:841 +16281:0:2565 +16282:3:2014 +16283:0:2565 +16284:3:2015 +16285:3:2019 +16286:3:2020 +16287:3:2028 +16288:3:2029 +16289:3:2033 +16290:3:2034 +16291:3:2042 +16292:3:2047 +16293:3:2051 +16294:3:2052 +16295:3:2059 +16296:3:2060 +16297:3:2071 +16298:3:2079 +16299:3:2080 +16300:3:2084 +16301:3:2089 +16302:3:2090 +16303:0:2565 +16304:3:2102 +16305:0:2565 +16306:3:2104 +16307:0:2565 +16308:3:2105 +16309:3:2109 +16310:3:2110 +16311:3:2118 +16312:3:2119 +16313:3:2123 +16314:3:2124 +16315:3:2132 +16316:3:2137 +16317:3:2141 +16318:3:2142 +16319:3:2149 +16320:3:2150 +16321:3:2161 +16322:3:2169 +16323:3:2170 +16324:3:2174 +16325:3:2179 +16326:3:2180 +16327:0:2565 +16328:3:2192 +16329:0:2565 +16330:2:853 +16331:0:2565 +16332:3:2013 +16333:0:2565 +16334:2:857 +16335:0:2565 +16336:2:465 +16337:0:2565 +16338:3:2014 +16339:0:2565 +16340:3:2015 +16341:3:2019 +16342:3:2020 +16343:3:2028 +16344:3:2029 +16345:3:2033 +16346:3:2034 +16347:3:2042 +16348:3:2047 +16349:3:2051 +16350:3:2052 +16351:3:2059 +16352:3:2060 +16353:3:2071 +16354:3:2079 +16355:3:2080 +16356:3:2084 +16357:3:2089 +16358:3:2090 +16359:0:2565 +16360:3:2102 +16361:0:2565 +16362:3:2104 +16363:0:2565 +16364:3:2105 +16365:3:2109 +16366:3:2110 +16367:3:2118 +16368:3:2119 +16369:3:2123 +16370:3:2124 +16371:3:2132 +16372:3:2137 +16373:3:2141 +16374:3:2142 +16375:3:2149 +16376:3:2150 +16377:3:2161 +16378:3:2169 +16379:3:2170 +16380:3:2174 +16381:3:2179 +16382:3:2180 +16383:0:2565 +16384:3:2192 +16385:0:2565 +16386:2:466 +16387:0:2565 +16388:3:2013 +16389:0:2565 +16390:3:2014 +16391:0:2565 +16392:3:2015 +16393:3:2019 +16394:3:2020 +16395:3:2028 +16396:3:2029 +16397:3:2033 +16398:3:2034 +16399:3:2042 +16400:3:2047 +16401:3:2051 +16402:3:2052 +16403:3:2059 +16404:3:2060 +16405:3:2071 +16406:3:2079 +16407:3:2080 +16408:3:2084 +16409:3:2089 +16410:3:2090 +16411:0:2565 +16412:3:2102 +16413:0:2565 +16414:3:2104 +16415:0:2565 +16416:3:2105 +16417:3:2109 +16418:3:2110 +16419:3:2118 +16420:3:2119 +16421:3:2123 +16422:3:2124 +16423:3:2132 +16424:3:2137 +16425:3:2141 +16426:3:2142 +16427:3:2149 +16428:3:2150 +16429:3:2161 +16430:3:2169 +16431:3:2170 +16432:3:2174 +16433:3:2179 +16434:3:2180 +16435:0:2565 +16436:2:467 +16437:0:2565 +16438:3:2192 +16439:0:2565 +16440:3:2013 +16441:0:2565 +16442:3:2014 +16443:0:2565 +16444:3:2015 +16445:3:2019 +16446:3:2020 +16447:3:2028 +16448:3:2029 +16449:3:2033 +16450:3:2034 +16451:3:2042 +16452:3:2047 +16453:3:2051 +16454:3:2052 +16455:3:2059 +16456:3:2060 +16457:3:2071 +16458:3:2079 +16459:3:2080 +16460:3:2084 +16461:3:2089 +16462:3:2090 +16463:0:2565 +16464:3:2102 +16465:0:2565 +16466:3:2104 +16467:0:2565 +16468:1:199 +16469:0:2565 +16470:2:468 +16471:0:2565 +16472:1:205 +16473:0:2565 +16474:3:2105 +16475:3:2109 +16476:3:2110 +16477:3:2118 +16478:3:2119 +16479:3:2123 +16480:3:2124 +16481:3:2132 +16482:3:2137 +16483:3:2141 +16484:3:2142 +16485:3:2149 +16486:3:2150 +16487:3:2161 +16488:3:2169 +16489:3:2170 +16490:3:2174 +16491:3:2179 +16492:3:2180 +16493:0:2565 +16494:3:2192 +16495:0:2565 +16496:3:2013 +16497:0:2565 +16498:3:2014 +16499:0:2565 +16500:3:2015 +16501:3:2019 +16502:3:2020 +16503:3:2028 +16504:3:2029 +16505:3:2033 +16506:3:2034 +16507:3:2042 +16508:3:2047 +16509:3:2051 +16510:3:2052 +16511:3:2059 +16512:3:2060 +16513:3:2071 +16514:3:2079 +16515:3:2080 +16516:3:2084 +16517:3:2089 +16518:3:2090 +16519:0:2565 +16520:3:2102 +16521:0:2565 +16522:3:2104 +16523:0:2565 +16524:2:467 +16525:0:2565 +16526:2:468 +16527:0:2565 +16528:3:2105 +16529:3:2109 +16530:3:2110 +16531:3:2118 +16532:3:2119 +16533:3:2123 +16534:3:2124 +16535:3:2132 +16536:3:2137 +16537:3:2141 +16538:3:2142 +16539:3:2149 +16540:3:2150 +16541:3:2161 +16542:3:2169 +16543:3:2170 +16544:3:2174 +16545:3:2179 +16546:3:2180 +16547:0:2565 +16548:3:2192 +16549:0:2565 +16550:3:2013 +16551:0:2565 +16552:3:2014 +16553:0:2565 +16554:3:2015 +16555:3:2019 +16556:3:2020 +16557:3:2028 +16558:3:2029 +16559:3:2033 +16560:3:2034 +16561:3:2042 +16562:3:2047 +16563:3:2051 +16564:3:2052 +16565:3:2059 +16566:3:2060 +16567:3:2071 +16568:3:2079 +16569:3:2080 +16570:3:2084 +16571:3:2089 +16572:3:2090 +16573:0:2565 +16574:3:2102 +16575:0:2565 +16576:2:467 +16577:0:2565 +16578:1:206 +16579:0:2565 +16580:2:468 +16581:0:2565 +16582:3:2104 +16583:0:2565 +16584:3:2105 +16585:3:2109 +16586:3:2110 +16587:3:2118 +16588:3:2119 +16589:3:2123 +16590:3:2124 +16591:3:2132 +16592:3:2137 +16593:3:2141 +16594:3:2142 +16595:3:2149 +16596:3:2150 +16597:3:2161 +16598:3:2169 +16599:3:2170 +16600:3:2174 +16601:3:2179 +16602:3:2180 +16603:0:2565 +16604:3:2192 +16605:0:2565 +16606:3:2013 +16607:0:2565 +16608:3:2014 +16609:0:2565 +16610:3:2015 +16611:3:2019 +16612:3:2020 +16613:3:2028 +16614:3:2029 +16615:3:2033 +16616:3:2034 +16617:3:2042 +16618:3:2047 +16619:3:2051 +16620:3:2052 +16621:3:2059 +16622:3:2060 +16623:3:2071 +16624:3:2079 +16625:3:2080 +16626:3:2084 +16627:3:2089 +16628:3:2090 +16629:0:2565 +16630:3:2102 +16631:0:2565 +16632:2:467 +16633:0:2565 +16634:2:468 +16635:0:2565 +16636:3:2104 +16637:0:2565 +16638:3:2105 +16639:3:2109 +16640:3:2110 +16641:3:2118 +16642:3:2119 +16643:3:2123 +16644:3:2124 +16645:3:2132 +16646:3:2137 +16647:3:2141 +16648:3:2142 +16649:3:2149 +16650:3:2150 +16651:3:2161 +16652:3:2169 +16653:3:2170 +16654:3:2174 +16655:3:2179 +16656:3:2180 +16657:0:2565 +16658:3:2192 +16659:0:2565 +16660:3:2013 +16661:0:2565 +16662:3:2014 +16663:0:2565 +16664:3:2015 +16665:3:2019 +16666:3:2020 +16667:3:2028 +16668:3:2029 +16669:3:2033 +16670:3:2034 +16671:3:2042 +16672:3:2047 +16673:3:2051 +16674:3:2052 +16675:3:2059 +16676:3:2060 +16677:3:2071 +16678:3:2079 +16679:3:2080 +16680:3:2084 +16681:3:2089 +16682:3:2090 +16683:0:2565 +16684:2:467 +16685:0:2565 +16686:1:207 +16687:1:211 +16688:1:212 +16689:1:220 +16690:1:229 +16691:1:230 +16692:1:234 +16693:1:239 +16694:1:243 +16695:1:244 +16696:1:251 +16697:1:252 +16698:1:263 +16699:1:264 +16700:1:267 +16701:1:268 +16702:1:276 +16703:1:281 +16704:1:282 +16705:0:2565 +16706:3:2102 +16707:0:2565 +16708:2:468 +16709:0:2565 +16710:3:2104 +16711:0:2565 +16712:3:2105 +16713:3:2109 +16714:3:2110 +16715:3:2118 +16716:3:2119 +16717:3:2123 +16718:3:2124 +16719:3:2132 +16720:3:2137 +16721:3:2141 +16722:3:2142 +16723:3:2149 +16724:3:2150 +16725:3:2161 +16726:3:2169 +16727:3:2170 +16728:3:2174 +16729:3:2179 +16730:3:2180 +16731:0:2565 +16732:3:2192 +16733:0:2565 +16734:3:2013 +16735:0:2565 +16736:3:2014 +16737:0:2565 +16738:3:2015 +16739:3:2019 +16740:3:2020 +16741:3:2028 +16742:3:2029 +16743:3:2033 +16744:3:2034 +16745:3:2042 +16746:3:2047 +16747:3:2051 +16748:3:2052 +16749:3:2059 +16750:3:2060 +16751:3:2071 +16752:3:2079 +16753:3:2080 +16754:3:2084 +16755:3:2089 +16756:3:2090 +16757:0:2565 +16758:2:467 +16759:0:2565 +16760:3:2102 +16761:0:2565 +16762:3:2104 +16763:0:2565 +16764:3:2105 +16765:3:2109 +16766:3:2110 +16767:3:2118 +16768:3:2119 +16769:3:2123 +16770:3:2124 +16771:3:2132 +16772:3:2137 +16773:3:2141 +16774:3:2142 +16775:3:2149 +16776:3:2150 +16777:3:2161 +16778:3:2169 +16779:3:2170 +16780:3:2174 +16781:3:2179 +16782:3:2180 +16783:0:2565 +16784:3:2192 +16785:0:2565 +16786:3:2013 +16787:0:2565 +16788:3:2014 +16789:0:2565 +16790:1:294 +16791:0:2565 +16792:2:468 +16793:0:2565 +16794:3:2015 +16795:3:2019 +16796:3:2020 +16797:3:2028 +16798:3:2029 +16799:3:2033 +16800:3:2034 +16801:3:2042 +16802:3:2047 +16803:3:2051 +16804:3:2052 +16805:3:2059 +16806:3:2060 +16807:3:2071 +16808:3:2079 +16809:3:2080 +16810:3:2084 +16811:3:2089 +16812:3:2090 +16813:0:2565 +16814:3:2102 +16815:0:2565 +16816:3:2104 +16817:0:2565 +16818:3:2105 +16819:3:2109 +16820:3:2110 +16821:3:2118 +16822:3:2119 +16823:3:2123 +16824:3:2124 +16825:3:2132 +16826:3:2137 +16827:3:2141 +16828:3:2142 +16829:3:2149 +16830:3:2150 +16831:3:2161 +16832:3:2169 +16833:3:2170 +16834:3:2174 +16835:3:2179 +16836:3:2180 +16837:0:2565 +16838:3:2192 +16839:0:2565 +16840:3:2013 +16841:0:2565 +16842:3:2014 +16843:0:2565 +16844:2:469 +16845:0:2565 +16846:2:475 +16847:0:2565 +16848:2:476 +16849:0:2565 +16850:3:2015 +16851:3:2019 +16852:3:2020 +16853:3:2028 +16854:3:2029 +16855:3:2033 +16856:3:2034 +16857:3:2042 +16858:3:2047 +16859:3:2051 +16860:3:2052 +16861:3:2059 +16862:3:2060 +16863:3:2071 +16864:3:2079 +16865:3:2080 +16866:3:2084 +16867:3:2089 +16868:3:2090 +16869:0:2565 +16870:3:2102 +16871:0:2565 +16872:3:2104 +16873:0:2565 +16874:3:2105 +16875:3:2109 +16876:3:2110 +16877:3:2118 +16878:3:2119 +16879:3:2123 +16880:3:2124 +16881:3:2132 +16882:3:2137 +16883:3:2141 +16884:3:2142 +16885:3:2149 +16886:3:2150 +16887:3:2161 +16888:3:2169 +16889:3:2170 +16890:3:2174 +16891:3:2179 +16892:3:2180 +16893:0:2565 +16894:3:2192 +16895:0:2565 +16896:3:2013 +16897:0:2565 +16898:2:477 +16899:2:481 +16900:2:482 +16901:2:490 +16902:2:499 +16903:2:500 +16904:2:504 +16905:2:509 +16906:2:513 +16907:2:514 +16908:2:521 +16909:2:522 +16910:2:533 +16911:2:534 +16912:2:537 +16913:2:538 +16914:2:546 +16915:2:551 +16916:2:552 +16917:0:2565 +16918:3:2014 +16919:0:2565 +16920:3:2015 +16921:3:2019 +16922:3:2020 +16923:3:2028 +16924:3:2029 +16925:3:2033 +16926:3:2034 +16927:3:2042 +16928:3:2047 +16929:3:2051 +16930:3:2052 +16931:3:2059 +16932:3:2060 +16933:3:2071 +16934:3:2079 +16935:3:2080 +16936:3:2084 +16937:3:2089 +16938:3:2090 +16939:0:2565 +16940:3:2102 +16941:0:2565 +16942:3:2104 +16943:0:2565 +16944:3:2105 +16945:3:2109 +16946:3:2110 +16947:3:2118 +16948:3:2119 +16949:3:2123 +16950:3:2124 +16951:3:2132 +16952:3:2137 +16953:3:2141 +16954:3:2142 +16955:3:2149 +16956:3:2150 +16957:3:2161 +16958:3:2169 +16959:3:2170 +16960:3:2174 +16961:3:2179 +16962:3:2180 +16963:0:2565 +16964:3:2192 +16965:0:2565 +16966:2:564 +16967:0:2565 +16968:3:2013 +16969:0:2565 +16970:3:2014 +16971:0:2565 +16972:3:2015 +16973:3:2019 +16974:3:2020 +16975:3:2028 +16976:3:2029 +16977:3:2033 +16978:3:2034 +16979:3:2042 +16980:3:2047 +16981:3:2051 +16982:3:2052 +16983:3:2059 +16984:3:2060 +16985:3:2071 +16986:3:2079 +16987:3:2080 +16988:3:2084 +16989:3:2089 +16990:3:2090 +16991:0:2565 +16992:3:2102 +16993:0:2565 +16994:3:2104 +16995:0:2565 +16996:3:2105 +16997:3:2109 +16998:3:2110 +16999:3:2118 +17000:3:2119 +17001:3:2123 +17002:3:2124 +17003:3:2132 +17004:3:2137 +17005:3:2141 +17006:3:2142 +17007:3:2149 +17008:3:2150 +17009:3:2161 +17010:3:2169 +17011:3:2170 +17012:3:2174 +17013:3:2179 +17014:3:2180 +17015:0:2565 +17016:2:565 +17017:2:569 +17018:2:570 +17019:2:578 +17020:2:587 +17021:2:588 +17022:2:592 +17023:2:597 +17024:2:601 +17025:2:602 +17026:2:609 +17027:2:610 +17028:2:621 +17029:2:622 +17030:2:625 +17031:2:626 +17032:2:634 +17033:2:639 +17034:2:640 +17035:0:2565 +17036:3:2192 +17037:0:2565 +17038:3:2013 +17039:0:2565 +17040:2:652 +17041:0:2565 +17042:3:2014 +17043:0:2565 +17044:3:2015 +17045:3:2019 +17046:3:2020 +17047:3:2028 +17048:3:2029 +17049:3:2033 +17050:3:2034 +17051:3:2042 +17052:3:2047 +17053:3:2051 +17054:3:2052 +17055:3:2059 +17056:3:2060 +17057:3:2071 +17058:3:2079 +17059:3:2080 +17060:3:2084 +17061:3:2089 +17062:3:2090 +17063:0:2565 +17064:3:2102 +17065:0:2565 +17066:3:2104 +17067:0:2565 +17068:3:2105 +17069:3:2109 +17070:3:2110 +17071:3:2118 +17072:3:2119 +17073:3:2123 +17074:3:2124 +17075:3:2132 +17076:3:2137 +17077:3:2141 +17078:3:2142 +17079:3:2149 +17080:3:2150 +17081:3:2161 +17082:3:2169 +17083:3:2170 +17084:3:2174 +17085:3:2179 +17086:3:2180 +17087:0:2565 +17088:3:2192 +17089:0:2565 +17090:2:653 +17091:0:2565 +17092:3:2013 +17093:0:2565 +17094:3:2014 +17095:0:2565 +17096:3:2015 +17097:3:2019 +17098:3:2020 +17099:3:2028 +17100:3:2029 +17101:3:2033 +17102:3:2034 +17103:3:2042 +17104:3:2047 +17105:3:2051 +17106:3:2052 +17107:3:2059 +17108:3:2060 +17109:3:2071 +17110:3:2079 +17111:3:2080 +17112:3:2084 +17113:3:2089 +17114:3:2090 +17115:0:2565 +17116:3:2102 +17117:0:2565 +17118:3:2104 +17119:0:2565 +17120:3:2105 +17121:3:2109 +17122:3:2110 +17123:3:2118 +17124:3:2119 +17125:3:2123 +17126:3:2124 +17127:3:2132 +17128:3:2137 +17129:3:2141 +17130:3:2142 +17131:3:2149 +17132:3:2150 +17133:3:2161 +17134:3:2169 +17135:3:2170 +17136:3:2174 +17137:3:2179 +17138:3:2180 +17139:0:2565 +17140:2:654 +17141:2:658 +17142:2:659 +17143:2:667 +17144:2:676 +17145:2:677 +17146:2:681 +17147:2:686 +17148:2:690 +17149:2:691 +17150:2:698 +17151:2:699 +17152:2:710 +17153:2:711 +17154:2:714 +17155:2:715 +17156:2:723 +17157:2:728 +17158:2:729 +17159:0:2565 +17160:3:2192 +17161:0:2565 +17162:3:2013 +17163:0:2565 +17164:3:2014 +17165:0:2565 +17166:3:2015 +17167:3:2019 +17168:3:2020 +17169:3:2028 +17170:3:2029 +17171:3:2033 +17172:3:2034 +17173:3:2042 +17174:3:2047 +17175:3:2051 +17176:3:2052 +17177:3:2059 +17178:3:2060 +17179:3:2071 +17180:3:2079 +17181:3:2080 +17182:3:2084 +17183:3:2089 +17184:3:2090 +17185:0:2565 +17186:3:2102 +17187:0:2565 +17188:3:2104 +17189:0:2565 +17190:1:295 +17191:0:2565 +17192:1:296 +17193:0:2565 +17194:3:2105 +17195:3:2109 +17196:3:2110 +17197:3:2118 +17198:3:2119 +17199:3:2123 +17200:3:2124 +17201:3:2132 +17202:3:2137 +17203:3:2141 +17204:3:2142 +17205:3:2149 +17206:3:2150 +17207:3:2161 +17208:3:2169 +17209:3:2170 +17210:3:2174 +17211:3:2179 +17212:3:2180 +17213:0:2565 +17214:3:2192 +17215:0:2565 +17216:3:2013 +17217:0:2565 +17218:3:2014 +17219:0:2565 +17220:3:2015 +17221:3:2019 +17222:3:2020 +17223:3:2028 +17224:3:2029 +17225:3:2033 +17226:3:2034 +17227:3:2042 +17228:3:2047 +17229:3:2051 +17230:3:2052 +17231:3:2059 +17232:3:2060 +17233:3:2071 +17234:3:2079 +17235:3:2080 +17236:3:2084 +17237:3:2089 +17238:3:2090 +17239:0:2565 +17240:3:2102 +17241:0:2565 +17242:3:2104 +17243:0:2565 +17244:1:295 +17245:0:2565 +17246:3:2105 +17247:3:2109 +17248:3:2110 +17249:3:2118 +17250:3:2119 +17251:3:2123 +17252:3:2124 +17253:3:2132 +17254:3:2137 +17255:3:2141 +17256:3:2142 +17257:3:2149 +17258:3:2150 +17259:3:2161 +17260:3:2169 +17261:3:2170 +17262:3:2174 +17263:3:2179 +17264:3:2180 +17265:0:2565 +17266:3:2192 +17267:0:2565 +17268:3:2013 +17269:0:2565 +17270:3:2014 +17271:0:2565 +17272:3:2015 +17273:3:2019 +17274:3:2020 +17275:3:2028 +17276:3:2029 +17277:3:2033 +17278:3:2034 +17279:3:2042 +17280:3:2047 +17281:3:2051 +17282:3:2052 +17283:3:2059 +17284:3:2060 +17285:3:2071 +17286:3:2079 +17287:3:2080 +17288:3:2084 +17289:3:2089 +17290:3:2090 +17291:0:2565 +17292:3:2102 +17293:0:2565 +17294:2:741 +17295:0:2565 +17296:2:750 +17297:0:2565 +17298:2:753 +17299:0:2565 +17300:1:296 +17301:0:2565 +17302:2:758 +17303:0:2565 +17304:2:759 +17305:0:2565 +17306:2:760 +17307:0:2565 +17308:2:761 +17309:0:2565 +17310:2:762 +17311:0:2565 +17312:2:763 +17313:0:2565 +17314:2:765 +17315:0:2565 +17316:2:766 +17317:2:770 +17318:2:771 +17319:2:779 +17320:2:780 +17321:2:781 +17322:2:793 +17323:2:798 +17324:2:802 +17325:2:803 +17326:2:810 +17327:2:811 +17328:2:822 +17329:2:823 +17330:2:824 +17331:2:835 +17332:2:840 +17333:2:841 +17334:0:2565 +17335:3:2104 +17336:0:2565 +17337:3:2105 +17338:3:2109 +17339:3:2110 +17340:3:2118 +17341:3:2119 +17342:3:2123 +17343:3:2124 +17344:3:2132 +17345:3:2137 +17346:3:2141 +17347:3:2142 +17348:3:2149 +17349:3:2150 +17350:3:2161 +17351:3:2169 +17352:3:2170 +17353:3:2174 +17354:3:2179 +17355:3:2180 +17356:0:2565 +17357:3:2192 +17358:0:2565 +17359:3:2013 +17360:0:2565 +17361:3:2014 +17362:0:2565 +17363:3:2015 +17364:3:2019 +17365:3:2020 +17366:3:2028 +17367:3:2029 +17368:3:2033 +17369:3:2034 +17370:3:2042 +17371:3:2047 +17372:3:2051 +17373:3:2052 +17374:3:2059 +17375:3:2060 +17376:3:2071 +17377:3:2079 +17378:3:2080 +17379:3:2084 +17380:3:2089 +17381:3:2090 +17382:0:2565 +17383:3:2102 +17384:0:2565 +17385:2:853 +17386:0:2565 +17387:2:857 +17388:0:2565 +17389:3:2104 +17390:0:2565 +17391:3:2105 +17392:3:2109 +17393:3:2110 +17394:3:2118 +17395:3:2119 +17396:3:2123 +17397:3:2124 +17398:3:2132 +17399:3:2137 +17400:3:2141 +17401:3:2142 +17402:3:2149 +17403:3:2150 +17404:3:2161 +17405:3:2169 +17406:3:2170 +17407:3:2174 +17408:3:2179 +17409:3:2180 +17410:0:2565 +17411:3:2192 +17412:0:2565 +17413:1:295 +17414:0:2565 +17415:3:2013 +17416:0:2565 +17417:2:465 +17418:0:2565 +17419:1:296 +17420:0:2565 +17421:3:2014 +17422:0:2565 +17423:3:2015 +17424:3:2019 +17425:3:2020 +17426:3:2028 +17427:3:2029 +17428:3:2033 +17429:3:2034 +17430:3:2042 +17431:3:2047 +17432:3:2051 +17433:3:2052 +17434:3:2059 +17435:3:2060 +17436:3:2071 +17437:3:2079 +17438:3:2080 +17439:3:2084 +17440:3:2089 +17441:3:2090 +17442:0:2565 +17443:3:2102 +17444:0:2565 +17445:3:2104 +17446:0:2565 +17447:3:2105 +17448:3:2109 +17449:3:2110 +17450:3:2118 +17451:3:2119 +17452:3:2123 +17453:3:2124 +17454:3:2132 +17455:3:2137 +17456:3:2141 +17457:3:2142 +17458:3:2149 +17459:3:2150 +17460:3:2161 +17461:3:2169 +17462:3:2170 +17463:3:2174 +17464:3:2179 +17465:3:2180 +17466:0:2565 +17467:3:2192 +17468:0:2565 +17469:3:2013 +17470:0:2565 +17471:1:295 +17472:0:2565 +17473:3:2014 +17474:0:2565 +17475:3:2015 +17476:3:2019 +17477:3:2020 +17478:3:2028 +17479:3:2029 +17480:3:2033 +17481:3:2034 +17482:3:2042 +17483:3:2047 +17484:3:2051 +17485:3:2052 +17486:3:2059 +17487:3:2060 +17488:3:2071 +17489:3:2079 +17490:3:2080 +17491:3:2084 +17492:3:2089 +17493:3:2090 +17494:0:2565 +17495:3:2102 +17496:0:2565 +17497:3:2104 +17498:0:2565 +17499:3:2105 +17500:3:2109 +17501:3:2110 +17502:3:2118 +17503:3:2119 +17504:3:2123 +17505:3:2124 +17506:3:2132 +17507:3:2137 +17508:3:2141 +17509:3:2142 +17510:3:2149 +17511:3:2150 +17512:3:2161 +17513:3:2169 +17514:3:2170 +17515:3:2174 +17516:3:2179 +17517:3:2180 +17518:0:2565 +17519:3:2192 +17520:0:2565 +17521:2:466 +17522:0:2565 +17523:3:2013 +17524:0:2565 +17525:1:296 +17526:0:2565 +17527:2:467 +17528:0:2565 +17529:2:468 +17530:0:2565 +17531:1:297 +17532:0:2565 +17533:2:467 +17534:0:2565 +17535:3:2014 +17536:0:2565 +17537:3:2015 +17538:3:2019 +17539:3:2020 +17540:3:2028 +17541:3:2029 +17542:3:2033 +17543:3:2034 +17544:3:2042 +17545:3:2047 +17546:3:2051 +17547:3:2052 +17548:3:2059 +17549:3:2060 +17550:3:2071 +17551:3:2079 +17552:3:2080 +17553:3:2084 +17554:3:2089 +17555:3:2090 +17556:0:2565 +17557:3:2102 +17558:0:2565 +17559:3:2104 +17560:0:2565 +17561:3:2105 +17562:3:2109 +17563:3:2110 +17564:3:2118 +17565:3:2119 +17566:3:2123 +17567:3:2124 +17568:3:2132 +17569:3:2137 +17570:3:2141 +17571:3:2142 +17572:3:2149 +17573:3:2150 +17574:3:2161 +17575:3:2169 +17576:3:2170 +17577:3:2174 +17578:3:2179 +17579:3:2180 +17580:0:2565 +17581:3:2192 +17582:0:2565 +17583:3:2013 +17584:0:2565 +17585:1:303 +17586:0:2565 +17587:2:468 +17588:0:2565 +17589:1:312 +17590:0:2565 +17591:2:467 +17592:0:2565 +17593:2:468 +17594:0:2565 +17595:1:314 +17596:0:2565 +17597:3:2014 +17598:0:2565 +17599:3:2015 +17600:3:2019 +17601:3:2020 +17602:3:2028 +17603:3:2029 +17604:3:2033 +17605:3:2034 +17606:3:2042 +17607:3:2047 +17608:3:2051 +17609:3:2052 +17610:3:2059 +17611:3:2060 +17612:3:2071 +17613:3:2079 +17614:3:2080 +17615:3:2084 +17616:3:2089 +17617:3:2090 +17618:0:2565 +17619:3:2102 +17620:0:2565 +17621:3:2104 +17622:0:2565 +17623:3:2105 +17624:3:2109 +17625:3:2110 +17626:3:2118 +17627:3:2119 +17628:3:2123 +17629:3:2124 +17630:3:2132 +17631:3:2137 +17632:3:2141 +17633:3:2142 +17634:3:2149 +17635:3:2150 +17636:3:2161 +17637:3:2169 +17638:3:2170 +17639:3:2174 +17640:3:2179 +17641:3:2180 +17642:0:2565 +17643:3:2192 +17644:0:2565 +17645:3:2013 +17646:0:2565 +17647:2:469 +17648:0:2565 +17649:2:475 +17650:0:2565 +17651:3:2014 +17652:0:2565 +17653:3:2015 +17654:3:2019 +17655:3:2020 +17656:3:2028 +17657:3:2029 +17658:3:2033 +17659:3:2034 +17660:3:2042 +17661:3:2047 +17662:3:2051 +17663:3:2052 +17664:3:2059 +17665:3:2060 +17666:3:2071 +17667:3:2079 +17668:3:2080 +17669:3:2084 +17670:3:2089 +17671:3:2090 +17672:0:2565 +17673:1:315 +17674:0:2565 +17675:3:2102 +17676:0:2565 +17677:2:476 +17678:0:2565 +17679:1:316 +17680:0:2565 +17681:3:2104 +17682:0:2565 +17683:3:2105 +17684:3:2109 +17685:3:2110 +17686:3:2118 +17687:3:2119 +17688:3:2123 +17689:3:2124 +17690:3:2132 +17691:3:2137 +17692:3:2141 +17693:3:2142 +17694:3:2149 +17695:3:2150 +17696:3:2161 +17697:3:2169 +17698:3:2170 +17699:3:2174 +17700:3:2179 +17701:3:2180 +17702:0:2565 +17703:3:2192 +17704:0:2565 +17705:3:2013 +17706:0:2565 +17707:3:2014 +17708:0:2565 +17709:3:2015 +17710:3:2019 +17711:3:2020 +17712:3:2028 +17713:3:2029 +17714:3:2033 +17715:3:2034 +17716:3:2042 +17717:3:2047 +17718:3:2051 +17719:3:2052 +17720:3:2059 +17721:3:2060 +17722:3:2071 +17723:3:2079 +17724:3:2080 +17725:3:2084 +17726:3:2089 +17727:3:2090 +17728:0:2565 +17729:3:2102 +17730:0:2565 +17731:2:477 +17732:2:481 +17733:2:482 +17734:2:490 +17735:2:499 +17736:2:500 +17737:2:504 +17738:2:509 +17739:2:513 +17740:2:514 +17741:2:521 +17742:2:522 +17743:2:533 +17744:2:534 +17745:2:537 +17746:2:538 +17747:2:546 +17748:2:551 +17749:2:552 +17750:0:2565 +17751:3:2104 +17752:0:2565 +17753:3:2105 +17754:3:2109 +17755:3:2110 +17756:3:2118 +17757:3:2119 +17758:3:2123 +17759:3:2124 +17760:3:2132 +17761:3:2137 +17762:3:2141 +17763:3:2142 +17764:3:2149 +17765:3:2150 +17766:3:2161 +17767:3:2169 +17768:3:2170 +17769:3:2174 +17770:3:2179 +17771:3:2180 +17772:0:2565 +17773:3:2192 +17774:0:2565 +17775:3:2013 +17776:0:2565 +17777:3:2014 +17778:0:2565 +17779:3:2015 +17780:3:2019 +17781:3:2020 +17782:3:2028 +17783:3:2029 +17784:3:2033 +17785:3:2034 +17786:3:2042 +17787:3:2047 +17788:3:2051 +17789:3:2052 +17790:3:2059 +17791:3:2060 +17792:3:2071 +17793:3:2079 +17794:3:2080 +17795:3:2084 +17796:3:2089 +17797:3:2090 +17798:0:2565 +17799:2:564 +17800:0:2565 +17801:3:2102 +17802:0:2565 +17803:3:2104 +17804:0:2565 +17805:3:2105 +17806:3:2109 +17807:3:2110 +17808:3:2118 +17809:3:2119 +17810:3:2123 +17811:3:2124 +17812:3:2132 +17813:3:2137 +17814:3:2141 +17815:3:2142 +17816:3:2149 +17817:3:2150 +17818:3:2161 +17819:3:2169 +17820:3:2170 +17821:3:2174 +17822:3:2179 +17823:3:2180 +17824:0:2565 +17825:3:2192 +17826:0:2565 +17827:3:2013 +17828:0:2565 +17829:3:2014 +17830:0:2565 +17831:2:565 +17832:2:569 +17833:2:570 +17834:2:578 +17835:2:579 +17836:2:580 +17837:2:592 +17838:2:597 +17839:2:601 +17840:2:602 +17841:2:609 +17842:2:610 +17843:2:621 +17844:2:622 +17845:2:623 +17846:2:634 +17847:2:639 +17848:2:640 +17849:0:2565 +17850:3:2015 +17851:3:2019 +17852:3:2020 +17853:3:2028 +17854:3:2029 +17855:3:2033 +17856:3:2034 +17857:3:2042 +17858:3:2047 +17859:3:2051 +17860:3:2052 +17861:3:2059 +17862:3:2060 +17863:3:2071 +17864:3:2079 +17865:3:2080 +17866:3:2084 +17867:3:2089 +17868:3:2090 +17869:0:2565 +17870:3:2102 +17871:0:2565 +17872:3:2104 +17873:0:2565 +17874:3:2105 +17875:3:2109 +17876:3:2110 +17877:3:2118 +17878:3:2119 +17879:3:2123 +17880:3:2124 +17881:3:2132 +17882:3:2137 +17883:3:2141 +17884:3:2142 +17885:3:2149 +17886:3:2150 +17887:3:2161 +17888:3:2169 +17889:3:2170 +17890:3:2174 +17891:3:2179 +17892:3:2180 +17893:0:2565 +17894:3:2192 +17895:0:2565 +17896:1:315 +17897:0:2565 +17898:3:2013 +17899:0:2565 +17900:2:744 +17901:0:2565 +17902:1:316 +17903:0:2565 +17904:3:2014 +17905:0:2565 +17906:3:2015 +17907:3:2019 +17908:3:2020 +17909:3:2028 +17910:3:2029 +17911:3:2033 +17912:3:2034 +17913:3:2042 +17914:3:2047 +17915:3:2051 +17916:3:2052 +17917:3:2059 +17918:3:2060 +17919:3:2071 +17920:3:2079 +17921:3:2080 +17922:3:2084 +17923:3:2089 +17924:3:2090 +17925:0:2565 +17926:3:2102 +17927:0:2565 +17928:3:2104 +17929:0:2565 +17930:3:2105 +17931:3:2109 +17932:3:2110 +17933:3:2118 +17934:3:2119 +17935:3:2123 +17936:3:2124 +17937:3:2132 +17938:3:2137 +17939:3:2141 +17940:3:2142 +17941:3:2149 +17942:3:2150 +17943:3:2161 +17944:3:2169 +17945:3:2170 +17946:3:2174 +17947:3:2179 +17948:3:2180 +17949:0:2565 +17950:3:2192 +17951:0:2565 +17952:3:2013 +17953:0:2565 +17954:1:315 +17955:0:2565 +17956:3:2014 +17957:0:2565 +17958:3:2015 +17959:3:2019 +17960:3:2020 +17961:3:2028 +17962:3:2029 +17963:3:2033 +17964:3:2034 +17965:3:2042 +17966:3:2047 +17967:3:2051 +17968:3:2052 +17969:3:2059 +17970:3:2060 +17971:3:2071 +17972:3:2079 +17973:3:2080 +17974:3:2084 +17975:3:2089 +17976:3:2090 +17977:0:2565 +17978:3:2102 +17979:0:2565 +17980:3:2104 +17981:0:2565 +17982:3:2105 +17983:3:2109 +17984:3:2110 +17985:3:2118 +17986:3:2119 +17987:3:2123 +17988:3:2124 +17989:3:2132 +17990:3:2137 +17991:3:2141 +17992:3:2142 +17993:3:2149 +17994:3:2150 +17995:3:2161 +17996:3:2169 +17997:3:2170 +17998:3:2174 +17999:3:2179 +18000:3:2180 +18001:0:2565 +18002:3:2192 +18003:0:2565 +18004:2:745 +18005:0:2565 +18006:3:2013 +18007:0:2565 +18008:2:750 +18009:0:2565 +18010:2:753 +18011:0:2565 +18012:1:316 +18013:0:2565 +18014:3:2014 +18015:0:2565 +18016:3:2015 +18017:3:2019 +18018:3:2020 +18019:3:2028 +18020:3:2029 +18021:3:2033 +18022:3:2034 +18023:3:2042 +18024:3:2047 +18025:3:2051 +18026:3:2052 +18027:3:2059 +18028:3:2060 +18029:3:2071 +18030:3:2079 +18031:3:2080 +18032:3:2084 +18033:3:2089 +18034:3:2090 +18035:0:2565 +18036:3:2102 +18037:0:2565 +18038:3:2104 +18039:0:2565 +18040:3:2105 +18041:3:2109 +18042:3:2110 +18043:3:2118 +18044:3:2119 +18045:3:2123 +18046:3:2124 +18047:3:2132 +18048:3:2137 +18049:3:2141 +18050:3:2142 +18051:3:2149 +18052:3:2150 +18053:3:2161 +18054:3:2169 +18055:3:2170 +18056:3:2174 +18057:3:2179 +18058:3:2180 +18059:0:2565 +18060:3:2192 +18061:0:2565 +18062:3:2013 +18063:0:2565 +18064:1:315 +18065:0:2565 +18066:3:2014 +18067:0:2565 +18068:3:2015 +18069:3:2019 +18070:3:2020 +18071:3:2028 +18072:3:2029 +18073:3:2033 +18074:3:2034 +18075:3:2042 +18076:3:2047 +18077:3:2051 +18078:3:2052 +18079:3:2059 +18080:3:2060 +18081:3:2071 +18082:3:2079 +18083:3:2080 +18084:3:2084 +18085:3:2089 +18086:3:2090 +18087:0:2565 +18088:3:2102 +18089:0:2565 +18090:3:2104 +18091:0:2565 +18092:3:2105 +18093:3:2109 +18094:3:2110 +18095:3:2118 +18096:3:2119 +18097:3:2123 +18098:3:2124 +18099:3:2132 +18100:3:2137 +18101:3:2141 +18102:3:2142 +18103:3:2149 +18104:3:2150 +18105:3:2161 +18106:3:2169 +18107:3:2170 +18108:3:2174 +18109:3:2179 +18110:3:2180 +18111:0:2565 +18112:3:2192 +18113:0:2565 +18114:2:758 +18115:0:2565 +18116:3:2013 +18117:0:2565 +18118:1:316 +18119:0:2565 +18120:3:2014 +18121:0:2565 +18122:3:2015 +18123:3:2019 +18124:3:2020 +18125:3:2028 +18126:3:2029 +18127:3:2033 +18128:3:2034 +18129:3:2042 +18130:3:2047 +18131:3:2051 +18132:3:2052 +18133:3:2059 +18134:3:2060 +18135:3:2071 +18136:3:2079 +18137:3:2080 +18138:3:2084 +18139:3:2089 +18140:3:2090 +18141:0:2565 +18142:3:2102 +18143:0:2565 +18144:3:2104 +18145:0:2565 +18146:3:2105 +18147:3:2109 +18148:3:2110 +18149:3:2118 +18150:3:2119 +18151:3:2123 +18152:3:2124 +18153:3:2132 +18154:3:2137 +18155:3:2141 +18156:3:2142 +18157:3:2149 +18158:3:2150 +18159:3:2161 +18160:3:2169 +18161:3:2170 +18162:3:2174 +18163:3:2179 +18164:3:2180 +18165:0:2565 +18166:3:2192 +18167:0:2565 +18168:3:2013 +18169:0:2565 +18170:1:315 +18171:0:2565 +18172:3:2014 +18173:0:2565 +18174:3:2015 +18175:3:2019 +18176:3:2020 +18177:3:2028 +18178:3:2029 +18179:3:2033 +18180:3:2034 +18181:3:2042 +18182:3:2047 +18183:3:2051 +18184:3:2052 +18185:3:2059 +18186:3:2060 +18187:3:2071 +18188:3:2079 +18189:3:2080 +18190:3:2084 +18191:3:2089 +18192:3:2090 +18193:0:2565 +18194:3:2102 +18195:0:2565 +18196:3:2104 +18197:0:2565 +18198:3:2105 +18199:3:2109 +18200:3:2110 +18201:3:2118 +18202:3:2119 +18203:3:2123 +18204:3:2124 +18205:3:2132 +18206:3:2137 +18207:3:2141 +18208:3:2142 +18209:3:2149 +18210:3:2150 +18211:3:2161 +18212:3:2169 +18213:3:2170 +18214:3:2174 +18215:3:2179 +18216:3:2180 +18217:0:2565 +18218:3:2192 +18219:0:2565 +18220:2:759 +18221:0:2565 +18222:3:2013 +18223:0:2565 +18224:1:316 +18225:0:2565 +18226:3:2014 +18227:0:2565 +18228:3:2015 +18229:3:2019 +18230:3:2020 +18231:3:2028 +18232:3:2029 +18233:3:2033 +18234:3:2034 +18235:3:2042 +18236:3:2047 +18237:3:2051 +18238:3:2052 +18239:3:2059 +18240:3:2060 +18241:3:2071 +18242:3:2079 +18243:3:2080 +18244:3:2084 +18245:3:2089 +18246:3:2090 +18247:0:2565 +18248:3:2102 +18249:0:2565 +18250:3:2104 +18251:0:2565 +18252:3:2105 +18253:3:2109 +18254:3:2110 +18255:3:2118 +18256:3:2119 +18257:3:2123 +18258:3:2124 +18259:3:2132 +18260:3:2137 +18261:3:2141 +18262:3:2142 +18263:3:2149 +18264:3:2150 +18265:3:2161 +18266:3:2169 +18267:3:2170 +18268:3:2174 +18269:3:2179 +18270:3:2180 +18271:0:2565 +18272:3:2192 +18273:0:2565 +18274:3:2013 +18275:0:2565 +18276:2:760 +18277:0:2565 +18278:2:761 +18279:0:2565 +18280:2:762 +18281:0:2565 +18282:3:2014 +18283:0:2565 +18284:3:2015 +18285:3:2019 +18286:3:2020 +18287:3:2028 +18288:3:2029 +18289:3:2033 +18290:3:2034 +18291:3:2042 +18292:3:2047 +18293:3:2051 +18294:3:2052 +18295:3:2059 +18296:3:2060 +18297:3:2071 +18298:3:2079 +18299:3:2080 +18300:3:2084 +18301:3:2089 +18302:3:2090 +18303:0:2565 +18304:3:2102 +18305:0:2565 +18306:1:315 +18307:0:2565 +18308:2:763 +18309:0:2565 +18310:1:316 +18311:0:2565 +18312:3:2104 +18313:0:2565 +18314:3:2105 +18315:3:2109 +18316:3:2110 +18317:3:2118 +18318:3:2119 +18319:3:2123 +18320:3:2124 +18321:3:2132 +18322:3:2137 +18323:3:2141 +18324:3:2142 +18325:3:2149 +18326:3:2150 +18327:3:2161 +18328:3:2169 +18329:3:2170 +18330:3:2174 +18331:3:2179 +18332:3:2180 +18333:0:2565 +18334:3:2192 +18335:0:2565 +18336:3:2013 +18337:0:2565 +18338:3:2014 +18339:0:2565 +18340:3:2015 +18341:3:2019 +18342:3:2020 +18343:3:2028 +18344:3:2029 +18345:3:2033 +18346:3:2034 +18347:3:2042 +18348:3:2047 +18349:3:2051 +18350:3:2052 +18351:3:2059 +18352:3:2060 +18353:3:2071 +18354:3:2079 +18355:3:2080 +18356:3:2084 +18357:3:2089 +18358:3:2090 +18359:0:2565 +18360:3:2102 +18361:0:2565 +18362:1:315 +18363:0:2565 +18364:3:2104 +18365:0:2565 +18366:3:2105 +18367:3:2109 +18368:3:2110 +18369:3:2118 +18370:3:2119 +18371:3:2123 +18372:3:2124 +18373:3:2132 +18374:3:2137 +18375:3:2141 +18376:3:2142 +18377:3:2149 +18378:3:2150 +18379:3:2161 +18380:3:2169 +18381:3:2170 +18382:3:2174 +18383:3:2179 +18384:3:2180 +18385:0:2565 +18386:3:2192 +18387:0:2565 +18388:3:2013 +18389:0:2565 +18390:3:2014 +18391:0:2565 +18392:3:2015 +18393:3:2019 +18394:3:2020 +18395:3:2028 +18396:3:2029 +18397:3:2033 +18398:3:2034 +18399:3:2042 +18400:3:2047 +18401:3:2051 +18402:3:2052 +18403:3:2059 +18404:3:2060 +18405:3:2071 +18406:3:2079 +18407:3:2080 +18408:3:2084 +18409:3:2089 +18410:3:2090 +18411:0:2565 +18412:2:765 +18413:0:2565 +18414:3:2102 +18415:0:2565 +18416:1:316 +18417:0:2565 +18418:3:2104 +18419:0:2565 +18420:3:2105 +18421:3:2109 +18422:3:2110 +18423:3:2118 +18424:3:2119 +18425:3:2123 +18426:3:2124 +18427:3:2132 +18428:3:2137 +18429:3:2141 +18430:3:2142 +18431:3:2149 +18432:3:2150 +18433:3:2161 +18434:3:2169 +18435:3:2170 +18436:3:2174 +18437:3:2179 +18438:3:2180 +18439:0:2565 +18440:3:2192 +18441:0:2565 +18442:3:2013 +18443:0:2565 +18444:3:2014 +18445:0:2565 +18446:3:2015 +18447:3:2019 +18448:3:2020 +18449:3:2028 +18450:3:2029 +18451:3:2033 +18452:3:2034 +18453:3:2042 +18454:3:2047 +18455:3:2051 +18456:3:2052 +18457:3:2059 +18458:3:2060 +18459:3:2071 +18460:3:2079 +18461:3:2080 +18462:3:2084 +18463:3:2089 +18464:3:2090 +18465:0:2565 +18466:3:2102 +18467:0:2565 +18468:2:766 +18469:2:770 +18470:2:771 +18471:2:779 +18472:2:788 +18473:2:789 +18474:2:793 +18475:2:798 +18476:2:802 +18477:2:803 +18478:2:810 +18479:2:811 +18480:2:822 +18481:2:823 +18482:2:826 +18483:2:827 +18484:2:835 +18485:2:840 +18486:2:841 +18487:0:2565 +18488:3:2104 +18489:0:2565 +18490:3:2105 +18491:3:2109 +18492:3:2110 +18493:3:2118 +18494:3:2119 +18495:3:2123 +18496:3:2124 +18497:3:2132 +18498:3:2137 +18499:3:2141 +18500:3:2142 +18501:3:2149 +18502:3:2150 +18503:3:2161 +18504:3:2169 +18505:3:2170 +18506:3:2174 +18507:3:2179 +18508:3:2180 +18509:0:2565 +18510:3:2192 +18511:0:2565 +18512:3:2013 +18513:0:2565 +18514:3:2014 +18515:0:2565 +18516:3:2015 +18517:3:2019 +18518:3:2020 +18519:3:2028 +18520:3:2029 +18521:3:2033 +18522:3:2034 +18523:3:2042 +18524:3:2047 +18525:3:2051 +18526:3:2052 +18527:3:2059 +18528:3:2060 +18529:3:2071 +18530:3:2079 +18531:3:2080 +18532:3:2084 +18533:3:2089 +18534:3:2090 +18535:0:2565 +18536:2:853 +18537:0:2565 +18538:3:2102 +18539:0:2565 +18540:2:857 +18541:0:2565 +18542:2:465 +18543:0:2565 +18544:3:2104 +18545:0:2565 +18546:3:2105 +18547:3:2109 +18548:3:2110 +18549:3:2118 +18550:3:2119 +18551:3:2123 +18552:3:2124 +18553:3:2132 +18554:3:2137 +18555:3:2141 +18556:3:2142 +18557:3:2149 +18558:3:2150 +18559:3:2161 +18560:3:2169 +18561:3:2170 +18562:3:2174 +18563:3:2179 +18564:3:2180 +18565:0:2565 +18566:3:2192 +18567:0:2565 +18568:3:2013 +18569:0:2565 +18570:3:2014 +18571:0:2565 +18572:3:2015 +18573:3:2019 +18574:3:2020 +18575:3:2028 +18576:3:2029 +18577:3:2033 +18578:3:2034 +18579:3:2042 +18580:3:2047 +18581:3:2051 +18582:3:2052 +18583:3:2059 +18584:3:2060 +18585:3:2071 +18586:3:2079 +18587:3:2080 +18588:3:2084 +18589:3:2089 +18590:3:2090 +18591:0:2565 +18592:2:466 +18593:0:2565 +18594:3:2102 +18595:0:2565 +18596:3:2104 +18597:0:2565 +18598:3:2105 +18599:3:2109 +18600:3:2110 +18601:3:2118 +18602:3:2119 +18603:3:2123 +18604:3:2124 +18605:3:2132 +18606:3:2137 +18607:3:2141 +18608:3:2142 +18609:3:2149 +18610:3:2150 +18611:3:2161 +18612:3:2169 +18613:3:2170 +18614:3:2174 +18615:3:2179 +18616:3:2180 +18617:0:2565 +18618:3:2192 +18619:0:2565 +18620:3:2013 +18621:0:2565 +18622:3:2014 +18623:0:2565 +18624:2:467 +18625:0:2565 +18626:3:2015 +18627:3:2019 +18628:3:2020 +18629:3:2028 +18630:3:2029 +18631:3:2033 +18632:3:2034 +18633:3:2042 +18634:3:2047 +18635:3:2051 +18636:3:2052 +18637:3:2059 +18638:3:2060 +18639:3:2071 +18640:3:2079 +18641:3:2080 +18642:3:2084 +18643:3:2089 +18644:3:2090 +18645:0:2565 +18646:3:2102 +18647:0:2565 +18648:3:2104 +18649:0:2565 +18650:3:2105 +18651:3:2109 +18652:3:2110 +18653:3:2118 +18654:3:2119 +18655:3:2123 +18656:3:2124 +18657:3:2132 +18658:3:2137 +18659:3:2141 +18660:3:2142 +18661:3:2149 +18662:3:2150 +18663:3:2161 +18664:3:2169 +18665:3:2170 +18666:3:2174 +18667:3:2179 +18668:3:2180 +18669:0:2565 +18670:3:2192 +18671:0:2565 +18672:3:2013 +18673:0:2565 +18674:1:317 +18675:0:2565 +18676:2:468 +18677:0:2565 +18678:1:323 +18679:0:2565 +18680:1:324 +18681:0:2565 +18682:3:2014 +18683:0:2565 +18684:3:2015 +18685:3:2019 +18686:3:2020 +18687:3:2028 +18688:3:2029 +18689:3:2033 +18690:3:2034 +18691:3:2042 +18692:3:2047 +18693:3:2051 +18694:3:2052 +18695:3:2059 +18696:3:2060 +18697:3:2071 +18698:3:2079 +18699:3:2080 +18700:3:2084 +18701:3:2089 +18702:3:2090 +18703:0:2565 +18704:3:2102 +18705:0:2565 +18706:3:2104 +18707:0:2565 +18708:3:2105 +18709:3:2109 +18710:3:2110 +18711:3:2118 +18712:3:2119 +18713:3:2123 +18714:3:2124 +18715:3:2132 +18716:3:2137 +18717:3:2141 +18718:3:2142 +18719:3:2149 +18720:3:2150 +18721:3:2161 +18722:3:2169 +18723:3:2170 +18724:3:2174 +18725:3:2179 +18726:3:2180 +18727:0:2565 +18728:3:2192 +18729:0:2565 +18730:3:2013 +18731:0:2565 +18732:2:467 +18733:0:2565 +18734:2:468 +18735:0:2565 +18736:3:2014 +18737:0:2565 +18738:3:2015 +18739:3:2019 +18740:3:2020 +18741:3:2028 +18742:3:2029 +18743:3:2033 +18744:3:2034 +18745:3:2042 +18746:3:2047 +18747:3:2051 +18748:3:2052 +18749:3:2059 +18750:3:2060 +18751:3:2071 +18752:3:2079 +18753:3:2080 +18754:3:2084 +18755:3:2089 +18756:3:2090 +18757:0:2565 +18758:3:2102 +18759:0:2565 +18760:3:2104 +18761:0:2565 +18762:3:2105 +18763:3:2109 +18764:3:2110 +18765:3:2118 +18766:3:2119 +18767:3:2123 +18768:3:2124 +18769:3:2132 +18770:3:2137 +18771:3:2141 +18772:3:2142 +18773:3:2149 +18774:3:2150 +18775:3:2161 +18776:3:2169 +18777:3:2170 +18778:3:2174 +18779:3:2179 +18780:3:2180 +18781:0:2565 +18782:3:2192 +18783:0:2565 +18784:2:467 +18785:0:2565 +18786:1:329 +18787:0:2565 +18788:3:2013 +18789:0:2565 +18790:2:468 +18791:0:2565 +18792:3:2014 +18793:0:2565 +18794:3:2015 +18795:3:2019 +18796:3:2020 +18797:3:2028 +18798:3:2029 +18799:3:2033 +18800:3:2034 +18801:3:2042 +18802:3:2047 +18803:3:2051 +18804:3:2052 +18805:3:2059 +18806:3:2060 +18807:3:2071 +18808:3:2079 +18809:3:2080 +18810:3:2084 +18811:3:2089 +18812:3:2090 +18813:0:2565 +18814:3:2102 +18815:0:2565 +18816:3:2104 +18817:0:2565 +18818:3:2105 +18819:3:2109 +18820:3:2110 +18821:3:2118 +18822:3:2119 +18823:3:2123 +18824:3:2124 +18825:3:2132 +18826:3:2137 +18827:3:2141 +18828:3:2142 +18829:3:2149 +18830:3:2150 +18831:3:2161 +18832:3:2169 +18833:3:2170 +18834:3:2174 +18835:3:2179 +18836:3:2180 +18837:0:2565 +18838:3:2192 +18839:0:2565 +18840:2:467 +18841:0:2565 +18842:3:2013 +18843:0:2565 +18844:3:2014 +18845:0:2565 +18846:3:2015 +18847:3:2019 +18848:3:2020 +18849:3:2028 +18850:3:2029 +18851:3:2033 +18852:3:2034 +18853:3:2042 +18854:3:2047 +18855:3:2051 +18856:3:2052 +18857:3:2059 +18858:3:2060 +18859:3:2071 +18860:3:2079 +18861:3:2080 +18862:3:2084 +18863:3:2089 +18864:3:2090 +18865:0:2565 +18866:3:2102 +18867:0:2565 +18868:3:2104 +18869:0:2565 +18870:3:2105 +18871:3:2109 +18872:3:2110 +18873:3:2118 +18874:3:2119 +18875:3:2123 +18876:3:2124 +18877:3:2132 +18878:3:2137 +18879:3:2141 +18880:3:2142 +18881:3:2149 +18882:3:2150 +18883:3:2161 +18884:3:2169 +18885:3:2170 +18886:3:2174 +18887:3:2179 +18888:3:2180 +18889:0:2565 +18890:1:330 +18891:0:2565 +18892:3:2192 +18893:0:2565 +18894:3:2013 +18895:0:2565 +18896:2:468 +18897:0:2565 +18898:3:2014 +18899:0:2565 +18900:3:2015 +18901:3:2019 +18902:3:2020 +18903:3:2028 +18904:3:2029 +18905:3:2033 +18906:3:2034 +18907:3:2042 +18908:3:2047 +18909:3:2051 +18910:3:2052 +18911:3:2059 +18912:3:2060 +18913:3:2071 +18914:3:2079 +18915:3:2080 +18916:3:2084 +18917:3:2089 +18918:3:2090 +18919:0:2565 +18920:3:2102 +18921:0:2565 +18922:3:2104 +18923:0:2565 +18924:3:2105 +18925:3:2109 +18926:3:2110 +18927:3:2118 +18928:3:2119 +18929:3:2123 +18930:3:2124 +18931:3:2132 +18932:3:2137 +18933:3:2141 +18934:3:2142 +18935:3:2149 +18936:3:2150 +18937:3:2161 +18938:3:2169 +18939:3:2170 +18940:3:2174 +18941:3:2179 +18942:3:2180 +18943:0:2565 +18944:3:2192 +18945:0:2565 +18946:2:467 +18947:0:2565 +18948:3:2013 +18949:0:2565 +18950:3:2014 +18951:0:2565 +18952:3:2015 +18953:3:2019 +18954:3:2020 +18955:3:2028 +18956:3:2029 +18957:3:2033 +18958:3:2034 +18959:3:2042 +18960:3:2047 +18961:3:2051 +18962:3:2052 +18963:3:2059 +18964:3:2060 +18965:3:2071 +18966:3:2079 +18967:3:2080 +18968:3:2084 +18969:3:2089 +18970:3:2090 +18971:0:2565 +18972:3:2102 +18973:0:2565 +18974:3:2104 +18975:0:2565 +18976:3:2105 +18977:3:2109 +18978:3:2110 +18979:3:2118 +18980:3:2119 +18981:3:2123 +18982:3:2124 +18983:3:2132 +18984:3:2137 +18985:3:2141 +18986:3:2142 +18987:3:2149 +18988:3:2150 +18989:3:2161 +18990:3:2169 +18991:3:2170 +18992:3:2174 +18993:3:2179 +18994:3:2180 +18995:0:2565 +18996:1:331 +18997:0:2565 +18998:3:2192 +18999:0:2565 +19000:3:2013 +19001:0:2565 +19002:2:468 +19003:0:2565 +19004:1:332 +19005:0:2565 +19006:1:333 +19007:0:2565 +19008:1:334 +19009:0:2565 +19010:3:2014 +19011:0:2565 +19012:3:2015 +19013:3:2019 +19014:3:2020 +19015:3:2028 +19016:3:2029 +19017:3:2033 +19018:3:2034 +19019:3:2042 +19020:3:2047 +19021:3:2051 +19022:3:2052 +19023:3:2059 +19024:3:2060 +19025:3:2071 +19026:3:2079 +19027:3:2080 +19028:3:2084 +19029:3:2089 +19030:3:2090 +19031:0:2565 +19032:3:2102 +19033:0:2565 +19034:3:2104 +19035:0:2565 +19036:3:2105 +19037:3:2109 +19038:3:2110 +19039:3:2118 +19040:3:2119 +19041:3:2123 +19042:3:2124 +19043:3:2132 +19044:3:2137 +19045:3:2141 +19046:3:2142 +19047:3:2149 +19048:3:2150 +19049:3:2161 +19050:3:2169 +19051:3:2170 +19052:3:2174 +19053:3:2179 +19054:3:2180 +19055:0:2565 +19056:3:2192 +19057:0:2565 +19058:3:2013 +19059:0:2565 +19060:2:467 +19061:0:2565 +19062:2:468 +19063:0:2565 +19064:3:2014 +19065:0:2565 +19066:3:2015 +19067:3:2019 +19068:3:2020 +19069:3:2028 +19070:3:2029 +19071:3:2033 +19072:3:2034 +19073:3:2042 +19074:3:2047 +19075:3:2051 +19076:3:2052 +19077:3:2059 +19078:3:2060 +19079:3:2071 +19080:3:2079 +19081:3:2080 +19082:3:2084 +19083:3:2089 +19084:3:2090 +19085:0:2565 +19086:3:2102 +19087:0:2565 +19088:3:2104 +19089:0:2565 +19090:3:2105 +19091:3:2109 +19092:3:2110 +19093:3:2118 +19094:3:2119 +19095:3:2123 +19096:3:2124 +19097:3:2132 +19098:3:2137 +19099:3:2141 +19100:3:2142 +19101:3:2149 +19102:3:2150 +19103:3:2161 +19104:3:2169 +19105:3:2170 +19106:3:2174 +19107:3:2179 +19108:3:2180 +19109:0:2565 +19110:3:2192 +19111:0:2565 +19112:2:467 +19113:0:2565 +19114:1:336 +19115:0:2565 +19116:3:2013 +19117:0:2565 +19118:2:468 +19119:0:2565 +19120:3:2014 +19121:0:2565 +19122:3:2015 +19123:3:2019 +19124:3:2020 +19125:3:2028 +19126:3:2029 +19127:3:2033 +19128:3:2034 +19129:3:2042 +19130:3:2047 +19131:3:2051 +19132:3:2052 +19133:3:2059 +19134:3:2060 +19135:3:2071 +19136:3:2079 +19137:3:2080 +19138:3:2084 +19139:3:2089 +19140:3:2090 +19141:0:2565 +19142:3:2102 +19143:0:2565 +19144:3:2104 +19145:0:2565 +19146:3:2105 +19147:3:2109 +19148:3:2110 +19149:3:2118 +19150:3:2119 +19151:3:2123 +19152:3:2124 +19153:3:2132 +19154:3:2137 +19155:3:2141 +19156:3:2142 +19157:3:2149 +19158:3:2150 +19159:3:2161 +19160:3:2169 +19161:3:2170 +19162:3:2174 +19163:3:2179 +19164:3:2180 +19165:0:2565 +19166:3:2192 +19167:0:2565 +19168:2:469 +19169:0:2565 +19170:3:2013 +19171:0:2565 +19172:2:475 +19173:0:2565 +19174:2:476 +19175:0:2565 +19176:3:2014 +19177:0:2565 +19178:3:2015 +19179:3:2019 +19180:3:2020 +19181:3:2028 +19182:3:2029 +19183:3:2033 +19184:3:2034 +19185:3:2042 +19186:3:2047 +19187:3:2051 +19188:3:2052 +19189:3:2059 +19190:3:2060 +19191:3:2071 +19192:3:2079 +19193:3:2080 +19194:3:2084 +19195:3:2089 +19196:3:2090 +19197:0:2565 +19198:3:2102 +19199:0:2565 +19200:3:2104 +19201:0:2565 +19202:3:2105 +19203:3:2109 +19204:3:2110 +19205:3:2118 +19206:3:2119 +19207:3:2123 +19208:3:2124 +19209:3:2132 +19210:3:2137 +19211:3:2141 +19212:3:2142 +19213:3:2149 +19214:3:2150 +19215:3:2161 +19216:3:2169 +19217:3:2170 +19218:3:2174 +19219:3:2179 +19220:3:2180 +19221:0:2565 +19222:3:2192 +19223:0:2565 +19224:2:477 +19225:2:481 +19226:2:482 +19227:2:490 +19228:2:499 +19229:2:500 +19230:2:504 +19231:2:509 +19232:2:513 +19233:2:514 +19234:2:521 +19235:2:522 +19236:2:533 +19237:2:534 +19238:2:537 +19239:2:538 +19240:2:546 +19241:2:551 +19242:2:552 +19243:0:2565 +19244:3:2013 +19245:0:2565 +19246:3:2014 +19247:0:2565 +19248:3:2015 +19249:3:2019 +19250:3:2020 +19251:3:2028 +19252:3:2029 +19253:3:2033 +19254:3:2034 +19255:3:2042 +19256:3:2047 +19257:3:2051 +19258:3:2052 +19259:3:2059 +19260:3:2060 +19261:3:2071 +19262:3:2079 +19263:3:2080 +19264:3:2084 +19265:3:2089 +19266:3:2090 +19267:0:2565 +19268:3:2102 +19269:0:2565 +19270:3:2104 +19271:0:2565 +19272:3:2105 +19273:3:2109 +19274:3:2110 +19275:3:2118 +19276:3:2119 +19277:3:2123 +19278:3:2124 +19279:3:2132 +19280:3:2137 +19281:3:2141 +19282:3:2142 +19283:3:2149 +19284:3:2150 +19285:3:2161 +19286:3:2169 +19287:3:2170 +19288:3:2174 +19289:3:2179 +19290:3:2180 +19291:0:2565 +19292:2:564 +19293:0:2565 +19294:3:2192 +19295:0:2565 +19296:3:2013 +19297:0:2565 +19298:3:2014 +19299:0:2565 +19300:3:2015 +19301:3:2019 +19302:3:2020 +19303:3:2028 +19304:3:2029 +19305:3:2033 +19306:3:2034 +19307:3:2042 +19308:3:2047 +19309:3:2051 +19310:3:2052 +19311:3:2059 +19312:3:2060 +19313:3:2071 +19314:3:2079 +19315:3:2080 +19316:3:2084 +19317:3:2089 +19318:3:2090 +19319:0:2565 +19320:3:2102 +19321:0:2565 +19322:3:2104 +19323:0:2565 +19324:2:565 +19325:2:569 +19326:2:570 +19327:2:578 +19328:2:587 +19329:2:588 +19330:2:592 +19331:2:597 +19332:2:601 +19333:2:602 +19334:2:609 +19335:2:610 +19336:2:621 +19337:2:622 +19338:2:625 +19339:2:626 +19340:2:634 +19341:2:639 +19342:2:640 +19343:0:2565 +19344:2:744 +19345:0:2565 +19346:3:2105 +19347:3:2109 +19348:3:2110 +19349:3:2118 +19350:3:2119 +19351:3:2123 +19352:3:2124 +19353:3:2132 +19354:3:2137 +19355:3:2141 +19356:3:2142 +19357:3:2149 +19358:3:2150 +19359:3:2161 +19360:3:2169 +19361:3:2170 +19362:3:2174 +19363:3:2179 +19364:3:2180 +19365:0:2565 +19366:3:2192 +19367:0:2565 +19368:3:2013 +19369:0:2565 +19370:3:2014 +19371:0:2565 +19372:3:2015 +19373:3:2019 +19374:3:2020 +19375:3:2028 +19376:3:2029 +19377:3:2033 +19378:3:2034 +19379:3:2042 +19380:3:2047 +19381:3:2051 +19382:3:2052 +19383:3:2059 +19384:3:2060 +19385:3:2071 +19386:3:2079 +19387:3:2080 +19388:3:2084 +19389:3:2089 +19390:3:2090 +19391:0:2565 +19392:3:2102 +19393:0:2565 +19394:1:337 +19395:0:2565 +19396:1:338 +19397:0:2565 +19398:3:2104 +19399:0:2565 +19400:3:2105 +19401:3:2109 +19402:3:2110 +19403:3:2118 +19404:3:2119 +19405:3:2123 +19406:3:2124 +19407:3:2132 +19408:3:2137 +19409:3:2141 +19410:3:2142 +19411:3:2149 +19412:3:2150 +19413:3:2161 +19414:3:2169 +19415:3:2170 +19416:3:2174 +19417:3:2179 +19418:3:2180 +19419:0:2565 +19420:3:2192 +19421:0:2565 +19422:3:2013 +19423:0:2565 +19424:3:2014 +19425:0:2565 +19426:3:2015 +19427:3:2019 +19428:3:2020 +19429:3:2028 +19430:3:2029 +19431:3:2033 +19432:3:2034 +19433:3:2042 +19434:3:2047 +19435:3:2051 +19436:3:2052 +19437:3:2059 +19438:3:2060 +19439:3:2071 +19440:3:2079 +19441:3:2080 +19442:3:2084 +19443:3:2089 +19444:3:2090 +19445:0:2565 +19446:3:2102 +19447:0:2565 +19448:1:337 +19449:0:2565 +19450:3:2104 +19451:0:2565 +19452:3:2105 +19453:3:2109 +19454:3:2110 +19455:3:2118 +19456:3:2119 +19457:3:2123 +19458:3:2124 +19459:3:2132 +19460:3:2137 +19461:3:2141 +19462:3:2142 +19463:3:2149 +19464:3:2150 +19465:3:2161 +19466:3:2169 +19467:3:2170 +19468:3:2174 +19469:3:2179 +19470:3:2180 +19471:0:2565 +19472:3:2192 +19473:0:2565 +19474:3:2013 +19475:0:2565 +19476:3:2014 +19477:0:2565 +19478:3:2015 +19479:3:2019 +19480:3:2020 +19481:3:2028 +19482:3:2029 +19483:3:2033 +19484:3:2034 +19485:3:2042 +19486:3:2047 +19487:3:2051 +19488:3:2052 +19489:3:2059 +19490:3:2060 +19491:3:2071 +19492:3:2079 +19493:3:2080 +19494:3:2084 +19495:3:2089 +19496:3:2090 +19497:0:2565 +19498:2:745 +19499:0:2565 +19500:3:2102 +19501:0:2565 +19502:2:750 +19503:0:2565 +19504:2:753 +19505:0:2565 +19506:1:338 +19507:0:2565 +19508:3:2104 +19509:0:2565 +19510:3:2105 +19511:3:2109 +19512:3:2110 +19513:3:2118 +19514:3:2119 +19515:3:2123 +19516:3:2124 +19517:3:2132 +19518:3:2137 +19519:3:2141 +19520:3:2142 +19521:3:2149 +19522:3:2150 +19523:3:2161 +19524:3:2169 +19525:3:2170 +19526:3:2174 +19527:3:2179 +19528:3:2180 +19529:0:2565 +19530:3:2192 +19531:0:2565 +19532:3:2013 +19533:0:2565 +19534:3:2014 +19535:0:2565 +19536:3:2015 +19537:3:2019 +19538:3:2020 +19539:3:2028 +19540:3:2029 +19541:3:2033 +19542:3:2034 +19543:3:2042 +19544:3:2047 +19545:3:2051 +19546:3:2052 +19547:3:2059 +19548:3:2060 +19549:3:2071 +19550:3:2079 +19551:3:2080 +19552:3:2084 +19553:3:2089 +19554:3:2090 +19555:0:2565 +19556:3:2102 +19557:0:2565 +19558:1:337 +19559:0:2565 +19560:3:2104 +19561:0:2565 +19562:3:2105 +19563:3:2109 +19564:3:2110 +19565:3:2118 +19566:3:2119 +19567:3:2123 +19568:3:2124 +19569:3:2132 +19570:3:2137 +19571:3:2141 +19572:3:2142 +19573:3:2149 +19574:3:2150 +19575:3:2161 +19576:3:2169 +19577:3:2170 +19578:3:2174 +19579:3:2179 +19580:3:2180 +19581:0:2565 +19582:3:2192 +19583:0:2565 +19584:3:2013 +19585:0:2565 +19586:3:2014 +19587:0:2565 +19588:3:2015 +19589:3:2019 +19590:3:2020 +19591:3:2028 +19592:3:2029 +19593:3:2033 +19594:3:2034 +19595:3:2042 +19596:3:2047 +19597:3:2051 +19598:3:2052 +19599:3:2059 +19600:3:2060 +19601:3:2071 +19602:3:2079 +19603:3:2080 +19604:3:2084 +19605:3:2089 +19606:3:2090 +19607:0:2565 +19608:2:758 +19609:0:2565 +19610:3:2102 +19611:0:2565 +19612:1:338 +19613:0:2565 +19614:3:2104 +19615:0:2565 +19616:3:2105 +19617:3:2109 +19618:3:2110 +19619:3:2118 +19620:3:2119 +19621:3:2123 +19622:3:2124 +19623:3:2132 +19624:3:2137 +19625:3:2141 +19626:3:2142 +19627:3:2149 +19628:3:2150 +19629:3:2161 +19630:3:2169 +19631:3:2170 +19632:3:2174 +19633:3:2179 +19634:3:2180 +19635:0:2565 +19636:3:2192 +19637:0:2565 +19638:3:2013 +19639:0:2565 +19640:3:2014 +19641:0:2565 +19642:3:2015 +19643:3:2019 +19644:3:2020 +19645:3:2028 +19646:3:2029 +19647:3:2033 +19648:3:2034 +19649:3:2042 +19650:3:2047 +19651:3:2051 +19652:3:2052 +19653:3:2059 +19654:3:2060 +19655:3:2071 +19656:3:2079 +19657:3:2080 +19658:3:2084 +19659:3:2089 +19660:3:2090 +19661:0:2565 +19662:3:2102 +19663:0:2565 +19664:1:337 +19665:0:2565 +19666:3:2104 +19667:0:2565 +19668:3:2105 +19669:3:2109 +19670:3:2110 +19671:3:2118 +19672:3:2119 +19673:3:2123 +19674:3:2124 +19675:3:2132 +19676:3:2137 +19677:3:2141 +19678:3:2142 +19679:3:2149 +19680:3:2150 +19681:3:2161 +19682:3:2169 +19683:3:2170 +19684:3:2174 +19685:3:2179 +19686:3:2180 +19687:0:2565 +19688:3:2192 +19689:0:2565 +19690:3:2013 +19691:0:2565 +19692:3:2014 +19693:0:2565 +19694:3:2015 +19695:3:2019 +19696:3:2020 +19697:3:2028 +19698:3:2029 +19699:3:2033 +19700:3:2034 +19701:3:2042 +19702:3:2047 +19703:3:2051 +19704:3:2052 +19705:3:2059 +19706:3:2060 +19707:3:2071 +19708:3:2079 +19709:3:2080 +19710:3:2084 +19711:3:2089 +19712:3:2090 +19713:0:2565 +19714:2:759 +19715:0:2565 +19716:3:2102 +19717:0:2565 +19718:1:338 +19719:0:2565 +19720:3:2104 +19721:0:2565 +19722:3:2105 +19723:3:2109 +19724:3:2110 +19725:3:2118 +19726:3:2119 +19727:3:2123 +19728:3:2124 +19729:3:2132 +19730:3:2137 +19731:3:2141 +19732:3:2142 +19733:3:2149 +19734:3:2150 +19735:3:2161 +19736:3:2169 +19737:3:2170 +19738:3:2174 +19739:3:2179 +19740:3:2180 +19741:0:2565 +19742:3:2192 +19743:0:2565 +19744:3:2013 +19745:0:2565 +19746:3:2014 +19747:0:2565 +19748:3:2015 +19749:3:2019 +19750:3:2020 +19751:3:2028 +19752:3:2029 +19753:3:2033 +19754:3:2034 +19755:3:2042 +19756:3:2047 +19757:3:2051 +19758:3:2052 +19759:3:2059 +19760:3:2060 +19761:3:2071 +19762:3:2079 +19763:3:2080 +19764:3:2084 +19765:3:2089 +19766:3:2090 +19767:0:2565 +19768:3:2102 +19769:0:2565 +19770:2:760 +19771:0:2565 +19772:2:761 +19773:0:2565 +19774:2:762 +19775:0:2565 +19776:3:2104 +19777:0:2565 +19778:3:2105 +19779:3:2109 +19780:3:2110 +19781:3:2118 +19782:3:2119 +19783:3:2123 +19784:3:2124 +19785:3:2132 +19786:3:2137 +19787:3:2141 +19788:3:2142 +19789:3:2149 +19790:3:2150 +19791:3:2161 +19792:3:2169 +19793:3:2170 +19794:3:2174 +19795:3:2179 +19796:3:2180 +19797:0:2565 +19798:3:2192 +19799:0:2565 +19800:1:337 +19801:0:2565 +19802:3:2013 +19803:0:2565 +19804:2:763 +19805:0:2565 +19806:1:338 +19807:0:2565 +19808:3:2014 +19809:0:2565 +19810:3:2015 +19811:3:2019 +19812:3:2020 +19813:3:2028 +19814:3:2029 +19815:3:2033 +19816:3:2034 +19817:3:2042 +19818:3:2047 +19819:3:2051 +19820:3:2052 +19821:3:2059 +19822:3:2060 +19823:3:2071 +19824:3:2079 +19825:3:2080 +19826:3:2084 +19827:3:2089 +19828:3:2090 +19829:0:2565 +19830:3:2102 +19831:0:2565 +19832:3:2104 +19833:0:2565 +19834:3:2105 +19835:3:2109 +19836:3:2110 +19837:3:2118 +19838:3:2119 +19839:3:2123 +19840:3:2124 +19841:3:2132 +19842:3:2137 +19843:3:2141 +19844:3:2142 +19845:3:2149 +19846:3:2150 +19847:3:2161 +19848:3:2169 +19849:3:2170 +19850:3:2174 +19851:3:2179 +19852:3:2180 +19853:0:2565 +19854:3:2192 +19855:0:2565 +19856:3:2013 +19857:0:2565 +19858:1:337 +19859:0:2565 +19860:3:2014 +19861:0:2565 +19862:3:2015 +19863:3:2019 +19864:3:2020 +19865:3:2028 +19866:3:2029 +19867:3:2033 +19868:3:2034 +19869:3:2042 +19870:3:2047 +19871:3:2051 +19872:3:2052 +19873:3:2059 +19874:3:2060 +19875:3:2071 +19876:3:2079 +19877:3:2080 +19878:3:2084 +19879:3:2089 +19880:3:2090 +19881:0:2565 +19882:3:2102 +19883:0:2565 +19884:3:2104 +19885:0:2565 +19886:3:2105 +19887:3:2109 +19888:3:2110 +19889:3:2118 +19890:3:2119 +19891:3:2123 +19892:3:2124 +19893:3:2132 +19894:3:2137 +19895:3:2141 +19896:3:2142 +19897:3:2149 +19898:3:2150 +19899:3:2161 +19900:3:2169 +19901:3:2170 +19902:3:2174 +19903:3:2179 +19904:3:2180 +19905:0:2565 +19906:3:2192 +19907:0:2565 +19908:2:765 +19909:0:2565 +19910:3:2013 +19911:0:2565 +19912:1:338 +19913:0:2565 +19914:3:2014 +19915:0:2565 +19916:3:2015 +19917:3:2019 +19918:3:2020 +19919:3:2028 +19920:3:2029 +19921:3:2033 +19922:3:2034 +19923:3:2042 +19924:3:2047 +19925:3:2051 +19926:3:2052 +19927:3:2059 +19928:3:2060 +19929:3:2071 +19930:3:2079 +19931:3:2080 +19932:3:2084 +19933:3:2089 +19934:3:2090 +19935:0:2565 +19936:3:2102 +19937:0:2565 +19938:3:2104 +19939:0:2565 +19940:3:2105 +19941:3:2109 +19942:3:2110 +19943:3:2118 +19944:3:2119 +19945:3:2123 +19946:3:2124 +19947:3:2132 +19948:3:2137 +19949:3:2141 +19950:3:2142 +19951:3:2149 +19952:3:2150 +19953:3:2161 +19954:3:2169 +19955:3:2170 +19956:3:2174 +19957:3:2179 +19958:3:2180 +19959:0:2565 +19960:3:2192 +19961:0:2565 +19962:3:2013 +19963:0:2565 +19964:2:766 +19965:2:770 +19966:2:771 +19967:2:779 +19968:2:788 +19969:2:789 +19970:2:793 +19971:2:798 +19972:2:802 +19973:2:803 +19974:2:810 +19975:2:811 +19976:2:822 +19977:2:823 +19978:2:826 +19979:2:827 +19980:2:835 +19981:2:840 +19982:2:841 +19983:0:2565 +19984:3:2014 +19985:0:2565 +19986:3:2015 +19987:3:2019 +19988:3:2020 +19989:3:2028 +19990:3:2029 +19991:3:2033 +19992:3:2034 +19993:3:2042 +19994:3:2047 +19995:3:2051 +19996:3:2052 +19997:3:2059 +19998:3:2060 +19999:3:2071 +20000:3:2079 +20001:3:2080 +20002:3:2084 +20003:3:2089 +20004:3:2090 +20005:0:2565 +20006:3:2102 +20007:0:2565 +20008:3:2104 +20009:0:2565 +20010:3:2105 +20011:3:2109 +20012:3:2110 +20013:3:2118 +20014:3:2119 +20015:3:2123 +20016:3:2124 +20017:3:2132 +20018:3:2137 +20019:3:2141 +20020:3:2142 +20021:3:2149 +20022:3:2150 +20023:3:2161 +20024:3:2169 +20025:3:2170 +20026:3:2174 +20027:3:2179 +20028:3:2180 +20029:0:2565 +20030:3:2192 +20031:0:2565 +20032:2:853 +20033:0:2565 +20034:3:2013 +20035:0:2565 +20036:2:857 +20037:0:2565 +20038:2:465 +20039:0:2565 +20040:3:2014 +20041:0:2565 +20042:3:2015 +20043:3:2019 +20044:3:2020 +20045:3:2028 +20046:3:2029 +20047:3:2033 +20048:3:2034 +20049:3:2042 +20050:3:2047 +20051:3:2051 +20052:3:2052 +20053:3:2059 +20054:3:2060 +20055:3:2071 +20056:3:2079 +20057:3:2080 +20058:3:2084 +20059:3:2089 +20060:3:2090 +20061:0:2565 +20062:3:2102 +20063:0:2565 +20064:3:2104 +20065:0:2565 +20066:3:2105 +20067:3:2109 +20068:3:2110 +20069:3:2118 +20070:3:2119 +20071:3:2123 +20072:3:2124 +20073:3:2132 +20074:3:2137 +20075:3:2141 +20076:3:2142 +20077:3:2149 +20078:3:2150 +20079:3:2161 +20080:3:2169 +20081:3:2170 +20082:3:2174 +20083:3:2179 +20084:3:2180 +20085:0:2565 +20086:3:2192 +20087:0:2565 +20088:2:466 +20089:0:2565 +20090:3:2013 +20091:0:2565 +20092:3:2014 +20093:0:2565 +20094:3:2015 +20095:3:2019 +20096:3:2020 +20097:3:2028 +20098:3:2029 +20099:3:2033 +20100:3:2034 +20101:3:2042 +20102:3:2047 +20103:3:2051 +20104:3:2052 +20105:3:2059 +20106:3:2060 +20107:3:2071 +20108:3:2079 +20109:3:2080 +20110:3:2084 +20111:3:2089 +20112:3:2090 +20113:0:2565 +20114:3:2102 +20115:0:2565 +20116:3:2104 +20117:0:2565 +20118:3:2105 +20119:3:2109 +20120:3:2110 +20121:3:2118 +20122:3:2119 +20123:3:2123 +20124:3:2124 +20125:3:2132 +20126:3:2137 +20127:3:2141 +20128:3:2142 +20129:3:2149 +20130:3:2150 +20131:3:2161 +20132:3:2169 +20133:3:2170 +20134:3:2174 +20135:3:2179 +20136:3:2180 +20137:0:2565 +20138:2:467 +20139:0:2565 +20140:3:2192 +20141:0:2565 +20142:3:2013 +20143:0:2565 +20144:3:2014 +20145:0:2565 +20146:3:2015 +20147:3:2019 +20148:3:2020 +20149:3:2028 +20150:3:2029 +20151:3:2033 +20152:3:2034 +20153:3:2042 +20154:3:2047 +20155:3:2051 +20156:3:2052 +20157:3:2059 +20158:3:2060 +20159:3:2071 +20160:3:2079 +20161:3:2080 +20162:3:2084 +20163:3:2089 +20164:3:2090 +20165:0:2565 +20166:3:2102 +20167:0:2565 +20168:3:2104 +20169:0:2565 +20170:1:339 +20171:0:2565 +20172:2:468 +20173:0:2565 +20174:3:2105 +20175:3:2109 +20176:3:2110 +20177:3:2118 +20178:3:2119 +20179:3:2123 +20180:3:2124 +20181:3:2132 +20182:3:2137 +20183:3:2141 +20184:3:2142 +20185:3:2149 +20186:3:2150 +20187:3:2161 +20188:3:2169 +20189:3:2170 +20190:3:2174 +20191:3:2179 +20192:3:2180 +20193:0:2565 +20194:3:2192 +20195:0:2565 +20196:3:2013 +20197:0:2565 +20198:3:2014 +20199:0:2565 +20200:3:2015 +20201:3:2019 +20202:3:2020 +20203:3:2028 +20204:3:2029 +20205:3:2033 +20206:3:2034 +20207:3:2042 +20208:3:2047 +20209:3:2051 +20210:3:2052 +20211:3:2059 +20212:3:2060 +20213:3:2071 +20214:3:2079 +20215:3:2080 +20216:3:2084 +20217:3:2089 +20218:3:2090 +20219:0:2565 +20220:3:2102 +20221:0:2565 +20222:3:2104 +20223:0:2565 +20224:2:467 +20225:0:2565 +20226:2:468 +20227:0:2565 +20228:3:2105 +20229:3:2109 +20230:3:2110 +20231:3:2118 +20232:3:2119 +20233:3:2123 +20234:3:2124 +20235:3:2132 +20236:3:2137 +20237:3:2141 +20238:3:2142 +20239:3:2149 +20240:3:2150 +20241:3:2161 +20242:3:2169 +20243:3:2170 +20244:3:2174 +20245:3:2179 +20246:3:2180 +20247:0:2565 +20248:3:2192 +20249:0:2565 +20250:3:2013 +20251:0:2565 +20252:3:2014 +20253:0:2565 +20254:3:2015 +20255:3:2019 +20256:3:2020 +20257:3:2028 +20258:3:2029 +20259:3:2033 +20260:3:2034 +20261:3:2042 +20262:3:2047 +20263:3:2051 +20264:3:2052 +20265:3:2059 +20266:3:2060 +20267:3:2071 +20268:3:2079 +20269:3:2080 +20270:3:2084 +20271:3:2089 +20272:3:2090 +20273:0:2565 +20274:3:2102 +20275:0:2565 +20276:2:467 +20277:0:2565 +20278:1:345 +20279:0:2565 +20280:2:468 +20281:0:2565 +20282:3:2104 +20283:0:2565 +20284:3:2105 +20285:3:2109 +20286:3:2110 +20287:3:2118 +20288:3:2119 +20289:3:2123 +20290:3:2124 +20291:3:2132 +20292:3:2137 +20293:3:2141 +20294:3:2142 +20295:3:2149 +20296:3:2150 +20297:3:2161 +20298:3:2169 +20299:3:2170 +20300:3:2174 +20301:3:2179 +20302:3:2180 +20303:0:2565 +20304:3:2192 +20305:0:2565 +20306:3:2013 +20307:0:2565 +20308:3:2014 +20309:0:2565 +20310:3:2015 +20311:3:2019 +20312:3:2020 +20313:3:2028 +20314:3:2029 +20315:3:2033 +20316:3:2034 +20317:3:2042 +20318:3:2047 +20319:3:2051 +20320:3:2052 +20321:3:2059 +20322:3:2060 +20323:3:2071 +20324:3:2079 +20325:3:2080 +20326:3:2084 +20327:3:2089 +20328:3:2090 +20329:0:2565 +20330:3:2102 +20331:0:2565 +20332:2:467 +20333:0:2565 +20334:2:468 +20335:0:2565 +20336:3:2104 +20337:0:2565 +20338:3:2105 +20339:3:2109 +20340:3:2110 +20341:3:2118 +20342:3:2119 +20343:3:2123 +20344:3:2124 +20345:3:2132 +20346:3:2137 +20347:3:2141 +20348:3:2142 +20349:3:2149 +20350:3:2150 +20351:3:2161 +20352:3:2169 +20353:3:2170 +20354:3:2174 +20355:3:2179 +20356:3:2180 +20357:0:2565 +20358:3:2192 +20359:0:2565 +20360:3:2013 +20361:0:2565 +20362:3:2014 +20363:0:2565 +20364:3:2015 +20365:3:2019 +20366:3:2020 +20367:3:2028 +20368:3:2029 +20369:3:2033 +20370:3:2034 +20371:3:2042 +20372:3:2047 +20373:3:2051 +20374:3:2052 +20375:3:2059 +20376:3:2060 +20377:3:2071 +20378:3:2079 +20379:3:2080 +20380:3:2084 +20381:3:2089 +20382:3:2090 +20383:0:2565 +20384:2:467 +20385:0:2565 +20386:1:346 +20387:1:350 +20388:1:351 +20389:1:359 +20390:1:360 +20391:1:361 +20392:1:373 +20393:1:378 +20394:1:382 +20395:1:383 +20396:1:390 +20397:1:391 +20398:1:402 +20399:1:403 +20400:1:404 +20401:1:415 +20402:1:420 +20403:1:421 +20404:0:2565 +20405:3:2102 +20406:0:2565 +20407:3:2104 +20408:0:2565 +20409:1:433 +20410:0:2565 +20411:3:2105 +20412:3:2109 +20413:3:2110 +20414:3:2118 +20415:3:2119 +20416:3:2123 +20417:3:2124 +20418:3:2132 +20419:3:2137 +20420:3:2141 +20421:3:2142 +20422:3:2149 +20423:3:2150 +20424:3:2161 +20425:3:2169 +20426:3:2170 +20427:3:2174 +20428:3:2179 +20429:3:2180 +20430:0:2565 +20431:1:434 +20432:0:2565 +20433:3:2192 +20434:0:2565 +20435:3:2013 +20436:0:2565 +20437:2:468 +20438:0:2565 +20439:1:435 +20440:0:2565 +20441:3:2014 +20442:0:2565 +20443:3:2015 +20444:3:2019 +20445:3:2020 +20446:3:2028 +20447:3:2029 +20448:3:2033 +20449:3:2034 +20450:3:2042 +20451:3:2047 +20452:3:2051 +20453:3:2052 +20454:3:2059 +20455:3:2060 +20456:3:2071 +20457:3:2079 +20458:3:2080 +20459:3:2084 +20460:3:2089 +20461:3:2090 +20462:0:2565 +20463:3:2102 +20464:0:2565 +20465:3:2104 +20466:0:2565 +20467:3:2105 +20468:3:2109 +20469:3:2110 +20470:3:2118 +20471:3:2119 +20472:3:2123 +20473:3:2124 +20474:3:2132 +20475:3:2137 +20476:3:2141 +20477:3:2142 +20478:3:2149 +20479:3:2150 +20480:3:2161 +20481:3:2169 +20482:3:2170 +20483:3:2174 +20484:3:2179 +20485:3:2180 +20486:0:2565 +20487:3:2192 +20488:0:2565 +20489:3:2013 +20490:0:2565 +20491:1:434 +20492:0:2565 +20493:3:2014 +20494:0:2565 +20495:3:2015 +20496:3:2019 +20497:3:2020 +20498:3:2028 +20499:3:2029 +20500:3:2033 +20501:3:2034 +20502:3:2042 +20503:3:2047 +20504:3:2051 +20505:3:2052 +20506:3:2059 +20507:3:2060 +20508:3:2071 +20509:3:2079 +20510:3:2080 +20511:3:2084 +20512:3:2089 +20513:3:2090 +20514:0:2565 +20515:3:2102 +20516:0:2565 +20517:3:2104 +20518:0:2565 +20519:3:2105 +20520:3:2109 +20521:3:2110 +20522:3:2118 +20523:3:2119 +20524:3:2123 +20525:3:2124 +20526:3:2132 +20527:3:2137 +20528:3:2141 +20529:3:2142 +20530:3:2149 +20531:3:2150 +20532:3:2161 +20533:3:2169 +20534:3:2170 +20535:3:2174 +20536:3:2179 +20537:3:2180 +20538:0:2565 +20539:3:2192 +20540:0:2565 +20541:2:469 +20542:0:2565 +20543:3:2013 +20544:0:2565 +20545:2:475 +20546:0:2565 +20547:2:476 +20548:0:2565 +20549:1:435 +20550:0:2565 +20551:3:2014 +20552:0:2565 +20553:3:2015 +20554:3:2019 +20555:3:2020 +20556:3:2028 +20557:3:2029 +20558:3:2033 +20559:3:2034 +20560:3:2042 +20561:3:2047 +20562:3:2051 +20563:3:2052 +20564:3:2059 +20565:3:2060 +20566:3:2071 +20567:3:2079 +20568:3:2080 +20569:3:2084 +20570:3:2089 +20571:3:2090 +20572:0:2565 +20573:3:2102 +20574:0:2565 +20575:3:2104 +20576:0:2565 +20577:3:2105 +20578:3:2109 +20579:3:2110 +20580:3:2118 +20581:3:2119 +20582:3:2123 +20583:3:2124 +20584:3:2132 +20585:3:2137 +20586:3:2141 +20587:3:2142 +20588:3:2149 +20589:3:2150 +20590:3:2161 +20591:3:2169 +20592:3:2170 +20593:3:2174 +20594:3:2179 +20595:3:2180 +20596:0:2565 +20597:3:2192 +20598:0:2565 +20599:3:2013 +20600:0:2565 +20601:1:434 +20602:0:2565 +20603:3:2014 +20604:0:2565 +20605:3:2015 +20606:3:2019 +20607:3:2020 +20608:3:2028 +20609:3:2029 +20610:3:2033 +20611:3:2034 +20612:3:2042 +20613:3:2047 +20614:3:2051 +20615:3:2052 +20616:3:2059 +20617:3:2060 +20618:3:2071 +20619:3:2079 +20620:3:2080 +20621:3:2084 +20622:3:2089 +20623:3:2090 +20624:0:2565 +20625:3:2102 +20626:0:2565 +20627:3:2104 +20628:0:2565 +20629:3:2105 +20630:3:2109 +20631:3:2110 +20632:3:2118 +20633:3:2119 +20634:3:2123 +20635:3:2124 +20636:3:2132 +20637:3:2137 +20638:3:2141 +20639:3:2142 +20640:3:2149 +20641:3:2150 +20642:3:2161 +20643:3:2169 +20644:3:2170 +20645:3:2174 +20646:3:2179 +20647:3:2180 +20648:0:2565 +20649:3:2192 +20650:0:2565 +20651:2:477 +20652:2:481 +20653:2:482 +20654:2:490 +20655:2:491 +20656:2:495 +20657:2:496 +20658:2:504 +20659:2:509 +20660:2:513 +20661:2:514 +20662:2:521 +20663:2:522 +20664:2:533 +20665:2:534 +20666:2:535 +20667:2:546 +20668:2:551 +20669:2:552 +20670:0:2565 +20671:3:2013 +20672:0:2565 +20673:1:435 +20674:0:2565 +20675:3:2014 +20676:0:2565 +20677:3:2015 +20678:3:2019 +20679:3:2020 +20680:3:2028 +20681:3:2029 +20682:3:2033 +20683:3:2034 +20684:3:2042 +20685:3:2047 +20686:3:2051 +20687:3:2052 +20688:3:2059 +20689:3:2060 +20690:3:2071 +20691:3:2079 +20692:3:2080 +20693:3:2084 +20694:3:2089 +20695:3:2090 +20696:0:2565 +20697:3:2102 +20698:0:2565 +20699:3:2104 +20700:0:2565 +20701:3:2105 +20702:3:2109 +20703:3:2110 +20704:3:2118 +20705:3:2119 +20706:3:2123 +20707:3:2124 +20708:3:2132 +20709:3:2137 +20710:3:2141 +20711:3:2142 +20712:3:2149 +20713:3:2150 +20714:3:2161 +20715:3:2169 +20716:3:2170 +20717:3:2174 +20718:3:2179 +20719:3:2180 +20720:0:2565 +20721:3:2192 +20722:0:2565 +20723:3:2013 +20724:0:2565 +20725:1:434 +20726:0:2565 +20727:3:2014 +20728:0:2565 +20729:3:2015 +20730:3:2019 +20731:3:2020 +20732:3:2028 +20733:3:2029 +20734:3:2033 +20735:3:2034 +20736:3:2042 +20737:3:2047 +20738:3:2051 +20739:3:2052 +20740:3:2059 +20741:3:2060 +20742:3:2071 +20743:3:2079 +20744:3:2080 +20745:3:2084 +20746:3:2089 +20747:3:2090 +20748:0:2565 +20749:3:2102 +20750:0:2565 +20751:3:2104 +20752:0:2565 +20753:3:2105 +20754:3:2109 +20755:3:2110 +20756:3:2118 +20757:3:2119 +20758:3:2123 +20759:3:2124 +20760:3:2132 +20761:3:2137 +20762:3:2141 +20763:3:2142 +20764:3:2149 +20765:3:2150 +20766:3:2161 +20767:3:2169 +20768:3:2170 +20769:3:2174 +20770:3:2179 +20771:3:2180 +20772:0:2565 +20773:3:2192 +20774:0:2565 +20775:2:564 +20776:0:2565 +20777:3:2013 +20778:0:2565 +20779:1:435 +20780:0:2565 +20781:3:2014 +20782:0:2565 +20783:3:2015 +20784:3:2019 +20785:3:2020 +20786:3:2028 +20787:3:2029 +20788:3:2033 +20789:3:2034 +20790:3:2042 +20791:3:2047 +20792:3:2051 +20793:3:2052 +20794:3:2059 +20795:3:2060 +20796:3:2071 +20797:3:2079 +20798:3:2080 +20799:3:2084 +20800:3:2089 +20801:3:2090 +20802:0:2565 +20803:3:2102 +20804:0:2565 +20805:3:2104 +20806:0:2565 +20807:3:2105 +20808:3:2109 +20809:3:2110 +20810:3:2118 +20811:3:2119 +20812:3:2123 +20813:3:2124 +20814:3:2132 +20815:3:2137 +20816:3:2141 +20817:3:2142 +20818:3:2149 +20819:3:2150 +20820:3:2161 +20821:3:2169 +20822:3:2170 +20823:3:2174 +20824:3:2179 +20825:3:2180 +20826:0:2565 +20827:3:2192 +20828:0:2565 +20829:3:2013 +20830:0:2565 +20831:2:565 +20832:2:569 +20833:2:570 +20834:2:578 +20835:2:579 +20836:2:583 +20837:2:584 +20838:2:592 +20839:2:597 +20840:2:601 +20841:2:602 +20842:2:609 +20843:2:610 +20844:2:621 +20845:2:622 +20846:2:623 +20847:2:634 +20848:2:639 +20849:2:640 +20850:0:2565 +20851:3:2014 +20852:0:2565 +20853:3:2015 +20854:3:2019 +20855:3:2020 +20856:3:2028 +20857:3:2029 +20858:3:2033 +20859:3:2034 +20860:3:2042 +20861:3:2047 +20862:3:2051 +20863:3:2052 +20864:3:2059 +20865:3:2060 +20866:3:2071 +20867:3:2079 +20868:3:2080 +20869:3:2084 +20870:3:2089 +20871:3:2090 +20872:0:2565 +20873:3:2102 +20874:0:2565 +20875:1:434 +20876:0:2565 +20877:2:744 +20878:0:2565 +20879:1:435 +20880:0:2565 +20881:3:2104 +20882:0:2565 +20883:3:2105 +20884:3:2109 +20885:3:2110 +20886:3:2118 +20887:3:2119 +20888:3:2123 +20889:3:2124 +20890:3:2132 +20891:3:2137 +20892:3:2141 +20893:3:2142 +20894:3:2149 +20895:3:2150 +20896:3:2161 +20897:3:2169 +20898:3:2170 +20899:3:2174 +20900:3:2179 +20901:3:2180 +20902:0:2565 +20903:3:2192 +20904:0:2565 +20905:3:2013 +20906:0:2565 +20907:3:2014 +20908:0:2565 +20909:3:2015 +20910:3:2019 +20911:3:2020 +20912:3:2028 +20913:3:2029 +20914:3:2033 +20915:3:2034 +20916:3:2042 +20917:3:2047 +20918:3:2051 +20919:3:2052 +20920:3:2059 +20921:3:2060 +20922:3:2071 +20923:3:2079 +20924:3:2080 +20925:3:2084 +20926:3:2089 +20927:3:2090 +20928:0:2565 +20929:3:2102 +20930:0:2565 +20931:1:434 +20932:0:2565 +20933:3:2104 +20934:0:2565 +20935:3:2105 +20936:3:2109 +20937:3:2110 +20938:3:2118 +20939:3:2119 +20940:3:2123 +20941:3:2124 +20942:3:2132 +20943:3:2137 +20944:3:2141 +20945:3:2142 +20946:3:2149 +20947:3:2150 +20948:3:2161 +20949:3:2169 +20950:3:2170 +20951:3:2174 +20952:3:2179 +20953:3:2180 +20954:0:2565 +20955:3:2192 +20956:0:2565 +20957:3:2013 +20958:0:2565 +20959:3:2014 +20960:0:2565 +20961:3:2015 +20962:3:2019 +20963:3:2020 +20964:3:2028 +20965:3:2029 +20966:3:2033 +20967:3:2034 +20968:3:2042 +20969:3:2047 +20970:3:2051 +20971:3:2052 +20972:3:2059 +20973:3:2060 +20974:3:2071 +20975:3:2079 +20976:3:2080 +20977:3:2084 +20978:3:2089 +20979:3:2090 +20980:0:2565 +20981:2:745 +20982:0:2565 +20983:3:2102 +20984:0:2565 +20985:2:750 +20986:0:2565 +20987:2:753 +20988:0:2565 +20989:1:435 +20990:0:2565 +20991:3:2104 +20992:0:2565 +20993:3:2105 +20994:3:2109 +20995:3:2110 +20996:3:2118 +20997:3:2119 +20998:3:2123 +20999:3:2124 +21000:3:2132 +21001:3:2137 +21002:3:2141 +21003:3:2142 +21004:3:2149 +21005:3:2150 +21006:3:2161 +21007:3:2169 +21008:3:2170 +21009:3:2174 +21010:3:2179 +21011:3:2180 +21012:0:2565 +21013:3:2192 +21014:0:2565 +21015:3:2013 +21016:0:2565 +21017:3:2014 +21018:0:2565 +21019:3:2015 +21020:3:2019 +21021:3:2020 +21022:3:2028 +21023:3:2029 +21024:3:2033 +21025:3:2034 +21026:3:2042 +21027:3:2047 +21028:3:2051 +21029:3:2052 +21030:3:2059 +21031:3:2060 +21032:3:2071 +21033:3:2079 +21034:3:2080 +21035:3:2084 +21036:3:2089 +21037:3:2090 +21038:0:2565 +21039:3:2102 +21040:0:2565 +21041:1:434 +21042:0:2565 +21043:3:2104 +21044:0:2565 +21045:3:2105 +21046:3:2109 +21047:3:2110 +21048:3:2118 +21049:3:2119 +21050:3:2123 +21051:3:2124 +21052:3:2132 +21053:3:2137 +21054:3:2141 +21055:3:2142 +21056:3:2149 +21057:3:2150 +21058:3:2161 +21059:3:2169 +21060:3:2170 +21061:3:2174 +21062:3:2179 +21063:3:2180 +21064:0:2565 +21065:3:2192 +21066:0:2565 +21067:3:2013 +21068:0:2565 +21069:3:2014 +21070:0:2565 +21071:3:2015 +21072:3:2019 +21073:3:2020 +21074:3:2028 +21075:3:2029 +21076:3:2033 +21077:3:2034 +21078:3:2042 +21079:3:2047 +21080:3:2051 +21081:3:2052 +21082:3:2059 +21083:3:2060 +21084:3:2071 +21085:3:2079 +21086:3:2080 +21087:3:2084 +21088:3:2089 +21089:3:2090 +21090:0:2565 +21091:2:758 +21092:0:2565 +21093:3:2102 +21094:0:2565 +21095:1:435 +21096:0:2565 +21097:3:2104 +21098:0:2565 +21099:3:2105 +21100:3:2109 +21101:3:2110 +21102:3:2118 +21103:3:2119 +21104:3:2123 +21105:3:2124 +21106:3:2132 +21107:3:2137 +21108:3:2141 +21109:3:2142 +21110:3:2149 +21111:3:2150 +21112:3:2161 +21113:3:2169 +21114:3:2170 +21115:3:2174 +21116:3:2179 +21117:3:2180 +21118:0:2565 +21119:3:2192 +21120:0:2565 +21121:3:2013 +21122:0:2565 +21123:3:2014 +21124:0:2565 +21125:3:2015 +21126:3:2019 +21127:3:2020 +21128:3:2028 +21129:3:2029 +21130:3:2033 +21131:3:2034 +21132:3:2042 +21133:3:2047 +21134:3:2051 +21135:3:2052 +21136:3:2059 +21137:3:2060 +21138:3:2071 +21139:3:2079 +21140:3:2080 +21141:3:2084 +21142:3:2089 +21143:3:2090 +21144:0:2565 +21145:3:2102 +21146:0:2565 +21147:1:434 +21148:0:2565 +21149:3:2104 +21150:0:2565 +21151:3:2105 +21152:3:2109 +21153:3:2110 +21154:3:2118 +21155:3:2119 +21156:3:2123 +21157:3:2124 +21158:3:2132 +21159:3:2137 +21160:3:2141 +21161:3:2142 +21162:3:2149 +21163:3:2150 +21164:3:2161 +21165:3:2169 +21166:3:2170 +21167:3:2174 +21168:3:2179 +21169:3:2180 +21170:0:2565 +21171:3:2192 +21172:0:2565 +21173:3:2013 +21174:0:2565 +21175:3:2014 +21176:0:2565 +21177:3:2015 +21178:3:2019 +21179:3:2020 +21180:3:2028 +21181:3:2029 +21182:3:2033 +21183:3:2034 +21184:3:2042 +21185:3:2047 +21186:3:2051 +21187:3:2052 +21188:3:2059 +21189:3:2060 +21190:3:2071 +21191:3:2079 +21192:3:2080 +21193:3:2084 +21194:3:2089 +21195:3:2090 +21196:0:2565 +21197:2:759 +21198:0:2565 +21199:3:2102 +21200:0:2565 +21201:1:435 +21202:0:2565 +21203:3:2104 +21204:0:2565 +21205:3:2105 +21206:3:2109 +21207:3:2110 +21208:3:2118 +21209:3:2119 +21210:3:2123 +21211:3:2124 +21212:3:2132 +21213:3:2137 +21214:3:2141 +21215:3:2142 +21216:3:2149 +21217:3:2150 +21218:3:2161 +21219:3:2169 +21220:3:2170 +21221:3:2174 +21222:3:2179 +21223:3:2180 +21224:0:2565 +21225:3:2192 +21226:0:2565 +21227:3:2013 +21228:0:2565 +21229:3:2014 +21230:0:2565 +21231:3:2015 +21232:3:2019 +21233:3:2020 +21234:3:2028 +21235:3:2029 +21236:3:2033 +21237:3:2034 +21238:3:2042 +21239:3:2047 +21240:3:2051 +21241:3:2052 +21242:3:2059 +21243:3:2060 +21244:3:2071 +21245:3:2079 +21246:3:2080 +21247:3:2084 +21248:3:2089 +21249:3:2090 +21250:0:2565 +21251:3:2102 +21252:0:2565 +21253:2:760 +21254:0:2565 +21255:2:761 +21256:0:2565 +21257:2:762 +21258:0:2565 +21259:3:2104 +21260:0:2565 +21261:3:2105 +21262:3:2109 +21263:3:2110 +21264:3:2118 +21265:3:2119 +21266:3:2123 +21267:3:2124 +21268:3:2132 +21269:3:2137 +21270:3:2141 +21271:3:2142 +21272:3:2149 +21273:3:2150 +21274:3:2161 +21275:3:2169 +21276:3:2170 +21277:3:2174 +21278:3:2179 +21279:3:2180 +21280:0:2565 +21281:3:2192 +21282:0:2565 +21283:1:434 +21284:0:2565 +21285:3:2013 +21286:0:2565 +21287:2:763 +21288:0:2565 +21289:1:435 +21290:0:2565 +21291:3:2014 +21292:0:2565 +21293:3:2015 +21294:3:2019 +21295:3:2020 +21296:3:2028 +21297:3:2029 +21298:3:2033 +21299:3:2034 +21300:3:2042 +21301:3:2047 +21302:3:2051 +21303:3:2052 +21304:3:2059 +21305:3:2060 +21306:3:2071 +21307:3:2079 +21308:3:2080 +21309:3:2084 +21310:3:2089 +21311:3:2090 +21312:0:2565 +21313:3:2102 +21314:0:2565 +21315:3:2104 +21316:0:2565 +21317:3:2105 +21318:3:2109 +21319:3:2110 +21320:3:2118 +21321:3:2119 +21322:3:2123 +21323:3:2124 +21324:3:2132 +21325:3:2137 +21326:3:2141 +21327:3:2142 +21328:3:2149 +21329:3:2150 +21330:3:2161 +21331:3:2169 +21332:3:2170 +21333:3:2174 +21334:3:2179 +21335:3:2180 +21336:0:2565 +21337:3:2192 +21338:0:2565 +21339:3:2013 +21340:0:2565 +21341:1:434 +21342:0:2565 +21343:3:2014 +21344:0:2565 +21345:3:2015 +21346:3:2019 +21347:3:2020 +21348:3:2028 +21349:3:2029 +21350:3:2033 +21351:3:2034 +21352:3:2042 +21353:3:2047 +21354:3:2051 +21355:3:2052 +21356:3:2059 +21357:3:2060 +21358:3:2071 +21359:3:2079 +21360:3:2080 +21361:3:2084 +21362:3:2089 +21363:3:2090 +21364:0:2565 +21365:3:2102 +21366:0:2565 +21367:3:2104 +21368:0:2565 +21369:3:2105 +21370:3:2109 +21371:3:2110 +21372:3:2118 +21373:3:2119 +21374:3:2123 +21375:3:2124 +21376:3:2132 +21377:3:2137 +21378:3:2141 +21379:3:2142 +21380:3:2149 +21381:3:2150 +21382:3:2161 +21383:3:2169 +21384:3:2170 +21385:3:2174 +21386:3:2179 +21387:3:2180 +21388:0:2565 +21389:3:2192 +21390:0:2565 +21391:2:765 +21392:0:2565 +21393:3:2013 +21394:0:2565 +21395:1:435 +21396:0:2565 +21397:3:2014 +21398:0:2565 +21399:3:2015 +21400:3:2019 +21401:3:2020 +21402:3:2028 +21403:3:2029 +21404:3:2033 +21405:3:2034 +21406:3:2042 +21407:3:2047 +21408:3:2051 +21409:3:2052 +21410:3:2059 +21411:3:2060 +21412:3:2071 +21413:3:2079 +21414:3:2080 +21415:3:2084 +21416:3:2089 +21417:3:2090 +21418:0:2565 +21419:3:2102 +21420:0:2565 +21421:3:2104 +21422:0:2565 +21423:3:2105 +21424:3:2109 +21425:3:2110 +21426:3:2118 +21427:3:2119 +21428:3:2123 +21429:3:2124 +21430:3:2132 +21431:3:2137 +21432:3:2141 +21433:3:2142 +21434:3:2149 +21435:3:2150 +21436:3:2161 +21437:3:2169 +21438:3:2170 +21439:3:2174 +21440:3:2179 +21441:3:2180 +21442:0:2565 +21443:3:2192 +21444:0:2565 +21445:3:2013 +21446:0:2565 +21447:2:766 +21448:2:770 +21449:2:771 +21450:2:779 +21451:2:788 +21452:2:789 +21453:2:793 +21454:2:798 +21455:2:802 +21456:2:803 +21457:2:810 +21458:2:811 +21459:2:822 +21460:2:823 +21461:2:826 +21462:2:827 +21463:2:835 +21464:2:840 +21465:2:841 +21466:0:2565 +21467:3:2014 +21468:0:2565 +21469:3:2015 +21470:3:2019 +21471:3:2020 +21472:3:2028 +21473:3:2029 +21474:3:2033 +21475:3:2034 +21476:3:2042 +21477:3:2047 +21478:3:2051 +21479:3:2052 +21480:3:2059 +21481:3:2060 +21482:3:2071 +21483:3:2079 +21484:3:2080 +21485:3:2084 +21486:3:2089 +21487:3:2090 +21488:0:2565 +21489:3:2102 +21490:0:2565 +21491:3:2104 +21492:0:2565 +21493:3:2105 +21494:3:2109 +21495:3:2110 +21496:3:2118 +21497:3:2119 +21498:3:2123 +21499:3:2124 +21500:3:2132 +21501:3:2137 +21502:3:2141 +21503:3:2142 +21504:3:2149 +21505:3:2150 +21506:3:2161 +21507:3:2169 +21508:3:2170 +21509:3:2174 +21510:3:2179 +21511:3:2180 +21512:0:2565 +21513:3:2192 +21514:0:2565 +21515:2:853 +21516:0:2565 +21517:3:2013 +21518:0:2565 +21519:2:857 +21520:0:2565 +21521:2:465 +21522:0:2565 +21523:3:2014 +21524:0:2565 +21525:3:2015 +21526:3:2019 +21527:3:2020 +21528:3:2028 +21529:3:2029 +21530:3:2033 +21531:3:2034 +21532:3:2042 +21533:3:2047 +21534:3:2051 +21535:3:2052 +21536:3:2059 +21537:3:2060 +21538:3:2071 +21539:3:2079 +21540:3:2080 +21541:3:2084 +21542:3:2089 +21543:3:2090 +21544:0:2565 +21545:3:2102 +21546:0:2565 +21547:3:2104 +21548:0:2565 +21549:3:2105 +21550:3:2109 +21551:3:2110 +21552:3:2118 +21553:3:2119 +21554:3:2123 +21555:3:2124 +21556:3:2132 +21557:3:2137 +21558:3:2141 +21559:3:2142 +21560:3:2149 +21561:3:2150 +21562:3:2161 +21563:3:2169 +21564:3:2170 +21565:3:2174 +21566:3:2179 +21567:3:2180 +21568:0:2565 +21569:3:2192 +21570:0:2565 +21571:2:466 +21572:0:2565 +21573:3:2013 +21574:0:2565 +21575:3:2014 +21576:0:2565 +21577:3:2015 +21578:3:2019 +21579:3:2020 +21580:3:2028 +21581:3:2029 +21582:3:2033 +21583:3:2034 +21584:3:2042 +21585:3:2047 +21586:3:2051 +21587:3:2052 +21588:3:2059 +21589:3:2060 +21590:3:2071 +21591:3:2079 +21592:3:2080 +21593:3:2084 +21594:3:2089 +21595:3:2090 +21596:0:2565 +21597:3:2102 +21598:0:2565 +21599:3:2104 +21600:0:2565 +21601:3:2105 +21602:3:2109 +21603:3:2110 +21604:3:2118 +21605:3:2119 +21606:3:2123 +21607:3:2124 +21608:3:2132 +21609:3:2137 +21610:3:2141 +21611:3:2142 +21612:3:2149 +21613:3:2150 +21614:3:2161 +21615:3:2169 +21616:3:2170 +21617:3:2174 +21618:3:2179 +21619:3:2180 +21620:0:2565 +21621:2:467 +21622:0:2565 +21623:3:2192 +21624:0:2565 +21625:3:2013 +21626:0:2565 +21627:3:2014 +21628:0:2565 +21629:3:2015 +21630:3:2019 +21631:3:2020 +21632:3:2028 +21633:3:2029 +21634:3:2033 +21635:3:2034 +21636:3:2042 +21637:3:2047 +21638:3:2051 +21639:3:2052 +21640:3:2059 +21641:3:2060 +21642:3:2071 +21643:3:2079 +21644:3:2080 +21645:3:2084 +21646:3:2089 +21647:3:2090 +21648:0:2565 +21649:3:2102 +21650:0:2565 +21651:3:2104 +21652:0:2565 +21653:1:436 +21654:0:2565 +21655:2:468 +21656:0:2565 +21657:3:2105 +21658:3:2109 +21659:3:2110 +21660:3:2118 +21661:3:2119 +21662:3:2123 +21663:3:2124 +21664:3:2132 +21665:3:2137 +21666:3:2141 +21667:3:2142 +21668:3:2149 +21669:3:2150 +21670:3:2161 +21671:3:2169 +21672:3:2170 +21673:3:2174 +21674:3:2179 +21675:3:2180 +21676:0:2565 +21677:3:2192 +21678:0:2565 +21679:3:2013 +21680:0:2565 +21681:3:2014 +21682:0:2565 +21683:3:2015 +21684:3:2019 +21685:3:2020 +21686:3:2028 +21687:3:2029 +21688:3:2033 +21689:3:2034 +21690:3:2042 +21691:3:2047 +21692:3:2051 +21693:3:2052 +21694:3:2059 +21695:3:2060 +21696:3:2071 +21697:3:2079 +21698:3:2080 +21699:3:2084 +21700:3:2089 +21701:3:2090 +21702:0:2565 +21703:3:2102 +21704:0:2565 +21705:3:2104 +21706:0:2565 +21707:2:467 +21708:0:2565 +21709:2:468 +21710:0:2565 +21711:3:2105 +21712:3:2109 +21713:3:2110 +21714:3:2118 +21715:3:2119 +21716:3:2123 +21717:3:2124 +21718:3:2132 +21719:3:2137 +21720:3:2141 +21721:3:2142 +21722:3:2149 +21723:3:2150 +21724:3:2161 +21725:3:2169 +21726:3:2170 +21727:3:2174 +21728:3:2179 +21729:3:2180 +21730:0:2565 +21731:3:2192 +21732:0:2565 +21733:3:2013 +21734:0:2565 +21735:3:2014 +21736:0:2565 +21737:3:2015 +21738:3:2019 +21739:3:2020 +21740:3:2028 +21741:3:2029 +21742:3:2033 +21743:3:2034 +21744:3:2042 +21745:3:2047 +21746:3:2051 +21747:3:2052 +21748:3:2059 +21749:3:2060 +21750:3:2071 +21751:3:2079 +21752:3:2080 +21753:3:2084 +21754:3:2089 +21755:3:2090 +21756:0:2565 +21757:3:2102 +21758:0:2565 +21759:2:467 +21760:0:2565 +21761:1:442 +21762:0:2565 +21763:2:468 +21764:0:2565 +21765:1:446 +21766:0:2565 +21767:1:9 +21768:0:2565 +21769:1:10 +21770:0:2565 +21771:1:11 +21772:0:2565 +21773:3:2104 +21774:0:2565 +21775:3:2105 +21776:3:2109 +21777:3:2110 +21778:3:2118 +21779:3:2119 +21780:3:2123 +21781:3:2124 +21782:3:2132 +21783:3:2137 +21784:3:2141 +21785:3:2142 +21786:3:2149 +21787:3:2150 +21788:3:2161 +21789:3:2169 +21790:3:2170 +21791:3:2174 +21792:3:2179 +21793:3:2180 +21794:0:2565 +21795:3:2192 +21796:0:2565 +21797:3:2013 +21798:0:2565 +21799:3:2014 +21800:0:2565 +21801:3:2015 +21802:3:2019 +21803:3:2020 +21804:3:2028 +21805:3:2029 +21806:3:2033 +21807:3:2034 +21808:3:2042 +21809:3:2047 +21810:3:2051 +21811:3:2052 +21812:3:2059 +21813:3:2060 +21814:3:2071 +21815:3:2079 +21816:3:2080 +21817:3:2084 +21818:3:2089 +21819:3:2090 +21820:0:2565 +21821:3:2102 +21822:0:2565 +21823:2:467 +21824:0:2565 +21825:2:468 +21826:0:2565 +21827:3:2104 +21828:0:2565 +21829:3:2105 +21830:3:2109 +21831:3:2110 +21832:3:2118 +21833:3:2119 +21834:3:2123 +21835:3:2124 +21836:3:2132 +21837:3:2137 +21838:3:2141 +21839:3:2142 +21840:3:2149 +21841:3:2150 +21842:3:2161 +21843:3:2169 +21844:3:2170 +21845:3:2174 +21846:3:2179 +21847:3:2180 +21848:0:2565 +21849:3:2192 +21850:0:2565 +21851:3:2013 +21852:0:2565 +21853:3:2014 +21854:0:2565 +21855:3:2015 +21856:3:2019 +21857:3:2020 +21858:3:2028 +21859:3:2029 +21860:3:2033 +21861:3:2034 +21862:3:2042 +21863:3:2047 +21864:3:2051 +21865:3:2052 +21866:3:2059 +21867:3:2060 +21868:3:2071 +21869:3:2079 +21870:3:2080 +21871:3:2084 +21872:3:2089 +21873:3:2090 +21874:0:2565 +21875:2:467 +21876:0:2565 +21877:1:12 +21878:1:16 +21879:1:17 +21880:1:25 +21881:1:26 +21882:1:27 +21883:1:39 +21884:1:44 +21885:1:48 +21886:1:49 +21887:1:56 +21888:1:57 +21889:1:68 +21890:1:69 +21891:1:70 +21892:1:81 +21893:1:86 +21894:1:87 +21895:0:2565 +21896:3:2102 +21897:0:2565 +21898:3:2104 +21899:0:2565 +21900:1:99 +21901:0:2565 +21902:3:2105 +21903:3:2109 +21904:3:2110 +21905:3:2118 +21906:3:2119 +21907:3:2123 +21908:3:2124 +21909:3:2132 +21910:3:2137 +21911:3:2141 +21912:3:2142 +21913:3:2149 +21914:3:2150 +21915:3:2161 +21916:3:2169 +21917:3:2170 +21918:3:2174 +21919:3:2179 +21920:3:2180 +21921:0:2565 +21922:1:100 +21923:0:2565 +21924:3:2192 +21925:0:2565 +21926:3:2013 +21927:0:2565 +21928:2:468 +21929:0:2565 +21930:1:101 +21931:0:2565 +21932:3:2014 +21933:0:2565 +21934:3:2015 +21935:3:2019 +21936:3:2020 +21937:3:2028 +21938:3:2029 +21939:3:2033 +21940:3:2034 +21941:3:2042 +21942:3:2047 +21943:3:2051 +21944:3:2052 +21945:3:2059 +21946:3:2060 +21947:3:2071 +21948:3:2079 +21949:3:2080 +21950:3:2084 +21951:3:2089 +21952:3:2090 +21953:0:2565 +21954:3:2102 +21955:0:2565 +21956:3:2104 +21957:0:2565 +21958:3:2105 +21959:3:2109 +21960:3:2110 +21961:3:2118 +21962:3:2119 +21963:3:2123 +21964:3:2124 +21965:3:2132 +21966:3:2137 +21967:3:2141 +21968:3:2142 +21969:3:2149 +21970:3:2150 +21971:3:2161 +21972:3:2169 +21973:3:2170 +21974:3:2174 +21975:3:2179 +21976:3:2180 +21977:0:2565 +21978:3:2192 +21979:0:2565 +21980:3:2013 +21981:0:2565 +21982:1:100 +21983:0:2565 +21984:3:2014 +21985:0:2565 +21986:3:2015 +21987:3:2019 +21988:3:2020 +21989:3:2028 +21990:3:2029 +21991:3:2033 +21992:3:2034 +21993:3:2042 +21994:3:2047 +21995:3:2051 +21996:3:2052 +21997:3:2059 +21998:3:2060 +21999:3:2071 +22000:3:2079 +22001:3:2080 +22002:3:2084 +22003:3:2089 +22004:3:2090 +22005:0:2565 +22006:3:2102 +22007:0:2565 +22008:3:2104 +22009:0:2565 +22010:3:2105 +22011:3:2109 +22012:3:2110 +22013:3:2118 +22014:3:2119 +22015:3:2123 +22016:3:2124 +22017:3:2132 +22018:3:2137 +22019:3:2141 +22020:3:2142 +22021:3:2149 +22022:3:2150 +22023:3:2161 +22024:3:2169 +22025:3:2170 +22026:3:2174 +22027:3:2179 +22028:3:2180 +22029:0:2565 +22030:3:2192 +22031:0:2565 +22032:2:469 +22033:0:2565 +22034:3:2013 +22035:0:2565 +22036:2:475 +22037:0:2565 +22038:2:476 +22039:0:2565 +22040:1:101 +22041:0:2565 +22042:3:2014 +22043:0:2565 +22044:3:2015 +22045:3:2019 +22046:3:2020 +22047:3:2028 +22048:3:2029 +22049:3:2033 +22050:3:2034 +22051:3:2042 +22052:3:2047 +22053:3:2051 +22054:3:2052 +22055:3:2059 +22056:3:2060 +22057:3:2071 +22058:3:2079 +22059:3:2080 +22060:3:2084 +22061:3:2089 +22062:3:2090 +22063:0:2565 +22064:3:2102 +22065:0:2565 +22066:3:2104 +22067:0:2565 +22068:3:2105 +22069:3:2109 +22070:3:2110 +22071:3:2118 +22072:3:2119 +22073:3:2123 +22074:3:2124 +22075:3:2132 +22076:3:2137 +22077:3:2141 +22078:3:2142 +22079:3:2149 +22080:3:2150 +22081:3:2161 +22082:3:2169 +22083:3:2170 +22084:3:2174 +22085:3:2179 +22086:3:2180 +22087:0:2565 +22088:3:2192 +22089:0:2565 +22090:3:2013 +22091:0:2565 +22092:1:100 +22093:0:2565 +22094:3:2014 +22095:0:2565 +22096:3:2015 +22097:3:2019 +22098:3:2020 +22099:3:2028 +22100:3:2029 +22101:3:2033 +22102:3:2034 +22103:3:2042 +22104:3:2047 +22105:3:2051 +22106:3:2052 +22107:3:2059 +22108:3:2060 +22109:3:2071 +22110:3:2079 +22111:3:2080 +22112:3:2084 +22113:3:2089 +22114:3:2090 +22115:0:2565 +22116:3:2102 +22117:0:2565 +22118:3:2104 +22119:0:2565 +22120:3:2105 +22121:3:2109 +22122:3:2110 +22123:3:2118 +22124:3:2119 +22125:3:2123 +22126:3:2124 +22127:3:2132 +22128:3:2137 +22129:3:2141 +22130:3:2142 +22131:3:2149 +22132:3:2150 +22133:3:2161 +22134:3:2169 +22135:3:2170 +22136:3:2174 +22137:3:2179 +22138:3:2180 +22139:0:2565 +22140:3:2192 +22141:0:2565 +22142:2:477 +22143:2:481 +22144:2:482 +22145:2:490 +22146:2:491 +22147:2:495 +22148:2:496 +22149:2:504 +22150:2:509 +22151:2:513 +22152:2:514 +22153:2:521 +22154:2:522 +22155:2:533 +22156:2:534 +22157:2:535 +22158:2:546 +22159:2:551 +22160:2:552 +22161:0:2565 +22162:3:2013 +22163:0:2565 +22164:1:101 +22165:0:2565 +22166:3:2014 +22167:0:2565 +22168:3:2015 +22169:3:2019 +22170:3:2020 +22171:3:2028 +22172:3:2029 +22173:3:2033 +22174:3:2034 +22175:3:2042 +22176:3:2047 +22177:3:2051 +22178:3:2052 +22179:3:2059 +22180:3:2060 +22181:3:2071 +22182:3:2079 +22183:3:2080 +22184:3:2084 +22185:3:2089 +22186:3:2090 +22187:0:2565 +22188:3:2102 +22189:0:2565 +22190:3:2104 +22191:0:2565 +22192:3:2105 +22193:3:2109 +22194:3:2110 +22195:3:2118 +22196:3:2119 +22197:3:2123 +22198:3:2124 +22199:3:2132 +22200:3:2137 +22201:3:2141 +22202:3:2142 +22203:3:2149 +22204:3:2150 +22205:3:2161 +22206:3:2169 +22207:3:2170 +22208:3:2174 +22209:3:2179 +22210:3:2180 +22211:0:2565 +22212:3:2192 +22213:0:2565 +22214:3:2013 +22215:0:2565 +22216:1:100 +22217:0:2565 +22218:3:2014 +22219:0:2565 +22220:3:2015 +22221:3:2019 +22222:3:2020 +22223:3:2028 +22224:3:2029 +22225:3:2033 +22226:3:2034 +22227:3:2042 +22228:3:2047 +22229:3:2051 +22230:3:2052 +22231:3:2059 +22232:3:2060 +22233:3:2071 +22234:3:2079 +22235:3:2080 +22236:3:2084 +22237:3:2089 +22238:3:2090 +22239:0:2565 +22240:3:2102 +22241:0:2565 +22242:3:2104 +22243:0:2565 +22244:3:2105 +22245:3:2109 +22246:3:2110 +22247:3:2118 +22248:3:2119 +22249:3:2123 +22250:3:2124 +22251:3:2132 +22252:3:2137 +22253:3:2141 +22254:3:2142 +22255:3:2149 +22256:3:2150 +22257:3:2161 +22258:3:2169 +22259:3:2170 +22260:3:2174 +22261:3:2179 +22262:3:2180 +22263:0:2565 +22264:3:2192 +22265:0:2565 +22266:2:564 +22267:0:2565 +22268:3:2013 +22269:0:2565 +22270:1:101 +22271:0:2565 +22272:3:2014 +22273:0:2565 +22274:3:2015 +22275:3:2019 +22276:3:2020 +22277:3:2028 +22278:3:2029 +22279:3:2033 +22280:3:2034 +22281:3:2042 +22282:3:2047 +22283:3:2051 +22284:3:2052 +22285:3:2059 +22286:3:2060 +22287:3:2071 +22288:3:2079 +22289:3:2080 +22290:3:2084 +22291:3:2089 +22292:3:2090 +22293:0:2565 +22294:3:2102 +22295:0:2565 +22296:3:2104 +22297:0:2565 +22298:3:2105 +22299:3:2109 +22300:3:2110 +22301:3:2118 +22302:3:2119 +22303:3:2123 +22304:3:2124 +22305:3:2132 +22306:3:2137 +22307:3:2141 +22308:3:2142 +22309:3:2149 +22310:3:2150 +22311:3:2161 +22312:3:2169 +22313:3:2170 +22314:3:2174 +22315:3:2179 +22316:3:2180 +22317:0:2565 +22318:3:2192 +22319:0:2565 +22320:3:2013 +22321:0:2565 +22322:2:565 +22323:2:569 +22324:2:570 +22325:2:578 +22326:2:579 +22327:2:583 +22328:2:584 +22329:2:592 +22330:2:597 +22331:2:601 +22332:2:602 +22333:2:609 +22334:2:610 +22335:2:621 +22336:2:622 +22337:2:623 +22338:2:634 +22339:2:639 +22340:2:640 +22341:0:2565 +22342:3:2014 +22343:0:2565 +22344:3:2015 +22345:3:2019 +22346:3:2020 +22347:3:2028 +22348:3:2029 +22349:3:2033 +22350:3:2034 +22351:3:2042 +22352:3:2047 +22353:3:2051 +22354:3:2052 +22355:3:2059 +22356:3:2060 +22357:3:2071 +22358:3:2079 +22359:3:2080 +22360:3:2084 +22361:3:2089 +22362:3:2090 +22363:0:2565 +22364:3:2102 +22365:0:2565 +22366:1:100 +22367:0:2565 +22368:2:652 +22369:0:2565 +22370:1:101 +22371:0:2565 +22372:3:2104 +22373:0:2565 +22374:3:2105 +22375:3:2109 +22376:3:2110 +22377:3:2118 +22378:3:2119 +22379:3:2123 +22380:3:2124 +22381:3:2132 +22382:3:2137 +22383:3:2141 +22384:3:2142 +22385:3:2149 +22386:3:2150 +22387:3:2161 +22388:3:2169 +22389:3:2170 +22390:3:2174 +22391:3:2179 +22392:3:2180 +22393:0:2565 +22394:3:2192 +22395:0:2565 +22396:3:2013 +22397:0:2565 +22398:3:2014 +22399:0:2565 +22400:3:2015 +22401:3:2019 +22402:3:2020 +22403:3:2028 +22404:3:2029 +22405:3:2033 +22406:3:2034 +22407:3:2042 +22408:3:2047 +22409:3:2051 +22410:3:2052 +22411:3:2059 +22412:3:2060 +22413:3:2071 +22414:3:2079 +22415:3:2080 +22416:3:2084 +22417:3:2089 +22418:3:2090 +22419:0:2565 +22420:3:2102 +22421:0:2565 +22422:1:100 +22423:0:2565 +22424:3:2104 +22425:0:2565 +22426:3:2105 +22427:3:2109 +22428:3:2110 +22429:3:2118 +22430:3:2119 +22431:3:2123 +22432:3:2124 +22433:3:2132 +22434:3:2137 +22435:3:2141 +22436:3:2142 +22437:3:2149 +22438:3:2150 +22439:3:2161 +22440:3:2169 +22441:3:2170 +22442:3:2174 +22443:3:2179 +22444:3:2180 +22445:0:2565 +22446:3:2192 +22447:0:2565 +22448:3:2013 +22449:0:2565 +22450:3:2014 +22451:0:2565 +22452:3:2015 +22453:3:2019 +22454:3:2020 +22455:3:2028 +22456:3:2029 +22457:3:2033 +22458:3:2034 +22459:3:2042 +22460:3:2047 +22461:3:2051 +22462:3:2052 +22463:3:2059 +22464:3:2060 +22465:3:2071 +22466:3:2079 +22467:3:2080 +22468:3:2084 +22469:3:2089 +22470:3:2090 +22471:0:2565 +22472:2:653 +22473:0:2565 +22474:3:2102 +22475:0:2565 +22476:1:101 +22477:0:2565 +22478:3:2104 +22479:0:2565 +22480:3:2105 +22481:3:2109 +22482:3:2110 +22483:3:2118 +22484:3:2119 +22485:3:2123 +22486:3:2124 +22487:3:2132 +22488:3:2137 +22489:3:2141 +22490:3:2142 +22491:3:2149 +22492:3:2150 +22493:3:2161 +22494:3:2169 +22495:3:2170 +22496:3:2174 +22497:3:2179 +22498:3:2180 +22499:0:2565 +22500:3:2192 +22501:0:2565 +22502:3:2013 +22503:0:2565 +22504:3:2014 +22505:0:2565 +22506:3:2015 +22507:3:2019 +22508:3:2020 +22509:3:2028 +22510:3:2029 +22511:3:2033 +22512:3:2034 +22513:3:2042 +22514:3:2047 +22515:3:2051 +22516:3:2052 +22517:3:2059 +22518:3:2060 +22519:3:2071 +22520:3:2079 +22521:3:2080 +22522:3:2084 +22523:3:2089 +22524:3:2090 +22525:0:2565 +22526:3:2102 +22527:0:2565 +22528:1:100 +22529:0:2565 +22530:3:2104 +22531:0:2565 +22532:3:2105 +22533:3:2109 +22534:3:2110 +22535:3:2118 +22536:3:2119 +22537:3:2123 +22538:3:2124 +22539:3:2132 +22540:3:2137 +22541:3:2141 +22542:3:2142 +22543:3:2149 +22544:3:2150 +22545:3:2161 +22546:3:2169 +22547:3:2170 +22548:3:2174 +22549:3:2179 +22550:3:2180 +22551:0:2565 +22552:3:2192 +22553:0:2565 +22554:3:2013 +22555:0:2565 +22556:3:2014 +22557:0:2565 +22558:3:2015 +22559:3:2019 +22560:3:2020 +22561:3:2028 +22562:3:2029 +22563:3:2033 +22564:3:2034 +22565:3:2042 +22566:3:2047 +22567:3:2051 +22568:3:2052 +22569:3:2059 +22570:3:2060 +22571:3:2071 +22572:3:2079 +22573:3:2080 +22574:3:2084 +22575:3:2089 +22576:3:2090 +22577:0:2565 +22578:2:654 +22579:2:658 +22580:2:659 +22581:2:667 +22582:2:668 +22583:2:672 +22584:2:673 +22585:2:681 +22586:2:686 +22587:2:690 +22588:2:691 +22589:2:698 +22590:2:699 +22591:2:710 +22592:2:711 +22593:2:712 +22594:2:723 +22595:2:728 +22596:2:729 +22597:0:2565 +22598:3:2102 +22599:0:2565 +22600:1:101 +22601:0:2565 +22602:3:2104 +22603:0:2565 +22604:3:2105 +22605:3:2109 +22606:3:2110 +22607:3:2118 +22608:3:2119 +22609:3:2123 +22610:3:2124 +22611:3:2132 +22612:3:2137 +22613:3:2141 +22614:3:2142 +22615:3:2149 +22616:3:2150 +22617:3:2161 +22618:3:2169 +22619:3:2170 +22620:3:2174 +22621:3:2179 +22622:3:2180 +22623:0:2565 +22624:3:2192 +22625:0:2565 +22626:3:2013 +22627:0:2565 +22628:3:2014 +22629:0:2565 +22630:3:2015 +22631:3:2019 +22632:3:2020 +22633:3:2028 +22634:3:2029 +22635:3:2033 +22636:3:2034 +22637:3:2042 +22638:3:2047 +22639:3:2051 +22640:3:2052 +22641:3:2059 +22642:3:2060 +22643:3:2071 +22644:3:2079 +22645:3:2080 +22646:3:2084 +22647:3:2089 +22648:3:2090 +22649:0:2565 +22650:3:2102 +22651:0:2565 +22652:2:741 +22653:0:2565 +22654:2:750 +22655:0:2565 +22656:3:2104 +22657:0:2565 +22658:3:2105 +22659:3:2109 +22660:3:2110 +22661:3:2118 +22662:3:2119 +22663:3:2123 +22664:3:2124 +22665:3:2132 +22666:3:2137 +22667:3:2141 +22668:3:2142 +22669:3:2149 +22670:3:2150 +22671:3:2161 +22672:3:2169 +22673:3:2170 +22674:3:2174 +22675:3:2179 +22676:3:2180 +22677:0:2565 +22678:3:2192 +22679:0:2565 +22680:3:2013 +22681:0:2565 +22682:1:100 +22683:0:2565 +22684:2:753 +22685:0:2565 +22686:1:101 +22687:0:2565 +22688:2:758 +22689:0:2565 +22690:2:759 +22691:0:2565 +22692:2:760 +22693:0:2565 +22694:2:761 +22695:0:2565 +22696:2:762 +22697:0:2565 +22698:2:763 +22699:0:2565 +22700:2:765 +22701:0:2565 +22702:2:766 +22703:2:770 +22704:2:771 +22705:2:779 +22706:2:780 +22707:2:781 +22708:2:793 +22709:2:798 +22710:2:802 +22711:2:803 +22712:2:810 +22713:2:811 +22714:2:822 +22715:2:823 +22716:2:824 +22717:2:835 +22718:2:840 +22719:2:841 +22720:0:2565 +22721:3:2014 +22722:0:2565 +22723:3:2015 +22724:3:2019 +22725:3:2020 +22726:3:2028 +22727:3:2029 +22728:3:2033 +22729:3:2034 +22730:3:2042 +22731:3:2047 +22732:3:2051 +22733:3:2052 +22734:3:2059 +22735:3:2060 +22736:3:2071 +22737:3:2079 +22738:3:2080 +22739:3:2084 +22740:3:2089 +22741:3:2090 +22742:0:2565 +22743:3:2102 +22744:0:2565 +22745:3:2104 +22746:0:2565 +22747:3:2105 +22748:3:2109 +22749:3:2110 +22750:3:2118 +22751:3:2119 +22752:3:2123 +22753:3:2124 +22754:3:2132 +22755:3:2137 +22756:3:2141 +22757:3:2142 +22758:3:2149 +22759:3:2150 +22760:3:2161 +22761:3:2169 +22762:3:2170 +22763:3:2174 +22764:3:2179 +22765:3:2180 +22766:0:2565 +22767:3:2192 +22768:0:2565 +22769:3:2013 +22770:0:2565 +22771:2:853 +22772:0:2565 +22773:2:857 +22774:0:2565 +22775:3:2014 +22776:0:2565 +22777:3:2015 +22778:3:2019 +22779:3:2020 +22780:3:2028 +22781:3:2029 +22782:3:2033 +22783:3:2034 +22784:3:2042 +22785:3:2047 +22786:3:2051 +22787:3:2052 +22788:3:2059 +22789:3:2060 +22790:3:2071 +22791:3:2079 +22792:3:2080 +22793:3:2084 +22794:3:2089 +22795:3:2090 +22796:0:2565 +22797:3:2102 +22798:0:2565 +22799:1:100 +22800:0:2565 +22801:2:465 +22802:0:2565 +22803:1:101 +22804:0:2565 +22805:3:2104 +22806:0:2565 +22807:3:2105 +22808:3:2109 +22809:3:2110 +22810:3:2118 +22811:3:2119 +22812:3:2123 +22813:3:2124 +22814:3:2132 +22815:3:2137 +22816:3:2141 +22817:3:2142 +22818:3:2149 +22819:3:2150 +22820:3:2161 +22821:3:2169 +22822:3:2170 +22823:3:2174 +22824:3:2179 +22825:3:2180 +22826:0:2565 +22827:3:2192 +22828:0:2565 +22829:3:2013 +22830:0:2565 +22831:3:2014 +22832:0:2565 +22833:3:2015 +22834:3:2019 +22835:3:2020 +22836:3:2028 +22837:3:2029 +22838:3:2033 +22839:3:2034 +22840:3:2042 +22841:3:2047 +22842:3:2051 +22843:3:2052 +22844:3:2059 +22845:3:2060 +22846:3:2071 +22847:3:2079 +22848:3:2080 +22849:3:2084 +22850:3:2089 +22851:3:2090 +22852:0:2565 +22853:3:2102 +22854:0:2565 +22855:1:100 +22856:0:2565 +22857:3:2104 +22858:0:2565 +22859:3:2105 +22860:3:2109 +22861:3:2110 +22862:3:2118 +22863:3:2119 +22864:3:2123 +22865:3:2124 +22866:3:2132 +22867:3:2137 +22868:3:2141 +22869:3:2142 +22870:3:2149 +22871:3:2150 +22872:3:2161 +22873:3:2169 +22874:3:2170 +22875:3:2174 +22876:3:2179 +22877:3:2180 +22878:0:2565 +22879:3:2192 +22880:0:2565 +22881:3:2013 +22882:0:2565 +22883:3:2014 +22884:0:2565 +22885:3:2015 +22886:3:2019 +22887:3:2020 +22888:3:2028 +22889:3:2029 +22890:3:2033 +22891:3:2034 +22892:3:2042 +22893:3:2047 +22894:3:2051 +22895:3:2052 +22896:3:2059 +22897:3:2060 +22898:3:2071 +22899:3:2079 +22900:3:2080 +22901:3:2084 +22902:3:2089 +22903:3:2090 +22904:0:2565 +22905:2:466 +22906:0:2565 +22907:3:2102 +22908:0:2565 +22909:1:101 +22910:0:2565 +22911:2:467 +22912:0:2565 +22913:2:468 +22914:0:2565 +22915:1:102 +22916:0:2565 +22917:2:467 +22918:0:2565 +22919:3:2104 +22920:0:2565 +22921:3:2105 +22922:3:2109 +22923:3:2110 +22924:3:2118 +22925:3:2119 +22926:3:2123 +22927:3:2124 +22928:3:2132 +22929:3:2137 +22930:3:2141 +22931:3:2142 +22932:3:2149 +22933:3:2150 +22934:3:2161 +22935:3:2169 +22936:3:2170 +22937:3:2174 +22938:3:2179 +22939:3:2180 +22940:0:2565 +22941:3:2192 +22942:0:2565 +22943:3:2013 +22944:0:2565 +22945:3:2014 +22946:0:2565 +22947:3:2015 +22948:3:2019 +22949:3:2020 +22950:3:2028 +22951:3:2029 +22952:3:2033 +22953:3:2034 +22954:3:2042 +22955:3:2047 +22956:3:2051 +22957:3:2052 +22958:3:2059 +22959:3:2060 +22960:3:2071 +22961:3:2079 +22962:3:2080 +22963:3:2084 +22964:3:2089 +22965:3:2090 +22966:0:2565 +22967:3:2102 +22968:0:2565 +22969:1:108 +22970:0:2565 +22971:3:2104 +22972:0:2565 +22973:3:2105 +22974:3:2109 +22975:3:2110 +22976:3:2118 +22977:3:2119 +22978:3:2123 +22979:3:2124 +22980:3:2132 +22981:3:2137 +22982:3:2141 +22983:3:2142 +22984:3:2149 +22985:3:2150 +22986:3:2161 +22987:3:2169 +22988:3:2170 +22989:3:2174 +22990:3:2179 +22991:3:2180 +22992:0:2565 +22993:3:2192 +22994:0:2565 +22995:3:2013 +22996:0:2565 +22997:3:2014 +22998:0:2565 +22999:3:2015 +23000:3:2019 +23001:3:2020 +23002:3:2028 +23003:3:2029 +23004:3:2033 +23005:3:2034 +23006:3:2042 +23007:3:2047 +23008:3:2051 +23009:3:2052 +23010:3:2059 +23011:3:2060 +23012:3:2071 +23013:3:2079 +23014:3:2080 +23015:3:2084 +23016:3:2089 +23017:3:2090 +23018:0:2565 +23019:1:109 +23020:1:113 +23021:1:114 +23022:1:122 +23023:1:123 +23024:1:124 +23025:1:136 +23026:1:141 +23027:1:145 +23028:1:146 +23029:1:153 +23030:1:154 +23031:1:165 +23032:1:166 +23033:1:167 +23034:1:178 +23035:1:183 +23036:1:184 +23037:0:2565 +23038:1:196 +23039:0:2565 +23040:3:2102 +23041:0:2565 +23042:1:197 +23043:0:2565 +23044:2:468 +23045:0:2565 +23046:1:198 +23047:0:2565 +23048:2:469 +23049:0:2565 +23050:2:475 +23051:0:2565 +23052:2:476 +23053:0:2565 +23054:2:477 +23055:2:481 +23056:2:482 +23057:2:490 +23058:2:491 +23059:2:495 +23060:2:496 +23061:2:504 +23062:2:509 +23063:2:513 +23064:2:514 +23065:2:521 +23066:2:522 +23067:2:533 +23068:2:534 +23069:2:535 +23070:2:546 +23071:2:551 +23072:2:552 +23073:0:2565 +23074:2:564 +23075:0:2565 +23076:2:565 +23077:2:569 +23078:2:570 +23079:2:578 +23080:2:579 +23081:2:583 +23082:2:584 +23083:2:592 +23084:2:597 +23085:2:601 +23086:2:602 +23087:2:609 +23088:2:610 +23089:2:621 +23090:2:622 +23091:2:623 +23092:2:634 +23093:2:639 +23094:2:640 +23095:0:2565 +23096:3:2104 +23097:0:2565 +23098:3:2105 +23099:3:2109 +23100:3:2110 +23101:3:2118 +23102:3:2119 +23103:3:2123 +23104:3:2124 +23105:3:2132 +23106:3:2137 +23107:3:2141 +23108:3:2142 +23109:3:2149 +23110:3:2150 +23111:3:2161 +23112:3:2169 +23113:3:2170 +23114:3:2174 +23115:3:2179 +23116:3:2180 +23117:0:2565 +23118:3:2192 +23119:0:2565 +23120:3:2013 +23121:0:2565 +23122:3:2014 +23123:0:2565 +23124:3:2015 +23125:3:2019 +23126:3:2020 +23127:3:2028 +23128:3:2029 +23129:3:2033 +23130:3:2034 +23131:3:2042 +23132:3:2047 +23133:3:2051 +23134:3:2052 +23135:3:2059 +23136:3:2060 +23137:3:2071 +23138:3:2079 +23139:3:2080 +23140:3:2084 +23141:3:2089 +23142:3:2090 +23143:0:2565 +23144:3:2102 +23145:0:2565 +23146:1:197 +23147:0:2565 +23148:2:652 +23149:0:2565 +23150:1:198 +23151:0:2565 +23152:2:653 +23153:0:2565 +23154:2:654 +23155:2:658 +23156:2:659 +23157:2:667 +23158:2:668 +23159:2:672 +23160:2:673 +23161:2:681 +23162:2:686 +23163:2:690 +23164:2:691 +23165:2:698 +23166:2:699 +23167:2:710 +23168:2:711 +23169:2:712 +23170:2:723 +23171:2:728 +23172:2:729 +23173:0:2565 +23174:2:741 +23175:0:2565 +23176:2:750 +23177:0:2565 +23178:2:753 +23179:0:2565 +23180:2:758 +23181:0:2565 +23182:2:759 +23183:0:2565 +23184:2:760 +23185:0:2565 +23186:2:761 +23187:0:2565 +23188:2:762 +23189:0:2565 +23190:2:763 +23191:0:2565 +23192:2:765 +23193:0:2565 +23194:2:766 +23195:2:770 +23196:2:771 +23197:2:779 +23198:2:780 +23199:2:781 +23200:2:793 +23201:2:798 +23202:2:802 +23203:2:803 +23204:2:810 +23205:2:811 +23206:2:822 +23207:2:823 +23208:2:824 +23209:2:835 +23210:2:840 +23211:2:841 +23212:0:2565 +23213:3:2104 +23214:0:2565 +23215:3:2105 +23216:3:2109 +23217:3:2110 +23218:3:2118 +23219:3:2119 +23220:3:2123 +23221:3:2124 +23222:3:2132 +23223:3:2137 +23224:3:2141 +23225:3:2142 +23226:3:2149 +23227:3:2150 +23228:3:2161 +23229:3:2169 +23230:3:2170 +23231:3:2174 +23232:3:2179 +23233:3:2180 +23234:0:2565 +23235:3:2192 +23236:0:2565 +23237:3:2013 +23238:0:2565 +23239:3:2014 +23240:0:2565 +23241:3:2015 +23242:3:2019 +23243:3:2020 +23244:3:2028 +23245:3:2029 +23246:3:2033 +23247:3:2034 +23248:3:2042 +23249:3:2047 +23250:3:2051 +23251:3:2052 +23252:3:2059 +23253:3:2060 +23254:3:2071 +23255:3:2079 +23256:3:2080 +23257:3:2084 +23258:3:2089 +23259:3:2090 +23260:0:2565 +23261:3:2102 +23262:0:2565 +23263:2:853 +23264:0:2565 +23265:2:857 +23266:0:2565 +23267:1:197 +23268:0:2565 +23269:2:465 +23270:0:2565 +23271:1:198 +23272:0:2565 +23273:3:2104 +23274:0:2565 +23275:3:2105 +23276:3:2109 +23277:3:2110 +23278:3:2118 +23279:3:2119 +23280:3:2123 +23281:3:2124 +23282:3:2132 +23283:3:2137 +23284:3:2141 +23285:3:2142 +23286:3:2149 +23287:3:2150 +23288:3:2161 +23289:3:2169 +23290:3:2170 +23291:3:2174 +23292:3:2179 +23293:3:2180 +23294:0:2565 +23295:3:2192 +23296:0:2565 +23297:3:2013 +23298:0:2565 +23299:3:2014 +23300:0:2565 +23301:3:2015 +23302:3:2019 +23303:3:2020 +23304:3:2028 +23305:3:2029 +23306:3:2033 +23307:3:2034 +23308:3:2042 +23309:3:2047 +23310:3:2051 +23311:3:2052 +23312:3:2059 +23313:3:2060 +23314:3:2071 +23315:3:2079 +23316:3:2080 +23317:3:2084 +23318:3:2089 +23319:3:2090 +23320:0:2565 +23321:3:2102 +23322:0:2565 +23323:1:197 +23324:0:2565 +23325:3:2104 +23326:0:2565 +23327:3:2105 +23328:3:2109 +23329:3:2110 +23330:3:2118 +23331:3:2119 +23332:3:2123 +23333:3:2124 +23334:3:2132 +23335:3:2137 +23336:3:2141 +23337:3:2142 +23338:3:2149 +23339:3:2150 +23340:3:2161 +23341:3:2169 +23342:3:2170 +23343:3:2174 +23344:3:2179 +23345:3:2180 +23346:0:2565 +23347:3:2192 +23348:0:2565 +23349:3:2013 +23350:0:2565 +23351:3:2014 +23352:0:2565 +23353:3:2015 +23354:3:2019 +23355:3:2020 +23356:3:2028 +23357:3:2029 +23358:3:2033 +23359:3:2034 +23360:3:2042 +23361:3:2047 +23362:3:2051 +23363:3:2052 +23364:3:2059 +23365:3:2060 +23366:3:2071 +23367:3:2079 +23368:3:2080 +23369:3:2084 +23370:3:2089 +23371:3:2090 +23372:0:2565 +23373:2:466 +23374:0:2565 +23375:3:2102 +23376:0:2565 +23377:1:198 +23378:0:2565 +23379:3:2104 +23380:0:2565 +23381:3:2105 +23382:3:2109 +23383:3:2110 +23384:3:2118 +23385:3:2119 +23386:3:2123 +23387:3:2124 +23388:3:2132 +23389:3:2137 +23390:3:2141 +23391:3:2142 +23392:3:2149 +23393:3:2150 +23394:3:2161 +23395:3:2169 +23396:3:2170 +23397:3:2174 +23398:3:2179 +23399:3:2180 +23400:0:2565 +23401:3:2192 +23402:0:2565 +23403:3:2013 +23404:0:2565 +23405:3:2014 +23406:0:2565 +23407:3:2015 +23408:3:2019 +23409:3:2020 +23410:3:2028 +23411:3:2029 +23412:3:2033 +23413:3:2034 +23414:3:2042 +23415:3:2047 +23416:3:2051 +23417:3:2052 +23418:3:2059 +23419:3:2060 +23420:3:2071 +23421:3:2079 +23422:3:2080 +23423:3:2084 +23424:3:2089 +23425:3:2090 +23426:0:2565 +23427:3:2102 +23428:0:2565 +23429:1:199 +23430:0:2565 +23431:3:2104 +23432:0:2565 +23433:3:2105 +23434:3:2109 +23435:3:2110 +23436:3:2118 +23437:3:2119 +23438:3:2123 +23439:3:2124 +23440:3:2132 +23441:3:2137 +23442:3:2141 +23443:3:2142 +23444:3:2149 +23445:3:2150 +23446:3:2161 +23447:3:2169 +23448:3:2170 +23449:3:2174 +23450:3:2179 +23451:3:2180 +23452:0:2565 +23453:3:2192 +23454:0:2565 +23455:3:2013 +23456:0:2565 +23457:3:2014 +23458:0:2565 +23459:3:2015 +23460:3:2019 +23461:3:2020 +23462:3:2028 +23463:3:2029 +23464:3:2033 +23465:3:2034 +23466:3:2042 +23467:3:2047 +23468:3:2051 +23469:3:2052 +23470:3:2059 +23471:3:2060 +23472:3:2071 +23473:3:2079 +23474:3:2080 +23475:3:2084 +23476:3:2089 +23477:3:2090 +23478:0:2565 +23479:2:467 +23480:0:2565 +23481:3:2102 +23482:0:2565 +23483:2:468 +23484:0:2565 +23485:1:205 +23486:0:2565 +23487:3:2104 +23488:0:2565 +23489:3:2105 +23490:3:2109 +23491:3:2110 +23492:3:2118 +23493:3:2119 +23494:3:2123 +23495:3:2124 +23496:3:2132 +23497:3:2137 +23498:3:2141 +23499:3:2142 +23500:3:2149 +23501:3:2150 +23502:3:2161 +23503:3:2169 +23504:3:2170 +23505:3:2174 +23506:3:2179 +23507:3:2180 +23508:0:2565 +23509:3:2192 +23510:0:2565 +23511:3:2013 +23512:0:2565 +23513:3:2014 +23514:0:2565 +23515:3:2015 +23516:3:2019 +23517:3:2020 +23518:3:2028 +23519:3:2029 +23520:3:2033 +23521:3:2034 +23522:3:2042 +23523:3:2047 +23524:3:2051 +23525:3:2052 +23526:3:2059 +23527:3:2060 +23528:3:2071 +23529:3:2079 +23530:3:2080 +23531:3:2084 +23532:3:2089 +23533:3:2090 +23534:0:2565 +23535:3:2102 +23536:0:2565 +23537:2:467 +23538:0:2565 +23539:2:468 +23540:0:2565 +23541:3:2104 +23542:0:2565 +23543:3:2105 +23544:3:2109 +23545:3:2110 +23546:3:2118 +23547:3:2119 +23548:3:2123 +23549:3:2124 +23550:3:2132 +23551:3:2137 +23552:3:2141 +23553:3:2142 +23554:3:2149 +23555:3:2150 +23556:3:2161 +23557:3:2169 +23558:3:2170 +23559:3:2174 +23560:3:2179 +23561:3:2180 +23562:0:2565 +23563:3:2192 +23564:0:2565 +23565:3:2013 +23566:0:2565 +23567:3:2014 +23568:0:2565 +23569:1:206 diff --git a/formal-model/urcu/result-signal-over-writer/DEFINES b/formal-model/urcu/result-signal-over-writer/DEFINES new file mode 100644 index 0000000..ec600f0 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/DEFINES @@ -0,0 +1,16 @@ + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#define TEST_SIGNAL +//#define TEST_SIGNAL_ON_READ +#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 1 +#endif + +#define REMOTE_BARRIERS diff --git a/formal-model/urcu/result-signal-over-writer/Makefile b/formal-model/urcu/result-signal-over-writer/Makefile new file mode 100644 index 0000000..8af320d --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/Makefile @@ -0,0 +1,172 @@ +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Copyright (C) Mathieu Desnoyers, 2009 +# +# Authors: Mathieu Desnoyers + +#CFLAGS=-DSAFETY +#for multi-core verif, 15.5GB shared mem, use files if full +#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 +#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 + +#liveness +#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 +CFLAGS=-DHASH64 + +SPINFILE=urcu.spin + +default: + make urcu_free | tee urcu_free.log + #nested useless with signal test. + #make urcu_free_nested | tee urcu_free_nested.log + make urcu_free_no_rmb | tee urcu_free_no_rmb.log + make urcu_free_no_wmb | tee urcu_free_no_wmb.log + make urcu_free_no_mb | tee urcu_free_no_mb.log + make urcu_free_single_flip | tee urcu_free_single_flip.log + make urcu_progress_writer | tee urcu_progress_writer.log + make urcu_progress_reader | tee urcu_progress_reader.log + make urcu_progress_writer_error | tee urcu_progress_writer_error.log + make asserts | tee asserts.log + make summary + +#show trail : spin -v -t -N pan.ltl input.spin +# after each individual make. + +summary: + @echo + @echo "Verification summary" + @grep errors: *.log + +asserts: clean + cat DEFINES > .input.spin + cat ${SPINFILE} >> .input.spin + rm -f .input.spin.trail + spin -a -X .input.spin + gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c + ./pan -v -c1 -X -m10000000 -w20 + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free: clean urcu_free_ltl run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_nested_define: + cp urcu_free_nested.define .input.define + +urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_no_rmb_define: + cp urcu_free_no_rmb.define .input.define + +urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_no_wmb_define: + cp urcu_free_no_wmb.define .input.define + +urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_no_mb_define: + cp urcu_free_no_mb.define .input.define + +urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_single_flip_define: + cp urcu_free_single_flip.define .input.define + +urcu_free_ltl: + touch .input.define + cat .input.define >> pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl + +# Progress checks + +urcu_progress_writer: clean urcu_progress_writer_ltl \ + urcu_progress_writer_define run_weak_fair + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_progress_writer_define: + cp urcu_progress_writer.define .input.define + +urcu_progress_writer_ltl: + touch .input.define + cat .input.define > pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl + +urcu_progress_reader: clean urcu_progress_reader_ltl \ + urcu_progress_reader_define run_weak_fair + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_progress_reader_define: + cp urcu_progress_reader.define .input.define + +urcu_progress_reader_ltl: + touch .input.define + cat .input.define > pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl + +urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ + urcu_progress_writer_error_define run_weak_fair + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_progress_writer_error_define: + cp urcu_progress_writer_error.define .input.define + +urcu_progress_writer_error_ltl: + touch .input.define + cat .input.define > pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl + + +run_weak_fair: pan + ./pan -a -f -v -c1 -X -m10000000 -w20 + +run: pan + ./pan -a -v -c1 -X -m10000000 -w20 + +pan: pan.c + gcc -O2 -w ${CFLAGS} -o pan pan.c + +pan.c: pan.ltl ${SPINFILE} + cat .input.define > .input.spin + cat DEFINES >> .input.spin + cat ${SPINFILE} >> .input.spin + rm -f .input.spin.trail + spin -a -X -N pan.ltl .input.spin + +.PHONY: clean default distclean summary +clean: + rm -f pan* trail.out .input.spin* *.spin.trail .input.define +distclean: + rm -f *.trail *.input *.log diff --git a/formal-model/urcu/result-signal-over-writer/asserts.log b/formal-model/urcu/result-signal-over-writer/asserts.log new file mode 100644 index 0000000..c102ffb --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/asserts.log @@ -0,0 +1,334 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +cat DEFINES > .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -DSAFETY -o pan pan.c +./pan -v -c1 -X -m10000000 -w20 + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim - (none specified) + assertion violations + + cycle checks - (disabled by -DSAFETY) + invalid end states + + +State-vector 40 byte, depth reached 7872, errors: 0 + 20128 states, stored + 191477 states, matched + 211605 transitions (= stored+matched) + 712166 atomic steps +hash conflicts: 942 (resolved) + +Stats on memory usage (in Megabytes): + 1.305 equivalent memory usage for states (stored*(State-vector + overhead)) + 1.467 actual memory usage for states (unsuccessful compression: 112.36%) + state-vector as stored = 48 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 467.229 total actual memory usage + +unreached in proctype urcu_reader_sig + line 401, ".input.spin", state 330, "(1)" + line 612, ".input.spin", state 411, "-end-" + (2 of 411 states) +unreached in proctype urcu_writer + line 397, ".input.spin", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 406, ".input.spin", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 407, ".input.spin", state 59, "(1)" + line 416, ".input.spin", state 89, "(1)" + line 397, ".input.spin", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 407, ".input.spin", state 160, "(1)" + line 650, ".input.spin", state 213, "(1)" + line 173, ".input.spin", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 177, ".input.spin", state 233, "(1)" + line 158, ".input.spin", state 254, "(1)" + line 162, ".input.spin", state 262, "(1)" + line 166, ".input.spin", state 274, "(1)" + line 173, ".input.spin", state 285, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 181, ".input.spin", state 742, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 158, ".input.spin", state 752, "(1)" + line 162, ".input.spin", state 760, "(1)" + line 162, ".input.spin", state 761, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 162, ".input.spin", state 761, "else" + line 160, ".input.spin", state 766, "((j<1))" + line 160, ".input.spin", state 766, "((j>=1))" + line 166, ".input.spin", state 772, "(1)" + line 166, ".input.spin", state 773, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 166, ".input.spin", state 773, "else" + line 168, ".input.spin", state 776, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 168, ".input.spin", state 776, "else" + line 173, ".input.spin", state 783, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 181, ".input.spin", state 805, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 166, ".input.spin", state 835, "(1)" + line 166, ".input.spin", state 836, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 173, ".input.spin", state 850, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 173, ".input.spin", state 852, "(1)" + line 177, ".input.spin", state 859, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 177, ".input.spin", state 861, "(1)" + line 177, ".input.spin", state 862, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 177, ".input.spin", state 862, "else" + line 175, ".input.spin", state 867, "((j<1))" + line 175, ".input.spin", state 867, "((j>=1))" + line 181, ".input.spin", state 872, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 158, ".input.spin", state 882, "(1)" + line 162, ".input.spin", state 890, "(1)" + line 162, ".input.spin", state 891, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 162, ".input.spin", state 891, "else" + line 160, ".input.spin", state 896, "((j<1))" + line 160, ".input.spin", state 896, "((j>=1))" + line 166, ".input.spin", state 902, "(1)" + line 166, ".input.spin", state 903, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 166, ".input.spin", state 903, "else" + line 168, ".input.spin", state 906, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 168, ".input.spin", state 906, "else" + line 200, ".input.spin", state 908, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 200, ".input.spin", state 908, "else" + line 219, ".input.spin", state 909, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 219, ".input.spin", state 909, "else" + line 354, ".input.spin", state 915, "((sighand_exec==1))" + line 354, ".input.spin", state 915, "else" + line 360, ".input.spin", state 918, "sighand_exec = 1" + line 397, ".input.spin", state 931, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 397, ".input.spin", state 933, "(1)" + line 397, ".input.spin", state 934, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 397, ".input.spin", state 934, "else" + line 397, ".input.spin", state 937, "(1)" + line 401, ".input.spin", state 945, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 401, ".input.spin", state 947, "(1)" + line 401, ".input.spin", state 948, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 401, ".input.spin", state 948, "else" + line 401, ".input.spin", state 951, "(1)" + line 401, ".input.spin", state 952, "(1)" + line 401, ".input.spin", state 952, "(1)" + line 399, ".input.spin", state 957, "((i<1))" + line 399, ".input.spin", state 957, "((i>=1))" + line 406, ".input.spin", state 963, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 407, ".input.spin", state 976, "(1)" + line 407, ".input.spin", state 977, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 407, ".input.spin", state 977, "else" + line 407, ".input.spin", state 980, "(1)" + line 407, ".input.spin", state 981, "(1)" + line 407, ".input.spin", state 981, "(1)" + line 411, ".input.spin", state 989, "(1)" + line 411, ".input.spin", state 990, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 411, ".input.spin", state 990, "else" + line 411, ".input.spin", state 993, "(1)" + line 411, ".input.spin", state 994, "(1)" + line 411, ".input.spin", state 994, "(1)" + line 409, ".input.spin", state 999, "((i<1))" + line 409, ".input.spin", state 999, "((i>=1))" + line 416, ".input.spin", state 1006, "(1)" + line 416, ".input.spin", state 1007, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 416, ".input.spin", state 1007, "else" + line 416, ".input.spin", state 1010, "(1)" + line 416, ".input.spin", state 1011, "(1)" + line 416, ".input.spin", state 1011, "(1)" + line 418, ".input.spin", state 1014, "(1)" + line 418, ".input.spin", state 1014, "(1)" + line 360, ".input.spin", state 1023, "sighand_exec = 1" + line 401, ".input.spin", state 1054, "(1)" + line 406, ".input.spin", state 1070, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 416, ".input.spin", state 1113, "(1)" + line 401, ".input.spin", state 1151, "(1)" + line 406, ".input.spin", state 1167, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 416, ".input.spin", state 1210, "(1)" + line 397, ".input.spin", state 1236, "(1)" + line 401, ".input.spin", state 1250, "(1)" + line 406, ".input.spin", state 1266, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 416, ".input.spin", state 1309, "(1)" + line 401, ".input.spin", state 1350, "(1)" + line 406, ".input.spin", state 1366, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 416, ".input.spin", state 1409, "(1)" + line 173, ".input.spin", state 1430, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 173, ".input.spin", state 1432, "(1)" + line 177, ".input.spin", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 177, ".input.spin", state 1441, "(1)" + line 177, ".input.spin", state 1442, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 177, ".input.spin", state 1442, "else" + line 175, ".input.spin", state 1447, "((j<1))" + line 175, ".input.spin", state 1447, "((j>=1))" + line 181, ".input.spin", state 1452, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 158, ".input.spin", state 1462, "(1)" + line 162, ".input.spin", state 1470, "(1)" + line 162, ".input.spin", state 1471, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 162, ".input.spin", state 1471, "else" + line 160, ".input.spin", state 1476, "((j<1))" + line 160, ".input.spin", state 1476, "((j>=1))" + line 166, ".input.spin", state 1482, "(1)" + line 166, ".input.spin", state 1483, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 166, ".input.spin", state 1483, "else" + line 168, ".input.spin", state 1486, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 168, ".input.spin", state 1486, "else" + line 173, ".input.spin", state 1493, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 181, ".input.spin", state 1515, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 166, ".input.spin", state 1545, "(1)" + line 166, ".input.spin", state 1546, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 173, ".input.spin", state 1560, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 173, ".input.spin", state 1562, "(1)" + line 177, ".input.spin", state 1569, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 177, ".input.spin", state 1571, "(1)" + line 177, ".input.spin", state 1572, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 177, ".input.spin", state 1572, "else" + line 175, ".input.spin", state 1577, "((j<1))" + line 175, ".input.spin", state 1577, "((j>=1))" + line 181, ".input.spin", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 158, ".input.spin", state 1592, "(1)" + line 162, ".input.spin", state 1600, "(1)" + line 162, ".input.spin", state 1601, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 162, ".input.spin", state 1601, "else" + line 160, ".input.spin", state 1606, "((j<1))" + line 160, ".input.spin", state 1606, "((j>=1))" + line 166, ".input.spin", state 1612, "(1)" + line 166, ".input.spin", state 1613, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 166, ".input.spin", state 1613, "else" + line 168, ".input.spin", state 1616, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 168, ".input.spin", state 1616, "else" + line 200, ".input.spin", state 1618, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 200, ".input.spin", state 1618, "else" + line 219, ".input.spin", state 1619, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 219, ".input.spin", state 1619, "else" + line 354, ".input.spin", state 1625, "((sighand_exec==1))" + line 354, ".input.spin", state 1625, "else" + line 360, ".input.spin", state 1628, "sighand_exec = 1" + line 397, ".input.spin", state 1641, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 397, ".input.spin", state 1643, "(1)" + line 397, ".input.spin", state 1644, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 397, ".input.spin", state 1644, "else" + line 397, ".input.spin", state 1647, "(1)" + line 401, ".input.spin", state 1655, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 401, ".input.spin", state 1657, "(1)" + line 401, ".input.spin", state 1658, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 401, ".input.spin", state 1658, "else" + line 401, ".input.spin", state 1661, "(1)" + line 401, ".input.spin", state 1662, "(1)" + line 401, ".input.spin", state 1662, "(1)" + line 399, ".input.spin", state 1667, "((i<1))" + line 399, ".input.spin", state 1667, "((i>=1))" + line 406, ".input.spin", state 1673, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 407, ".input.spin", state 1686, "(1)" + line 407, ".input.spin", state 1687, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 407, ".input.spin", state 1687, "else" + line 407, ".input.spin", state 1690, "(1)" + line 407, ".input.spin", state 1691, "(1)" + line 407, ".input.spin", state 1691, "(1)" + line 411, ".input.spin", state 1699, "(1)" + line 411, ".input.spin", state 1700, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 411, ".input.spin", state 1700, "else" + line 411, ".input.spin", state 1703, "(1)" + line 411, ".input.spin", state 1704, "(1)" + line 411, ".input.spin", state 1704, "(1)" + line 409, ".input.spin", state 1709, "((i<1))" + line 409, ".input.spin", state 1709, "((i>=1))" + line 416, ".input.spin", state 1716, "(1)" + line 416, ".input.spin", state 1717, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 416, ".input.spin", state 1717, "else" + line 416, ".input.spin", state 1720, "(1)" + line 416, ".input.spin", state 1721, "(1)" + line 416, ".input.spin", state 1721, "(1)" + line 418, ".input.spin", state 1724, "(1)" + line 418, ".input.spin", state 1724, "(1)" + line 360, ".input.spin", state 1733, "sighand_exec = 1" + line 177, ".input.spin", state 1758, "(1)" + line 181, ".input.spin", state 1769, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 158, ".input.spin", state 1779, "(1)" + line 162, ".input.spin", state 1787, "(1)" + line 166, ".input.spin", state 1799, "(1)" + line 173, ".input.spin", state 1810, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-writer/asserts.spin.input.trail b/formal-model/urcu/result-signal-over-writer/asserts.spin.input.trail new file mode 100644 index 0000000..287e52a --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/asserts.spin.input.trail @@ -0,0 +1,6 @@ +-4:-4:-4 +1:0:2673 +2:0:2674 +3:0:2675 +4:0:2676 +5:4:1129 diff --git a/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/DEFINES b/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/DEFINES new file mode 100644 index 0000000..ec600f0 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/DEFINES @@ -0,0 +1,16 @@ + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#define TEST_SIGNAL +//#define TEST_SIGNAL_ON_READ +#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 1 +#endif + +#define REMOTE_BARRIERS diff --git a/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/Makefile b/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/Makefile new file mode 100644 index 0000000..8af320d --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/Makefile @@ -0,0 +1,172 @@ +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Copyright (C) Mathieu Desnoyers, 2009 +# +# Authors: Mathieu Desnoyers + +#CFLAGS=-DSAFETY +#for multi-core verif, 15.5GB shared mem, use files if full +#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 +#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 + +#liveness +#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 +CFLAGS=-DHASH64 + +SPINFILE=urcu.spin + +default: + make urcu_free | tee urcu_free.log + #nested useless with signal test. + #make urcu_free_nested | tee urcu_free_nested.log + make urcu_free_no_rmb | tee urcu_free_no_rmb.log + make urcu_free_no_wmb | tee urcu_free_no_wmb.log + make urcu_free_no_mb | tee urcu_free_no_mb.log + make urcu_free_single_flip | tee urcu_free_single_flip.log + make urcu_progress_writer | tee urcu_progress_writer.log + make urcu_progress_reader | tee urcu_progress_reader.log + make urcu_progress_writer_error | tee urcu_progress_writer_error.log + make asserts | tee asserts.log + make summary + +#show trail : spin -v -t -N pan.ltl input.spin +# after each individual make. + +summary: + @echo + @echo "Verification summary" + @grep errors: *.log + +asserts: clean + cat DEFINES > .input.spin + cat ${SPINFILE} >> .input.spin + rm -f .input.spin.trail + spin -a -X .input.spin + gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c + ./pan -v -c1 -X -m10000000 -w20 + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free: clean urcu_free_ltl run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_nested_define: + cp urcu_free_nested.define .input.define + +urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_no_rmb_define: + cp urcu_free_no_rmb.define .input.define + +urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_no_wmb_define: + cp urcu_free_no_wmb.define .input.define + +urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_no_mb_define: + cp urcu_free_no_mb.define .input.define + +urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_single_flip_define: + cp urcu_free_single_flip.define .input.define + +urcu_free_ltl: + touch .input.define + cat .input.define >> pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl + +# Progress checks + +urcu_progress_writer: clean urcu_progress_writer_ltl \ + urcu_progress_writer_define run_weak_fair + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_progress_writer_define: + cp urcu_progress_writer.define .input.define + +urcu_progress_writer_ltl: + touch .input.define + cat .input.define > pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl + +urcu_progress_reader: clean urcu_progress_reader_ltl \ + urcu_progress_reader_define run_weak_fair + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_progress_reader_define: + cp urcu_progress_reader.define .input.define + +urcu_progress_reader_ltl: + touch .input.define + cat .input.define > pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl + +urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ + urcu_progress_writer_error_define run_weak_fair + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_progress_writer_error_define: + cp urcu_progress_writer_error.define .input.define + +urcu_progress_writer_error_ltl: + touch .input.define + cat .input.define > pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl + + +run_weak_fair: pan + ./pan -a -f -v -c1 -X -m10000000 -w20 + +run: pan + ./pan -a -v -c1 -X -m10000000 -w20 + +pan: pan.c + gcc -O2 -w ${CFLAGS} -o pan pan.c + +pan.c: pan.ltl ${SPINFILE} + cat .input.define > .input.spin + cat DEFINES >> .input.spin + cat ${SPINFILE} >> .input.spin + rm -f .input.spin.trail + spin -a -X -N pan.ltl .input.spin + +.PHONY: clean default distclean summary +clean: + rm -f pan* trail.out .input.spin* *.spin.trail .input.define +distclean: + rm -f *.trail *.input *.log diff --git a/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/asserts.log b/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/asserts.log new file mode 100644 index 0000000..c102ffb --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/asserts.log @@ -0,0 +1,334 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +cat DEFINES > .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -DSAFETY -o pan pan.c +./pan -v -c1 -X -m10000000 -w20 + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim - (none specified) + assertion violations + + cycle checks - (disabled by -DSAFETY) + invalid end states + + +State-vector 40 byte, depth reached 7872, errors: 0 + 20128 states, stored + 191477 states, matched + 211605 transitions (= stored+matched) + 712166 atomic steps +hash conflicts: 942 (resolved) + +Stats on memory usage (in Megabytes): + 1.305 equivalent memory usage for states (stored*(State-vector + overhead)) + 1.467 actual memory usage for states (unsuccessful compression: 112.36%) + state-vector as stored = 48 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 467.229 total actual memory usage + +unreached in proctype urcu_reader_sig + line 401, ".input.spin", state 330, "(1)" + line 612, ".input.spin", state 411, "-end-" + (2 of 411 states) +unreached in proctype urcu_writer + line 397, ".input.spin", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 406, ".input.spin", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 407, ".input.spin", state 59, "(1)" + line 416, ".input.spin", state 89, "(1)" + line 397, ".input.spin", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 407, ".input.spin", state 160, "(1)" + line 650, ".input.spin", state 213, "(1)" + line 173, ".input.spin", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 177, ".input.spin", state 233, "(1)" + line 158, ".input.spin", state 254, "(1)" + line 162, ".input.spin", state 262, "(1)" + line 166, ".input.spin", state 274, "(1)" + line 173, ".input.spin", state 285, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 181, ".input.spin", state 742, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 158, ".input.spin", state 752, "(1)" + line 162, ".input.spin", state 760, "(1)" + line 162, ".input.spin", state 761, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 162, ".input.spin", state 761, "else" + line 160, ".input.spin", state 766, "((j<1))" + line 160, ".input.spin", state 766, "((j>=1))" + line 166, ".input.spin", state 772, "(1)" + line 166, ".input.spin", state 773, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 166, ".input.spin", state 773, "else" + line 168, ".input.spin", state 776, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 168, ".input.spin", state 776, "else" + line 173, ".input.spin", state 783, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 181, ".input.spin", state 805, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 166, ".input.spin", state 835, "(1)" + line 166, ".input.spin", state 836, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 173, ".input.spin", state 850, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 173, ".input.spin", state 852, "(1)" + line 177, ".input.spin", state 859, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 177, ".input.spin", state 861, "(1)" + line 177, ".input.spin", state 862, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 177, ".input.spin", state 862, "else" + line 175, ".input.spin", state 867, "((j<1))" + line 175, ".input.spin", state 867, "((j>=1))" + line 181, ".input.spin", state 872, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 158, ".input.spin", state 882, "(1)" + line 162, ".input.spin", state 890, "(1)" + line 162, ".input.spin", state 891, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 162, ".input.spin", state 891, "else" + line 160, ".input.spin", state 896, "((j<1))" + line 160, ".input.spin", state 896, "((j>=1))" + line 166, ".input.spin", state 902, "(1)" + line 166, ".input.spin", state 903, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 166, ".input.spin", state 903, "else" + line 168, ".input.spin", state 906, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 168, ".input.spin", state 906, "else" + line 200, ".input.spin", state 908, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 200, ".input.spin", state 908, "else" + line 219, ".input.spin", state 909, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 219, ".input.spin", state 909, "else" + line 354, ".input.spin", state 915, "((sighand_exec==1))" + line 354, ".input.spin", state 915, "else" + line 360, ".input.spin", state 918, "sighand_exec = 1" + line 397, ".input.spin", state 931, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 397, ".input.spin", state 933, "(1)" + line 397, ".input.spin", state 934, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 397, ".input.spin", state 934, "else" + line 397, ".input.spin", state 937, "(1)" + line 401, ".input.spin", state 945, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 401, ".input.spin", state 947, "(1)" + line 401, ".input.spin", state 948, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 401, ".input.spin", state 948, "else" + line 401, ".input.spin", state 951, "(1)" + line 401, ".input.spin", state 952, "(1)" + line 401, ".input.spin", state 952, "(1)" + line 399, ".input.spin", state 957, "((i<1))" + line 399, ".input.spin", state 957, "((i>=1))" + line 406, ".input.spin", state 963, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 407, ".input.spin", state 976, "(1)" + line 407, ".input.spin", state 977, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 407, ".input.spin", state 977, "else" + line 407, ".input.spin", state 980, "(1)" + line 407, ".input.spin", state 981, "(1)" + line 407, ".input.spin", state 981, "(1)" + line 411, ".input.spin", state 989, "(1)" + line 411, ".input.spin", state 990, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 411, ".input.spin", state 990, "else" + line 411, ".input.spin", state 993, "(1)" + line 411, ".input.spin", state 994, "(1)" + line 411, ".input.spin", state 994, "(1)" + line 409, ".input.spin", state 999, "((i<1))" + line 409, ".input.spin", state 999, "((i>=1))" + line 416, ".input.spin", state 1006, "(1)" + line 416, ".input.spin", state 1007, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 416, ".input.spin", state 1007, "else" + line 416, ".input.spin", state 1010, "(1)" + line 416, ".input.spin", state 1011, "(1)" + line 416, ".input.spin", state 1011, "(1)" + line 418, ".input.spin", state 1014, "(1)" + line 418, ".input.spin", state 1014, "(1)" + line 360, ".input.spin", state 1023, "sighand_exec = 1" + line 401, ".input.spin", state 1054, "(1)" + line 406, ".input.spin", state 1070, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 416, ".input.spin", state 1113, "(1)" + line 401, ".input.spin", state 1151, "(1)" + line 406, ".input.spin", state 1167, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 416, ".input.spin", state 1210, "(1)" + line 397, ".input.spin", state 1236, "(1)" + line 401, ".input.spin", state 1250, "(1)" + line 406, ".input.spin", state 1266, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 416, ".input.spin", state 1309, "(1)" + line 401, ".input.spin", state 1350, "(1)" + line 406, ".input.spin", state 1366, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 416, ".input.spin", state 1409, "(1)" + line 173, ".input.spin", state 1430, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 173, ".input.spin", state 1432, "(1)" + line 177, ".input.spin", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 177, ".input.spin", state 1441, "(1)" + line 177, ".input.spin", state 1442, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 177, ".input.spin", state 1442, "else" + line 175, ".input.spin", state 1447, "((j<1))" + line 175, ".input.spin", state 1447, "((j>=1))" + line 181, ".input.spin", state 1452, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 158, ".input.spin", state 1462, "(1)" + line 162, ".input.spin", state 1470, "(1)" + line 162, ".input.spin", state 1471, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 162, ".input.spin", state 1471, "else" + line 160, ".input.spin", state 1476, "((j<1))" + line 160, ".input.spin", state 1476, "((j>=1))" + line 166, ".input.spin", state 1482, "(1)" + line 166, ".input.spin", state 1483, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 166, ".input.spin", state 1483, "else" + line 168, ".input.spin", state 1486, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 168, ".input.spin", state 1486, "else" + line 173, ".input.spin", state 1493, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 181, ".input.spin", state 1515, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 166, ".input.spin", state 1545, "(1)" + line 166, ".input.spin", state 1546, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 173, ".input.spin", state 1560, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 173, ".input.spin", state 1562, "(1)" + line 177, ".input.spin", state 1569, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 177, ".input.spin", state 1571, "(1)" + line 177, ".input.spin", state 1572, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 177, ".input.spin", state 1572, "else" + line 175, ".input.spin", state 1577, "((j<1))" + line 175, ".input.spin", state 1577, "((j>=1))" + line 181, ".input.spin", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 158, ".input.spin", state 1592, "(1)" + line 162, ".input.spin", state 1600, "(1)" + line 162, ".input.spin", state 1601, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 162, ".input.spin", state 1601, "else" + line 160, ".input.spin", state 1606, "((j<1))" + line 160, ".input.spin", state 1606, "((j>=1))" + line 166, ".input.spin", state 1612, "(1)" + line 166, ".input.spin", state 1613, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 166, ".input.spin", state 1613, "else" + line 168, ".input.spin", state 1616, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 168, ".input.spin", state 1616, "else" + line 200, ".input.spin", state 1618, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 200, ".input.spin", state 1618, "else" + line 219, ".input.spin", state 1619, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 219, ".input.spin", state 1619, "else" + line 354, ".input.spin", state 1625, "((sighand_exec==1))" + line 354, ".input.spin", state 1625, "else" + line 360, ".input.spin", state 1628, "sighand_exec = 1" + line 397, ".input.spin", state 1641, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 397, ".input.spin", state 1643, "(1)" + line 397, ".input.spin", state 1644, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 397, ".input.spin", state 1644, "else" + line 397, ".input.spin", state 1647, "(1)" + line 401, ".input.spin", state 1655, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 401, ".input.spin", state 1657, "(1)" + line 401, ".input.spin", state 1658, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 401, ".input.spin", state 1658, "else" + line 401, ".input.spin", state 1661, "(1)" + line 401, ".input.spin", state 1662, "(1)" + line 401, ".input.spin", state 1662, "(1)" + line 399, ".input.spin", state 1667, "((i<1))" + line 399, ".input.spin", state 1667, "((i>=1))" + line 406, ".input.spin", state 1673, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 407, ".input.spin", state 1686, "(1)" + line 407, ".input.spin", state 1687, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 407, ".input.spin", state 1687, "else" + line 407, ".input.spin", state 1690, "(1)" + line 407, ".input.spin", state 1691, "(1)" + line 407, ".input.spin", state 1691, "(1)" + line 411, ".input.spin", state 1699, "(1)" + line 411, ".input.spin", state 1700, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 411, ".input.spin", state 1700, "else" + line 411, ".input.spin", state 1703, "(1)" + line 411, ".input.spin", state 1704, "(1)" + line 411, ".input.spin", state 1704, "(1)" + line 409, ".input.spin", state 1709, "((i<1))" + line 409, ".input.spin", state 1709, "((i>=1))" + line 416, ".input.spin", state 1716, "(1)" + line 416, ".input.spin", state 1717, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 416, ".input.spin", state 1717, "else" + line 416, ".input.spin", state 1720, "(1)" + line 416, ".input.spin", state 1721, "(1)" + line 416, ".input.spin", state 1721, "(1)" + line 418, ".input.spin", state 1724, "(1)" + line 418, ".input.spin", state 1724, "(1)" + line 360, ".input.spin", state 1733, "sighand_exec = 1" + line 177, ".input.spin", state 1758, "(1)" + line 181, ".input.spin", state 1769, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 158, ".input.spin", state 1779, "(1)" + line 162, ".input.spin", state 1787, "(1)" + line 166, ".input.spin", state 1799, "(1)" + line 173, ".input.spin", state 1810, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/asserts.spin.input.trail b/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/asserts.spin.input.trail new file mode 100644 index 0000000..287e52a --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/asserts.spin.input.trail @@ -0,0 +1,6 @@ +-4:-4:-4 +1:0:2673 +2:0:2674 +3:0:2675 +4:0:2676 +5:4:1129 diff --git a/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/references.txt b/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/references.txt new file mode 100644 index 0000000..72c67a2 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/references.txt @@ -0,0 +1,13 @@ +http://spinroot.com/spin/Man/ltl.html +http://en.wikipedia.org/wiki/Linear_temporal_logic +http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt + +http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php +http://spinroot.com/spin/Man/index.html +http://spinroot.com/spin/Man/promela.html + +LTL vs CTL : + +http://spinroot.com/spin/Doc/course/lecture12.pdf p. 9, p. 15, p. 18 +http://www-i2.informatik.rwth-aachen.de/i2/fileadmin/user_upload/documents/Introduction_to_Model_Checking/mc_lec18.pdf + (downloaded) diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/.input.define b/formal-model/urcu/result-signal-over-writer/testmerge/.input.define new file mode 100644 index 0000000..e69de29 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/.input.spin b/formal-model/urcu/result-signal-over-writer/testmerge/.input.spin new file mode 100644 index 0000000..f2737c4 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/.input.spin @@ -0,0 +1,531 @@ + +#define NR_READERS 2 +#define NR_WRITERS 1 + +#define NR_PROCS 3 + + +#if (NR_READERS == 1) + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#elif (NR_READERS == 2) + +#define read_free_race (read_generation[0] == last_free_gen || read_generation[1] == last_free_gen) +#define read_free (free_done && (data_access[0] || data_access[1])) + +#else + +#error "Too many readers" + +#endif + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +#define get_pid() (_pid) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb(i, j) +{ + if + :: get_pid() >= NR_READERS -> + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); + :: else -> skip; + fi; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +#define get_readerid() (get_pid()) +#define get_writerid() (get_readerid() + NR_READERS) + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb(i, j); +#else + ooo_mem(i); +#endif + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + ooo_mem(i); + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + ooo_mem(i); + data_access[get_readerid()] = 1; + ooo_mem(i); + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + ooo_mem(i); + //smp_mc(i); /* added */ +} + +active [NR_READERS] proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS + /* Only test progress of one random reader. They are all the + * same. */ + atomic { + if + :: get_readerid() == 0 -> +progress_reader: + skip; + :: else -> + skip; + fi; + } +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb(i, j); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb(i, j); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + skip; + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/DEFINES b/formal-model/urcu/result-signal-over-writer/testmerge/DEFINES new file mode 100644 index 0000000..12c751b --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/DEFINES @@ -0,0 +1,31 @@ + +#define NR_READERS 2 +#define NR_WRITERS 1 + +#define NR_PROCS 3 + + +#if (NR_READERS == 1) + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#elif (NR_READERS == 2) + +#define read_free_race (read_generation[0] == last_free_gen || read_generation[1] == last_free_gen) +#define read_free (free_done && (data_access[0] || data_access[1])) + +#else + +#error "Too many readers" + +#endif + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/Makefile b/formal-model/urcu/result-signal-over-writer/testmerge/Makefile new file mode 100644 index 0000000..ca932b7 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/Makefile @@ -0,0 +1,165 @@ +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Copyright (C) Mathieu Desnoyers, 2009 +# +# Authors: Mathieu Desnoyers + +#CFLAGS=-DSAFETY +CFLAGS=-DHASH64 + +SPINFILE=urcu.spin + +default: + make urcu_free | tee urcu_free.log + make urcu_free_nested | tee urcu_free_nested.log + make urcu_free_no_rmb | tee urcu_free_no_rmb.log + make urcu_free_no_wmb | tee urcu_free_no_wmb.log + make urcu_free_no_mb | tee urcu_free_no_mb.log + make urcu_free_single_flip | tee urcu_free_single_flip.log + make urcu_progress_writer | tee urcu_progress_writer.log + make urcu_progress_reader | tee urcu_progress_reader.log + make urcu_progress_writer_error | tee urcu_progress_writer_error.log + make asserts | tee asserts.log + make summary + +#show trail : spin -v -t -N pan.ltl input.spin +# after each individual make. + +summary: + @echo + @echo "Verification summary" + @grep errors: *.log + +asserts: clean + cat DEFINES > .input.spin + cat ${SPINFILE} >> .input.spin + rm -f .input.spin.trail + spin -a -X .input.spin + gcc -w ${CFLAGS} -DSAFETY -o pan pan.c + ./pan -v -c1 -X -m10000000 -w20 + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free: clean urcu_free_ltl run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_nested_define: + cp urcu_free_nested.define .input.define + +urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_no_rmb_define: + cp urcu_free_no_rmb.define .input.define + +urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_no_wmb_define: + cp urcu_free_no_wmb.define .input.define + +urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_no_mb_define: + cp urcu_free_no_mb.define .input.define + +urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_single_flip_define: + cp urcu_free_single_flip.define .input.define + +urcu_free_ltl: + touch .input.define + cat .input.define >> pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl + +# Progress checks + +urcu_progress_writer: clean urcu_progress_writer_ltl \ + urcu_progress_writer_define run_weak_fair + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_progress_writer_define: + cp urcu_progress_writer.define .input.define + +urcu_progress_writer_ltl: + touch .input.define + cat .input.define > pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl + +urcu_progress_reader: clean urcu_progress_reader_ltl \ + urcu_progress_reader_define run_weak_fair + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_progress_reader_define: + cp urcu_progress_reader.define .input.define + +urcu_progress_reader_ltl: + touch .input.define + cat .input.define > pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl + +urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ + urcu_progress_writer_error_define run_weak_fair + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_progress_writer_error_define: + cp urcu_progress_writer_error.define .input.define + +urcu_progress_writer_error_ltl: + touch .input.define + cat .input.define > pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl + + +run_weak_fair: pan + ./pan -a -f -v -c1 -X -m10000000 -w20 + +run: pan + ./pan -a -v -c1 -X -m10000000 -w20 + +pan: pan.c + gcc -w ${CFLAGS} -o pan pan.c + +pan.c: pan.ltl ${SPINFILE} + cat .input.define > .input.spin + cat DEFINES >> .input.spin + cat ${SPINFILE} >> .input.spin + rm -f .input.spin.trail + spin -a -X -N pan.ltl .input.spin + +.PHONY: clean default distclean summary +clean: + rm -f pan* trail.out .input.spin* *.spin.trail .input.define +distclean: + rm -f *.trail *.input *.log diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/asserts.log b/formal-model/urcu/result-signal-over-writer/testmerge/asserts.log new file mode 100644 index 0000000..75f2427 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/asserts.log @@ -0,0 +1,10 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +cat DEFINES > .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X .input.spin +spin: line 295 replacement value: tmp +spin: line 295 ".input.spin", Error: formal par of wait_for_quiescent_state contains replacement value saw '-2'' near 'readerid' +spin: 1 error(s) - aborting +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/asserts.spin.input b/formal-model/urcu/result-signal-over-writer/testmerge/asserts.spin.input new file mode 100644 index 0000000..b06898a --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/asserts.spin.input @@ -0,0 +1,409 @@ +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#define read_free_race (read_generation == last_free_gen) +#define read_free (free_done && data_access) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#define get_pid() (_pid) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), wmb_mb forces + * both. + */ + +#define DECLARE_CACHED_VAR(type, x, v) \ + type mem_##x = v; \ + type cached_##x[NR_PROCS] = v; \ + bit cache_dirty_##x[NR_PROCS] = 0 + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x[id]) + +#define READ_CACHED_VAR(x) (cached_##x[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x[get_pid()] = v; \ + cache_dirty_##x[get_pid()] = 1; \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x[id]; \ + cache_dirty_##x[id] = 0; \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + CACHE_READ_FROM_MEM(urcu_active_readers_one, i); + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + CACHE_WRITE_TO_MEM(urcu_active_readers_one, i); + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i); +#endif +#ifndef NO_RMB + smp_rmb_pid(i); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb(i) +{ + if + :: get_pid() >= NR_READERS -> + smp_mb_pid(get_pid()); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid()); + :: else -> skip; + fi; +} + +#else + +inline smp_rmb(i) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + CACHE_READ_FROM_MEM(urcu_active_readers_one, get_pid()); + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + CACHE_WRITE_TO_MEM(urcu_active_readers_one, get_pid()); + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i); +#endif +#ifndef NO_RMB + smp_rmb(i); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb and ooo_mem */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr, 1); +/* Note ! currently only one reader */ +DECLARE_CACHED_VAR(byte, urcu_active_readers_one, 0); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr, 0); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation = 1; +bit data_access = 0; + +bit write_lock = 0; + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers_one, + get_pid()); + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers_one, + get_pid()); + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +#define get_readerid() (get_pid()) +#define get_writerid() (get_readerid() + NR_READERS) + +inline wait_for_reader(tmp, id, i) +{ + do + :: 1 -> + tmp = READ_CACHED_VAR(urcu_active_readers_one); + ooo_mem(i); + if + :: (tmp & RCU_GP_CTR_NEST_MASK) + && ((tmp ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb(i); +#else + ooo_mem(i); +#endif + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, i, j) +{ + i = 0; + do + :: i < NR_READERS -> + wait_for_reader(tmp, i, j); + if + :: (NR_READERS > 1) && (i < NR_READERS - 1) + -> ooo_mem(j); + :: else + -> skip; + fi; + i++ + :: i >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +inline urcu_one_read(i, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers_one); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers_one, tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers_one, + tmp + 1); + fi; + smp_mb(i); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + ooo_mem(i); + read_generation = READ_CACHED_VAR(generation_ptr); + ooo_mem(i); + data_access = 1; + ooo_mem(i); + data_access = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb(i); + tmp2 = READ_CACHED_VAR(urcu_active_readers_one); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers_one, tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + ooo_mem(i); + //smp_mc(i); /* added */ +} + +active [NR_READERS] proctype urcu_reader() +{ + byte i, nest_i; + byte tmp, tmp2; + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, nest_i, tmp, tmp2); + od; +} + +/* Model the RCU update process. */ + +active [NR_WRITERS] proctype urcu_writer() +{ + byte i, j; + byte tmp; + byte old_gen; + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb(i); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + //smp_mc(i); + wait_for_quiescent_state(tmp, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + wait_for_quiescent_state(tmp, i, j); +#endif + smp_mb(i); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + skip; + od; +} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/asserts.spin.input.trail b/formal-model/urcu/result-signal-over-writer/testmerge/asserts.spin.input.trail new file mode 100644 index 0000000..287e52a --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/asserts.spin.input.trail @@ -0,0 +1,6 @@ +-4:-4:-4 +1:0:2673 +2:0:2674 +3:0:2675 +4:0:2676 +5:4:1129 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/references.txt b/formal-model/urcu/result-signal-over-writer/testmerge/references.txt new file mode 100644 index 0000000..72c67a2 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/references.txt @@ -0,0 +1,13 @@ +http://spinroot.com/spin/Man/ltl.html +http://en.wikipedia.org/wiki/Linear_temporal_logic +http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt + +http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php +http://spinroot.com/spin/Man/index.html +http://spinroot.com/spin/Man/promela.html + +LTL vs CTL : + +http://spinroot.com/spin/Doc/course/lecture12.pdf p. 9, p. 15, p. 18 +http://www-i2.informatik.rwth-aachen.de/i2/fileadmin/user_upload/documents/Introduction_to_Model_Checking/mc_lec18.pdf + (downloaded) diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu.sh b/formal-model/urcu/result-signal-over-writer/testmerge/urcu.sh new file mode 100644 index 0000000..65ff517 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu.sh @@ -0,0 +1,29 @@ +#!/bin/sh +# +# Compiles and runs the urcu.spin Promela model. +# +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Copyright (C) IBM Corporation, 2009 +# Mathieu Desnoyers, 2009 +# +# Authors: Paul E. McKenney +# Mathieu Desnoyers + +# Basic execution, without LTL clauses. See Makefile. + +spin -a urcu.spin +cc -DSAFETY -o pan pan.c +./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu.spin b/formal-model/urcu/result-signal-over-writer/testmerge/urcu.spin new file mode 100644 index 0000000..61d9052 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu.spin @@ -0,0 +1,500 @@ +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +#define get_pid() (_pid) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb(i, j) +{ + if + :: get_pid() >= NR_READERS -> + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); + :: else -> skip; + fi; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +#define get_readerid() (get_pid()) +#define get_writerid() (get_readerid() + NR_READERS) + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb(i, j); +#else + ooo_mem(i); +#endif + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + ooo_mem(i); + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + ooo_mem(i); + data_access[get_readerid()] = 1; + ooo_mem(i); + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + ooo_mem(i); + //smp_mc(i); /* added */ +} + +active [NR_READERS] proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS + /* Only test progress of one random reader. They are all the + * same. */ + atomic { + if + :: get_readerid() == 0 -> +progress_reader: + skip; + :: else -> + skip; + fi; + } +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb(i, j); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb(i, j); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + skip; + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu.spin.bkp2 b/formal-model/urcu/result-signal-over-writer/testmerge/urcu.spin.bkp2 new file mode 100644 index 0000000..b1c8311 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu.spin.bkp2 @@ -0,0 +1,395 @@ +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +#define NR_WRITERS 1 +#define NR_READERS 3 + +/* Number of reader and writer processes */ +#define NR_PROCS 5 + +/* Includes reader, writer and init process */ +#define MAX_NR_PROCS 5 + +#define get_pid() (_pid) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), wmb_mb forces + * both. + */ + +#define DECLARE_CACHED_VAR(type, x, v) \ + type mem_##x = v; \ + type cached_##x[NR_PROCS] = v; \ + bit cache_dirty_##x[NR_PROCS] = 0 + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x[id]) + +#define READ_CACHED_VAR(x) (cached_##x[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x[get_pid()] = v; \ + cache_dirty_##x[get_pid()] = 1; \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x[id]; \ + cache_dirty_##x[id] = 0; \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + CACHE_READ_FROM_MEM(urcu_active_readers_one, i); + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + CACHE_WRITE_TO_MEM(urcu_active_readers_one, i); + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i); +#endif +#ifndef NO_RMB + smp_rmb_pid(i); +#endif + skip; + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb(i) +{ + if + :: get_pid() >= NR_READERS -> + smp_mb_pid(get_pid()); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid()); + :: else -> skip; + fi; +} + +#else + +inline smp_rmb(i) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + CACHE_READ_FROM_MEM(urcu_active_readers_one, get_pid()); + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + CACHE_WRITE_TO_MEM(urcu_active_readers_one, get_pid()); + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i); +#endif +#ifndef NO_RMB + smp_rmb(i); +#endif + skip; + } +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb and ooo_mem */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr, 1); +/* Note ! currently only one reader */ +DECLARE_CACHED_VAR(byte, urcu_active_readers_one, 0); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr, 0); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation = 1; +bit data_access = 0; + +bit write_lock = 0; + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers_one, + get_pid()); + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers_one, + get_pid()); + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +#define get_writerid() (get_pid()) +#define get_readerid() (get_writerrid() + NR_READERS) + +inline wait_for_reader(tmp, id, i) +{ + do + :: 1 -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers_one); + ooo_mem(i); + if + :: (tmp & RCU_GP_CTR_NEST_MASK) + && ((tmp ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb(i); +#else + skip; +#endif + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, i, j) +{ + i = 0; + do + :: i < NR_READERS -> + wait_for_reader(tmp, i, j); + i++ + :: i >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +inline urcu_one_read(i, nest_i, tmp, tmp2, nest) +{ + nest_i = 0; + do + :: nest_i < nest -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers_one); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers_one, tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers_one, + tmp + 1); + fi; + ooo_mem(i); + smp_mb(i); + nest_i++; + :: nest_i >= nest -> break; + od; + + ooo_mem(i); + read_generation = READ_CACHED_VAR(generation_ptr); + ooo_mem(i); + data_access = 1; + ooo_mem(i); + data_access = 0; + + nest_i = 0; + do + :: nest_i < nest -> + ooo_mem(i); + smp_mb(i); + ooo_mem(i); + tmp2 = READ_CACHED_VAR(urcu_active_readers_one); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers_one, tmp2 - 1); + nest_i++; + :: nest_i >= nest -> break; + od; + ooo_mem(i); + //smp_mc(i); /* added */ +} + +active [2] proctype urcu_reader() +{ + byte i, nest_i; + byte tmp, tmp2; + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, nest_i, tmp, tmp2, 2); + od; +} + +/* Model the RCU update process. */ + +active [1] proctype urcu_writer() +{ + byte i, j; + byte tmp; + byte old_gen; + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb(i); + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + //smp_mc(i); + wait_for_quiescent_state(tmp, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + wait_for_quiescent_state(tmp, i, j); +#endif + ooo_mem(i); + smp_mb(i); + ooo_mem(i); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + skip; + od; +} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu.spin.bkp5 b/formal-model/urcu/result-signal-over-writer/testmerge/urcu.spin.bkp5 new file mode 100644 index 0000000..324ee39 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu.spin.bkp5 @@ -0,0 +1,398 @@ +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#define get_pid() (_pid) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +#define DECLARE_CACHED_VAR(type, x, v) \ + type mem_##x = v; \ + type cached_##x[NR_PROCS] = v; \ + bit cache_dirty_##x[NR_PROCS] = 0 + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x[id]) + +#define READ_CACHED_VAR(x) (cached_##x[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x[get_pid()] = v; \ + cache_dirty_##x[get_pid()] = 1; \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x[id]; \ + cache_dirty_##x[id] = 0; \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + CACHE_READ_FROM_MEM(urcu_active_readers_one, i); + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + CACHE_WRITE_TO_MEM(urcu_active_readers_one, i); + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i); +#endif +#ifndef NO_RMB + smp_rmb_pid(i); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb(i) +{ + if + :: get_pid() >= NR_READERS -> + smp_mb_pid(get_pid()); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid()); + :: else -> skip; + fi; +} + +#else + +inline smp_rmb(i) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + CACHE_READ_FROM_MEM(urcu_active_readers_one, get_pid()); + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + CACHE_WRITE_TO_MEM(urcu_active_readers_one, get_pid()); + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i); +#endif +#ifndef NO_RMB + smp_rmb(i); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb and ooo_mem */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr, 1); +/* Note ! currently only one reader */ +DECLARE_CACHED_VAR(byte, urcu_active_readers_one, 0); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr, 0); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation = 1; +bit data_access = 0; + +bit write_lock = 0; + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers_one, + get_pid()); + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers_one, + get_pid()); + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +#define get_readerid() (get_pid()) +#define get_writerid() (get_readerid() + NR_READERS) + +inline wait_for_reader(tmp, id, i) +{ + do + :: 1 -> + tmp = READ_CACHED_VAR(urcu_active_readers_one); + ooo_mem(i); + if + :: (tmp & RCU_GP_CTR_NEST_MASK) + && ((tmp ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb(i); +#else + ooo_mem(i); +#endif + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, i, j) +{ + i = 0; + do + :: i < NR_READERS -> + wait_for_reader(tmp, i, j); + if + :: (NR_READERS > 1) && (i < NR_READERS - 1) + -> ooo_mem(j); + :: else + -> skip; + fi; + i++ + :: i >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +inline urcu_one_read(i, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers_one); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers_one, tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers_one, + tmp + 1); + fi; + smp_mb(i); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + ooo_mem(i); + read_generation = READ_CACHED_VAR(generation_ptr); + ooo_mem(i); + data_access = 1; + ooo_mem(i); + data_access = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb(i); + tmp2 = READ_CACHED_VAR(urcu_active_readers_one); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers_one, tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + ooo_mem(i); + //smp_mc(i); /* added */ +} + +active [NR_READERS] proctype urcu_reader() +{ + byte i, nest_i; + byte tmp, tmp2; + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, nest_i, tmp, tmp2); + od; +} + +/* Model the RCU update process. */ + +active [NR_WRITERS] proctype urcu_writer() +{ + byte i, j; + byte tmp; + byte old_gen; + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb(i); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + //smp_mc(i); + wait_for_quiescent_state(tmp, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + wait_for_quiescent_state(tmp, i, j); +#endif + smp_mb(i); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + skip; + od; +} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free.log b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free.log new file mode 100644 index 0000000..6a04aba --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free.log @@ -0,0 +1,414 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 566) +Depth= 4234 States= 1e+06 Transitions= 1.7e+07 Memory= 527.287 t= 31.3 R= 3e+04 +Depth= 4234 States= 2e+06 Transitions= 3.44e+07 Memory= 588.322 t= 63.9 R= 3e+04 +Depth= 4234 States= 3e+06 Transitions= 5.2e+07 Memory= 649.358 t= 97 R= 3e+04 +pan: resizing hashtable to -w22.. done +Depth= 4234 States= 4e+06 Transitions= 6.97e+07 Memory= 741.416 t= 130 R= 3e+04 + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 4234, errors: 0 + 4027146 states, stored + 66145121 states, matched + 70172267 transitions (= stored+matched) +2.6437688e+08 atomic steps +hash conflicts: 47318190 (resolved) + +Stats on memory usage (in Megabytes): + 322.609 equivalent memory usage for states (stored*(State-vector + overhead)) + 253.418 actual memory usage for states (compression: 78.55%) + state-vector as stored = 38 byte + 28 byte overhead + 32.000 memory used for hash table (-w22) + 457.764 memory used for DFS stack (-m10000000) + 743.076 total actual memory usage + +unreached in proctype urcu_reader + line 288, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 61, "(1)" + line 307, "pan.___", state 91, "(1)" + line 288, "pan.___", state 104, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 136, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 149, "(1)" + line 307, "pan.___", state 179, "(1)" + line 288, "pan.___", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 225, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 238, "(1)" + line 307, "pan.___", state 268, "(1)" + line 158, "pan.___", state 289, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 158, "pan.___", state 291, "(1)" + line 162, "pan.___", state 298, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 162, "pan.___", state 300, "(1)" + line 162, "pan.___", state 301, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 162, "pan.___", state 301, "else" + line 160, "pan.___", state 306, "((j<1))" + line 160, "pan.___", state 306, "((j>=1))" + line 166, "pan.___", state 311, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 143, "pan.___", state 321, "(1)" + line 147, "pan.___", state 329, "(1)" + line 147, "pan.___", state 330, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 147, "pan.___", state 330, "else" + line 145, "pan.___", state 335, "((j<1))" + line 145, "pan.___", state 335, "((j>=1))" + line 151, "pan.___", state 341, "(1)" + line 151, "pan.___", state 342, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 151, "pan.___", state 342, "else" + line 153, "pan.___", state 345, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 153, "pan.___", state 345, "else" + line 185, "pan.___", state 347, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 185, "pan.___", state 347, "else" + line 158, "pan.___", state 352, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 166, "pan.___", state 374, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 151, "pan.___", state 404, "(1)" + line 151, "pan.___", state 405, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 158, "pan.___", state 419, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 158, "pan.___", state 421, "(1)" + line 162, "pan.___", state 428, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 162, "pan.___", state 430, "(1)" + line 162, "pan.___", state 431, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 162, "pan.___", state 431, "else" + line 160, "pan.___", state 436, "((j<1))" + line 160, "pan.___", state 436, "((j>=1))" + line 166, "pan.___", state 441, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 143, "pan.___", state 451, "(1)" + line 147, "pan.___", state 459, "(1)" + line 147, "pan.___", state 460, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 147, "pan.___", state 460, "else" + line 145, "pan.___", state 465, "((j<1))" + line 145, "pan.___", state 465, "((j>=1))" + line 151, "pan.___", state 471, "(1)" + line 151, "pan.___", state 472, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 151, "pan.___", state 472, "else" + line 153, "pan.___", state 475, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 153, "pan.___", state 475, "else" + line 185, "pan.___", state 477, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 185, "pan.___", state 477, "else" + line 288, "pan.___", state 492, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 524, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 537, "(1)" + line 307, "pan.___", state 567, "(1)" + line 288, "pan.___", state 580, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 612, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 625, "(1)" + line 307, "pan.___", state 655, "(1)" + line 288, "pan.___", state 668, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 713, "(1)" + line 307, "pan.___", state 743, "(1)" + line 158, "pan.___", state 758, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 158, "pan.___", state 760, "(1)" + line 162, "pan.___", state 767, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 162, "pan.___", state 769, "(1)" + line 162, "pan.___", state 770, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 162, "pan.___", state 770, "else" + line 160, "pan.___", state 775, "((j<1))" + line 160, "pan.___", state 775, "((j>=1))" + line 166, "pan.___", state 780, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 143, "pan.___", state 790, "(1)" + line 147, "pan.___", state 798, "(1)" + line 147, "pan.___", state 799, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 147, "pan.___", state 799, "else" + line 145, "pan.___", state 804, "((j<1))" + line 145, "pan.___", state 804, "((j>=1))" + line 151, "pan.___", state 810, "(1)" + line 151, "pan.___", state 811, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 151, "pan.___", state 811, "else" + line 153, "pan.___", state 814, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 153, "pan.___", state 814, "else" + line 185, "pan.___", state 816, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 185, "pan.___", state 816, "else" + line 158, "pan.___", state 821, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 166, "pan.___", state 843, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 151, "pan.___", state 873, "(1)" + line 151, "pan.___", state 874, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 158, "pan.___", state 888, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 158, "pan.___", state 890, "(1)" + line 162, "pan.___", state 897, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 162, "pan.___", state 899, "(1)" + line 162, "pan.___", state 900, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 162, "pan.___", state 900, "else" + line 160, "pan.___", state 905, "((j<1))" + line 160, "pan.___", state 905, "((j>=1))" + line 166, "pan.___", state 910, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 143, "pan.___", state 920, "(1)" + line 147, "pan.___", state 928, "(1)" + line 147, "pan.___", state 929, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 147, "pan.___", state 929, "else" + line 145, "pan.___", state 934, "((j<1))" + line 145, "pan.___", state 934, "((j>=1))" + line 151, "pan.___", state 940, "(1)" + line 151, "pan.___", state 941, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 151, "pan.___", state 941, "else" + line 153, "pan.___", state 944, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 153, "pan.___", state 944, "else" + line 185, "pan.___", state 946, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 185, "pan.___", state 946, "else" + line 288, "pan.___", state 956, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 988, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 1001, "(1)" + line 307, "pan.___", state 1031, "(1)" + line 288, "pan.___", state 1052, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 1084, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 1097, "(1)" + line 307, "pan.___", state 1127, "(1)" + line 433, "pan.___", state 1140, "-end-" + (125 of 1140 states) +unreached in proctype urcu_writer + line 288, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 292, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 59, "(1)" + line 302, "pan.___", state 72, "(1)" + line 307, "pan.___", state 89, "(1)" + line 288, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 292, "pan.___", state 120, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 151, "(1)" + line 302, "pan.___", state 164, "(1)" + line 467, "pan.___", state 195, "(1)" + line 158, "pan.___", state 205, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 162, "pan.___", state 214, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 143, "pan.___", state 237, "(1)" + line 147, "pan.___", state 245, "(1)" + line 151, "pan.___", state 257, "(1)" + line 158, "pan.___", state 268, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 297, "pan.___", state 910, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 923, "(1)" + line 298, "pan.___", state 924, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 298, "pan.___", state 924, "else" + line 298, "pan.___", state 927, "(1)" + line 298, "pan.___", state 928, "(1)" + line 298, "pan.___", state 928, "(1)" + line 302, "pan.___", state 936, "(1)" + line 302, "pan.___", state 937, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 302, "pan.___", state 937, "else" + line 302, "pan.___", state 940, "(1)" + line 302, "pan.___", state 941, "(1)" + line 302, "pan.___", state 941, "(1)" + line 300, "pan.___", state 946, "((i<1))" + line 300, "pan.___", state 946, "((i>=1))" + line 307, "pan.___", state 953, "(1)" + line 307, "pan.___", state 954, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 307, "pan.___", state 954, "else" + line 307, "pan.___", state 957, "(1)" + line 307, "pan.___", state 958, "(1)" + line 307, "pan.___", state 958, "(1)" + line 309, "pan.___", state 961, "(1)" + line 309, "pan.___", state 961, "(1)" + line 292, "pan.___", state 990, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 1008, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 302, "pan.___", state 1034, "(1)" + line 307, "pan.___", state 1051, "(1)" + line 292, "pan.___", state 1078, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 1096, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 302, "pan.___", state 1122, "(1)" + line 307, "pan.___", state 1139, "(1)" + line 288, "pan.___", state 1156, "(1)" + line 292, "pan.___", state 1168, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 1186, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 302, "pan.___", state 1212, "(1)" + line 307, "pan.___", state 1229, "(1)" + line 292, "pan.___", state 1259, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 1277, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 302, "pan.___", state 1303, "(1)" + line 307, "pan.___", state 1320, "(1)" + line 162, "pan.___", state 1342, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 166, "pan.___", state 1355, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 143, "pan.___", state 1365, "(1)" + line 147, "pan.___", state 1373, "(1)" + line 151, "pan.___", state 1385, "(1)" + line 158, "pan.___", state 1396, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 297, "pan.___", state 1571, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 1584, "(1)" + line 298, "pan.___", state 1585, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 298, "pan.___", state 1585, "else" + line 298, "pan.___", state 1588, "(1)" + line 298, "pan.___", state 1589, "(1)" + line 298, "pan.___", state 1589, "(1)" + line 302, "pan.___", state 1597, "(1)" + line 302, "pan.___", state 1598, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 302, "pan.___", state 1598, "else" + line 302, "pan.___", state 1601, "(1)" + line 302, "pan.___", state 1602, "(1)" + line 302, "pan.___", state 1602, "(1)" + line 300, "pan.___", state 1607, "((i<1))" + line 300, "pan.___", state 1607, "((i>=1))" + line 307, "pan.___", state 1614, "(1)" + line 307, "pan.___", state 1615, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 307, "pan.___", state 1615, "else" + line 307, "pan.___", state 1618, "(1)" + line 307, "pan.___", state 1619, "(1)" + line 307, "pan.___", state 1619, "(1)" + line 309, "pan.___", state 1622, "(1)" + line 309, "pan.___", state 1622, "(1)" + line 162, "pan.___", state 1646, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 166, "pan.___", state 1659, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 143, "pan.___", state 1669, "(1)" + line 147, "pan.___", state 1677, "(1)" + line 151, "pan.___", state 1689, "(1)" + line 158, "pan.___", state 1700, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< !read_free_race) diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free.spin.input b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free.spin.input new file mode 100644 index 0000000..18f99c4 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free.spin.input @@ -0,0 +1,531 @@ + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + + +#if (NR_READERS == 1) + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#elif (NR_READERS == 2) + +#define read_free_race (read_generation[0] == last_free_gen || read_generation[1] == last_free_gen) +#define read_free (free_done && (data_access[0] || data_access[1])) + +#else + +#error "Too many readers" + +#endif + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +#define get_pid() (_pid) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb(i, j) +{ + if + :: get_pid() >= NR_READERS -> + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); + :: else -> skip; + fi; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +#define get_readerid() (get_pid()) +#define get_writerid() (get_readerid() + NR_READERS) + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb(i, j); +#else + ooo_mem(i); +#endif + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + ooo_mem(i); + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + ooo_mem(i); + data_access[get_readerid()] = 1; + ooo_mem(i); + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + ooo_mem(i); + //smp_mc(i); /* added */ +} + +active [NR_READERS] proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS + /* Only test progress of one random reader. They are all the + * same. */ + atomic { + if + :: get_readerid() == 0 -> +progress_reader: + skip; + :: else -> + skip; + fi; + } +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb(i, j); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb(i, j); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + skip; + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free.spin.input.trail b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free.spin.input.trail new file mode 100644 index 0000000..0d22946 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free.spin.input.trail @@ -0,0 +1,1902 @@ +-2:3:-2 +-4:-4:-4 +1:0:3013 +2:2:1132 +3:0:3013 +4:1:0 +5:0:3013 +6:1:1 +7:0:3013 +8:1:2 +9:0:3013 +10:1:3 +11:0:3013 +12:3:2969 +13:0:3013 +14:3:2970 +15:0:3013 +16:3:2971 +17:0:3013 +18:3:2972 +19:0:3013 +20:3:2973 +21:0:3013 +22:3:2974 +23:0:3013 +24:3:2971 +25:0:3013 +26:3:2972 +27:0:3013 +28:3:2973 +29:0:3013 +30:3:2974 +31:0:3013 +32:3:2975 +33:0:3013 +34:3:2980 +35:0:3013 +36:3:2981 +37:0:3013 +38:3:2982 +39:0:3013 +40:3:2983 +41:0:3013 +42:3:2984 +43:0:3013 +44:3:2985 +45:0:3013 +46:3:2982 +47:0:3013 +48:3:2983 +49:0:3013 +50:3:2984 +51:0:3013 +52:3:2985 +53:0:3013 +54:3:2986 +55:0:3013 +56:3:2992 +57:0:3013 +58:3:2993 +59:0:3013 +60:3:2994 +61:0:3013 +62:3:2995 +63:0:3013 +64:3:2996 +65:0:3013 +66:3:2997 +67:0:3013 +68:3:2998 +69:0:3013 +70:3:2995 +71:0:3013 +72:2:1133 +73:0:3013 +74:2:1134 +75:2:1138 +76:2:1139 +77:2:1147 +78:2:1148 +79:2:1152 +80:2:1153 +81:2:1161 +82:2:1166 +83:2:1170 +84:2:1171 +85:2:1178 +86:2:1179 +87:2:1190 +88:2:1191 +89:2:1192 +90:2:1203 +91:2:1208 +92:2:1209 +93:0:3013 +94:2:1221 +95:2:1222 +96:0:3013 +97:2:1226 +98:2:1230 +99:2:1231 +100:2:1239 +101:2:1240 +102:2:1244 +103:2:1245 +104:2:1253 +105:2:1258 +106:2:1259 +107:2:1270 +108:2:1271 +109:2:1282 +110:2:1283 +111:2:1284 +112:2:1295 +113:2:1300 +114:2:1301 +115:0:3013 +116:2:1313 +117:0:3013 +118:2:1314 +119:0:3013 +120:2:1324 +121:0:3013 +122:2:1325 +123:0:3013 +124:2:1329 +125:2:1330 +126:2:1334 +127:2:1338 +128:2:1339 +129:2:1343 +130:2:1351 +131:2:1352 +132:2:1357 +133:2:1364 +134:2:1365 +135:2:1372 +136:2:1377 +137:0:3013 +138:2:1388 +139:0:3013 +140:2:1392 +141:2:1393 +142:2:1397 +143:2:1401 +144:2:1402 +145:2:1406 +146:2:1414 +147:2:1415 +148:2:1420 +149:2:1427 +150:2:1428 +151:2:1435 +152:2:1440 +153:0:3013 +154:2:1451 +155:0:3013 +156:2:1459 +157:2:1460 +158:2:1464 +159:2:1468 +160:2:1469 +161:2:1473 +162:2:1481 +163:2:1482 +164:2:1487 +165:2:1494 +166:2:1495 +167:2:1502 +168:2:1507 +169:0:3013 +170:2:1522 +171:0:3013 +172:2:1523 +173:2:1527 +174:2:1528 +175:2:1536 +176:2:1537 +177:2:1541 +178:2:1542 +179:2:1550 +180:2:1555 +181:2:1559 +182:2:1560 +183:2:1567 +184:2:1568 +185:2:1579 +186:2:1580 +187:2:1581 +188:2:1592 +189:2:1597 +190:2:1598 +191:0:3013 +192:2:1610 +193:0:3013 +194:2:1613 +195:2:1614 +196:2:1626 +197:2:1627 +198:2:1631 +199:2:1632 +200:2:1640 +201:2:1645 +202:2:1649 +203:2:1650 +204:2:1657 +205:2:1658 +206:2:1669 +207:2:1670 +208:2:1671 +209:2:1682 +210:2:1687 +211:2:1688 +212:0:3013 +213:2:1700 +214:0:3013 +215:2:1701 +216:0:3013 +217:2:1702 +218:0:3013 +219:2:1703 +220:0:3013 +221:2:1704 +222:2:1708 +223:2:1709 +224:2:1717 +225:2:1718 +226:2:1722 +227:2:1723 +228:2:1731 +229:2:1736 +230:2:1740 +231:2:1741 +232:2:1748 +233:2:1749 +234:2:1760 +235:2:1761 +236:2:1762 +237:2:1773 +238:2:1778 +239:2:1779 +240:0:3013 +241:2:1989 +242:0:3013 +243:2:2085 +244:0:3013 +245:2:2086 +246:0:3013 +247:2:2090 +248:0:3013 +249:2:2096 +250:2:2100 +251:2:2101 +252:2:2109 +253:2:2110 +254:2:2114 +255:2:2115 +256:2:2123 +257:2:2128 +258:2:2132 +259:2:2133 +260:2:2140 +261:2:2141 +262:2:2152 +263:2:2153 +264:2:2154 +265:2:2165 +266:2:2170 +267:2:2171 +268:0:3013 +269:2:2183 +270:0:3013 +271:2:2184 +272:2:2188 +273:2:2189 +274:2:2197 +275:2:2198 +276:2:2202 +277:2:2203 +278:2:2211 +279:2:2216 +280:2:2220 +281:2:2221 +282:2:2228 +283:2:2229 +284:2:2240 +285:2:2241 +286:2:2242 +287:2:2253 +288:2:2258 +289:2:2259 +290:0:3013 +291:2:2271 +292:0:3013 +293:2:2274 +294:2:2275 +295:2:2287 +296:2:2288 +297:2:2292 +298:2:2293 +299:2:2301 +300:2:2306 +301:2:2310 +302:2:2311 +303:2:2318 +304:2:2319 +305:2:2330 +306:2:2331 +307:2:2332 +308:2:2343 +309:2:2348 +310:2:2349 +311:0:3013 +312:2:2361 +313:0:3013 +314:2:2362 +315:0:3013 +316:2:2363 +317:0:3013 +318:2:2364 +319:0:3013 +320:2:2365 +321:2:2369 +322:2:2370 +323:2:2378 +324:2:2379 +325:2:2383 +326:2:2384 +327:2:2392 +328:2:2397 +329:2:2401 +330:2:2402 +331:2:2409 +332:2:2410 +333:2:2421 +334:2:2422 +335:2:2423 +336:2:2434 +337:2:2439 +338:2:2440 +339:0:3013 +340:2:2650 +341:0:3013 +342:2:2746 +343:0:3013 +344:2:2747 +345:0:3013 +346:2:2751 +347:0:3013 +348:2:2757 +349:0:3013 +350:2:2761 +351:2:2762 +352:2:2766 +353:2:2770 +354:2:2771 +355:2:2775 +356:2:2783 +357:2:2784 +358:2:2789 +359:2:2796 +360:2:2797 +361:2:2804 +362:2:2809 +363:0:3013 +364:2:2820 +365:0:3013 +366:2:2824 +367:2:2825 +368:2:2829 +369:2:2833 +370:2:2834 +371:2:2838 +372:2:2846 +373:2:2847 +374:2:2852 +375:2:2859 +376:2:2860 +377:2:2867 +378:2:2872 +379:0:3013 +380:2:2883 +381:0:3013 +382:2:2891 +383:2:2892 +384:2:2896 +385:2:2900 +386:2:2901 +387:2:2905 +388:2:2913 +389:2:2914 +390:2:2919 +391:2:2926 +392:2:2927 +393:2:2934 +394:2:2939 +395:0:3013 +396:2:2954 +397:0:3013 +398:2:2955 +399:0:3013 +400:2:1133 +401:0:3013 +402:2:1134 +403:2:1138 +404:2:1139 +405:2:1147 +406:2:1148 +407:2:1152 +408:2:1153 +409:2:1161 +410:2:1166 +411:2:1170 +412:2:1171 +413:2:1178 +414:2:1179 +415:2:1190 +416:2:1191 +417:2:1192 +418:2:1203 +419:2:1208 +420:2:1209 +421:0:3013 +422:2:1221 +423:2:1222 +424:0:3013 +425:2:1226 +426:2:1230 +427:2:1231 +428:2:1239 +429:2:1240 +430:2:1244 +431:2:1245 +432:2:1253 +433:2:1258 +434:2:1259 +435:2:1270 +436:2:1271 +437:2:1282 +438:2:1283 +439:2:1284 +440:2:1295 +441:2:1300 +442:2:1301 +443:0:3013 +444:2:1313 +445:0:3013 +446:2:1314 +447:0:3013 +448:2:1324 +449:0:3013 +450:2:1325 +451:0:3013 +452:2:1329 +453:2:1330 +454:2:1334 +455:2:1338 +456:2:1339 +457:2:1343 +458:2:1351 +459:2:1352 +460:2:1357 +461:2:1364 +462:2:1365 +463:2:1372 +464:2:1377 +465:0:3013 +466:2:1388 +467:0:3013 +468:2:1392 +469:2:1393 +470:2:1397 +471:2:1401 +472:2:1402 +473:2:1406 +474:2:1414 +475:2:1415 +476:2:1420 +477:2:1427 +478:2:1428 +479:2:1435 +480:2:1440 +481:0:3013 +482:2:1451 +483:0:3013 +484:2:1459 +485:2:1460 +486:2:1464 +487:2:1468 +488:2:1469 +489:2:1473 +490:2:1481 +491:2:1482 +492:2:1487 +493:2:1494 +494:2:1495 +495:2:1502 +496:2:1507 +497:0:3013 +498:2:1522 +499:0:3013 +500:2:1523 +501:2:1527 +502:2:1528 +503:2:1536 +504:2:1537 +505:2:1541 +506:2:1542 +507:2:1550 +508:2:1555 +509:2:1559 +510:2:1560 +511:2:1567 +512:2:1568 +513:2:1579 +514:2:1580 +515:2:1581 +516:2:1592 +517:2:1597 +518:2:1598 +519:0:3013 +520:2:1610 +521:0:3013 +522:2:1613 +523:2:1614 +524:2:1626 +525:2:1627 +526:2:1631 +527:2:1632 +528:2:1640 +529:2:1645 +530:2:1649 +531:2:1650 +532:2:1657 +533:2:1658 +534:2:1669 +535:2:1670 +536:2:1671 +537:2:1682 +538:2:1687 +539:2:1688 +540:0:3013 +541:2:1700 +542:0:3013 +543:2:1701 +544:0:3013 +545:2:1702 +546:0:3013 +547:2:1703 +548:0:3013 +549:2:1704 +550:2:1708 +551:2:1709 +552:2:1717 +553:2:1718 +554:2:1722 +555:2:1723 +556:2:1731 +557:2:1736 +558:2:1740 +559:2:1741 +560:2:1748 +561:2:1749 +562:2:1760 +563:2:1761 +564:2:1762 +565:2:1773 +566:2:1778 +567:2:1779 +568:0:3013 +569:2:1989 +570:0:3013 +571:2:2085 +572:0:3013 +573:2:2086 +574:0:3013 +575:2:2090 +576:0:3013 +577:2:2096 +578:2:2100 +579:2:2101 +580:2:2109 +581:2:2110 +582:2:2114 +583:2:2115 +584:2:2123 +585:2:2128 +586:2:2132 +587:2:2133 +588:2:2140 +589:2:2141 +590:2:2152 +591:2:2153 +592:2:2154 +593:2:2165 +594:2:2170 +595:2:2171 +596:0:3013 +597:2:2183 +598:0:3013 +599:2:2184 +600:2:2188 +601:2:2189 +602:2:2197 +603:2:2198 +604:2:2202 +605:2:2203 +606:2:2211 +607:2:2216 +608:2:2220 +609:2:2221 +610:2:2228 +611:2:2229 +612:2:2240 +613:2:2241 +614:2:2242 +615:2:2253 +616:2:2258 +617:2:2259 +618:0:3013 +619:2:2271 +620:0:3013 +621:2:2274 +622:2:2275 +623:2:2287 +624:2:2288 +625:2:2292 +626:2:2293 +627:2:2301 +628:2:2306 +629:2:2310 +630:2:2311 +631:2:2318 +632:2:2319 +633:2:2330 +634:2:2331 +635:2:2332 +636:2:2343 +637:2:2348 +638:2:2349 +639:0:3013 +640:2:2361 +641:0:3013 +642:2:2362 +643:0:3013 +644:2:2363 +645:0:3013 +646:2:2364 +647:0:3013 +648:2:2365 +649:2:2369 +650:2:2370 +651:2:2378 +652:2:2379 +653:2:2383 +654:2:2384 +655:2:2392 +656:2:2397 +657:2:2401 +658:2:2402 +659:2:2409 +660:2:2410 +661:2:2421 +662:2:2422 +663:2:2423 +664:2:2434 +665:2:2439 +666:2:2440 +667:0:3013 +668:2:2650 +669:0:3013 +670:2:2746 +671:0:3013 +672:2:2747 +673:0:3013 +674:2:2751 +675:0:3013 +676:2:2757 +677:0:3013 +678:2:2761 +679:2:2762 +680:2:2766 +681:2:2770 +682:2:2771 +683:2:2775 +684:2:2783 +685:2:2784 +686:2:2789 +687:2:2796 +688:2:2797 +689:2:2804 +690:2:2809 +691:0:3013 +692:2:2820 +693:0:3013 +694:2:2824 +695:2:2825 +696:2:2829 +697:2:2833 +698:2:2834 +699:2:2838 +700:2:2846 +701:2:2847 +702:2:2852 +703:2:2859 +704:2:2860 +705:2:2867 +706:2:2872 +707:0:3013 +708:2:2883 +709:0:3013 +710:2:2891 +711:2:2892 +712:2:2896 +713:2:2900 +714:2:2901 +715:2:2905 +716:2:2913 +717:2:2914 +718:2:2919 +719:2:2926 +720:2:2927 +721:2:2934 +722:2:2939 +723:0:3013 +724:2:2954 +725:0:3013 +726:2:2955 +727:0:3013 +728:2:1133 +729:0:3013 +730:2:1134 +731:2:1138 +732:2:1139 +733:2:1147 +734:2:1148 +735:2:1152 +736:2:1153 +737:2:1161 +738:2:1166 +739:2:1170 +740:2:1171 +741:2:1178 +742:2:1179 +743:2:1190 +744:2:1191 +745:2:1192 +746:2:1203 +747:2:1208 +748:2:1209 +749:0:3013 +750:2:1221 +751:2:1222 +752:0:3013 +753:2:1226 +754:2:1230 +755:2:1231 +756:2:1239 +757:2:1240 +758:2:1244 +759:2:1245 +760:2:1253 +761:2:1258 +762:2:1259 +763:2:1270 +764:2:1271 +765:2:1282 +766:2:1283 +767:2:1284 +768:2:1295 +769:2:1300 +770:2:1301 +771:0:3013 +772:2:1313 +773:0:3013 +774:2:1314 +775:0:3013 +776:2:1324 +777:0:3013 +778:2:1325 +779:0:3013 +780:2:1329 +781:2:1330 +782:2:1334 +783:2:1338 +784:2:1339 +785:2:1343 +786:2:1351 +787:2:1352 +788:2:1357 +789:2:1364 +790:2:1365 +791:2:1372 +792:2:1377 +793:0:3013 +794:2:1388 +795:0:3013 +796:2:1392 +797:2:1393 +798:2:1397 +799:2:1401 +800:2:1402 +801:2:1406 +802:2:1414 +803:2:1415 +804:2:1420 +805:2:1427 +806:2:1428 +807:2:1435 +808:2:1440 +809:0:3013 +810:2:1451 +811:0:3013 +812:2:1459 +813:2:1460 +814:2:1464 +815:2:1468 +816:2:1469 +817:2:1473 +818:2:1481 +819:2:1482 +820:2:1487 +821:2:1494 +822:2:1495 +823:2:1502 +824:2:1507 +825:0:3013 +826:2:1522 +827:0:3013 +828:2:1523 +829:2:1527 +830:2:1528 +831:2:1536 +832:2:1537 +833:2:1541 +834:2:1542 +835:2:1550 +836:2:1555 +837:2:1559 +838:2:1560 +839:2:1567 +840:2:1568 +841:2:1579 +842:2:1580 +843:2:1581 +844:2:1592 +845:2:1597 +846:2:1598 +847:0:3013 +848:2:1610 +849:0:3013 +850:2:1613 +851:2:1614 +852:2:1626 +853:2:1627 +854:2:1631 +855:2:1632 +856:2:1640 +857:2:1645 +858:2:1649 +859:2:1650 +860:2:1657 +861:2:1658 +862:2:1669 +863:2:1670 +864:2:1671 +865:2:1682 +866:2:1687 +867:2:1688 +868:0:3013 +869:2:1700 +870:0:3013 +871:2:1701 +872:0:3013 +873:2:1702 +874:0:3013 +875:2:1703 +876:0:3013 +877:2:1704 +878:2:1708 +879:2:1709 +880:2:1717 +881:2:1718 +882:2:1722 +883:2:1723 +884:2:1731 +885:2:1736 +886:2:1740 +887:2:1741 +888:2:1748 +889:2:1749 +890:2:1760 +891:2:1761 +892:2:1762 +893:2:1773 +894:2:1778 +895:2:1779 +896:0:3013 +897:2:1989 +898:0:3013 +899:2:2085 +900:0:3013 +901:2:2086 +902:0:3013 +903:2:2090 +904:0:3013 +905:2:2096 +906:2:2100 +907:2:2101 +908:2:2109 +909:2:2110 +910:2:2114 +911:2:2115 +912:2:2123 +913:2:2128 +914:2:2132 +915:2:2133 +916:2:2140 +917:2:2141 +918:2:2152 +919:2:2153 +920:2:2154 +921:2:2165 +922:2:2170 +923:2:2171 +924:0:3013 +925:2:2183 +926:0:3013 +927:2:2184 +928:2:2188 +929:2:2189 +930:2:2197 +931:2:2198 +932:2:2202 +933:2:2203 +934:2:2211 +935:2:2216 +936:2:2220 +937:2:2221 +938:2:2228 +939:2:2229 +940:2:2240 +941:2:2241 +942:2:2242 +943:2:2253 +944:2:2258 +945:2:2259 +946:0:3013 +947:2:2271 +948:0:3013 +949:2:2274 +950:2:2275 +951:2:2287 +952:2:2288 +953:2:2292 +954:2:2293 +955:2:2301 +956:2:2306 +957:2:2310 +958:2:2311 +959:2:2318 +960:2:2319 +961:2:2330 +962:2:2331 +963:2:2332 +964:2:2343 +965:2:2348 +966:2:2349 +967:0:3013 +968:2:2361 +969:0:3013 +970:2:2362 +971:0:3013 +972:2:2363 +973:0:3013 +974:2:2364 +975:0:3013 +976:2:2365 +977:2:2369 +978:2:2370 +979:2:2378 +980:2:2379 +981:2:2383 +982:2:2384 +983:2:2392 +984:2:2397 +985:2:2401 +986:2:2402 +987:2:2409 +988:2:2410 +989:2:2421 +990:2:2422 +991:2:2423 +992:2:2434 +993:2:2439 +994:2:2440 +995:0:3013 +996:2:2650 +997:0:3013 +998:2:2746 +999:0:3013 +1000:2:2747 +1001:0:3013 +1002:2:2751 +1003:0:3013 +1004:2:2757 +1005:0:3013 +1006:2:2761 +1007:2:2762 +1008:2:2766 +1009:2:2770 +1010:2:2771 +1011:2:2775 +1012:2:2783 +1013:2:2784 +1014:2:2789 +1015:2:2796 +1016:2:2797 +1017:2:2804 +1018:2:2809 +1019:0:3013 +1020:2:2820 +1021:0:3013 +1022:2:2824 +1023:2:2825 +1024:2:2829 +1025:2:2833 +1026:2:2834 +1027:2:2838 +1028:2:2846 +1029:2:2847 +1030:2:2852 +1031:2:2859 +1032:2:2860 +1033:2:2867 +1034:2:2872 +1035:0:3013 +1036:2:2883 +1037:0:3013 +1038:2:2891 +1039:2:2892 +1040:2:2896 +1041:2:2900 +1042:2:2901 +1043:2:2905 +1044:2:2913 +1045:2:2914 +1046:2:2919 +1047:2:2926 +1048:2:2927 +1049:2:2934 +1050:2:2939 +1051:0:3013 +1052:2:2954 +1053:0:3013 +1054:2:2955 +1055:0:3013 +1056:2:1133 +1057:0:3013 +1058:2:1134 +1059:2:1138 +1060:2:1139 +1061:2:1147 +1062:2:1148 +1063:2:1152 +1064:2:1153 +1065:2:1161 +1066:2:1166 +1067:2:1170 +1068:2:1171 +1069:2:1178 +1070:2:1179 +1071:2:1190 +1072:2:1191 +1073:2:1192 +1074:2:1203 +1075:2:1208 +1076:2:1209 +1077:0:3013 +1078:2:1221 +1079:2:1222 +1080:0:3013 +1081:2:1226 +1082:2:1230 +1083:2:1231 +1084:2:1239 +1085:2:1240 +1086:2:1244 +1087:2:1245 +1088:2:1253 +1089:2:1258 +1090:2:1259 +1091:2:1270 +1092:2:1271 +1093:2:1282 +1094:2:1283 +1095:2:1284 +1096:2:1295 +1097:2:1300 +1098:2:1301 +1099:0:3013 +1100:2:1313 +1101:0:3013 +1102:2:1314 +1103:0:3013 +1104:2:1324 +1105:0:3013 +1106:2:1325 +1107:0:3013 +1108:2:1329 +1109:2:1330 +1110:2:1334 +1111:2:1338 +1112:2:1339 +1113:2:1343 +1114:2:1351 +1115:2:1352 +1116:2:1357 +1117:2:1364 +1118:2:1365 +1119:2:1372 +1120:2:1377 +1121:0:3013 +1122:2:1388 +1123:0:3013 +1124:2:1392 +1125:2:1393 +1126:2:1397 +1127:2:1401 +1128:2:1402 +1129:2:1406 +1130:2:1414 +1131:2:1415 +1132:2:1420 +1133:2:1427 +1134:2:1428 +1135:2:1435 +1136:2:1440 +1137:0:3013 +1138:2:1451 +1139:0:3013 +1140:2:1459 +1141:2:1460 +1142:2:1464 +1143:2:1468 +1144:2:1469 +1145:2:1473 +1146:2:1481 +1147:2:1482 +1148:2:1487 +1149:2:1494 +1150:2:1495 +1151:2:1502 +1152:2:1507 +1153:0:3013 +1154:2:1522 +1155:0:3013 +1156:2:1523 +1157:2:1527 +1158:2:1528 +1159:2:1536 +1160:2:1537 +1161:2:1541 +1162:2:1542 +1163:2:1550 +1164:2:1555 +1165:2:1559 +1166:2:1560 +1167:2:1567 +1168:2:1568 +1169:2:1579 +1170:2:1580 +1171:2:1581 +1172:2:1592 +1173:2:1597 +1174:2:1598 +1175:0:3013 +1176:2:1610 +1177:0:3013 +1178:2:1613 +1179:2:1614 +1180:2:1626 +1181:2:1627 +1182:2:1631 +1183:2:1632 +1184:2:1640 +1185:2:1645 +1186:2:1649 +1187:2:1650 +1188:2:1657 +1189:2:1658 +1190:2:1669 +1191:2:1670 +1192:2:1671 +1193:2:1682 +1194:2:1687 +1195:2:1688 +1196:0:3013 +1197:2:1700 +1198:0:3013 +1199:2:1701 +1200:0:3013 +1201:2:1702 +1202:0:3013 +1203:2:1703 +1204:0:3013 +1205:2:1704 +1206:2:1708 +1207:2:1709 +1208:2:1717 +1209:2:1718 +1210:2:1722 +1211:2:1723 +1212:2:1731 +1213:2:1736 +1214:2:1740 +1215:2:1741 +1216:2:1748 +1217:2:1749 +1218:2:1760 +1219:2:1761 +1220:2:1762 +1221:2:1773 +1222:2:1778 +1223:2:1779 +1224:0:3013 +1225:2:1989 +1226:0:3013 +1227:2:2085 +1228:0:3013 +1229:2:2086 +1230:0:3013 +1231:2:2090 +1232:0:3013 +1233:2:2096 +1234:2:2100 +1235:2:2101 +1236:2:2109 +1237:2:2110 +1238:2:2114 +1239:2:2115 +1240:2:2123 +1241:2:2128 +1242:2:2132 +1243:2:2133 +1244:2:2140 +1245:2:2141 +1246:2:2152 +1247:2:2153 +1248:2:2154 +1249:2:2165 +1250:2:2170 +1251:2:2171 +1252:0:3013 +1253:2:2183 +1254:0:3013 +1255:2:2184 +1256:2:2188 +1257:2:2189 +1258:2:2197 +1259:2:2198 +1260:2:2202 +1261:2:2203 +1262:2:2211 +1263:2:2216 +1264:2:2220 +1265:2:2221 +1266:2:2228 +1267:2:2229 +1268:2:2240 +1269:2:2241 +1270:2:2242 +1271:2:2253 +1272:2:2258 +1273:2:2259 +1274:0:3013 +1275:2:2271 +1276:0:3013 +1277:2:2274 +1278:2:2275 +1279:2:2287 +1280:2:2288 +1281:2:2292 +1282:2:2293 +1283:2:2301 +1284:2:2306 +1285:2:2310 +1286:2:2311 +1287:2:2318 +1288:2:2319 +1289:2:2330 +1290:2:2331 +1291:2:2332 +1292:2:2343 +1293:2:2348 +1294:2:2349 +1295:0:3013 +1296:2:2361 +1297:0:3013 +1298:2:2362 +1299:0:3013 +1300:2:2363 +1301:0:3013 +1302:2:2364 +1303:0:3013 +1304:2:2365 +1305:2:2369 +1306:2:2370 +1307:2:2378 +1308:2:2379 +1309:2:2383 +1310:2:2384 +1311:2:2392 +1312:2:2397 +1313:2:2401 +1314:2:2402 +1315:2:2409 +1316:2:2410 +1317:2:2421 +1318:2:2422 +1319:2:2423 +1320:2:2434 +1321:2:2439 +1322:2:2440 +1323:0:3013 +1324:2:2650 +1325:0:3013 +1326:2:2746 +1327:0:3013 +1328:2:2747 +1329:0:3013 +1330:2:2751 +1331:0:3013 +1332:2:2757 +1333:0:3013 +1334:2:2761 +1335:2:2762 +1336:2:2766 +1337:2:2770 +1338:2:2771 +1339:2:2775 +1340:2:2783 +1341:2:2784 +1342:2:2789 +1343:2:2796 +1344:2:2797 +1345:2:2804 +1346:2:2809 +1347:0:3013 +1348:2:2820 +1349:0:3013 +1350:2:2824 +1351:2:2825 +1352:2:2829 +1353:2:2833 +1354:2:2834 +1355:2:2838 +1356:2:2846 +1357:2:2847 +1358:2:2852 +1359:2:2859 +1360:2:2860 +1361:2:2867 +1362:2:2872 +1363:0:3013 +1364:2:2883 +1365:0:3013 +1366:2:2891 +1367:2:2892 +1368:2:2896 +1369:2:2900 +1370:2:2901 +1371:2:2905 +1372:2:2913 +1373:2:2914 +1374:2:2919 +1375:2:2926 +1376:2:2927 +1377:2:2934 +1378:2:2939 +1379:0:3013 +1380:2:2954 +1381:0:3013 +1382:2:2955 +1383:0:3013 +1384:2:1133 +1385:0:3013 +1386:2:1134 +1387:2:1138 +1388:2:1139 +1389:2:1147 +1390:2:1148 +1391:2:1152 +1392:2:1153 +1393:2:1161 +1394:2:1166 +1395:2:1170 +1396:2:1171 +1397:2:1178 +1398:2:1179 +1399:2:1190 +1400:2:1191 +1401:2:1192 +1402:2:1203 +1403:2:1208 +1404:2:1209 +1405:0:3013 +1406:2:1221 +1407:2:1222 +1408:0:3013 +1409:2:1226 +1410:2:1230 +1411:2:1231 +1412:2:1239 +1413:2:1240 +1414:2:1244 +1415:2:1245 +1416:2:1253 +1417:2:1258 +1418:2:1259 +1419:2:1270 +1420:2:1271 +1421:2:1282 +1422:2:1283 +1423:2:1284 +1424:2:1295 +1425:2:1300 +1426:2:1301 +1427:0:3013 +1428:2:1313 +1429:0:3013 +1430:2:1314 +1431:0:3013 +1432:2:1324 +1433:0:3013 +1434:2:1325 +1435:0:3013 +1436:2:1329 +1437:2:1330 +1438:2:1334 +1439:2:1338 +1440:2:1339 +1441:2:1343 +1442:2:1351 +1443:2:1352 +1444:2:1357 +1445:2:1364 +1446:2:1365 +1447:2:1372 +1448:2:1377 +1449:0:3013 +1450:2:1388 +1451:0:3013 +1452:1:4 +1453:1:8 +1454:1:9 +1455:1:17 +1456:1:18 +1457:1:22 +1458:1:23 +1459:1:31 +1460:1:36 +1461:1:40 +1462:1:41 +1463:1:48 +1464:1:49 +1465:1:60 +1466:1:61 +1467:1:62 +1468:1:73 +1469:1:85 +1470:1:86 +1471:0:3013 +1472:1:91 +1473:0:3013 +1474:1:92 +1475:1:96 +1476:1:97 +1477:1:105 +1478:1:106 +1479:1:110 +1480:1:111 +1481:1:119 +1482:1:124 +1483:1:128 +1484:1:129 +1485:1:136 +1486:1:137 +1487:1:148 +1488:1:149 +1489:1:150 +1490:1:161 +1491:1:173 +1492:1:174 +1493:0:3013 +1494:1:179 +1495:0:3013 +1496:1:180 +1497:0:3013 +1498:1:181 +1499:1:185 +1500:1:186 +1501:1:194 +1502:1:195 +1503:1:199 +1504:1:200 +1505:1:208 +1506:1:213 +1507:1:217 +1508:1:218 +1509:1:225 +1510:1:226 +1511:1:237 +1512:1:238 +1513:1:239 +1514:1:250 +1515:1:262 +1516:1:263 +1517:0:3013 +1518:1:268 +1519:0:3013 +1520:1:469 +1521:0:3013 +1522:1:470 +1523:0:3013 +1524:1:3 +1525:0:3013 +1526:1:4 +1527:1:8 +1528:1:9 +1529:1:17 +1530:1:18 +1531:1:19 +1532:1:31 +1533:1:36 +1534:1:40 +1535:1:41 +1536:1:48 +1537:1:49 +1538:1:60 +1539:1:61 +1540:1:62 +1541:1:73 +1542:1:85 +1543:1:86 +1544:0:3013 +1545:1:91 +1546:0:3013 +1547:1:92 +1548:1:96 +1549:1:97 +1550:1:105 +1551:1:106 +1552:1:110 +1553:1:111 +1554:1:119 +1555:1:124 +1556:1:128 +1557:1:129 +1558:1:136 +1559:1:137 +1560:1:148 +1561:1:149 +1562:1:150 +1563:1:161 +1564:1:173 +1565:1:174 +1566:0:3013 +1567:1:271 +1568:0:3013 +1569:1:272 +1570:0:3013 +1571:1:469 +1572:0:3013 +1573:1:470 +1574:0:3013 +1575:1:475 +1576:0:3013 +1577:1:480 +1578:1:484 +1579:1:485 +1580:1:493 +1581:1:494 +1582:1:495 +1583:1:507 +1584:1:512 +1585:1:516 +1586:1:517 +1587:1:524 +1588:1:525 +1589:1:536 +1590:1:537 +1591:1:538 +1592:1:549 +1593:1:561 +1594:1:562 +1595:0:3013 +1596:1:567 +1597:0:3013 +1598:2:1392 +1599:2:1393 +1600:2:1397 +1601:2:1401 +1602:2:1402 +1603:2:1406 +1604:2:1414 +1605:2:1415 +1606:2:1420 +1607:2:1427 +1608:2:1428 +1609:2:1435 +1610:2:1440 +1611:0:3013 +1612:2:1451 +1613:0:3013 +1614:2:1459 +1615:2:1460 +1616:2:1464 +1617:2:1468 +1618:2:1469 +1619:2:1473 +1620:2:1481 +1621:2:1482 +1622:2:1487 +1623:2:1494 +1624:2:1495 +1625:2:1502 +1626:2:1507 +1627:0:3013 +1628:3:2996 +1629:0:3013 +1630:3:2997 +1631:0:3013 +1632:3:2998 +1633:0:3013 +1634:3:2999 +1635:0:3013 +1636:3:3005 +1637:0:3013 +1638:3:3010 +1639:0:3013 +1640:2:1522 +1641:0:3013 +1642:2:1523 +1643:2:1527 +1644:2:1528 +1645:2:1536 +1646:2:1537 +1647:2:1541 +1648:2:1542 +1649:2:1550 +1650:2:1555 +1651:2:1559 +1652:2:1560 +1653:2:1567 +1654:2:1568 +1655:2:1579 +1656:2:1587 +1657:2:1588 +1658:2:1592 +1659:2:1597 +1660:2:1598 +1661:0:3013 +1662:2:1610 +1663:0:3013 +1664:2:1613 +1665:2:1614 +1666:2:1626 +1667:2:1627 +1668:2:1631 +1669:2:1632 +1670:2:1640 +1671:2:1645 +1672:2:1649 +1673:2:1650 +1674:2:1657 +1675:2:1658 +1676:2:1669 +1677:2:1677 +1678:2:1678 +1679:2:1682 +1680:2:1687 +1681:2:1688 +1682:0:3013 +1683:2:1700 +1684:0:3013 +1685:2:1701 +1686:0:3013 +1687:2:1702 +1688:0:3013 +1689:2:1703 +1690:0:3013 +1691:2:1704 +1692:2:1708 +1693:2:1709 +1694:2:1717 +1695:2:1718 +1696:2:1722 +1697:2:1723 +1698:2:1731 +1699:2:1736 +1700:2:1740 +1701:2:1741 +1702:2:1748 +1703:2:1749 +1704:2:1760 +1705:2:1761 +1706:2:1762 +1707:2:1773 +1708:2:1778 +1709:2:1779 +1710:0:3013 +1711:2:1989 +1712:0:3013 +1713:2:2085 +1714:0:3013 +1715:2:2086 +1716:0:3013 +1717:2:2090 +1718:0:3013 +1719:2:2096 +1720:2:2100 +1721:2:2101 +1722:2:2109 +1723:2:2110 +1724:2:2114 +1725:2:2115 +1726:2:2123 +1727:2:2128 +1728:2:2132 +1729:2:2133 +1730:2:2140 +1731:2:2141 +1732:2:2152 +1733:2:2153 +1734:2:2154 +1735:2:2165 +1736:2:2170 +1737:2:2171 +1738:0:3013 +1739:2:2183 +1740:0:3013 +1741:2:2184 +1742:2:2188 +1743:2:2189 +1744:2:2197 +1745:2:2198 +1746:2:2202 +1747:2:2203 +1748:2:2211 +1749:2:2216 +1750:2:2220 +1751:2:2221 +1752:2:2228 +1753:2:2229 +1754:2:2240 +1755:2:2241 +1756:2:2242 +1757:2:2253 +1758:2:2258 +1759:2:2259 +1760:0:3013 +1761:2:2271 +1762:0:3013 +1763:2:2274 +1764:2:2275 +1765:2:2287 +1766:2:2288 +1767:2:2292 +1768:2:2293 +1769:2:2301 +1770:2:2306 +1771:2:2310 +1772:2:2311 +1773:2:2318 +1774:2:2319 +1775:2:2330 +1776:2:2331 +1777:2:2332 +1778:2:2343 +1779:2:2348 +1780:2:2349 +1781:0:3013 +1782:2:2361 +1783:0:3013 +1784:2:2362 +1785:0:3013 +1786:2:2363 +1787:0:3013 +1788:2:2364 +1789:0:3013 +1790:2:2365 +1791:2:2369 +1792:2:2370 +1793:2:2378 +1794:2:2379 +1795:2:2383 +1796:2:2384 +1797:2:2392 +1798:2:2397 +1799:2:2401 +1800:2:2402 +1801:2:2409 +1802:2:2410 +1803:2:2421 +1804:2:2422 +1805:2:2423 +1806:2:2434 +1807:2:2439 +1808:2:2440 +1809:0:3013 +1810:2:2650 +1811:0:3013 +1812:2:2746 +1813:0:3013 +1814:2:2747 +1815:0:3013 +1816:2:2751 +1817:0:3013 +1818:2:2757 +1819:0:3013 +1820:2:2761 +1821:2:2762 +1822:2:2766 +1823:2:2770 +1824:2:2771 +1825:2:2775 +1826:2:2783 +1827:2:2784 +1828:2:2789 +1829:2:2796 +1830:2:2797 +1831:2:2804 +1832:2:2809 +1833:0:3013 +1834:2:2820 +1835:0:3013 +1836:2:2824 +1837:2:2825 +1838:2:2829 +1839:2:2833 +1840:2:2834 +1841:2:2838 +1842:2:2846 +1843:2:2847 +1844:2:2852 +1845:2:2859 +1846:2:2860 +1847:2:2867 +1848:2:2872 +1849:0:3013 +1850:2:2883 +1851:0:3013 +1852:2:2891 +1853:2:2892 +1854:2:2896 +1855:2:2900 +1856:2:2901 +1857:2:2905 +1858:2:2913 +1859:2:2914 +1860:2:2919 +1861:2:2926 +1862:2:2927 +1863:2:2934 +1864:2:2939 +1865:0:3013 +1866:2:2954 +1867:0:3013 +1868:2:2955 +1869:0:3013 +1870:2:2958 +1871:0:3013 +1872:2:2963 +1873:0:3013 +1874:1:568 +1875:1:572 +1876:1:573 +1877:1:581 +1878:1:582 +1879:1:586 +1880:1:587 +1881:1:595 +1882:1:600 +1883:1:604 +1884:1:605 +1885:1:612 +1886:1:613 +1887:1:624 +1888:1:625 +1889:1:626 +1890:1:637 +1891:1:642 +1892:1:643 +1893:0:3013 +1894:2:2964 +1895:0:3013 +1896:1:655 +1897:0:3011 +1898:2:2963 +1899:0:3017 +1900:1:655 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_nested.define b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_nested.define new file mode 100644 index 0000000..e69de29 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_nested.log b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_nested.log new file mode 100644 index 0000000..708dee2 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_nested.log @@ -0,0 +1,415 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_free_nested.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 566) +Depth= 4234 States= 1e+06 Transitions= 1.7e+07 Memory= 527.287 t= 31.2 R= 3e+04 +Depth= 4234 States= 2e+06 Transitions= 3.44e+07 Memory= 588.322 t= 63.7 R= 3e+04 +Depth= 4234 States= 3e+06 Transitions= 5.2e+07 Memory= 649.358 t= 96.8 R= 3e+04 +pan: resizing hashtable to -w22.. done +Depth= 4234 States= 4e+06 Transitions= 6.97e+07 Memory= 741.416 t= 130 R= 3e+04 + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 4234, errors: 0 + 4027146 states, stored + 66145121 states, matched + 70172267 transitions (= stored+matched) +2.6437688e+08 atomic steps +hash conflicts: 47318190 (resolved) + +Stats on memory usage (in Megabytes): + 322.609 equivalent memory usage for states (stored*(State-vector + overhead)) + 253.418 actual memory usage for states (compression: 78.55%) + state-vector as stored = 38 byte + 28 byte overhead + 32.000 memory used for hash table (-w22) + 457.764 memory used for DFS stack (-m10000000) + 743.076 total actual memory usage + +unreached in proctype urcu_reader + line 288, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 61, "(1)" + line 307, "pan.___", state 91, "(1)" + line 288, "pan.___", state 104, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 136, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 149, "(1)" + line 307, "pan.___", state 179, "(1)" + line 288, "pan.___", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 225, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 238, "(1)" + line 307, "pan.___", state 268, "(1)" + line 158, "pan.___", state 289, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 158, "pan.___", state 291, "(1)" + line 162, "pan.___", state 298, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 162, "pan.___", state 300, "(1)" + line 162, "pan.___", state 301, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 162, "pan.___", state 301, "else" + line 160, "pan.___", state 306, "((j<1))" + line 160, "pan.___", state 306, "((j>=1))" + line 166, "pan.___", state 311, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 143, "pan.___", state 321, "(1)" + line 147, "pan.___", state 329, "(1)" + line 147, "pan.___", state 330, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 147, "pan.___", state 330, "else" + line 145, "pan.___", state 335, "((j<1))" + line 145, "pan.___", state 335, "((j>=1))" + line 151, "pan.___", state 341, "(1)" + line 151, "pan.___", state 342, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 151, "pan.___", state 342, "else" + line 153, "pan.___", state 345, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 153, "pan.___", state 345, "else" + line 185, "pan.___", state 347, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 185, "pan.___", state 347, "else" + line 158, "pan.___", state 352, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 166, "pan.___", state 374, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 151, "pan.___", state 404, "(1)" + line 151, "pan.___", state 405, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 158, "pan.___", state 419, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 158, "pan.___", state 421, "(1)" + line 162, "pan.___", state 428, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 162, "pan.___", state 430, "(1)" + line 162, "pan.___", state 431, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 162, "pan.___", state 431, "else" + line 160, "pan.___", state 436, "((j<1))" + line 160, "pan.___", state 436, "((j>=1))" + line 166, "pan.___", state 441, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 143, "pan.___", state 451, "(1)" + line 147, "pan.___", state 459, "(1)" + line 147, "pan.___", state 460, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 147, "pan.___", state 460, "else" + line 145, "pan.___", state 465, "((j<1))" + line 145, "pan.___", state 465, "((j>=1))" + line 151, "pan.___", state 471, "(1)" + line 151, "pan.___", state 472, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 151, "pan.___", state 472, "else" + line 153, "pan.___", state 475, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 153, "pan.___", state 475, "else" + line 185, "pan.___", state 477, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 185, "pan.___", state 477, "else" + line 288, "pan.___", state 492, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 524, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 537, "(1)" + line 307, "pan.___", state 567, "(1)" + line 288, "pan.___", state 580, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 612, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 625, "(1)" + line 307, "pan.___", state 655, "(1)" + line 288, "pan.___", state 668, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 713, "(1)" + line 307, "pan.___", state 743, "(1)" + line 158, "pan.___", state 758, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 158, "pan.___", state 760, "(1)" + line 162, "pan.___", state 767, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 162, "pan.___", state 769, "(1)" + line 162, "pan.___", state 770, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 162, "pan.___", state 770, "else" + line 160, "pan.___", state 775, "((j<1))" + line 160, "pan.___", state 775, "((j>=1))" + line 166, "pan.___", state 780, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 143, "pan.___", state 790, "(1)" + line 147, "pan.___", state 798, "(1)" + line 147, "pan.___", state 799, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 147, "pan.___", state 799, "else" + line 145, "pan.___", state 804, "((j<1))" + line 145, "pan.___", state 804, "((j>=1))" + line 151, "pan.___", state 810, "(1)" + line 151, "pan.___", state 811, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 151, "pan.___", state 811, "else" + line 153, "pan.___", state 814, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 153, "pan.___", state 814, "else" + line 185, "pan.___", state 816, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 185, "pan.___", state 816, "else" + line 158, "pan.___", state 821, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 166, "pan.___", state 843, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 151, "pan.___", state 873, "(1)" + line 151, "pan.___", state 874, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 158, "pan.___", state 888, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 158, "pan.___", state 890, "(1)" + line 162, "pan.___", state 897, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 162, "pan.___", state 899, "(1)" + line 162, "pan.___", state 900, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 162, "pan.___", state 900, "else" + line 160, "pan.___", state 905, "((j<1))" + line 160, "pan.___", state 905, "((j>=1))" + line 166, "pan.___", state 910, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 143, "pan.___", state 920, "(1)" + line 147, "pan.___", state 928, "(1)" + line 147, "pan.___", state 929, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 147, "pan.___", state 929, "else" + line 145, "pan.___", state 934, "((j<1))" + line 145, "pan.___", state 934, "((j>=1))" + line 151, "pan.___", state 940, "(1)" + line 151, "pan.___", state 941, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 151, "pan.___", state 941, "else" + line 153, "pan.___", state 944, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 153, "pan.___", state 944, "else" + line 185, "pan.___", state 946, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 185, "pan.___", state 946, "else" + line 288, "pan.___", state 956, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 988, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 1001, "(1)" + line 307, "pan.___", state 1031, "(1)" + line 288, "pan.___", state 1052, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 1084, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 1097, "(1)" + line 307, "pan.___", state 1127, "(1)" + line 433, "pan.___", state 1140, "-end-" + (125 of 1140 states) +unreached in proctype urcu_writer + line 288, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 292, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 59, "(1)" + line 302, "pan.___", state 72, "(1)" + line 307, "pan.___", state 89, "(1)" + line 288, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 292, "pan.___", state 120, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 151, "(1)" + line 302, "pan.___", state 164, "(1)" + line 467, "pan.___", state 195, "(1)" + line 158, "pan.___", state 205, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 162, "pan.___", state 214, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 143, "pan.___", state 237, "(1)" + line 147, "pan.___", state 245, "(1)" + line 151, "pan.___", state 257, "(1)" + line 158, "pan.___", state 268, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 297, "pan.___", state 910, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 923, "(1)" + line 298, "pan.___", state 924, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 298, "pan.___", state 924, "else" + line 298, "pan.___", state 927, "(1)" + line 298, "pan.___", state 928, "(1)" + line 298, "pan.___", state 928, "(1)" + line 302, "pan.___", state 936, "(1)" + line 302, "pan.___", state 937, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 302, "pan.___", state 937, "else" + line 302, "pan.___", state 940, "(1)" + line 302, "pan.___", state 941, "(1)" + line 302, "pan.___", state 941, "(1)" + line 300, "pan.___", state 946, "((i<1))" + line 300, "pan.___", state 946, "((i>=1))" + line 307, "pan.___", state 953, "(1)" + line 307, "pan.___", state 954, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 307, "pan.___", state 954, "else" + line 307, "pan.___", state 957, "(1)" + line 307, "pan.___", state 958, "(1)" + line 307, "pan.___", state 958, "(1)" + line 309, "pan.___", state 961, "(1)" + line 309, "pan.___", state 961, "(1)" + line 292, "pan.___", state 990, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 1008, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 302, "pan.___", state 1034, "(1)" + line 307, "pan.___", state 1051, "(1)" + line 292, "pan.___", state 1078, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 1096, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 302, "pan.___", state 1122, "(1)" + line 307, "pan.___", state 1139, "(1)" + line 288, "pan.___", state 1156, "(1)" + line 292, "pan.___", state 1168, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 1186, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 302, "pan.___", state 1212, "(1)" + line 307, "pan.___", state 1229, "(1)" + line 292, "pan.___", state 1259, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 297, "pan.___", state 1277, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 302, "pan.___", state 1303, "(1)" + line 307, "pan.___", state 1320, "(1)" + line 162, "pan.___", state 1342, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 166, "pan.___", state 1355, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 143, "pan.___", state 1365, "(1)" + line 147, "pan.___", state 1373, "(1)" + line 151, "pan.___", state 1385, "(1)" + line 158, "pan.___", state 1396, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 297, "pan.___", state 1571, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 1584, "(1)" + line 298, "pan.___", state 1585, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 298, "pan.___", state 1585, "else" + line 298, "pan.___", state 1588, "(1)" + line 298, "pan.___", state 1589, "(1)" + line 298, "pan.___", state 1589, "(1)" + line 302, "pan.___", state 1597, "(1)" + line 302, "pan.___", state 1598, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 302, "pan.___", state 1598, "else" + line 302, "pan.___", state 1601, "(1)" + line 302, "pan.___", state 1602, "(1)" + line 302, "pan.___", state 1602, "(1)" + line 300, "pan.___", state 1607, "((i<1))" + line 300, "pan.___", state 1607, "((i>=1))" + line 307, "pan.___", state 1614, "(1)" + line 307, "pan.___", state 1615, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 307, "pan.___", state 1615, "else" + line 307, "pan.___", state 1618, "(1)" + line 307, "pan.___", state 1619, "(1)" + line 307, "pan.___", state 1619, "(1)" + line 309, "pan.___", state 1622, "(1)" + line 309, "pan.___", state 1622, "(1)" + line 162, "pan.___", state 1646, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 166, "pan.___", state 1659, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 143, "pan.___", state 1669, "(1)" + line 147, "pan.___", state 1677, "(1)" + line 151, "pan.___", state 1689, "(1)" + line 158, "pan.___", state 1700, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb(i, j) +{ + if + :: get_pid() >= NR_READERS -> + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); + :: else -> skip; + fi; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +#define get_readerid() (get_pid()) +#define get_writerid() (get_readerid() + NR_READERS) + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb(i, j); +#else + ooo_mem(i); +#endif + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + ooo_mem(i); + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + ooo_mem(i); + data_access[get_readerid()] = 1; + ooo_mem(i); + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + ooo_mem(i); + //smp_mc(i); /* added */ +} + +active [NR_READERS] proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS + /* Only test progress of one random reader. They are all the + * same. */ + atomic { + if + :: get_readerid() == 0 -> +progress_reader: + skip; + :: else -> + skip; + fi; + } +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb(i, j); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb(i, j); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + skip; + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_nested.spin.input.trail b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_nested.spin.input.trail new file mode 100644 index 0000000..2cefe6b --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_nested.spin.input.trail @@ -0,0 +1,7 @@ +-2:3:-2 +-4:-4:-4 +1:0:2679 +2:1:2673 +3:1:2674 +4:0:2679 +5:3:1129 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.define b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.define new file mode 100644 index 0000000..136ef67 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.define @@ -0,0 +1,2 @@ +#define NO_RMB +#define NO_WMB diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.log b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.log new file mode 100644 index 0000000..c722840 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.log @@ -0,0 +1,16 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_free_no_mb.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +spin: line 291 "pan.___", Error: syntax error saw 'operator: =' +spin: line 291 "pan.___", Error: syntax error saw 'operator: =' +spin: 2 error(s) - aborting +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.spin.input b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.spin.input new file mode 100644 index 0000000..1346c4e --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.spin.input @@ -0,0 +1,533 @@ +#define NO_RMB +#define NO_WMB + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + + +#if (NR_READERS == 1) + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#elif (NR_READERS == 2) + +#define read_free_race (read_generation[0] == last_free_gen || read_generation[1] == last_free_gen) +#define read_free (free_done && (data_access[0] || data_access[1])) + +#else + +#error "Too many readers" + +#endif + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +#define get_pid() (_pid) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb(i, j) +{ + if + :: get_pid() >= NR_READERS -> + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); + :: else -> skip; + fi; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +#define get_readerid() (get_pid()) +#define get_writerid() (get_readerid() + NR_READERS) + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb(i, j); +#else + ooo_mem(i); +#endif + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + ooo_mem(i); + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + ooo_mem(i); + data_access[get_readerid()] = 1; + ooo_mem(i); + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + ooo_mem(i); + //smp_mc(i); /* added */ +} + +active [NR_READERS] proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS + /* Only test progress of one random reader. They are all the + * same. */ + atomic { + if + :: get_readerid() == 0 -> +progress_reader: + skip; + :: else -> + skip; + fi; + } +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb(i, j); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb(i, j); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + skip; + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.spin.input.trail b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.spin.input.trail new file mode 100644 index 0000000..3d2a95e --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.spin.input.trail @@ -0,0 +1,2082 @@ +-2:3:-2 +-4:-4:-4 +1:0:3537 +2:3:3489 +3:3:3492 +4:3:3492 +5:3:3495 +6:3:3503 +7:3:3503 +8:3:3506 +9:3:3512 +10:3:3516 +11:3:3516 +12:3:3519 +13:3:3527 +14:3:3531 +15:3:3532 +16:0:3537 +17:3:3534 +18:0:3537 +19:2:1310 +20:0:3537 +21:2:1316 +22:0:3537 +23:2:1317 +24:0:3537 +25:2:1318 +26:2:1322 +27:2:1323 +28:2:1331 +29:2:1332 +30:2:1336 +31:2:1337 +32:2:1345 +33:2:1350 +34:2:1354 +35:2:1355 +36:2:1362 +37:2:1363 +38:2:1374 +39:2:1375 +40:2:1376 +41:2:1387 +42:2:1392 +43:2:1393 +44:0:3537 +45:2:1405 +46:2:1406 +47:0:3537 +48:2:1410 +49:2:1414 +50:2:1415 +51:2:1423 +52:2:1424 +53:2:1428 +54:2:1429 +55:2:1437 +56:2:1442 +57:2:1443 +58:2:1454 +59:2:1455 +60:2:1466 +61:2:1467 +62:2:1468 +63:2:1479 +64:2:1484 +65:2:1485 +66:0:3537 +67:2:1497 +68:0:3537 +69:2:1498 +70:0:3537 +71:2:1508 +72:0:3537 +73:2:1509 +74:0:3537 +75:2:1510 +76:2:1514 +77:2:1515 +78:2:1523 +79:2:1524 +80:2:1528 +81:2:1529 +82:2:1537 +83:2:1542 +84:2:1546 +85:2:1547 +86:2:1554 +87:2:1555 +88:2:1566 +89:2:1567 +90:2:1568 +91:2:1579 +92:2:1584 +93:2:1585 +94:0:3537 +95:2:1600 +96:0:3537 +97:2:1601 +98:2:1605 +99:2:1606 +100:2:1614 +101:2:1615 +102:2:1619 +103:2:1620 +104:2:1628 +105:2:1633 +106:2:1637 +107:2:1638 +108:2:1645 +109:2:1646 +110:2:1657 +111:2:1658 +112:2:1659 +113:2:1670 +114:2:1675 +115:2:1676 +116:0:3537 +117:2:1691 +118:0:3537 +119:2:1696 +120:2:1700 +121:2:1701 +122:2:1709 +123:2:1710 +124:2:1714 +125:2:1715 +126:2:1723 +127:2:1728 +128:2:1732 +129:2:1733 +130:2:1740 +131:2:1741 +132:2:1752 +133:2:1753 +134:2:1754 +135:2:1765 +136:2:1770 +137:2:1771 +138:0:3537 +139:2:1790 +140:0:3537 +141:2:1791 +142:2:1795 +143:2:1796 +144:2:1804 +145:2:1805 +146:2:1809 +147:2:1810 +148:2:1818 +149:2:1823 +150:2:1827 +151:2:1828 +152:2:1835 +153:2:1836 +154:2:1847 +155:2:1848 +156:2:1849 +157:2:1860 +158:2:1865 +159:2:1866 +160:0:3537 +161:2:1878 +162:0:3537 +163:2:1881 +164:2:1882 +165:2:1894 +166:2:1895 +167:2:1899 +168:2:1900 +169:2:1908 +170:2:1913 +171:2:1917 +172:2:1918 +173:2:1925 +174:2:1926 +175:2:1937 +176:2:1938 +177:2:1939 +178:2:1950 +179:2:1955 +180:2:1956 +181:0:3537 +182:2:1968 +183:0:3537 +184:2:1969 +185:0:3537 +186:2:1970 +187:0:3537 +188:2:1971 +189:0:3537 +190:2:1972 +191:2:1976 +192:2:1977 +193:2:1985 +194:2:1986 +195:2:1990 +196:2:1991 +197:2:1999 +198:2:2004 +199:2:2008 +200:2:2009 +201:2:2016 +202:2:2017 +203:2:2028 +204:2:2029 +205:2:2030 +206:2:2041 +207:2:2046 +208:2:2047 +209:0:3537 +210:2:2341 +211:0:3537 +212:2:2437 +213:0:3537 +214:2:2438 +215:0:3537 +216:2:2442 +217:0:3537 +218:2:2448 +219:2:2452 +220:2:2453 +221:2:2461 +222:2:2462 +223:2:2466 +224:2:2467 +225:2:2475 +226:2:2480 +227:2:2484 +228:2:2485 +229:2:2492 +230:2:2493 +231:2:2504 +232:2:2505 +233:2:2506 +234:2:2517 +235:2:2522 +236:2:2523 +237:0:3537 +238:2:2535 +239:0:3537 +240:2:2536 +241:2:2540 +242:2:2541 +243:2:2549 +244:2:2550 +245:2:2554 +246:2:2555 +247:2:2563 +248:2:2568 +249:2:2572 +250:2:2573 +251:2:2580 +252:2:2581 +253:2:2592 +254:2:2593 +255:2:2594 +256:2:2605 +257:2:2610 +258:2:2611 +259:0:3537 +260:2:2623 +261:0:3537 +262:2:2626 +263:2:2627 +264:2:2639 +265:2:2640 +266:2:2644 +267:2:2645 +268:2:2653 +269:2:2658 +270:2:2662 +271:2:2663 +272:2:2670 +273:2:2671 +274:2:2682 +275:2:2683 +276:2:2684 +277:2:2695 +278:2:2700 +279:2:2701 +280:0:3537 +281:2:2713 +282:0:3537 +283:2:2714 +284:0:3537 +285:2:2715 +286:0:3537 +287:2:2716 +288:0:3537 +289:2:2717 +290:2:2721 +291:2:2722 +292:2:2730 +293:2:2731 +294:2:2735 +295:2:2736 +296:2:2744 +297:2:2749 +298:2:2753 +299:2:2754 +300:2:2761 +301:2:2762 +302:2:2773 +303:2:2774 +304:2:2775 +305:2:2786 +306:2:2791 +307:2:2792 +308:0:3537 +309:2:3086 +310:0:3537 +311:2:3182 +312:0:3537 +313:2:3183 +314:0:3537 +315:2:3187 +316:0:3537 +317:2:3193 +318:0:3537 +319:2:3194 +320:2:3198 +321:2:3199 +322:2:3207 +323:2:3208 +324:2:3212 +325:2:3213 +326:2:3221 +327:2:3226 +328:2:3230 +329:2:3231 +330:2:3238 +331:2:3239 +332:2:3250 +333:2:3251 +334:2:3252 +335:2:3263 +336:2:3268 +337:2:3269 +338:0:3537 +339:2:3284 +340:0:3537 +341:2:3285 +342:2:3289 +343:2:3290 +344:2:3298 +345:2:3299 +346:2:3303 +347:2:3304 +348:2:3312 +349:2:3317 +350:2:3321 +351:2:3322 +352:2:3329 +353:2:3330 +354:2:3341 +355:2:3342 +356:2:3343 +357:2:3354 +358:2:3359 +359:2:3360 +360:0:3537 +361:2:3375 +362:0:3537 +363:2:3380 +364:2:3384 +365:2:3385 +366:2:3393 +367:2:3394 +368:2:3398 +369:2:3399 +370:2:3407 +371:2:3412 +372:2:3416 +373:2:3417 +374:2:3424 +375:2:3425 +376:2:3436 +377:2:3437 +378:2:3438 +379:2:3449 +380:2:3454 +381:2:3455 +382:0:3537 +383:2:3474 +384:0:3537 +385:2:3475 +386:0:3537 +387:2:1317 +388:0:3537 +389:2:1318 +390:2:1322 +391:2:1323 +392:2:1331 +393:2:1332 +394:2:1336 +395:2:1337 +396:2:1345 +397:2:1350 +398:2:1354 +399:2:1355 +400:2:1362 +401:2:1363 +402:2:1374 +403:2:1375 +404:2:1376 +405:2:1387 +406:2:1392 +407:2:1393 +408:0:3537 +409:2:1405 +410:2:1406 +411:0:3537 +412:2:1410 +413:2:1414 +414:2:1415 +415:2:1423 +416:2:1424 +417:2:1428 +418:2:1429 +419:2:1437 +420:2:1442 +421:2:1443 +422:2:1454 +423:2:1455 +424:2:1466 +425:2:1467 +426:2:1468 +427:2:1479 +428:2:1484 +429:2:1485 +430:0:3537 +431:2:1497 +432:0:3537 +433:2:1498 +434:0:3537 +435:2:1508 +436:0:3537 +437:2:1509 +438:0:3537 +439:2:1510 +440:2:1514 +441:2:1515 +442:2:1523 +443:2:1524 +444:2:1528 +445:2:1529 +446:2:1537 +447:2:1542 +448:2:1546 +449:2:1547 +450:2:1554 +451:2:1555 +452:2:1566 +453:2:1567 +454:2:1568 +455:2:1579 +456:2:1584 +457:2:1585 +458:0:3537 +459:2:1600 +460:0:3537 +461:2:1601 +462:2:1605 +463:2:1606 +464:2:1614 +465:2:1615 +466:2:1619 +467:2:1620 +468:2:1628 +469:2:1633 +470:2:1637 +471:2:1638 +472:2:1645 +473:2:1646 +474:2:1657 +475:2:1658 +476:2:1659 +477:2:1670 +478:2:1675 +479:2:1676 +480:0:3537 +481:2:1691 +482:0:3537 +483:2:1696 +484:2:1700 +485:2:1701 +486:2:1709 +487:2:1710 +488:2:1714 +489:2:1715 +490:2:1723 +491:2:1728 +492:2:1732 +493:2:1733 +494:2:1740 +495:2:1741 +496:2:1752 +497:2:1753 +498:2:1754 +499:2:1765 +500:2:1770 +501:2:1771 +502:0:3537 +503:2:1790 +504:0:3537 +505:2:1791 +506:2:1795 +507:2:1796 +508:2:1804 +509:2:1805 +510:2:1809 +511:2:1810 +512:2:1818 +513:2:1823 +514:2:1827 +515:2:1828 +516:2:1835 +517:2:1836 +518:2:1847 +519:2:1848 +520:2:1849 +521:2:1860 +522:2:1865 +523:2:1866 +524:0:3537 +525:2:1878 +526:0:3537 +527:2:1881 +528:2:1882 +529:2:1894 +530:2:1895 +531:2:1899 +532:2:1900 +533:2:1908 +534:2:1913 +535:2:1917 +536:2:1918 +537:2:1925 +538:2:1926 +539:2:1937 +540:2:1938 +541:2:1939 +542:2:1950 +543:2:1955 +544:2:1956 +545:0:3537 +546:2:1968 +547:0:3537 +548:2:1969 +549:0:3537 +550:2:1970 +551:0:3537 +552:2:1971 +553:0:3537 +554:2:1972 +555:2:1976 +556:2:1977 +557:2:1985 +558:2:1986 +559:2:1990 +560:2:1991 +561:2:1999 +562:2:2004 +563:2:2008 +564:2:2009 +565:2:2016 +566:2:2017 +567:2:2028 +568:2:2029 +569:2:2030 +570:2:2041 +571:2:2046 +572:2:2047 +573:0:3537 +574:2:2341 +575:0:3537 +576:2:2437 +577:0:3537 +578:2:2438 +579:0:3537 +580:2:2442 +581:0:3537 +582:2:2448 +583:2:2452 +584:2:2453 +585:2:2461 +586:2:2462 +587:2:2466 +588:2:2467 +589:2:2475 +590:2:2480 +591:2:2484 +592:2:2485 +593:2:2492 +594:2:2493 +595:2:2504 +596:2:2505 +597:2:2506 +598:2:2517 +599:2:2522 +600:2:2523 +601:0:3537 +602:2:2535 +603:0:3537 +604:2:2536 +605:2:2540 +606:2:2541 +607:2:2549 +608:2:2550 +609:2:2554 +610:2:2555 +611:2:2563 +612:2:2568 +613:2:2572 +614:2:2573 +615:2:2580 +616:2:2581 +617:2:2592 +618:2:2593 +619:2:2594 +620:2:2605 +621:2:2610 +622:2:2611 +623:0:3537 +624:2:2623 +625:0:3537 +626:2:2626 +627:2:2627 +628:2:2639 +629:2:2640 +630:2:2644 +631:2:2645 +632:2:2653 +633:2:2658 +634:2:2662 +635:2:2663 +636:2:2670 +637:2:2671 +638:2:2682 +639:2:2683 +640:2:2684 +641:2:2695 +642:2:2700 +643:2:2701 +644:0:3537 +645:2:2713 +646:0:3537 +647:2:2714 +648:0:3537 +649:2:2715 +650:0:3537 +651:2:2716 +652:0:3537 +653:2:2717 +654:2:2721 +655:2:2722 +656:2:2730 +657:2:2731 +658:2:2735 +659:2:2736 +660:2:2744 +661:2:2749 +662:2:2753 +663:2:2754 +664:2:2761 +665:2:2762 +666:2:2773 +667:2:2774 +668:2:2775 +669:2:2786 +670:2:2791 +671:2:2792 +672:0:3537 +673:2:3086 +674:0:3537 +675:2:3182 +676:0:3537 +677:2:3183 +678:0:3537 +679:2:3187 +680:0:3537 +681:2:3193 +682:0:3537 +683:2:3194 +684:2:3198 +685:2:3199 +686:2:3207 +687:2:3208 +688:2:3212 +689:2:3213 +690:2:3221 +691:2:3226 +692:2:3230 +693:2:3231 +694:2:3238 +695:2:3239 +696:2:3250 +697:2:3251 +698:2:3252 +699:2:3263 +700:2:3268 +701:2:3269 +702:0:3537 +703:2:3284 +704:0:3537 +705:2:3285 +706:2:3289 +707:2:3290 +708:2:3298 +709:2:3299 +710:2:3303 +711:2:3304 +712:2:3312 +713:2:3317 +714:2:3321 +715:2:3322 +716:2:3329 +717:2:3330 +718:2:3341 +719:2:3342 +720:2:3343 +721:2:3354 +722:2:3359 +723:2:3360 +724:0:3537 +725:2:3375 +726:0:3537 +727:2:3380 +728:2:3384 +729:2:3385 +730:2:3393 +731:2:3394 +732:2:3398 +733:2:3399 +734:2:3407 +735:2:3412 +736:2:3416 +737:2:3417 +738:2:3424 +739:2:3425 +740:2:3436 +741:2:3437 +742:2:3438 +743:2:3449 +744:2:3454 +745:2:3455 +746:0:3537 +747:2:3474 +748:0:3537 +749:2:3475 +750:0:3537 +751:2:1317 +752:0:3537 +753:2:1318 +754:2:1322 +755:2:1323 +756:2:1331 +757:2:1332 +758:2:1336 +759:2:1337 +760:2:1345 +761:2:1350 +762:2:1354 +763:2:1355 +764:2:1362 +765:2:1363 +766:2:1374 +767:2:1375 +768:2:1376 +769:2:1387 +770:2:1392 +771:2:1393 +772:0:3537 +773:2:1405 +774:2:1406 +775:0:3537 +776:2:1410 +777:2:1414 +778:2:1415 +779:2:1423 +780:2:1424 +781:2:1428 +782:2:1429 +783:2:1437 +784:2:1442 +785:2:1443 +786:2:1454 +787:2:1455 +788:2:1466 +789:2:1467 +790:2:1468 +791:2:1479 +792:2:1484 +793:2:1485 +794:0:3537 +795:2:1497 +796:0:3537 +797:2:1498 +798:0:3537 +799:2:1508 +800:0:3537 +801:2:1509 +802:0:3537 +803:2:1510 +804:2:1514 +805:2:1515 +806:2:1523 +807:2:1524 +808:2:1528 +809:2:1529 +810:2:1537 +811:2:1542 +812:2:1546 +813:2:1547 +814:2:1554 +815:2:1555 +816:2:1566 +817:2:1567 +818:2:1568 +819:2:1579 +820:2:1584 +821:2:1585 +822:0:3537 +823:2:1600 +824:0:3537 +825:2:1601 +826:2:1605 +827:2:1606 +828:2:1614 +829:2:1615 +830:2:1619 +831:2:1620 +832:2:1628 +833:2:1633 +834:2:1637 +835:2:1638 +836:2:1645 +837:2:1646 +838:2:1657 +839:2:1658 +840:2:1659 +841:2:1670 +842:2:1675 +843:2:1676 +844:0:3537 +845:2:1691 +846:0:3537 +847:2:1696 +848:2:1700 +849:2:1701 +850:2:1709 +851:2:1710 +852:2:1714 +853:2:1715 +854:2:1723 +855:2:1728 +856:2:1732 +857:2:1733 +858:2:1740 +859:2:1741 +860:2:1752 +861:2:1753 +862:2:1754 +863:2:1765 +864:2:1770 +865:2:1771 +866:0:3537 +867:2:1790 +868:0:3537 +869:2:1791 +870:2:1795 +871:2:1796 +872:2:1804 +873:2:1805 +874:2:1809 +875:2:1810 +876:2:1818 +877:2:1823 +878:2:1827 +879:2:1828 +880:2:1835 +881:2:1836 +882:2:1847 +883:2:1848 +884:2:1849 +885:2:1860 +886:2:1865 +887:2:1866 +888:0:3537 +889:2:1878 +890:0:3537 +891:2:1881 +892:2:1882 +893:2:1894 +894:2:1895 +895:2:1899 +896:2:1900 +897:2:1908 +898:2:1913 +899:2:1917 +900:2:1918 +901:2:1925 +902:2:1926 +903:2:1937 +904:2:1938 +905:2:1939 +906:2:1950 +907:2:1955 +908:2:1956 +909:0:3537 +910:2:1968 +911:0:3537 +912:2:1969 +913:0:3537 +914:2:1970 +915:0:3537 +916:2:1971 +917:0:3537 +918:2:1972 +919:2:1976 +920:2:1977 +921:2:1985 +922:2:1986 +923:2:1990 +924:2:1991 +925:2:1999 +926:2:2004 +927:2:2008 +928:2:2009 +929:2:2016 +930:2:2017 +931:2:2028 +932:2:2029 +933:2:2030 +934:2:2041 +935:2:2046 +936:2:2047 +937:0:3537 +938:2:2341 +939:0:3537 +940:2:2437 +941:0:3537 +942:2:2438 +943:0:3537 +944:2:2442 +945:0:3537 +946:2:2448 +947:2:2452 +948:2:2453 +949:2:2461 +950:2:2462 +951:2:2466 +952:2:2467 +953:2:2475 +954:2:2480 +955:2:2484 +956:2:2485 +957:2:2492 +958:2:2493 +959:2:2504 +960:2:2505 +961:2:2506 +962:2:2517 +963:2:2522 +964:2:2523 +965:0:3537 +966:2:2535 +967:0:3537 +968:2:2536 +969:2:2540 +970:2:2541 +971:2:2549 +972:2:2550 +973:2:2554 +974:2:2555 +975:2:2563 +976:2:2568 +977:2:2572 +978:2:2573 +979:2:2580 +980:2:2581 +981:2:2592 +982:2:2593 +983:2:2594 +984:2:2605 +985:2:2610 +986:2:2611 +987:0:3537 +988:2:2623 +989:0:3537 +990:2:2626 +991:2:2627 +992:2:2639 +993:2:2640 +994:2:2644 +995:2:2645 +996:2:2653 +997:2:2658 +998:2:2662 +999:2:2663 +1000:2:2670 +1001:2:2671 +1002:2:2682 +1003:2:2683 +1004:2:2684 +1005:2:2695 +1006:2:2700 +1007:2:2701 +1008:0:3537 +1009:2:2713 +1010:0:3537 +1011:2:2714 +1012:0:3537 +1013:2:2715 +1014:0:3537 +1015:2:2716 +1016:0:3537 +1017:2:2717 +1018:2:2721 +1019:2:2722 +1020:2:2730 +1021:2:2731 +1022:2:2735 +1023:2:2736 +1024:2:2744 +1025:2:2749 +1026:2:2753 +1027:2:2754 +1028:2:2761 +1029:2:2762 +1030:2:2773 +1031:2:2774 +1032:2:2775 +1033:2:2786 +1034:2:2791 +1035:2:2792 +1036:0:3537 +1037:2:3086 +1038:0:3537 +1039:2:3182 +1040:0:3537 +1041:2:3183 +1042:0:3537 +1043:2:3187 +1044:0:3537 +1045:2:3193 +1046:0:3537 +1047:2:3194 +1048:2:3198 +1049:2:3199 +1050:2:3207 +1051:2:3208 +1052:2:3212 +1053:2:3213 +1054:2:3221 +1055:2:3226 +1056:2:3230 +1057:2:3231 +1058:2:3238 +1059:2:3239 +1060:2:3250 +1061:2:3251 +1062:2:3252 +1063:2:3263 +1064:2:3268 +1065:2:3269 +1066:0:3537 +1067:2:3284 +1068:0:3537 +1069:2:3285 +1070:2:3289 +1071:2:3290 +1072:2:3298 +1073:2:3299 +1074:2:3303 +1075:2:3304 +1076:2:3312 +1077:2:3317 +1078:2:3321 +1079:2:3322 +1080:2:3329 +1081:2:3330 +1082:2:3341 +1083:2:3342 +1084:2:3343 +1085:2:3354 +1086:2:3359 +1087:2:3360 +1088:0:3537 +1089:2:3375 +1090:0:3537 +1091:2:3380 +1092:2:3384 +1093:2:3385 +1094:2:3393 +1095:2:3394 +1096:2:3398 +1097:2:3399 +1098:2:3407 +1099:2:3412 +1100:2:3416 +1101:2:3417 +1102:2:3424 +1103:2:3425 +1104:2:3436 +1105:2:3437 +1106:2:3438 +1107:2:3449 +1108:2:3454 +1109:2:3455 +1110:0:3537 +1111:2:3474 +1112:0:3537 +1113:2:3475 +1114:0:3537 +1115:2:1317 +1116:0:3537 +1117:2:1318 +1118:2:1322 +1119:2:1323 +1120:2:1331 +1121:2:1332 +1122:2:1336 +1123:2:1337 +1124:2:1345 +1125:2:1350 +1126:2:1354 +1127:2:1355 +1128:2:1362 +1129:2:1363 +1130:2:1374 +1131:2:1375 +1132:2:1376 +1133:2:1387 +1134:2:1392 +1135:2:1393 +1136:0:3537 +1137:2:1405 +1138:2:1406 +1139:0:3537 +1140:2:1410 +1141:2:1414 +1142:2:1415 +1143:2:1423 +1144:2:1424 +1145:2:1428 +1146:2:1429 +1147:2:1437 +1148:2:1442 +1149:2:1443 +1150:2:1454 +1151:2:1455 +1152:2:1466 +1153:2:1467 +1154:2:1468 +1155:2:1479 +1156:2:1484 +1157:2:1485 +1158:0:3537 +1159:2:1497 +1160:0:3537 +1161:2:1498 +1162:0:3537 +1163:2:1508 +1164:0:3537 +1165:2:1509 +1166:0:3537 +1167:2:1510 +1168:2:1514 +1169:2:1515 +1170:2:1523 +1171:2:1524 +1172:2:1528 +1173:2:1529 +1174:2:1537 +1175:2:1542 +1176:2:1546 +1177:2:1547 +1178:2:1554 +1179:2:1555 +1180:2:1566 +1181:2:1567 +1182:2:1568 +1183:2:1579 +1184:2:1584 +1185:2:1585 +1186:0:3537 +1187:2:1600 +1188:0:3537 +1189:2:1601 +1190:2:1605 +1191:2:1606 +1192:2:1614 +1193:2:1615 +1194:2:1619 +1195:2:1620 +1196:2:1628 +1197:2:1633 +1198:2:1637 +1199:2:1638 +1200:2:1645 +1201:2:1646 +1202:2:1657 +1203:2:1658 +1204:2:1659 +1205:2:1670 +1206:2:1675 +1207:2:1676 +1208:0:3537 +1209:2:1691 +1210:0:3537 +1211:2:1696 +1212:2:1700 +1213:2:1701 +1214:2:1709 +1215:2:1710 +1216:2:1714 +1217:2:1715 +1218:2:1723 +1219:2:1728 +1220:2:1732 +1221:2:1733 +1222:2:1740 +1223:2:1741 +1224:2:1752 +1225:2:1753 +1226:2:1754 +1227:2:1765 +1228:2:1770 +1229:2:1771 +1230:0:3537 +1231:2:1790 +1232:0:3537 +1233:2:1791 +1234:2:1795 +1235:2:1796 +1236:2:1804 +1237:2:1805 +1238:2:1809 +1239:2:1810 +1240:2:1818 +1241:2:1823 +1242:2:1827 +1243:2:1828 +1244:2:1835 +1245:2:1836 +1246:2:1847 +1247:2:1848 +1248:2:1849 +1249:2:1860 +1250:2:1865 +1251:2:1866 +1252:0:3537 +1253:2:1878 +1254:0:3537 +1255:2:1881 +1256:2:1882 +1257:2:1894 +1258:2:1895 +1259:2:1899 +1260:2:1900 +1261:2:1908 +1262:2:1913 +1263:2:1917 +1264:2:1918 +1265:2:1925 +1266:2:1926 +1267:2:1937 +1268:2:1938 +1269:2:1939 +1270:2:1950 +1271:2:1955 +1272:2:1956 +1273:0:3537 +1274:2:1968 +1275:0:3537 +1276:2:1969 +1277:0:3537 +1278:2:1970 +1279:0:3537 +1280:2:1971 +1281:0:3537 +1282:2:1972 +1283:2:1976 +1284:2:1977 +1285:2:1985 +1286:2:1986 +1287:2:1990 +1288:2:1991 +1289:2:1999 +1290:2:2004 +1291:2:2008 +1292:2:2009 +1293:2:2016 +1294:2:2017 +1295:2:2028 +1296:2:2029 +1297:2:2030 +1298:2:2041 +1299:2:2046 +1300:2:2047 +1301:0:3537 +1302:2:2341 +1303:0:3537 +1304:2:2437 +1305:0:3537 +1306:2:2438 +1307:0:3537 +1308:2:2442 +1309:0:3537 +1310:2:2448 +1311:2:2452 +1312:2:2453 +1313:2:2461 +1314:2:2462 +1315:2:2466 +1316:2:2467 +1317:2:2475 +1318:2:2480 +1319:2:2484 +1320:2:2485 +1321:2:2492 +1322:2:2493 +1323:2:2504 +1324:2:2505 +1325:2:2506 +1326:2:2517 +1327:2:2522 +1328:2:2523 +1329:0:3537 +1330:2:2535 +1331:0:3537 +1332:2:2536 +1333:2:2540 +1334:2:2541 +1335:2:2549 +1336:2:2550 +1337:2:2554 +1338:2:2555 +1339:2:2563 +1340:2:2568 +1341:2:2572 +1342:2:2573 +1343:2:2580 +1344:2:2581 +1345:2:2592 +1346:2:2593 +1347:2:2594 +1348:2:2605 +1349:2:2610 +1350:2:2611 +1351:0:3537 +1352:2:2623 +1353:0:3537 +1354:2:2626 +1355:2:2627 +1356:2:2639 +1357:2:2640 +1358:2:2644 +1359:2:2645 +1360:2:2653 +1361:2:2658 +1362:2:2662 +1363:2:2663 +1364:2:2670 +1365:2:2671 +1366:2:2682 +1367:2:2683 +1368:2:2684 +1369:2:2695 +1370:2:2700 +1371:2:2701 +1372:0:3537 +1373:2:2713 +1374:0:3537 +1375:2:2714 +1376:0:3537 +1377:2:2715 +1378:0:3537 +1379:2:2716 +1380:0:3537 +1381:2:2717 +1382:2:2721 +1383:2:2722 +1384:2:2730 +1385:2:2731 +1386:2:2735 +1387:2:2736 +1388:2:2744 +1389:2:2749 +1390:2:2753 +1391:2:2754 +1392:2:2761 +1393:2:2762 +1394:2:2773 +1395:2:2774 +1396:2:2775 +1397:2:2786 +1398:2:2791 +1399:2:2792 +1400:0:3537 +1401:2:3086 +1402:0:3537 +1403:2:3182 +1404:0:3537 +1405:2:3183 +1406:0:3537 +1407:2:3187 +1408:0:3537 +1409:2:3193 +1410:0:3537 +1411:2:3194 +1412:2:3198 +1413:2:3199 +1414:2:3207 +1415:2:3208 +1416:2:3212 +1417:2:3213 +1418:2:3221 +1419:2:3226 +1420:2:3230 +1421:2:3231 +1422:2:3238 +1423:2:3239 +1424:2:3250 +1425:2:3251 +1426:2:3252 +1427:2:3263 +1428:2:3268 +1429:2:3269 +1430:0:3537 +1431:2:3284 +1432:0:3537 +1433:2:3285 +1434:2:3289 +1435:2:3290 +1436:2:3298 +1437:2:3299 +1438:2:3303 +1439:2:3304 +1440:2:3312 +1441:2:3317 +1442:2:3321 +1443:2:3322 +1444:2:3329 +1445:2:3330 +1446:2:3341 +1447:2:3342 +1448:2:3343 +1449:2:3354 +1450:2:3359 +1451:2:3360 +1452:0:3537 +1453:2:3375 +1454:0:3537 +1455:2:3380 +1456:2:3384 +1457:2:3385 +1458:2:3393 +1459:2:3394 +1460:2:3398 +1461:2:3399 +1462:2:3407 +1463:2:3412 +1464:2:3416 +1465:2:3417 +1466:2:3424 +1467:2:3425 +1468:2:3436 +1469:2:3437 +1470:2:3438 +1471:2:3449 +1472:2:3454 +1473:2:3455 +1474:0:3537 +1475:2:3474 +1476:0:3537 +1477:2:3475 +1478:0:3537 +1479:2:1317 +1480:0:3537 +1481:2:1318 +1482:2:1322 +1483:2:1323 +1484:2:1331 +1485:2:1332 +1486:2:1336 +1487:2:1337 +1488:2:1345 +1489:2:1350 +1490:2:1354 +1491:2:1355 +1492:2:1362 +1493:2:1363 +1494:2:1374 +1495:2:1375 +1496:2:1376 +1497:2:1387 +1498:2:1392 +1499:2:1393 +1500:0:3537 +1501:2:1405 +1502:2:1406 +1503:0:3537 +1504:2:1410 +1505:2:1414 +1506:2:1415 +1507:2:1423 +1508:2:1424 +1509:2:1428 +1510:2:1429 +1511:2:1437 +1512:2:1450 +1513:2:1451 +1514:2:1454 +1515:2:1455 +1516:2:1466 +1517:2:1467 +1518:2:1468 +1519:2:1479 +1520:2:1484 +1521:2:1487 +1522:2:1488 +1523:0:3537 +1524:2:1497 +1525:0:3537 +1526:2:1498 +1527:0:3537 +1528:2:1508 +1529:0:3537 +1530:2:1509 +1531:0:3537 +1532:2:1510 +1533:2:1514 +1534:2:1515 +1535:2:1523 +1536:2:1524 +1537:2:1528 +1538:2:1529 +1539:2:1537 +1540:2:1550 +1541:2:1551 +1542:2:1554 +1543:2:1555 +1544:2:1566 +1545:2:1567 +1546:2:1568 +1547:2:1579 +1548:2:1584 +1549:2:1587 +1550:2:1588 +1551:0:3537 +1552:2:1600 +1553:0:3537 +1554:2:1601 +1555:2:1605 +1556:2:1606 +1557:2:1614 +1558:2:1615 +1559:2:1619 +1560:2:1620 +1561:2:1628 +1562:2:1641 +1563:2:1642 +1564:2:1645 +1565:2:1646 +1566:2:1657 +1567:2:1658 +1568:2:1659 +1569:2:1670 +1570:2:1675 +1571:2:1678 +1572:2:1679 +1573:0:3537 +1574:2:1691 +1575:0:3537 +1576:2:1696 +1577:2:1700 +1578:2:1701 +1579:2:1709 +1580:2:1710 +1581:2:1714 +1582:2:1715 +1583:2:1723 +1584:2:1736 +1585:2:1737 +1586:2:1740 +1587:2:1741 +1588:2:1752 +1589:2:1753 +1590:2:1754 +1591:2:1765 +1592:2:1770 +1593:2:1773 +1594:2:1774 +1595:0:3537 +1596:2:1790 +1597:0:3537 +1598:2:1791 +1599:2:1795 +1600:2:1796 +1601:2:1804 +1602:2:1805 +1603:2:1809 +1604:2:1810 +1605:2:1818 +1606:2:1831 +1607:2:1832 +1608:2:1835 +1609:2:1836 +1610:2:1847 +1611:2:1848 +1612:2:1849 +1613:2:1860 +1614:2:1865 +1615:2:1868 +1616:2:1869 +1617:0:3537 +1618:2:1878 +1619:0:3537 +1620:2:1881 +1621:2:1882 +1622:2:1894 +1623:2:1895 +1624:2:1899 +1625:2:1900 +1626:2:1908 +1627:2:1921 +1628:2:1922 +1629:2:1925 +1630:2:1926 +1631:2:1937 +1632:2:1938 +1633:2:1939 +1634:2:1950 +1635:2:1955 +1636:2:1958 +1637:2:1959 +1638:0:3537 +1639:2:1968 +1640:0:3537 +1641:2:1969 +1642:0:3537 +1643:2:1970 +1644:0:3537 +1645:2:1971 +1646:0:3537 +1647:2:1972 +1648:2:1976 +1649:2:1977 +1650:2:1985 +1651:2:1986 +1652:2:1990 +1653:2:1991 +1654:2:1999 +1655:2:2012 +1656:2:2013 +1657:2:2016 +1658:2:2017 +1659:2:2028 +1660:2:2029 +1661:2:2030 +1662:2:2041 +1663:2:2046 +1664:2:2049 +1665:2:2050 +1666:0:3537 +1667:2:2341 +1668:0:3537 +1669:2:2437 +1670:0:3537 +1671:2:2438 +1672:0:3537 +1673:2:2442 +1674:0:3537 +1675:2:2448 +1676:2:2452 +1677:2:2453 +1678:2:2461 +1679:2:2462 +1680:2:2466 +1681:2:2467 +1682:2:2475 +1683:2:2488 +1684:2:2489 +1685:2:2492 +1686:2:2493 +1687:2:2504 +1688:2:2505 +1689:2:2506 +1690:2:2517 +1691:2:2522 +1692:2:2525 +1693:2:2526 +1694:0:3537 +1695:2:2535 +1696:0:3537 +1697:2:2536 +1698:2:2540 +1699:2:2541 +1700:2:2549 +1701:2:2550 +1702:2:2554 +1703:2:2555 +1704:2:2563 +1705:2:2576 +1706:2:2577 +1707:2:2580 +1708:2:2581 +1709:2:2592 +1710:2:2593 +1711:2:2594 +1712:2:2605 +1713:2:2610 +1714:2:2613 +1715:2:2614 +1716:0:3537 +1717:2:2623 +1718:0:3537 +1719:2:2626 +1720:2:2627 +1721:2:2639 +1722:2:2640 +1723:2:2644 +1724:2:2645 +1725:2:2653 +1726:2:2666 +1727:2:2667 +1728:2:2670 +1729:2:2671 +1730:2:2682 +1731:2:2683 +1732:2:2684 +1733:2:2695 +1734:2:2700 +1735:2:2703 +1736:2:2704 +1737:0:3537 +1738:2:2713 +1739:0:3537 +1740:2:2714 +1741:0:3537 +1742:2:2715 +1743:0:3537 +1744:2:2716 +1745:0:3537 +1746:2:2717 +1747:2:2721 +1748:2:2722 +1749:2:2730 +1750:2:2731 +1751:2:2735 +1752:2:2736 +1753:2:2744 +1754:2:2757 +1755:2:2758 +1756:2:2761 +1757:2:2762 +1758:2:2773 +1759:2:2774 +1760:2:2775 +1761:2:2786 +1762:2:2791 +1763:2:2794 +1764:2:2795 +1765:0:3537 +1766:2:3086 +1767:0:3537 +1768:2:3182 +1769:0:3537 +1770:2:3183 +1771:0:3537 +1772:2:3187 +1773:0:3537 +1774:2:3193 +1775:0:3537 +1776:2:3194 +1777:2:3198 +1778:2:3199 +1779:2:3207 +1780:2:3208 +1781:2:3212 +1782:2:3213 +1783:2:3221 +1784:2:3234 +1785:2:3235 +1786:2:3238 +1787:2:3239 +1788:2:3250 +1789:2:3251 +1790:2:3252 +1791:2:3263 +1792:2:3268 +1793:2:3271 +1794:2:3272 +1795:0:3537 +1796:2:3284 +1797:0:3537 +1798:2:3285 +1799:2:3289 +1800:2:3290 +1801:2:3298 +1802:2:3299 +1803:2:3303 +1804:2:3304 +1805:2:3312 +1806:2:3325 +1807:2:3326 +1808:2:3329 +1809:2:3330 +1810:2:3341 +1811:2:3342 +1812:2:3343 +1813:2:3354 +1814:2:3359 +1815:2:3362 +1816:2:3363 +1817:0:3537 +1818:2:3375 +1819:0:3537 +1820:2:3380 +1821:2:3384 +1822:2:3385 +1823:2:3393 +1824:2:3394 +1825:2:3398 +1826:2:3399 +1827:2:3407 +1828:2:3420 +1829:2:3421 +1830:2:3424 +1831:2:3425 +1832:2:3436 +1833:2:3437 +1834:2:3438 +1835:2:3449 +1836:2:3454 +1837:2:3457 +1838:2:3458 +1839:0:3537 +1840:2:3474 +1841:0:3537 +1842:2:3475 +1843:0:3537 +1844:2:3478 +1845:0:3537 +1846:2:3483 +1847:0:3537 +1848:1:2 +1849:0:3537 +1850:2:3484 +1851:0:3537 +1852:1:8 +1853:0:3537 +1854:2:3483 +1855:0:3537 +1856:1:9 +1857:0:3537 +1858:2:3484 +1859:0:3537 +1860:1:10 +1861:0:3537 +1862:2:3483 +1863:0:3537 +1864:1:11 +1865:0:3537 +1866:2:3484 +1867:0:3537 +1868:1:12 +1869:1:16 +1870:1:17 +1871:1:25 +1872:1:26 +1873:1:30 +1874:1:31 +1875:1:39 +1876:1:44 +1877:1:48 +1878:1:49 +1879:1:56 +1880:1:57 +1881:1:68 +1882:1:69 +1883:1:70 +1884:1:81 +1885:1:86 +1886:1:87 +1887:0:3537 +1888:2:3483 +1889:0:3537 +1890:1:99 +1891:0:3537 +1892:2:3484 +1893:0:3537 +1894:1:100 +1895:1:104 +1896:1:105 +1897:1:113 +1898:1:114 +1899:1:118 +1900:1:119 +1901:1:127 +1902:1:132 +1903:1:136 +1904:1:137 +1905:1:144 +1906:1:145 +1907:1:156 +1908:1:157 +1909:1:158 +1910:1:169 +1911:1:174 +1912:1:175 +1913:0:3537 +1914:2:3483 +1915:0:3537 +1916:1:187 +1917:0:3537 +1918:2:3484 +1919:0:3537 +1920:1:188 +1921:0:3537 +1922:2:3483 +1923:0:3537 +1924:1:189 +1925:1:193 +1926:1:194 +1927:1:202 +1928:1:203 +1929:1:207 +1930:1:208 +1931:1:216 +1932:1:221 +1933:1:225 +1934:1:226 +1935:1:233 +1936:1:234 +1937:1:245 +1938:1:246 +1939:1:247 +1940:1:258 +1941:1:263 +1942:1:264 +1943:0:3537 +1944:2:3484 +1945:0:3537 +1946:1:276 +1947:0:3537 +1948:2:3483 +1949:0:3537 +1950:1:561 +1951:0:3537 +1952:2:3484 +1953:0:3537 +1954:1:562 +1955:0:3537 +1956:2:3483 +1957:0:3537 +1958:1:11 +1959:0:3537 +1960:2:3484 +1961:0:3537 +1962:1:12 +1963:1:16 +1964:1:17 +1965:1:25 +1966:1:26 +1967:1:27 +1968:1:39 +1969:1:44 +1970:1:48 +1971:1:49 +1972:1:56 +1973:1:57 +1974:1:68 +1975:1:69 +1976:1:70 +1977:1:81 +1978:1:86 +1979:1:87 +1980:0:3537 +1981:2:3483 +1982:0:3537 +1983:1:99 +1984:0:3537 +1985:2:3484 +1986:0:3537 +1987:1:100 +1988:1:104 +1989:1:105 +1990:1:113 +1991:1:114 +1992:1:118 +1993:1:119 +1994:1:127 +1995:1:132 +1996:1:136 +1997:1:137 +1998:1:144 +1999:1:145 +2000:1:156 +2001:1:157 +2002:1:158 +2003:1:169 +2004:1:174 +2005:1:175 +2006:0:3537 +2007:2:3483 +2008:0:3537 +2009:1:279 +2010:0:3537 +2011:2:3484 +2012:0:3537 +2013:1:280 +2014:0:3537 +2015:2:3483 +2016:0:3537 +2017:1:561 +2018:0:3537 +2019:2:3484 +2020:0:3537 +2021:1:562 +2022:0:3537 +2023:2:3483 +2024:0:3537 +2025:1:567 +2026:0:3537 +2027:2:3484 +2028:0:3537 +2029:1:572 +2030:1:576 +2031:1:577 +2032:1:585 +2033:1:586 +2034:1:587 +2035:1:599 +2036:1:604 +2037:1:608 +2038:1:609 +2039:1:616 +2040:1:617 +2041:1:628 +2042:1:629 +2043:1:630 +2044:1:641 +2045:1:646 +2046:1:647 +2047:0:3537 +2048:2:3483 +2049:0:3537 +2050:1:659 +2051:0:3537 +2052:2:3484 +2053:0:3537 +2054:1:660 +2055:1:664 +2056:1:665 +2057:1:673 +2058:1:674 +2059:1:678 +2060:1:679 +2061:1:687 +2062:1:692 +2063:1:696 +2064:1:697 +2065:1:704 +2066:1:705 +2067:1:716 +2068:1:717 +2069:1:718 +2070:1:729 +2071:1:734 +2072:1:735 +2073:0:3537 +2074:2:3483 +2075:0:3537 +2076:1:747 +2077:0:3535 +2078:2:3484 +2079:0:3541 +2080:1:1280 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.define b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.define new file mode 100644 index 0000000..73e61a4 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.define @@ -0,0 +1 @@ +#define NO_RMB diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.log b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.log new file mode 100644 index 0000000..6a46f80 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.log @@ -0,0 +1,369 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_free_no_rmb.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 567) +Depth= 5645 States= 1e+06 Transitions= 1.47e+07 Memory= 527.287 t= 27.1 R= 4e+04 +pan: claim violated! (at depth 1736) +pan: wrote .input.spin.trail + +(Spin Version 5.1.7 -- 23 December 2008) +Warning: Search not completed + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 5645, errors: 1 + 1039881 states, stored + 14441478 states, matched + 15481359 transitions (= stored+matched) + 57000435 atomic steps +hash conflicts: 2892596 (resolved) + +Stats on memory usage (in Megabytes): + 83.303 equivalent memory usage for states (stored*(State-vector + overhead)) + 64.050 actual memory usage for states (compression: 76.89%) + state-vector as stored = 37 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 529.729 total actual memory usage + +unreached in proctype urcu_reader + line 289, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 61, "(1)" + line 308, "pan.___", state 91, "(1)" + line 289, "pan.___", state 104, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 136, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 149, "(1)" + line 308, "pan.___", state 179, "(1)" + line 289, "pan.___", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 225, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 238, "(1)" + line 308, "pan.___", state 268, "(1)" + line 159, "pan.___", state 289, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 159, "pan.___", state 291, "(1)" + line 163, "pan.___", state 298, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 163, "pan.___", state 300, "(1)" + line 163, "pan.___", state 301, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 163, "pan.___", state 301, "else" + line 161, "pan.___", state 306, "((j<1))" + line 161, "pan.___", state 306, "((j>=1))" + line 167, "pan.___", state 311, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 167, "pan.___", state 313, "(1)" + line 167, "pan.___", state 314, "((cache_dirty_generation_ptr.bitfield&(1<<_pid)))" + line 167, "pan.___", state 314, "else" + line 177, "pan.___", state 319, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 177, "pan.___", state 319, "else" + line 159, "pan.___", state 324, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 167, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 159, "pan.___", state 363, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 159, "pan.___", state 365, "(1)" + line 163, "pan.___", state 372, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 163, "pan.___", state 374, "(1)" + line 163, "pan.___", state 375, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 163, "pan.___", state 375, "else" + line 161, "pan.___", state 380, "((j<1))" + line 161, "pan.___", state 380, "((j>=1))" + line 167, "pan.___", state 385, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 167, "pan.___", state 387, "(1)" + line 167, "pan.___", state 388, "((cache_dirty_generation_ptr.bitfield&(1<<_pid)))" + line 167, "pan.___", state 388, "else" + line 177, "pan.___", state 393, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 177, "pan.___", state 393, "else" + line 289, "pan.___", state 408, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 440, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 453, "(1)" + line 308, "pan.___", state 483, "(1)" + line 289, "pan.___", state 496, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 541, "(1)" + line 308, "pan.___", state 571, "(1)" + line 289, "pan.___", state 584, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 616, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 629, "(1)" + line 308, "pan.___", state 659, "(1)" + line 159, "pan.___", state 674, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 159, "pan.___", state 676, "(1)" + line 163, "pan.___", state 683, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 163, "pan.___", state 685, "(1)" + line 163, "pan.___", state 686, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 163, "pan.___", state 686, "else" + line 161, "pan.___", state 691, "((j<1))" + line 161, "pan.___", state 691, "((j>=1))" + line 167, "pan.___", state 696, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 167, "pan.___", state 698, "(1)" + line 167, "pan.___", state 699, "((cache_dirty_generation_ptr.bitfield&(1<<_pid)))" + line 167, "pan.___", state 699, "else" + line 177, "pan.___", state 704, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 177, "pan.___", state 704, "else" + line 159, "pan.___", state 709, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 167, "pan.___", state 731, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 159, "pan.___", state 748, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 159, "pan.___", state 750, "(1)" + line 163, "pan.___", state 757, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 163, "pan.___", state 759, "(1)" + line 163, "pan.___", state 760, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 163, "pan.___", state 760, "else" + line 161, "pan.___", state 765, "((j<1))" + line 161, "pan.___", state 765, "((j>=1))" + line 167, "pan.___", state 770, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 167, "pan.___", state 772, "(1)" + line 167, "pan.___", state 773, "((cache_dirty_generation_ptr.bitfield&(1<<_pid)))" + line 167, "pan.___", state 773, "else" + line 177, "pan.___", state 778, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 177, "pan.___", state 778, "else" + line 289, "pan.___", state 788, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 820, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 833, "(1)" + line 308, "pan.___", state 863, "(1)" + line 289, "pan.___", state 884, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 916, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 929, "(1)" + line 308, "pan.___", state 959, "(1)" + line 434, "pan.___", state 972, "-end-" + (95 of 972 states) +unreached in proctype urcu_writer + line 289, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 289, "pan.___", state 20, "(1)" + line 293, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 293, "pan.___", state 34, "(1)" + line 293, "pan.___", state 35, "(1)" + line 293, "pan.___", state 35, "(1)" + line 291, "pan.___", state 40, "((i<1))" + line 291, "pan.___", state 40, "((i>=1))" + line 298, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 59, "(1)" + line 299, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 299, "pan.___", state 60, "else" + line 299, "pan.___", state 63, "(1)" + line 299, "pan.___", state 64, "(1)" + line 299, "pan.___", state 64, "(1)" + line 303, "pan.___", state 72, "(1)" + line 303, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 303, "pan.___", state 73, "else" + line 303, "pan.___", state 76, "(1)" + line 303, "pan.___", state 77, "(1)" + line 303, "pan.___", state 77, "(1)" + line 301, "pan.___", state 82, "((i<1))" + line 301, "pan.___", state 82, "((i>=1))" + line 308, "pan.___", state 89, "(1)" + line 308, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 308, "pan.___", state 90, "else" + line 308, "pan.___", state 93, "(1)" + line 308, "pan.___", state 94, "(1)" + line 308, "pan.___", state 94, "(1)" + line 310, "pan.___", state 97, "(1)" + line 310, "pan.___", state 97, "(1)" + line 456, "pan.___", state 101, "cached_generation_ptr.val[_pid] = (old_gen+1)" + line 454, "pan.___", state 102, "old_gen = cached_generation_ptr.val[_pid]" + line 289, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 289, "pan.___", state 112, "(1)" + line 293, "pan.___", state 120, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 293, "pan.___", state 126, "(1)" + line 293, "pan.___", state 127, "(1)" + line 293, "pan.___", state 127, "(1)" + line 299, "pan.___", state 151, "(1)" + line 303, "pan.___", state 164, "(1)" + line 310, "pan.___", state 189, "(1)" + line 310, "pan.___", state 189, "(1)" + line 468, "pan.___", state 195, "(1)" + line 159, "pan.___", state 205, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 163, "pan.___", state 214, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 159, "pan.___", state 240, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 298, "pan.___", state 742, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 755, "(1)" + line 299, "pan.___", state 756, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 299, "pan.___", state 756, "else" + line 299, "pan.___", state 759, "(1)" + line 299, "pan.___", state 760, "(1)" + line 299, "pan.___", state 760, "(1)" + line 303, "pan.___", state 768, "(1)" + line 303, "pan.___", state 769, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 303, "pan.___", state 769, "else" + line 303, "pan.___", state 772, "(1)" + line 303, "pan.___", state 773, "(1)" + line 303, "pan.___", state 773, "(1)" + line 301, "pan.___", state 778, "((i<1))" + line 301, "pan.___", state 778, "((i>=1))" + line 308, "pan.___", state 785, "(1)" + line 308, "pan.___", state 786, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 308, "pan.___", state 786, "else" + line 308, "pan.___", state 789, "(1)" + line 308, "pan.___", state 790, "(1)" + line 308, "pan.___", state 790, "(1)" + line 310, "pan.___", state 793, "(1)" + line 310, "pan.___", state 793, "(1)" + line 293, "pan.___", state 822, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 840, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 303, "pan.___", state 866, "(1)" + line 308, "pan.___", state 883, "(1)" + line 293, "pan.___", state 910, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 928, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 303, "pan.___", state 954, "(1)" + line 308, "pan.___", state 971, "(1)" + line 289, "pan.___", state 988, "(1)" + line 293, "pan.___", state 1000, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 1018, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 303, "pan.___", state 1044, "(1)" + line 308, "pan.___", state 1061, "(1)" + line 293, "pan.___", state 1091, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 1109, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 303, "pan.___", state 1135, "(1)" + line 308, "pan.___", state 1152, "(1)" + line 163, "pan.___", state 1174, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 167, "pan.___", state 1187, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 159, "pan.___", state 1200, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 298, "pan.___", state 1319, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 1332, "(1)" + line 299, "pan.___", state 1333, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 299, "pan.___", state 1333, "else" + line 299, "pan.___", state 1336, "(1)" + line 299, "pan.___", state 1337, "(1)" + line 299, "pan.___", state 1337, "(1)" + line 303, "pan.___", state 1345, "(1)" + line 303, "pan.___", state 1346, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 303, "pan.___", state 1346, "else" + line 303, "pan.___", state 1349, "(1)" + line 303, "pan.___", state 1350, "(1)" + line 303, "pan.___", state 1350, "(1)" + line 301, "pan.___", state 1355, "((i<1))" + line 301, "pan.___", state 1355, "((i>=1))" + line 308, "pan.___", state 1362, "(1)" + line 308, "pan.___", state 1363, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 308, "pan.___", state 1363, "else" + line 308, "pan.___", state 1366, "(1)" + line 308, "pan.___", state 1367, "(1)" + line 308, "pan.___", state 1367, "(1)" + line 310, "pan.___", state 1370, "(1)" + line 310, "pan.___", state 1370, "(1)" + line 163, "pan.___", state 1394, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 167, "pan.___", state 1407, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 159, "pan.___", state 1420, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=2))" + line 519, "pan.___", state 20, "((j<2))" + line 519, "pan.___", state 20, "((j>=2))" + line 524, "pan.___", state 33, "((j<2))" + line 524, "pan.___", state 33, "((j>=2))" + (3 of 46 states) +unreached in proctype :never: + line 572, "pan.___", state 8, "-end-" + (1 of 8 states) + +pan: elapsed time 28.5 seconds +pan: rate 36487.053 states/second +pan: avg transition delay 1.8409e-06 usec +cp .input.spin urcu_free_no_rmb.spin.input +cp .input.spin.trail urcu_free_no_rmb.spin.input.trail +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.spin.input b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.spin.input new file mode 100644 index 0000000..899fdb4 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.spin.input @@ -0,0 +1,532 @@ +#define NO_RMB + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + + +#if (NR_READERS == 1) + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#elif (NR_READERS == 2) + +#define read_free_race (read_generation[0] == last_free_gen || read_generation[1] == last_free_gen) +#define read_free (free_done && (data_access[0] || data_access[1])) + +#else + +#error "Too many readers" + +#endif + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +#define get_pid() (_pid) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb(i, j) +{ + if + :: get_pid() >= NR_READERS -> + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); + :: else -> skip; + fi; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +#define get_readerid() (get_pid()) +#define get_writerid() (get_readerid() + NR_READERS) + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb(i, j); +#else + ooo_mem(i); +#endif + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + ooo_mem(i); + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + ooo_mem(i); + data_access[get_readerid()] = 1; + ooo_mem(i); + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + ooo_mem(i); + //smp_mc(i); /* added */ +} + +active [NR_READERS] proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS + /* Only test progress of one random reader. They are all the + * same. */ + atomic { + if + :: get_readerid() == 0 -> +progress_reader: + skip; + :: else -> + skip; + fi; + } +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb(i, j); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb(i, j); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + skip; + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.spin.input.trail b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.spin.input.trail new file mode 100644 index 0000000..0aacf1a --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.spin.input.trail @@ -0,0 +1,1739 @@ +-2:3:-2 +-4:-4:-4 +1:0:2529 +2:3:2481 +3:3:2484 +4:3:2484 +5:3:2487 +6:3:2495 +7:3:2495 +8:3:2498 +9:3:2504 +10:3:2508 +11:3:2508 +12:3:2511 +13:3:2519 +14:3:2523 +15:3:2524 +16:0:2529 +17:3:2526 +18:0:2529 +19:2:974 +20:0:2529 +21:2:980 +22:0:2529 +23:2:981 +24:0:2529 +25:2:982 +26:2:986 +27:2:987 +28:2:995 +29:2:996 +30:2:1000 +31:2:1001 +32:2:1009 +33:2:1014 +34:2:1018 +35:2:1019 +36:2:1026 +37:2:1027 +38:2:1038 +39:2:1039 +40:2:1040 +41:2:1051 +42:2:1056 +43:2:1057 +44:0:2529 +45:2:1069 +46:2:1070 +47:0:2529 +48:2:1074 +49:2:1078 +50:2:1079 +51:2:1087 +52:2:1088 +53:2:1092 +54:2:1093 +55:2:1101 +56:2:1106 +57:2:1107 +58:2:1118 +59:2:1119 +60:2:1130 +61:2:1131 +62:2:1132 +63:2:1143 +64:2:1148 +65:2:1149 +66:0:2529 +67:2:1161 +68:0:2529 +69:2:1162 +70:0:2529 +71:2:1172 +72:0:2529 +73:2:1173 +74:0:2529 +75:2:1177 +76:2:1178 +77:2:1182 +78:2:1186 +79:2:1187 +80:2:1191 +81:2:1199 +82:2:1200 +83:0:2529 +84:2:1208 +85:0:2529 +86:2:1212 +87:2:1213 +88:2:1217 +89:2:1221 +90:2:1222 +91:2:1226 +92:2:1234 +93:2:1235 +94:0:2529 +95:2:1243 +96:0:2529 +97:2:1251 +98:2:1252 +99:2:1256 +100:2:1260 +101:2:1261 +102:2:1265 +103:2:1273 +104:2:1274 +105:0:2529 +106:2:1286 +107:0:2529 +108:2:1287 +109:2:1291 +110:2:1292 +111:2:1300 +112:2:1301 +113:2:1305 +114:2:1306 +115:2:1314 +116:2:1319 +117:2:1323 +118:2:1324 +119:2:1331 +120:2:1332 +121:2:1343 +122:2:1344 +123:2:1345 +124:2:1356 +125:2:1361 +126:2:1362 +127:0:2529 +128:2:1374 +129:0:2529 +130:2:1377 +131:2:1378 +132:2:1390 +133:2:1391 +134:2:1395 +135:2:1396 +136:2:1404 +137:2:1409 +138:2:1413 +139:2:1414 +140:2:1421 +141:2:1422 +142:2:1433 +143:2:1434 +144:2:1435 +145:2:1446 +146:2:1451 +147:2:1452 +148:0:2529 +149:2:1464 +150:0:2529 +151:2:1465 +152:0:2529 +153:2:1466 +154:0:2529 +155:2:1467 +156:0:2529 +157:2:1468 +158:2:1472 +159:2:1473 +160:2:1481 +161:2:1482 +162:2:1486 +163:2:1487 +164:2:1495 +165:2:1500 +166:2:1504 +167:2:1505 +168:2:1512 +169:2:1513 +170:2:1524 +171:2:1525 +172:2:1526 +173:2:1537 +174:2:1542 +175:2:1543 +176:0:2529 +177:2:1669 +178:0:2529 +179:2:1765 +180:0:2529 +181:2:1766 +182:0:2529 +183:2:1770 +184:0:2529 +185:2:1776 +186:2:1780 +187:2:1781 +188:2:1789 +189:2:1790 +190:2:1794 +191:2:1795 +192:2:1803 +193:2:1808 +194:2:1812 +195:2:1813 +196:2:1820 +197:2:1821 +198:2:1832 +199:2:1833 +200:2:1834 +201:2:1845 +202:2:1850 +203:2:1851 +204:0:2529 +205:2:1863 +206:0:2529 +207:2:1864 +208:2:1868 +209:2:1869 +210:2:1877 +211:2:1878 +212:2:1882 +213:2:1883 +214:2:1891 +215:2:1896 +216:2:1900 +217:2:1901 +218:2:1908 +219:2:1909 +220:2:1920 +221:2:1921 +222:2:1922 +223:2:1933 +224:2:1938 +225:2:1939 +226:0:2529 +227:2:1951 +228:0:2529 +229:2:1954 +230:2:1955 +231:2:1967 +232:2:1968 +233:2:1972 +234:2:1973 +235:2:1981 +236:2:1986 +237:2:1990 +238:2:1991 +239:2:1998 +240:2:1999 +241:2:2010 +242:2:2011 +243:2:2012 +244:2:2023 +245:2:2028 +246:2:2029 +247:0:2529 +248:2:2041 +249:0:2529 +250:2:2042 +251:0:2529 +252:2:2043 +253:0:2529 +254:2:2044 +255:0:2529 +256:2:2045 +257:2:2049 +258:2:2050 +259:2:2058 +260:2:2059 +261:2:2063 +262:2:2064 +263:2:2072 +264:2:2077 +265:2:2081 +266:2:2082 +267:2:2089 +268:2:2090 +269:2:2101 +270:2:2102 +271:2:2103 +272:2:2114 +273:2:2119 +274:2:2120 +275:0:2529 +276:2:2246 +277:0:2529 +278:2:2342 +279:0:2529 +280:2:2343 +281:0:2529 +282:2:2347 +283:0:2529 +284:2:2353 +285:0:2529 +286:2:2357 +287:2:2358 +288:2:2362 +289:2:2366 +290:2:2367 +291:2:2371 +292:2:2379 +293:2:2380 +294:0:2529 +295:2:2388 +296:0:2529 +297:2:2392 +298:2:2393 +299:2:2397 +300:2:2401 +301:2:2402 +302:2:2406 +303:2:2414 +304:2:2415 +305:0:2529 +306:2:2423 +307:0:2529 +308:2:2431 +309:2:2432 +310:2:2436 +311:2:2440 +312:2:2441 +313:2:2445 +314:2:2453 +315:2:2454 +316:0:2529 +317:2:2466 +318:0:2529 +319:2:2467 +320:0:2529 +321:2:981 +322:0:2529 +323:2:982 +324:2:986 +325:2:987 +326:2:995 +327:2:996 +328:2:1000 +329:2:1001 +330:2:1009 +331:2:1014 +332:2:1018 +333:2:1019 +334:2:1026 +335:2:1027 +336:2:1038 +337:2:1039 +338:2:1040 +339:2:1051 +340:2:1056 +341:2:1057 +342:0:2529 +343:2:1069 +344:2:1070 +345:0:2529 +346:2:1074 +347:2:1078 +348:2:1079 +349:2:1087 +350:2:1088 +351:2:1092 +352:2:1093 +353:2:1101 +354:2:1106 +355:2:1107 +356:2:1118 +357:2:1119 +358:2:1130 +359:2:1131 +360:2:1132 +361:2:1143 +362:2:1148 +363:2:1149 +364:0:2529 +365:2:1161 +366:0:2529 +367:2:1162 +368:0:2529 +369:2:1172 +370:0:2529 +371:2:1173 +372:0:2529 +373:2:1177 +374:2:1178 +375:2:1182 +376:2:1186 +377:2:1187 +378:2:1191 +379:2:1199 +380:2:1200 +381:0:2529 +382:2:1208 +383:0:2529 +384:2:1212 +385:2:1213 +386:2:1217 +387:2:1221 +388:2:1222 +389:2:1226 +390:2:1234 +391:2:1235 +392:0:2529 +393:2:1243 +394:0:2529 +395:2:1251 +396:2:1252 +397:2:1256 +398:2:1260 +399:2:1261 +400:2:1265 +401:2:1273 +402:2:1274 +403:0:2529 +404:2:1286 +405:0:2529 +406:2:1287 +407:2:1291 +408:2:1292 +409:2:1300 +410:2:1301 +411:2:1305 +412:2:1306 +413:2:1314 +414:2:1319 +415:2:1323 +416:2:1324 +417:2:1331 +418:2:1332 +419:2:1343 +420:2:1344 +421:2:1345 +422:2:1356 +423:2:1361 +424:2:1362 +425:0:2529 +426:2:1374 +427:0:2529 +428:2:1377 +429:2:1378 +430:2:1390 +431:2:1391 +432:2:1395 +433:2:1396 +434:2:1404 +435:2:1409 +436:2:1413 +437:2:1414 +438:2:1421 +439:2:1422 +440:2:1433 +441:2:1434 +442:2:1435 +443:2:1446 +444:2:1451 +445:2:1452 +446:0:2529 +447:2:1464 +448:0:2529 +449:2:1465 +450:0:2529 +451:2:1466 +452:0:2529 +453:2:1467 +454:0:2529 +455:2:1468 +456:2:1472 +457:2:1473 +458:2:1481 +459:2:1482 +460:2:1486 +461:2:1487 +462:2:1495 +463:2:1500 +464:2:1504 +465:2:1505 +466:2:1512 +467:2:1513 +468:2:1524 +469:2:1525 +470:2:1526 +471:2:1537 +472:2:1542 +473:2:1543 +474:0:2529 +475:2:1669 +476:0:2529 +477:2:1765 +478:0:2529 +479:2:1766 +480:0:2529 +481:2:1770 +482:0:2529 +483:2:1776 +484:2:1780 +485:2:1781 +486:2:1789 +487:2:1790 +488:2:1794 +489:2:1795 +490:2:1803 +491:2:1808 +492:2:1812 +493:2:1813 +494:2:1820 +495:2:1821 +496:2:1832 +497:2:1833 +498:2:1834 +499:2:1845 +500:2:1850 +501:2:1851 +502:0:2529 +503:2:1863 +504:0:2529 +505:2:1864 +506:2:1868 +507:2:1869 +508:2:1877 +509:2:1878 +510:2:1882 +511:2:1883 +512:2:1891 +513:2:1896 +514:2:1900 +515:2:1901 +516:2:1908 +517:2:1909 +518:2:1920 +519:2:1921 +520:2:1922 +521:2:1933 +522:2:1938 +523:2:1939 +524:0:2529 +525:2:1951 +526:0:2529 +527:2:1954 +528:2:1955 +529:2:1967 +530:2:1968 +531:2:1972 +532:2:1973 +533:2:1981 +534:2:1986 +535:2:1990 +536:2:1991 +537:2:1998 +538:2:1999 +539:2:2010 +540:2:2011 +541:2:2012 +542:2:2023 +543:2:2028 +544:2:2029 +545:0:2529 +546:2:2041 +547:0:2529 +548:2:2042 +549:0:2529 +550:2:2043 +551:0:2529 +552:2:2044 +553:0:2529 +554:2:2045 +555:2:2049 +556:2:2050 +557:2:2058 +558:2:2059 +559:2:2063 +560:2:2064 +561:2:2072 +562:2:2077 +563:2:2081 +564:2:2082 +565:2:2089 +566:2:2090 +567:2:2101 +568:2:2102 +569:2:2103 +570:2:2114 +571:2:2119 +572:2:2120 +573:0:2529 +574:2:2246 +575:0:2529 +576:2:2342 +577:0:2529 +578:2:2343 +579:0:2529 +580:2:2347 +581:0:2529 +582:2:2353 +583:0:2529 +584:2:2357 +585:2:2358 +586:2:2362 +587:2:2366 +588:2:2367 +589:2:2371 +590:2:2379 +591:2:2380 +592:0:2529 +593:2:2388 +594:0:2529 +595:2:2392 +596:2:2393 +597:2:2397 +598:2:2401 +599:2:2402 +600:2:2406 +601:2:2414 +602:2:2415 +603:0:2529 +604:2:2423 +605:0:2529 +606:2:2431 +607:2:2432 +608:2:2436 +609:2:2440 +610:2:2441 +611:2:2445 +612:2:2453 +613:2:2454 +614:0:2529 +615:2:2466 +616:0:2529 +617:2:2467 +618:0:2529 +619:2:981 +620:0:2529 +621:2:982 +622:2:986 +623:2:987 +624:2:995 +625:2:996 +626:2:1000 +627:2:1001 +628:2:1009 +629:2:1014 +630:2:1018 +631:2:1019 +632:2:1026 +633:2:1027 +634:2:1038 +635:2:1039 +636:2:1040 +637:2:1051 +638:2:1056 +639:2:1057 +640:0:2529 +641:2:1069 +642:2:1070 +643:0:2529 +644:2:1074 +645:2:1078 +646:2:1079 +647:2:1087 +648:2:1088 +649:2:1092 +650:2:1093 +651:2:1101 +652:2:1106 +653:2:1107 +654:2:1118 +655:2:1119 +656:2:1130 +657:2:1131 +658:2:1132 +659:2:1143 +660:2:1148 +661:2:1149 +662:0:2529 +663:2:1161 +664:0:2529 +665:2:1162 +666:0:2529 +667:2:1172 +668:0:2529 +669:2:1173 +670:0:2529 +671:2:1177 +672:2:1178 +673:2:1182 +674:2:1186 +675:2:1187 +676:2:1191 +677:2:1199 +678:2:1200 +679:0:2529 +680:2:1208 +681:0:2529 +682:2:1212 +683:2:1213 +684:2:1217 +685:2:1221 +686:2:1222 +687:2:1226 +688:2:1234 +689:2:1235 +690:0:2529 +691:2:1243 +692:0:2529 +693:2:1251 +694:2:1252 +695:2:1256 +696:2:1260 +697:2:1261 +698:2:1265 +699:2:1273 +700:2:1274 +701:0:2529 +702:2:1286 +703:0:2529 +704:2:1287 +705:2:1291 +706:2:1292 +707:2:1300 +708:2:1301 +709:2:1305 +710:2:1306 +711:2:1314 +712:2:1319 +713:2:1323 +714:2:1324 +715:2:1331 +716:2:1332 +717:2:1343 +718:2:1344 +719:2:1345 +720:2:1356 +721:2:1361 +722:2:1362 +723:0:2529 +724:2:1374 +725:0:2529 +726:2:1377 +727:2:1378 +728:2:1390 +729:2:1391 +730:2:1395 +731:2:1396 +732:2:1404 +733:2:1409 +734:2:1413 +735:2:1414 +736:2:1421 +737:2:1422 +738:2:1433 +739:2:1434 +740:2:1435 +741:2:1446 +742:2:1451 +743:2:1452 +744:0:2529 +745:2:1464 +746:0:2529 +747:2:1465 +748:0:2529 +749:2:1466 +750:0:2529 +751:2:1467 +752:0:2529 +753:2:1468 +754:2:1472 +755:2:1473 +756:2:1481 +757:2:1482 +758:2:1486 +759:2:1487 +760:2:1495 +761:2:1500 +762:2:1504 +763:2:1505 +764:2:1512 +765:2:1513 +766:2:1524 +767:2:1525 +768:2:1526 +769:2:1537 +770:2:1542 +771:2:1543 +772:0:2529 +773:2:1669 +774:0:2529 +775:2:1765 +776:0:2529 +777:2:1766 +778:0:2529 +779:2:1770 +780:0:2529 +781:2:1776 +782:2:1780 +783:2:1781 +784:2:1789 +785:2:1790 +786:2:1794 +787:2:1795 +788:2:1803 +789:2:1808 +790:2:1812 +791:2:1813 +792:2:1820 +793:2:1821 +794:2:1832 +795:2:1833 +796:2:1834 +797:2:1845 +798:2:1850 +799:2:1851 +800:0:2529 +801:2:1863 +802:0:2529 +803:2:1864 +804:2:1868 +805:2:1869 +806:2:1877 +807:2:1878 +808:2:1882 +809:2:1883 +810:2:1891 +811:2:1896 +812:2:1900 +813:2:1901 +814:2:1908 +815:2:1909 +816:2:1920 +817:2:1921 +818:2:1922 +819:2:1933 +820:2:1938 +821:2:1939 +822:0:2529 +823:2:1951 +824:0:2529 +825:2:1954 +826:2:1955 +827:2:1967 +828:2:1968 +829:2:1972 +830:2:1973 +831:2:1981 +832:2:1986 +833:2:1990 +834:2:1991 +835:2:1998 +836:2:1999 +837:2:2010 +838:2:2011 +839:2:2012 +840:2:2023 +841:2:2028 +842:2:2029 +843:0:2529 +844:2:2041 +845:0:2529 +846:2:2042 +847:0:2529 +848:2:2043 +849:0:2529 +850:2:2044 +851:0:2529 +852:2:2045 +853:2:2049 +854:2:2050 +855:2:2058 +856:2:2059 +857:2:2063 +858:2:2064 +859:2:2072 +860:2:2077 +861:2:2081 +862:2:2082 +863:2:2089 +864:2:2090 +865:2:2101 +866:2:2102 +867:2:2103 +868:2:2114 +869:2:2119 +870:2:2120 +871:0:2529 +872:2:2246 +873:0:2529 +874:2:2342 +875:0:2529 +876:2:2343 +877:0:2529 +878:2:2347 +879:0:2529 +880:2:2353 +881:0:2529 +882:2:2357 +883:2:2358 +884:2:2362 +885:2:2366 +886:2:2367 +887:2:2371 +888:2:2379 +889:2:2380 +890:0:2529 +891:2:2388 +892:0:2529 +893:2:2392 +894:2:2393 +895:2:2397 +896:2:2401 +897:2:2402 +898:2:2406 +899:2:2414 +900:2:2415 +901:0:2529 +902:2:2423 +903:0:2529 +904:2:2431 +905:2:2432 +906:2:2436 +907:2:2440 +908:2:2441 +909:2:2445 +910:2:2453 +911:2:2454 +912:0:2529 +913:2:2466 +914:0:2529 +915:2:2467 +916:0:2529 +917:2:981 +918:0:2529 +919:2:982 +920:2:986 +921:2:987 +922:2:995 +923:2:996 +924:2:1000 +925:2:1001 +926:2:1009 +927:2:1014 +928:2:1018 +929:2:1019 +930:2:1026 +931:2:1027 +932:2:1038 +933:2:1039 +934:2:1040 +935:2:1051 +936:2:1056 +937:2:1057 +938:0:2529 +939:2:1069 +940:2:1070 +941:0:2529 +942:2:1074 +943:2:1078 +944:2:1079 +945:2:1087 +946:2:1088 +947:2:1092 +948:2:1093 +949:2:1101 +950:2:1106 +951:2:1107 +952:2:1118 +953:2:1119 +954:2:1130 +955:2:1131 +956:2:1132 +957:2:1143 +958:2:1148 +959:2:1149 +960:0:2529 +961:2:1161 +962:0:2529 +963:2:1162 +964:0:2529 +965:2:1172 +966:0:2529 +967:2:1173 +968:0:2529 +969:2:1177 +970:2:1178 +971:2:1182 +972:2:1186 +973:2:1187 +974:2:1191 +975:2:1199 +976:2:1200 +977:0:2529 +978:2:1208 +979:0:2529 +980:2:1212 +981:2:1213 +982:2:1217 +983:2:1221 +984:2:1222 +985:2:1226 +986:2:1234 +987:2:1235 +988:0:2529 +989:2:1243 +990:0:2529 +991:2:1251 +992:2:1252 +993:2:1256 +994:2:1260 +995:2:1261 +996:2:1265 +997:2:1273 +998:2:1274 +999:0:2529 +1000:2:1286 +1001:0:2529 +1002:2:1287 +1003:2:1291 +1004:2:1292 +1005:2:1300 +1006:2:1301 +1007:2:1305 +1008:2:1306 +1009:2:1314 +1010:2:1319 +1011:2:1323 +1012:2:1324 +1013:2:1331 +1014:2:1332 +1015:2:1343 +1016:2:1344 +1017:2:1345 +1018:2:1356 +1019:2:1361 +1020:2:1362 +1021:0:2529 +1022:2:1374 +1023:0:2529 +1024:2:1377 +1025:2:1378 +1026:2:1390 +1027:2:1391 +1028:2:1395 +1029:2:1396 +1030:2:1404 +1031:2:1409 +1032:2:1413 +1033:2:1414 +1034:2:1421 +1035:2:1422 +1036:2:1433 +1037:2:1434 +1038:2:1435 +1039:2:1446 +1040:2:1451 +1041:2:1452 +1042:0:2529 +1043:2:1464 +1044:0:2529 +1045:2:1465 +1046:0:2529 +1047:2:1466 +1048:0:2529 +1049:2:1467 +1050:0:2529 +1051:2:1468 +1052:2:1472 +1053:2:1473 +1054:2:1481 +1055:2:1482 +1056:2:1486 +1057:2:1487 +1058:2:1495 +1059:2:1500 +1060:2:1504 +1061:2:1505 +1062:2:1512 +1063:2:1513 +1064:2:1524 +1065:2:1525 +1066:2:1526 +1067:2:1537 +1068:2:1542 +1069:2:1543 +1070:0:2529 +1071:2:1669 +1072:0:2529 +1073:2:1765 +1074:0:2529 +1075:2:1766 +1076:0:2529 +1077:2:1770 +1078:0:2529 +1079:2:1776 +1080:2:1780 +1081:2:1781 +1082:2:1789 +1083:2:1790 +1084:2:1794 +1085:2:1795 +1086:2:1803 +1087:2:1808 +1088:2:1812 +1089:2:1813 +1090:2:1820 +1091:2:1821 +1092:2:1832 +1093:2:1833 +1094:2:1834 +1095:2:1845 +1096:2:1850 +1097:2:1851 +1098:0:2529 +1099:2:1863 +1100:0:2529 +1101:2:1864 +1102:2:1868 +1103:2:1869 +1104:2:1877 +1105:2:1878 +1106:2:1882 +1107:2:1883 +1108:2:1891 +1109:2:1896 +1110:2:1900 +1111:2:1901 +1112:2:1908 +1113:2:1909 +1114:2:1920 +1115:2:1921 +1116:2:1922 +1117:2:1933 +1118:2:1938 +1119:2:1939 +1120:0:2529 +1121:2:1951 +1122:0:2529 +1123:2:1954 +1124:2:1955 +1125:2:1967 +1126:2:1968 +1127:2:1972 +1128:2:1973 +1129:2:1981 +1130:2:1986 +1131:2:1990 +1132:2:1991 +1133:2:1998 +1134:2:1999 +1135:2:2010 +1136:2:2011 +1137:2:2012 +1138:2:2023 +1139:2:2028 +1140:2:2029 +1141:0:2529 +1142:2:2041 +1143:0:2529 +1144:2:2042 +1145:0:2529 +1146:2:2043 +1147:0:2529 +1148:2:2044 +1149:0:2529 +1150:2:2045 +1151:2:2049 +1152:2:2050 +1153:2:2058 +1154:2:2059 +1155:2:2063 +1156:2:2064 +1157:2:2072 +1158:2:2077 +1159:2:2081 +1160:2:2082 +1161:2:2089 +1162:2:2090 +1163:2:2101 +1164:2:2102 +1165:2:2103 +1166:2:2114 +1167:2:2119 +1168:2:2120 +1169:0:2529 +1170:2:2246 +1171:0:2529 +1172:2:2342 +1173:0:2529 +1174:2:2343 +1175:0:2529 +1176:2:2347 +1177:0:2529 +1178:2:2353 +1179:0:2529 +1180:2:2357 +1181:2:2358 +1182:2:2362 +1183:2:2366 +1184:2:2367 +1185:2:2371 +1186:2:2379 +1187:2:2380 +1188:0:2529 +1189:2:2388 +1190:0:2529 +1191:2:2392 +1192:2:2393 +1193:2:2397 +1194:2:2401 +1195:2:2402 +1196:2:2406 +1197:2:2414 +1198:2:2415 +1199:0:2529 +1200:2:2423 +1201:0:2529 +1202:2:2431 +1203:2:2432 +1204:2:2436 +1205:2:2440 +1206:2:2441 +1207:2:2445 +1208:2:2453 +1209:2:2454 +1210:0:2529 +1211:2:2466 +1212:0:2529 +1213:2:2467 +1214:0:2529 +1215:2:981 +1216:0:2529 +1217:2:982 +1218:2:986 +1219:2:987 +1220:2:995 +1221:2:996 +1222:2:1000 +1223:2:1001 +1224:2:1009 +1225:2:1014 +1226:2:1018 +1227:2:1019 +1228:2:1026 +1229:2:1027 +1230:2:1038 +1231:2:1039 +1232:2:1040 +1233:2:1051 +1234:2:1056 +1235:2:1057 +1236:0:2529 +1237:2:1069 +1238:2:1070 +1239:0:2529 +1240:2:1074 +1241:2:1078 +1242:2:1079 +1243:2:1087 +1244:2:1088 +1245:2:1092 +1246:2:1093 +1247:2:1101 +1248:2:1114 +1249:2:1115 +1250:2:1118 +1251:2:1119 +1252:2:1130 +1253:2:1131 +1254:2:1132 +1255:2:1143 +1256:2:1148 +1257:2:1151 +1258:2:1152 +1259:0:2529 +1260:2:1161 +1261:0:2529 +1262:2:1162 +1263:0:2529 +1264:2:1172 +1265:0:2529 +1266:2:1173 +1267:0:2529 +1268:1:2 +1269:0:2529 +1270:1:8 +1271:0:2529 +1272:1:9 +1273:0:2529 +1274:1:10 +1275:0:2529 +1276:1:11 +1277:0:2529 +1278:1:12 +1279:1:16 +1280:1:17 +1281:1:25 +1282:1:26 +1283:1:30 +1284:1:31 +1285:1:39 +1286:1:44 +1287:1:48 +1288:1:49 +1289:1:56 +1290:1:57 +1291:1:68 +1292:1:69 +1293:1:70 +1294:1:81 +1295:1:86 +1296:1:87 +1297:0:2529 +1298:2:1177 +1299:2:1178 +1300:2:1182 +1301:2:1186 +1302:2:1187 +1303:2:1191 +1304:2:1196 +1305:0:2529 +1306:2:1208 +1307:0:2529 +1308:2:1212 +1309:2:1213 +1310:2:1217 +1311:2:1221 +1312:2:1222 +1313:2:1226 +1314:2:1234 +1315:2:1235 +1316:0:2529 +1317:2:1243 +1318:0:2529 +1319:2:1251 +1320:2:1252 +1321:2:1256 +1322:2:1260 +1323:2:1261 +1324:2:1265 +1325:2:1273 +1326:2:1274 +1327:0:2529 +1328:2:1286 +1329:0:2529 +1330:2:1287 +1331:2:1291 +1332:2:1292 +1333:2:1300 +1334:2:1301 +1335:2:1305 +1336:2:1306 +1337:2:1314 +1338:2:1319 +1339:2:1323 +1340:2:1324 +1341:2:1331 +1342:2:1332 +1343:2:1343 +1344:2:1344 +1345:2:1345 +1346:2:1356 +1347:2:1361 +1348:2:1362 +1349:0:2529 +1350:2:1374 +1351:0:2529 +1352:2:1377 +1353:2:1378 +1354:2:1390 +1355:2:1391 +1356:2:1395 +1357:2:1396 +1358:2:1404 +1359:2:1409 +1360:2:1413 +1361:2:1414 +1362:2:1421 +1363:2:1422 +1364:2:1433 +1365:2:1434 +1366:2:1435 +1367:2:1446 +1368:2:1451 +1369:2:1452 +1370:0:2529 +1371:2:1464 +1372:0:2529 +1373:2:1465 +1374:0:2529 +1375:2:1466 +1376:0:2529 +1377:2:1467 +1378:0:2529 +1379:2:1468 +1380:2:1472 +1381:2:1473 +1382:2:1481 +1383:2:1482 +1384:2:1486 +1385:2:1487 +1386:2:1495 +1387:2:1500 +1388:2:1504 +1389:2:1505 +1390:2:1512 +1391:2:1513 +1392:2:1524 +1393:2:1525 +1394:2:1526 +1395:2:1537 +1396:2:1542 +1397:2:1543 +1398:0:2529 +1399:2:1669 +1400:0:2529 +1401:2:1765 +1402:0:2529 +1403:2:1766 +1404:0:2529 +1405:2:1770 +1406:0:2529 +1407:2:1776 +1408:2:1780 +1409:2:1781 +1410:2:1789 +1411:2:1790 +1412:2:1794 +1413:2:1795 +1414:2:1803 +1415:2:1808 +1416:2:1812 +1417:2:1813 +1418:2:1820 +1419:2:1821 +1420:2:1832 +1421:2:1833 +1422:2:1834 +1423:2:1845 +1424:2:1850 +1425:2:1851 +1426:0:2529 +1427:2:1863 +1428:0:2529 +1429:2:1864 +1430:2:1868 +1431:2:1869 +1432:2:1877 +1433:2:1878 +1434:2:1882 +1435:2:1883 +1436:2:1891 +1437:2:1896 +1438:2:1900 +1439:2:1901 +1440:2:1908 +1441:2:1909 +1442:2:1920 +1443:2:1921 +1444:2:1922 +1445:2:1933 +1446:2:1938 +1447:2:1939 +1448:0:2529 +1449:2:1951 +1450:0:2529 +1451:2:1954 +1452:2:1955 +1453:2:1967 +1454:2:1968 +1455:2:1972 +1456:2:1973 +1457:2:1981 +1458:2:1986 +1459:2:1990 +1460:2:1991 +1461:2:1998 +1462:2:1999 +1463:2:2010 +1464:2:2011 +1465:2:2012 +1466:2:2023 +1467:2:2028 +1468:2:2029 +1469:0:2529 +1470:2:2041 +1471:0:2529 +1472:2:2042 +1473:0:2529 +1474:2:2043 +1475:0:2529 +1476:2:2044 +1477:0:2529 +1478:2:2045 +1479:2:2049 +1480:2:2050 +1481:2:2058 +1482:2:2059 +1483:2:2063 +1484:2:2064 +1485:2:2072 +1486:2:2077 +1487:2:2081 +1488:2:2082 +1489:2:2089 +1490:2:2090 +1491:2:2101 +1492:2:2102 +1493:2:2103 +1494:2:2114 +1495:2:2119 +1496:2:2120 +1497:0:2529 +1498:2:2246 +1499:0:2529 +1500:2:2342 +1501:0:2529 +1502:2:2343 +1503:0:2529 +1504:2:2347 +1505:0:2529 +1506:2:2353 +1507:0:2529 +1508:2:2357 +1509:2:2358 +1510:2:2362 +1511:2:2366 +1512:2:2367 +1513:2:2371 +1514:2:2379 +1515:2:2380 +1516:0:2529 +1517:2:2388 +1518:0:2529 +1519:2:2392 +1520:2:2393 +1521:2:2397 +1522:2:2401 +1523:2:2402 +1524:2:2406 +1525:2:2414 +1526:2:2415 +1527:0:2529 +1528:2:2423 +1529:0:2529 +1530:2:2431 +1531:2:2432 +1532:2:2436 +1533:2:2440 +1534:2:2441 +1535:2:2445 +1536:2:2453 +1537:2:2454 +1538:0:2529 +1539:2:2466 +1540:0:2529 +1541:2:2467 +1542:0:2529 +1543:2:2470 +1544:0:2529 +1545:2:2475 +1546:0:2529 +1547:1:99 +1548:0:2529 +1549:2:2476 +1550:0:2529 +1551:1:100 +1552:1:104 +1553:1:105 +1554:1:113 +1555:1:114 +1556:1:118 +1557:1:119 +1558:1:127 +1559:1:132 +1560:1:136 +1561:1:137 +1562:1:144 +1563:1:145 +1564:1:156 +1565:1:157 +1566:1:158 +1567:1:169 +1568:1:181 +1569:1:182 +1570:0:2529 +1571:2:2475 +1572:0:2529 +1573:1:187 +1574:0:2529 +1575:2:2476 +1576:0:2529 +1577:1:188 +1578:0:2529 +1579:2:2475 +1580:0:2529 +1581:1:189 +1582:1:193 +1583:1:194 +1584:1:202 +1585:1:203 +1586:1:207 +1587:1:208 +1588:1:216 +1589:1:221 +1590:1:225 +1591:1:226 +1592:1:233 +1593:1:234 +1594:1:245 +1595:1:246 +1596:1:247 +1597:1:258 +1598:1:270 +1599:1:271 +1600:0:2529 +1601:2:2476 +1602:0:2529 +1603:1:276 +1604:0:2529 +1605:2:2475 +1606:0:2529 +1607:1:393 +1608:0:2529 +1609:2:2476 +1610:0:2529 +1611:1:394 +1612:0:2529 +1613:2:2475 +1614:0:2529 +1615:1:11 +1616:0:2529 +1617:2:2476 +1618:0:2529 +1619:1:12 +1620:1:16 +1621:1:17 +1622:1:25 +1623:1:26 +1624:1:27 +1625:1:39 +1626:1:44 +1627:1:48 +1628:1:49 +1629:1:56 +1630:1:57 +1631:1:68 +1632:1:69 +1633:1:70 +1634:1:81 +1635:1:93 +1636:1:94 +1637:0:2529 +1638:2:2475 +1639:0:2529 +1640:1:99 +1641:0:2529 +1642:2:2476 +1643:0:2529 +1644:1:100 +1645:1:104 +1646:1:105 +1647:1:113 +1648:1:114 +1649:1:118 +1650:1:119 +1651:1:127 +1652:1:132 +1653:1:136 +1654:1:137 +1655:1:144 +1656:1:145 +1657:1:156 +1658:1:157 +1659:1:158 +1660:1:169 +1661:1:181 +1662:1:182 +1663:0:2529 +1664:2:2475 +1665:0:2529 +1666:1:279 +1667:0:2529 +1668:2:2476 +1669:0:2529 +1670:1:280 +1671:0:2529 +1672:2:2475 +1673:0:2529 +1674:1:393 +1675:0:2529 +1676:2:2476 +1677:0:2529 +1678:1:394 +1679:0:2529 +1680:2:2475 +1681:0:2529 +1682:1:399 +1683:0:2529 +1684:2:2476 +1685:0:2529 +1686:1:404 +1687:1:408 +1688:1:409 +1689:1:417 +1690:1:418 +1691:1:419 +1692:1:431 +1693:1:436 +1694:1:440 +1695:1:441 +1696:1:448 +1697:1:449 +1698:1:460 +1699:1:461 +1700:1:462 +1701:1:473 +1702:1:485 +1703:1:486 +1704:0:2529 +1705:2:2475 +1706:0:2529 +1707:1:491 +1708:0:2529 +1709:2:2476 +1710:0:2529 +1711:1:492 +1712:1:496 +1713:1:497 +1714:1:505 +1715:1:506 +1716:1:510 +1717:1:511 +1718:1:519 +1719:1:524 +1720:1:528 +1721:1:529 +1722:1:536 +1723:1:537 +1724:1:548 +1725:1:549 +1726:1:550 +1727:1:561 +1728:1:566 +1729:1:567 +1730:0:2529 +1731:2:2475 +1732:0:2529 +1733:1:579 +1734:0:2527 +1735:2:2476 +1736:0:2533 +1737:1:662 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.define b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.define new file mode 100644 index 0000000..710f29d --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.define @@ -0,0 +1 @@ +#define NO_WMB diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.log b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.log new file mode 100644 index 0000000..477c85d --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.log @@ -0,0 +1,381 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_free_no_wmb.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 567) +pan: claim violated! (at depth 1889) +pan: wrote .input.spin.trail + +(Spin Version 5.1.7 -- 23 December 2008) +Warning: Search not completed + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 6646, errors: 1 + 377244 states, stored + 5291719 states, matched + 5668963 transitions (= stored+matched) + 20822372 atomic steps +hash conflicts: 405371 (resolved) + +Stats on memory usage (in Megabytes): + 30.221 equivalent memory usage for states (stored*(State-vector + overhead)) + 23.526 actual memory usage for states (compression: 77.85%) + state-vector as stored = 37 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 489.201 total actual memory usage + +unreached in proctype urcu_reader + line 289, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 61, "(1)" + line 308, "pan.___", state 91, "(1)" + line 289, "pan.___", state 104, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 136, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 149, "(1)" + line 308, "pan.___", state 179, "(1)" + line 289, "pan.___", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 225, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 238, "(1)" + line 308, "pan.___", state 268, "(1)" + line 144, "pan.___", state 290, "(1)" + line 148, "pan.___", state 298, "(1)" + line 148, "pan.___", state 299, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 148, "pan.___", state 299, "else" + line 146, "pan.___", state 304, "((j<1))" + line 146, "pan.___", state 304, "((j>=1))" + line 152, "pan.___", state 310, "(1)" + line 152, "pan.___", state 311, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 152, "pan.___", state 311, "else" + line 186, "pan.___", state 316, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 186, "pan.___", state 316, "else" + line 144, "pan.___", state 322, "(1)" + line 148, "pan.___", state 330, "(1)" + line 148, "pan.___", state 331, "(!((cache_dirty_urcu_active_readers.bitfield&(1<=1))" + line 152, "pan.___", state 342, "(1)" + line 152, "pan.___", state 343, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 144, "pan.___", state 358, "(1)" + line 148, "pan.___", state 366, "(1)" + line 148, "pan.___", state 367, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 148, "pan.___", state 367, "else" + line 146, "pan.___", state 372, "((j<1))" + line 146, "pan.___", state 372, "((j>=1))" + line 152, "pan.___", state 378, "(1)" + line 152, "pan.___", state 379, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 152, "pan.___", state 379, "else" + line 186, "pan.___", state 384, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 186, "pan.___", state 384, "else" + line 289, "pan.___", state 399, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 293, "pan.___", state 415, "(1)" + line 298, "pan.___", state 431, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 444, "(1)" + line 308, "pan.___", state 474, "(1)" + line 289, "pan.___", state 487, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 519, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 532, "(1)" + line 308, "pan.___", state 562, "(1)" + line 289, "pan.___", state 575, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 607, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 620, "(1)" + line 308, "pan.___", state 650, "(1)" + line 144, "pan.___", state 666, "(1)" + line 148, "pan.___", state 674, "(1)" + line 148, "pan.___", state 675, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 148, "pan.___", state 675, "else" + line 146, "pan.___", state 680, "((j<1))" + line 146, "pan.___", state 680, "((j>=1))" + line 152, "pan.___", state 686, "(1)" + line 152, "pan.___", state 687, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 152, "pan.___", state 687, "else" + line 186, "pan.___", state 692, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 186, "pan.___", state 692, "else" + line 144, "pan.___", state 698, "(1)" + line 148, "pan.___", state 706, "(1)" + line 148, "pan.___", state 707, "(!((cache_dirty_urcu_active_readers.bitfield&(1<=1))" + line 152, "pan.___", state 718, "(1)" + line 152, "pan.___", state 719, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 144, "pan.___", state 734, "(1)" + line 148, "pan.___", state 742, "(1)" + line 148, "pan.___", state 743, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 148, "pan.___", state 743, "else" + line 146, "pan.___", state 748, "((j<1))" + line 146, "pan.___", state 748, "((j>=1))" + line 152, "pan.___", state 754, "(1)" + line 152, "pan.___", state 755, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 152, "pan.___", state 755, "else" + line 186, "pan.___", state 760, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 186, "pan.___", state 760, "else" + line 289, "pan.___", state 770, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 802, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 815, "(1)" + line 308, "pan.___", state 845, "(1)" + line 289, "pan.___", state 866, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 293, "pan.___", state 882, "(1)" + line 298, "pan.___", state 898, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 911, "(1)" + line 308, "pan.___", state 941, "(1)" + line 434, "pan.___", state 954, "-end-" + (79 of 954 states) +unreached in proctype urcu_writer + line 289, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 289, "pan.___", state 20, "(1)" + line 293, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 293, "pan.___", state 34, "(1)" + line 293, "pan.___", state 35, "(1)" + line 293, "pan.___", state 35, "(1)" + line 291, "pan.___", state 40, "((i<1))" + line 291, "pan.___", state 40, "((i>=1))" + line 298, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 59, "(1)" + line 299, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 299, "pan.___", state 60, "else" + line 299, "pan.___", state 63, "(1)" + line 299, "pan.___", state 64, "(1)" + line 299, "pan.___", state 64, "(1)" + line 303, "pan.___", state 72, "(1)" + line 303, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 303, "pan.___", state 73, "else" + line 303, "pan.___", state 76, "(1)" + line 303, "pan.___", state 77, "(1)" + line 303, "pan.___", state 77, "(1)" + line 301, "pan.___", state 82, "((i<1))" + line 301, "pan.___", state 82, "((i>=1))" + line 308, "pan.___", state 89, "(1)" + line 308, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 308, "pan.___", state 90, "else" + line 308, "pan.___", state 93, "(1)" + line 308, "pan.___", state 94, "(1)" + line 308, "pan.___", state 94, "(1)" + line 310, "pan.___", state 97, "(1)" + line 310, "pan.___", state 97, "(1)" + line 456, "pan.___", state 101, "cached_generation_ptr.val[_pid] = (old_gen+1)" + line 454, "pan.___", state 102, "old_gen = cached_generation_ptr.val[_pid]" + line 289, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 289, "pan.___", state 112, "(1)" + line 293, "pan.___", state 120, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 293, "pan.___", state 126, "(1)" + line 293, "pan.___", state 127, "(1)" + line 293, "pan.___", state 127, "(1)" + line 291, "pan.___", state 132, "((i<1))" + line 291, "pan.___", state 132, "((i>=1))" + line 299, "pan.___", state 151, "(1)" + line 299, "pan.___", state 152, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 299, "pan.___", state 152, "else" + line 299, "pan.___", state 155, "(1)" + line 299, "pan.___", state 156, "(1)" + line 299, "pan.___", state 156, "(1)" + line 303, "pan.___", state 164, "(1)" + line 303, "pan.___", state 165, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 303, "pan.___", state 165, "else" + line 303, "pan.___", state 168, "(1)" + line 303, "pan.___", state 169, "(1)" + line 303, "pan.___", state 169, "(1)" + line 301, "pan.___", state 174, "((i<1))" + line 301, "pan.___", state 174, "((i>=1))" + line 308, "pan.___", state 181, "(1)" + line 308, "pan.___", state 182, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 308, "pan.___", state 182, "else" + line 308, "pan.___", state 185, "(1)" + line 308, "pan.___", state 186, "(1)" + line 308, "pan.___", state 186, "(1)" + line 310, "pan.___", state 189, "(1)" + line 310, "pan.___", state 189, "(1)" + line 468, "pan.___", state 195, "(1)" + line 462, "pan.___", state 198, "((write_lock==0))" + line 462, "pan.___", state 198, "else" + line 460, "pan.___", state 199, "(1)" + line 144, "pan.___", state 206, "(1)" + line 148, "pan.___", state 214, "(1)" + line 148, "pan.___", state 215, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 148, "pan.___", state 215, "else" + line 146, "pan.___", state 220, "((j<1))" + line 146, "pan.___", state 220, "((j>=1))" + line 152, "pan.___", state 226, "(1)" + line 152, "pan.___", state 227, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 152, "pan.___", state 227, "else" + line 186, "pan.___", state 232, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 186, "pan.___", state 232, "else" + line 144, "pan.___", state 238, "(1)" + line 152, "pan.___", state 258, "(1)" + line 144, "pan.___", state 274, "(1)" + line 148, "pan.___", state 282, "(1)" + line 152, "pan.___", state 294, "(1)" + line 289, "pan.___", state 310, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 293, "pan.___", state 324, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 342, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 355, "(1)" + line 303, "pan.___", state 368, "(1)" + line 308, "pan.___", state 385, "(1)" + line 289, "pan.___", state 402, "(1)" + line 293, "pan.___", state 414, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 432, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 303, "pan.___", state 458, "(1)" + line 308, "pan.___", state 475, "(1)" + line 293, "pan.___", state 505, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 523, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 303, "pan.___", state 549, "(1)" + line 308, "pan.___", state 566, "(1)" + line 148, "pan.___", state 588, "(1)" + line 152, "pan.___", state 600, "(1)" + line 144, "pan.___", state 612, "(1)" + line 152, "pan.___", state 632, "(1)" + line 148, "pan.___", state 656, "(1)" + line 152, "pan.___", state 668, "(1)" + line 289, "pan.___", state 692, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 289, "pan.___", state 694, "(1)" + line 289, "pan.___", state 695, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 289, "pan.___", state 695, "else" + line 289, "pan.___", state 698, "(1)" + line 293, "pan.___", state 706, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 293, "pan.___", state 708, "(1)" + line 293, "pan.___", state 709, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 293, "pan.___", state 709, "else" + line 293, "pan.___", state 712, "(1)" + line 293, "pan.___", state 713, "(1)" + line 293, "pan.___", state 713, "(1)" + line 291, "pan.___", state 718, "((i<1))" + line 291, "pan.___", state 718, "((i>=1))" + line 298, "pan.___", state 724, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 737, "(1)" + line 299, "pan.___", state 738, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 299, "pan.___", state 738, "else" + line 299, "pan.___", state 741, "(1)" + line 299, "pan.___", state 742, "(1)" + line 299, "pan.___", state 742, "(1)" + line 303, "pan.___", state 750, "(1)" + line 303, "pan.___", state 751, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 303, "pan.___", state 751, "else" + line 303, "pan.___", state 754, "(1)" + line 303, "pan.___", state 755, "(1)" + line 303, "pan.___", state 755, "(1)" + line 301, "pan.___", state 760, "((i<1))" + line 301, "pan.___", state 760, "((i>=1))" + line 308, "pan.___", state 767, "(1)" + line 308, "pan.___", state 768, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 308, "pan.___", state 768, "else" + line 308, "pan.___", state 771, "(1)" + line 308, "pan.___", state 772, "(1)" + line 308, "pan.___", state 772, "(1)" + line 310, "pan.___", state 775, "(1)" + line 310, "pan.___", state 775, "(1)" + line 293, "pan.___", state 804, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 822, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 303, "pan.___", state 848, "(1)" + line 308, "pan.___", state 865, "(1)" + line 293, "pan.___", state 892, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 910, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 303, "pan.___", state 936, "(1)" + line 308, "pan.___", state 953, "(1)" + line 289, "pan.___", state 970, "(1)" + line 293, "pan.___", state 982, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 1000, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 303, "pan.___", state 1026, "(1)" + line 308, "pan.___", state 1043, "(1)" + line 293, "pan.___", state 1073, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 1091, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 303, "pan.___", state 1117, "(1)" + line 308, "pan.___", state 1134, "(1)" + line 148, "pan.___", state 1156, "(1)" + line 152, "pan.___", state 1168, "(1)" + line 144, "pan.___", state 1180, "(1)" + line 152, "pan.___", state 1200, "(1)" + line 148, "pan.___", state 1224, "(1)" + line 152, "pan.___", state 1236, "(1)" + line 289, "pan.___", state 1260, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 289, "pan.___", state 1262, "(1)" + line 289, "pan.___", state 1263, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 289, "pan.___", state 1263, "else" + line 289, "pan.___", state 1266, "(1)" + line 293, "pan.___", state 1274, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 293, "pan.___", state 1276, "(1)" + line 293, "pan.___", state 1277, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 293, "pan.___", state 1277, "else" + line 293, "pan.___", state 1280, "(1)" + line 293, "pan.___", state 1281, "(1)" + line 293, "pan.___", state 1281, "(1)" + line 291, "pan.___", state 1286, "((i<1))" + line 291, "pan.___", state 1286, "((i>=1))" + line 298, "pan.___", state 1292, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 1305, "(1)" + line 299, "pan.___", state 1306, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 299, "pan.___", state 1306, "else" + line 299, "pan.___", state 1309, "(1)" + line 299, "pan.___", state 1310, "(1)" + line 299, "pan.___", state 1310, "(1)" + line 303, "pan.___", state 1318, "(1)" + line 303, "pan.___", state 1319, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 303, "pan.___", state 1319, "else" + line 303, "pan.___", state 1322, "(1)" + line 303, "pan.___", state 1323, "(1)" + line 303, "pan.___", state 1323, "(1)" + line 301, "pan.___", state 1328, "((i<1))" + line 301, "pan.___", state 1328, "((i>=1))" + line 308, "pan.___", state 1335, "(1)" + line 308, "pan.___", state 1336, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 308, "pan.___", state 1336, "else" + line 308, "pan.___", state 1339, "(1)" + line 308, "pan.___", state 1340, "(1)" + line 308, "pan.___", state 1340, "(1)" + line 310, "pan.___", state 1343, "(1)" + line 310, "pan.___", state 1343, "(1)" + line 148, "pan.___", state 1367, "(1)" + line 152, "pan.___", state 1379, "(1)" + line 144, "pan.___", state 1391, "(1)" + line 152, "pan.___", state 1411, "(1)" + line 148, "pan.___", state 1435, "(1)" + line 152, "pan.___", state 1447, "(1)" + line 511, "pan.___", state 1473, "-end-" + (159 of 1473 states) +unreached in proctype :init: + line 518, "pan.___", state 9, "((j<2))" + line 518, "pan.___", state 9, "((j>=2))" + line 519, "pan.___", state 20, "((j<2))" + line 519, "pan.___", state 20, "((j>=2))" + line 524, "pan.___", state 33, "((j<2))" + line 524, "pan.___", state 33, "((j>=2))" + (3 of 46 states) +unreached in proctype :never: + line 572, "pan.___", state 8, "-end-" + (1 of 8 states) + +pan: elapsed time 10.4 seconds +pan: rate 36378.399 states/second +pan: avg transition delay 1.8293e-06 usec +cp .input.spin urcu_free_no_wmb.spin.input +cp .input.spin.trail urcu_free_no_wmb.spin.input.trail +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.spin.input b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.spin.input new file mode 100644 index 0000000..12cde50 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.spin.input @@ -0,0 +1,532 @@ +#define NO_WMB + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + + +#if (NR_READERS == 1) + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#elif (NR_READERS == 2) + +#define read_free_race (read_generation[0] == last_free_gen || read_generation[1] == last_free_gen) +#define read_free (free_done && (data_access[0] || data_access[1])) + +#else + +#error "Too many readers" + +#endif + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +#define get_pid() (_pid) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb(i, j) +{ + if + :: get_pid() >= NR_READERS -> + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); + :: else -> skip; + fi; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +#define get_readerid() (get_pid()) +#define get_writerid() (get_readerid() + NR_READERS) + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb(i, j); +#else + ooo_mem(i); +#endif + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + ooo_mem(i); + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + ooo_mem(i); + data_access[get_readerid()] = 1; + ooo_mem(i); + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + ooo_mem(i); + //smp_mc(i); /* added */ +} + +active [NR_READERS] proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS + /* Only test progress of one random reader. They are all the + * same. */ + atomic { + if + :: get_readerid() == 0 -> +progress_reader: + skip; + :: else -> + skip; + fi; + } +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb(i, j); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb(i, j); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + skip; + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.spin.input.trail b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.spin.input.trail new file mode 100644 index 0000000..ec82525 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.spin.input.trail @@ -0,0 +1,1892 @@ +-2:3:-2 +-4:-4:-4 +1:0:2475 +2:3:2427 +3:3:2430 +4:3:2430 +5:3:2433 +6:3:2441 +7:3:2441 +8:3:2444 +9:3:2450 +10:3:2454 +11:3:2454 +12:3:2457 +13:3:2465 +14:3:2469 +15:3:2470 +16:0:2475 +17:3:2472 +18:0:2475 +19:2:956 +20:0:2475 +21:2:962 +22:0:2475 +23:2:963 +24:0:2475 +25:2:964 +26:2:968 +27:2:969 +28:2:977 +29:2:978 +30:2:982 +31:2:983 +32:2:991 +33:2:996 +34:2:1000 +35:2:1001 +36:2:1008 +37:2:1009 +38:2:1020 +39:2:1021 +40:2:1022 +41:2:1033 +42:2:1038 +43:2:1039 +44:0:2475 +45:2:1051 +46:2:1052 +47:0:2475 +48:2:1056 +49:2:1060 +50:2:1061 +51:2:1069 +52:2:1070 +53:2:1074 +54:2:1075 +55:2:1083 +56:2:1088 +57:2:1089 +58:2:1100 +59:2:1101 +60:2:1112 +61:2:1113 +62:2:1114 +63:2:1125 +64:2:1130 +65:2:1131 +66:0:2475 +67:2:1143 +68:0:2475 +69:2:1144 +70:0:2475 +71:2:1154 +72:0:2475 +73:2:1155 +74:0:2475 +75:2:1156 +76:2:1163 +77:2:1164 +78:2:1171 +79:2:1176 +80:0:2475 +81:2:1187 +82:0:2475 +83:2:1188 +84:2:1195 +85:2:1196 +86:2:1203 +87:2:1208 +88:0:2475 +89:2:1219 +90:0:2475 +91:2:1224 +92:2:1231 +93:2:1232 +94:2:1239 +95:2:1244 +96:0:2475 +97:2:1259 +98:0:2475 +99:2:1260 +100:2:1264 +101:2:1265 +102:2:1273 +103:2:1274 +104:2:1278 +105:2:1279 +106:2:1287 +107:2:1292 +108:2:1296 +109:2:1297 +110:2:1304 +111:2:1305 +112:2:1316 +113:2:1317 +114:2:1318 +115:2:1329 +116:2:1334 +117:2:1335 +118:0:2475 +119:2:1347 +120:0:2475 +121:2:1350 +122:2:1351 +123:2:1363 +124:2:1364 +125:2:1368 +126:2:1369 +127:2:1377 +128:2:1382 +129:2:1386 +130:2:1387 +131:2:1394 +132:2:1395 +133:2:1406 +134:2:1407 +135:2:1408 +136:2:1419 +137:2:1424 +138:2:1425 +139:0:2475 +140:2:1437 +141:0:2475 +142:2:1438 +143:0:2475 +144:2:1439 +145:0:2475 +146:2:1440 +147:0:2475 +148:2:1441 +149:2:1445 +150:2:1446 +151:2:1454 +152:2:1455 +153:2:1459 +154:2:1460 +155:2:1468 +156:2:1473 +157:2:1477 +158:2:1478 +159:2:1485 +160:2:1486 +161:2:1497 +162:2:1498 +163:2:1499 +164:2:1510 +165:2:1515 +166:2:1516 +167:0:2475 +168:2:1633 +169:0:2475 +170:2:1729 +171:0:2475 +172:2:1730 +173:0:2475 +174:2:1734 +175:0:2475 +176:2:1740 +177:2:1744 +178:2:1745 +179:2:1753 +180:2:1754 +181:2:1758 +182:2:1759 +183:2:1767 +184:2:1772 +185:2:1776 +186:2:1777 +187:2:1784 +188:2:1785 +189:2:1796 +190:2:1797 +191:2:1798 +192:2:1809 +193:2:1814 +194:2:1815 +195:0:2475 +196:2:1827 +197:0:2475 +198:2:1828 +199:2:1832 +200:2:1833 +201:2:1841 +202:2:1842 +203:2:1846 +204:2:1847 +205:2:1855 +206:2:1860 +207:2:1864 +208:2:1865 +209:2:1872 +210:2:1873 +211:2:1884 +212:2:1885 +213:2:1886 +214:2:1897 +215:2:1902 +216:2:1903 +217:0:2475 +218:2:1915 +219:0:2475 +220:2:1918 +221:2:1919 +222:2:1931 +223:2:1932 +224:2:1936 +225:2:1937 +226:2:1945 +227:2:1950 +228:2:1954 +229:2:1955 +230:2:1962 +231:2:1963 +232:2:1974 +233:2:1975 +234:2:1976 +235:2:1987 +236:2:1992 +237:2:1993 +238:0:2475 +239:2:2005 +240:0:2475 +241:2:2006 +242:0:2475 +243:2:2007 +244:0:2475 +245:2:2008 +246:0:2475 +247:2:2009 +248:2:2013 +249:2:2014 +250:2:2022 +251:2:2023 +252:2:2027 +253:2:2028 +254:2:2036 +255:2:2041 +256:2:2045 +257:2:2046 +258:2:2053 +259:2:2054 +260:2:2065 +261:2:2066 +262:2:2067 +263:2:2078 +264:2:2083 +265:2:2084 +266:0:2475 +267:2:2201 +268:0:2475 +269:2:2297 +270:0:2475 +271:2:2298 +272:0:2475 +273:2:2302 +274:0:2475 +275:2:2308 +276:0:2475 +277:2:2309 +278:2:2316 +279:2:2317 +280:2:2324 +281:2:2329 +282:0:2475 +283:2:2340 +284:0:2475 +285:2:2341 +286:2:2348 +287:2:2349 +288:2:2356 +289:2:2361 +290:0:2475 +291:2:2372 +292:0:2475 +293:2:2377 +294:2:2384 +295:2:2385 +296:2:2392 +297:2:2397 +298:0:2475 +299:2:2412 +300:0:2475 +301:2:2413 +302:0:2475 +303:2:963 +304:0:2475 +305:2:964 +306:2:968 +307:2:969 +308:2:977 +309:2:978 +310:2:982 +311:2:983 +312:2:991 +313:2:996 +314:2:1000 +315:2:1001 +316:2:1008 +317:2:1009 +318:2:1020 +319:2:1021 +320:2:1022 +321:2:1033 +322:2:1038 +323:2:1039 +324:0:2475 +325:2:1051 +326:2:1052 +327:0:2475 +328:2:1056 +329:2:1060 +330:2:1061 +331:2:1069 +332:2:1070 +333:2:1074 +334:2:1075 +335:2:1083 +336:2:1088 +337:2:1089 +338:2:1100 +339:2:1101 +340:2:1112 +341:2:1113 +342:2:1114 +343:2:1125 +344:2:1130 +345:2:1131 +346:0:2475 +347:2:1143 +348:0:2475 +349:2:1144 +350:0:2475 +351:2:1154 +352:0:2475 +353:2:1155 +354:0:2475 +355:2:1156 +356:2:1163 +357:2:1164 +358:2:1171 +359:2:1176 +360:0:2475 +361:2:1187 +362:0:2475 +363:2:1188 +364:2:1195 +365:2:1196 +366:2:1203 +367:2:1208 +368:0:2475 +369:2:1219 +370:0:2475 +371:2:1224 +372:2:1231 +373:2:1232 +374:2:1239 +375:2:1244 +376:0:2475 +377:2:1259 +378:0:2475 +379:2:1260 +380:2:1264 +381:2:1265 +382:2:1273 +383:2:1274 +384:2:1278 +385:2:1279 +386:2:1287 +387:2:1292 +388:2:1296 +389:2:1297 +390:2:1304 +391:2:1305 +392:2:1316 +393:2:1317 +394:2:1318 +395:2:1329 +396:2:1334 +397:2:1335 +398:0:2475 +399:2:1347 +400:0:2475 +401:2:1350 +402:2:1351 +403:2:1363 +404:2:1364 +405:2:1368 +406:2:1369 +407:2:1377 +408:2:1382 +409:2:1386 +410:2:1387 +411:2:1394 +412:2:1395 +413:2:1406 +414:2:1407 +415:2:1408 +416:2:1419 +417:2:1424 +418:2:1425 +419:0:2475 +420:2:1437 +421:0:2475 +422:2:1438 +423:0:2475 +424:2:1439 +425:0:2475 +426:2:1440 +427:0:2475 +428:2:1441 +429:2:1445 +430:2:1446 +431:2:1454 +432:2:1455 +433:2:1459 +434:2:1460 +435:2:1468 +436:2:1473 +437:2:1477 +438:2:1478 +439:2:1485 +440:2:1486 +441:2:1497 +442:2:1498 +443:2:1499 +444:2:1510 +445:2:1515 +446:2:1516 +447:0:2475 +448:2:1633 +449:0:2475 +450:2:1729 +451:0:2475 +452:2:1730 +453:0:2475 +454:2:1734 +455:0:2475 +456:2:1740 +457:2:1744 +458:2:1745 +459:2:1753 +460:2:1754 +461:2:1758 +462:2:1759 +463:2:1767 +464:2:1772 +465:2:1776 +466:2:1777 +467:2:1784 +468:2:1785 +469:2:1796 +470:2:1797 +471:2:1798 +472:2:1809 +473:2:1814 +474:2:1815 +475:0:2475 +476:2:1827 +477:0:2475 +478:2:1828 +479:2:1832 +480:2:1833 +481:2:1841 +482:2:1842 +483:2:1846 +484:2:1847 +485:2:1855 +486:2:1860 +487:2:1864 +488:2:1865 +489:2:1872 +490:2:1873 +491:2:1884 +492:2:1885 +493:2:1886 +494:2:1897 +495:2:1902 +496:2:1903 +497:0:2475 +498:2:1915 +499:0:2475 +500:2:1918 +501:2:1919 +502:2:1931 +503:2:1932 +504:2:1936 +505:2:1937 +506:2:1945 +507:2:1950 +508:2:1954 +509:2:1955 +510:2:1962 +511:2:1963 +512:2:1974 +513:2:1975 +514:2:1976 +515:2:1987 +516:2:1992 +517:2:1993 +518:0:2475 +519:2:2005 +520:0:2475 +521:2:2006 +522:0:2475 +523:2:2007 +524:0:2475 +525:2:2008 +526:0:2475 +527:2:2009 +528:2:2013 +529:2:2014 +530:2:2022 +531:2:2023 +532:2:2027 +533:2:2028 +534:2:2036 +535:2:2041 +536:2:2045 +537:2:2046 +538:2:2053 +539:2:2054 +540:2:2065 +541:2:2066 +542:2:2067 +543:2:2078 +544:2:2083 +545:2:2084 +546:0:2475 +547:2:2201 +548:0:2475 +549:2:2297 +550:0:2475 +551:2:2298 +552:0:2475 +553:2:2302 +554:0:2475 +555:2:2308 +556:0:2475 +557:2:2309 +558:2:2316 +559:2:2317 +560:2:2324 +561:2:2329 +562:0:2475 +563:2:2340 +564:0:2475 +565:2:2341 +566:2:2348 +567:2:2349 +568:2:2356 +569:2:2361 +570:0:2475 +571:2:2372 +572:0:2475 +573:2:2377 +574:2:2384 +575:2:2385 +576:2:2392 +577:2:2397 +578:0:2475 +579:2:2412 +580:0:2475 +581:2:2413 +582:0:2475 +583:2:963 +584:0:2475 +585:2:964 +586:2:968 +587:2:969 +588:2:977 +589:2:978 +590:2:982 +591:2:983 +592:2:991 +593:2:996 +594:2:1000 +595:2:1001 +596:2:1008 +597:2:1009 +598:2:1020 +599:2:1021 +600:2:1022 +601:2:1033 +602:2:1038 +603:2:1039 +604:0:2475 +605:2:1051 +606:2:1052 +607:0:2475 +608:2:1056 +609:2:1060 +610:2:1061 +611:2:1069 +612:2:1070 +613:2:1074 +614:2:1075 +615:2:1083 +616:2:1088 +617:2:1089 +618:2:1100 +619:2:1101 +620:2:1112 +621:2:1113 +622:2:1114 +623:2:1125 +624:2:1130 +625:2:1131 +626:0:2475 +627:2:1143 +628:0:2475 +629:2:1144 +630:0:2475 +631:2:1154 +632:0:2475 +633:2:1155 +634:0:2475 +635:2:1156 +636:2:1163 +637:2:1164 +638:2:1171 +639:2:1176 +640:0:2475 +641:2:1187 +642:0:2475 +643:2:1188 +644:2:1195 +645:2:1196 +646:2:1203 +647:2:1208 +648:0:2475 +649:2:1219 +650:0:2475 +651:2:1224 +652:2:1231 +653:2:1232 +654:2:1239 +655:2:1244 +656:0:2475 +657:2:1259 +658:0:2475 +659:2:1260 +660:2:1264 +661:2:1265 +662:2:1273 +663:2:1274 +664:2:1278 +665:2:1279 +666:2:1287 +667:2:1292 +668:2:1296 +669:2:1297 +670:2:1304 +671:2:1305 +672:2:1316 +673:2:1317 +674:2:1318 +675:2:1329 +676:2:1334 +677:2:1335 +678:0:2475 +679:2:1347 +680:0:2475 +681:2:1350 +682:2:1351 +683:2:1363 +684:2:1364 +685:2:1368 +686:2:1369 +687:2:1377 +688:2:1382 +689:2:1386 +690:2:1387 +691:2:1394 +692:2:1395 +693:2:1406 +694:2:1407 +695:2:1408 +696:2:1419 +697:2:1424 +698:2:1425 +699:0:2475 +700:2:1437 +701:0:2475 +702:2:1438 +703:0:2475 +704:2:1439 +705:0:2475 +706:2:1440 +707:0:2475 +708:2:1441 +709:2:1445 +710:2:1446 +711:2:1454 +712:2:1455 +713:2:1459 +714:2:1460 +715:2:1468 +716:2:1473 +717:2:1477 +718:2:1478 +719:2:1485 +720:2:1486 +721:2:1497 +722:2:1498 +723:2:1499 +724:2:1510 +725:2:1515 +726:2:1516 +727:0:2475 +728:2:1633 +729:0:2475 +730:2:1729 +731:0:2475 +732:2:1730 +733:0:2475 +734:2:1734 +735:0:2475 +736:2:1740 +737:2:1744 +738:2:1745 +739:2:1753 +740:2:1754 +741:2:1758 +742:2:1759 +743:2:1767 +744:2:1772 +745:2:1776 +746:2:1777 +747:2:1784 +748:2:1785 +749:2:1796 +750:2:1797 +751:2:1798 +752:2:1809 +753:2:1814 +754:2:1815 +755:0:2475 +756:2:1827 +757:0:2475 +758:2:1828 +759:2:1832 +760:2:1833 +761:2:1841 +762:2:1842 +763:2:1846 +764:2:1847 +765:2:1855 +766:2:1860 +767:2:1864 +768:2:1865 +769:2:1872 +770:2:1873 +771:2:1884 +772:2:1885 +773:2:1886 +774:2:1897 +775:2:1902 +776:2:1903 +777:0:2475 +778:2:1915 +779:0:2475 +780:2:1918 +781:2:1919 +782:2:1931 +783:2:1932 +784:2:1936 +785:2:1937 +786:2:1945 +787:2:1950 +788:2:1954 +789:2:1955 +790:2:1962 +791:2:1963 +792:2:1974 +793:2:1975 +794:2:1976 +795:2:1987 +796:2:1992 +797:2:1993 +798:0:2475 +799:2:2005 +800:0:2475 +801:2:2006 +802:0:2475 +803:2:2007 +804:0:2475 +805:2:2008 +806:0:2475 +807:2:2009 +808:2:2013 +809:2:2014 +810:2:2022 +811:2:2023 +812:2:2027 +813:2:2028 +814:2:2036 +815:2:2041 +816:2:2045 +817:2:2046 +818:2:2053 +819:2:2054 +820:2:2065 +821:2:2066 +822:2:2067 +823:2:2078 +824:2:2083 +825:2:2084 +826:0:2475 +827:2:2201 +828:0:2475 +829:2:2297 +830:0:2475 +831:2:2298 +832:0:2475 +833:2:2302 +834:0:2475 +835:2:2308 +836:0:2475 +837:2:2309 +838:2:2316 +839:2:2317 +840:2:2324 +841:2:2329 +842:0:2475 +843:2:2340 +844:0:2475 +845:2:2341 +846:2:2348 +847:2:2349 +848:2:2356 +849:2:2361 +850:0:2475 +851:2:2372 +852:0:2475 +853:2:2377 +854:2:2384 +855:2:2385 +856:2:2392 +857:2:2397 +858:0:2475 +859:2:2412 +860:0:2475 +861:2:2413 +862:0:2475 +863:2:963 +864:0:2475 +865:2:964 +866:2:968 +867:2:969 +868:2:977 +869:2:978 +870:2:982 +871:2:983 +872:2:991 +873:2:996 +874:2:1000 +875:2:1001 +876:2:1008 +877:2:1009 +878:2:1020 +879:2:1021 +880:2:1022 +881:2:1033 +882:2:1038 +883:2:1039 +884:0:2475 +885:2:1051 +886:2:1052 +887:0:2475 +888:2:1056 +889:2:1060 +890:2:1061 +891:2:1069 +892:2:1070 +893:2:1074 +894:2:1075 +895:2:1083 +896:2:1088 +897:2:1089 +898:2:1100 +899:2:1101 +900:2:1112 +901:2:1113 +902:2:1114 +903:2:1125 +904:2:1130 +905:2:1131 +906:0:2475 +907:2:1143 +908:0:2475 +909:2:1144 +910:0:2475 +911:2:1154 +912:0:2475 +913:2:1155 +914:0:2475 +915:2:1156 +916:2:1163 +917:2:1164 +918:2:1171 +919:2:1176 +920:0:2475 +921:2:1187 +922:0:2475 +923:2:1188 +924:2:1195 +925:2:1196 +926:2:1203 +927:2:1208 +928:0:2475 +929:2:1219 +930:0:2475 +931:2:1224 +932:2:1231 +933:2:1232 +934:2:1239 +935:2:1244 +936:0:2475 +937:2:1259 +938:0:2475 +939:2:1260 +940:2:1264 +941:2:1265 +942:2:1273 +943:2:1274 +944:2:1278 +945:2:1279 +946:2:1287 +947:2:1292 +948:2:1296 +949:2:1297 +950:2:1304 +951:2:1305 +952:2:1316 +953:2:1317 +954:2:1318 +955:2:1329 +956:2:1334 +957:2:1335 +958:0:2475 +959:2:1347 +960:0:2475 +961:2:1350 +962:2:1351 +963:2:1363 +964:2:1364 +965:2:1368 +966:2:1369 +967:2:1377 +968:2:1382 +969:2:1386 +970:2:1387 +971:2:1394 +972:2:1395 +973:2:1406 +974:2:1407 +975:2:1408 +976:2:1419 +977:2:1424 +978:2:1425 +979:0:2475 +980:2:1437 +981:0:2475 +982:2:1438 +983:0:2475 +984:2:1439 +985:0:2475 +986:2:1440 +987:0:2475 +988:2:1441 +989:2:1445 +990:2:1446 +991:2:1454 +992:2:1455 +993:2:1459 +994:2:1460 +995:2:1468 +996:2:1473 +997:2:1477 +998:2:1478 +999:2:1485 +1000:2:1486 +1001:2:1497 +1002:2:1498 +1003:2:1499 +1004:2:1510 +1005:2:1515 +1006:2:1516 +1007:0:2475 +1008:2:1633 +1009:0:2475 +1010:2:1729 +1011:0:2475 +1012:2:1730 +1013:0:2475 +1014:2:1734 +1015:0:2475 +1016:2:1740 +1017:2:1744 +1018:2:1745 +1019:2:1753 +1020:2:1754 +1021:2:1758 +1022:2:1759 +1023:2:1767 +1024:2:1772 +1025:2:1776 +1026:2:1777 +1027:2:1784 +1028:2:1785 +1029:2:1796 +1030:2:1797 +1031:2:1798 +1032:2:1809 +1033:2:1814 +1034:2:1815 +1035:0:2475 +1036:2:1827 +1037:0:2475 +1038:2:1828 +1039:2:1832 +1040:2:1833 +1041:2:1841 +1042:2:1842 +1043:2:1846 +1044:2:1847 +1045:2:1855 +1046:2:1860 +1047:2:1864 +1048:2:1865 +1049:2:1872 +1050:2:1873 +1051:2:1884 +1052:2:1885 +1053:2:1886 +1054:2:1897 +1055:2:1902 +1056:2:1903 +1057:0:2475 +1058:2:1915 +1059:0:2475 +1060:2:1918 +1061:2:1919 +1062:2:1931 +1063:2:1932 +1064:2:1936 +1065:2:1937 +1066:2:1945 +1067:2:1950 +1068:2:1954 +1069:2:1955 +1070:2:1962 +1071:2:1963 +1072:2:1974 +1073:2:1975 +1074:2:1976 +1075:2:1987 +1076:2:1992 +1077:2:1993 +1078:0:2475 +1079:2:2005 +1080:0:2475 +1081:2:2006 +1082:0:2475 +1083:2:2007 +1084:0:2475 +1085:2:2008 +1086:0:2475 +1087:2:2009 +1088:2:2013 +1089:2:2014 +1090:2:2022 +1091:2:2023 +1092:2:2027 +1093:2:2028 +1094:2:2036 +1095:2:2041 +1096:2:2045 +1097:2:2046 +1098:2:2053 +1099:2:2054 +1100:2:2065 +1101:2:2066 +1102:2:2067 +1103:2:2078 +1104:2:2083 +1105:2:2084 +1106:0:2475 +1107:2:2201 +1108:0:2475 +1109:2:2297 +1110:0:2475 +1111:2:2298 +1112:0:2475 +1113:2:2302 +1114:0:2475 +1115:2:2308 +1116:0:2475 +1117:2:2309 +1118:2:2316 +1119:2:2317 +1120:2:2324 +1121:2:2329 +1122:0:2475 +1123:2:2340 +1124:0:2475 +1125:2:2341 +1126:2:2348 +1127:2:2349 +1128:2:2356 +1129:2:2361 +1130:0:2475 +1131:2:2372 +1132:0:2475 +1133:2:2377 +1134:2:2384 +1135:2:2385 +1136:2:2392 +1137:2:2397 +1138:0:2475 +1139:2:2412 +1140:0:2475 +1141:2:2413 +1142:0:2475 +1143:2:963 +1144:0:2475 +1145:2:964 +1146:2:968 +1147:2:969 +1148:2:977 +1149:2:978 +1150:2:982 +1151:2:983 +1152:2:991 +1153:2:996 +1154:2:1000 +1155:2:1001 +1156:2:1008 +1157:2:1009 +1158:2:1020 +1159:2:1021 +1160:2:1022 +1161:2:1033 +1162:2:1038 +1163:2:1039 +1164:0:2475 +1165:2:1051 +1166:2:1052 +1167:0:2475 +1168:2:1056 +1169:2:1060 +1170:2:1061 +1171:2:1069 +1172:2:1070 +1173:2:1074 +1174:2:1075 +1175:2:1083 +1176:2:1088 +1177:2:1089 +1178:2:1100 +1179:2:1101 +1180:2:1112 +1181:2:1113 +1182:2:1114 +1183:2:1125 +1184:2:1130 +1185:2:1131 +1186:0:2475 +1187:2:1143 +1188:0:2475 +1189:2:1144 +1190:0:2475 +1191:2:1154 +1192:0:2475 +1193:2:1155 +1194:0:2475 +1195:2:1156 +1196:2:1163 +1197:2:1164 +1198:2:1171 +1199:2:1176 +1200:0:2475 +1201:2:1187 +1202:0:2475 +1203:1:2 +1204:0:2475 +1205:1:8 +1206:0:2475 +1207:1:9 +1208:0:2475 +1209:1:10 +1210:0:2475 +1211:1:11 +1212:0:2475 +1213:1:12 +1214:1:16 +1215:1:17 +1216:1:25 +1217:1:26 +1218:1:30 +1219:1:31 +1220:1:39 +1221:1:44 +1222:1:48 +1223:1:49 +1224:1:56 +1225:1:57 +1226:1:68 +1227:1:69 +1228:1:70 +1229:1:81 +1230:1:93 +1231:1:94 +1232:0:2475 +1233:1:99 +1234:0:2475 +1235:1:100 +1236:1:104 +1237:1:105 +1238:1:113 +1239:1:114 +1240:1:118 +1241:1:119 +1242:1:127 +1243:1:132 +1244:1:136 +1245:1:137 +1246:1:144 +1247:1:145 +1248:1:156 +1249:1:157 +1250:1:158 +1251:1:169 +1252:1:181 +1253:1:182 +1254:0:2475 +1255:1:187 +1256:0:2475 +1257:1:188 +1258:0:2475 +1259:1:189 +1260:1:193 +1261:1:194 +1262:1:202 +1263:1:203 +1264:1:207 +1265:1:208 +1266:1:216 +1267:1:221 +1268:1:225 +1269:1:226 +1270:1:233 +1271:1:234 +1272:1:245 +1273:1:246 +1274:1:247 +1275:1:258 +1276:1:270 +1277:1:271 +1278:0:2475 +1279:1:276 +1280:0:2475 +1281:1:384 +1282:0:2475 +1283:1:385 +1284:0:2475 +1285:1:11 +1286:0:2475 +1287:1:12 +1288:1:16 +1289:1:17 +1290:1:25 +1291:1:26 +1292:1:27 +1293:1:39 +1294:1:44 +1295:1:48 +1296:1:49 +1297:1:56 +1298:1:57 +1299:1:68 +1300:1:69 +1301:1:70 +1302:1:81 +1303:1:93 +1304:1:94 +1305:0:2475 +1306:1:99 +1307:0:2475 +1308:1:100 +1309:1:104 +1310:1:105 +1311:1:113 +1312:1:114 +1313:1:118 +1314:1:119 +1315:1:127 +1316:1:132 +1317:1:136 +1318:1:137 +1319:1:144 +1320:1:145 +1321:1:156 +1322:1:157 +1323:1:158 +1324:1:169 +1325:1:181 +1326:1:182 +1327:0:2475 +1328:1:279 +1329:0:2475 +1330:1:280 +1331:0:2475 +1332:1:384 +1333:0:2475 +1334:1:385 +1335:0:2475 +1336:1:390 +1337:0:2475 +1338:1:395 +1339:1:399 +1340:1:400 +1341:1:408 +1342:1:409 +1343:1:410 +1344:1:422 +1345:1:427 +1346:1:431 +1347:1:432 +1348:1:439 +1349:1:440 +1350:1:451 +1351:1:452 +1352:1:453 +1353:1:464 +1354:1:476 +1355:1:477 +1356:0:2475 +1357:1:482 +1358:0:2475 +1359:1:483 +1360:1:487 +1361:1:488 +1362:1:496 +1363:1:497 +1364:1:501 +1365:1:502 +1366:1:510 +1367:1:515 +1368:1:519 +1369:1:520 +1370:1:527 +1371:1:528 +1372:1:539 +1373:1:540 +1374:1:541 +1375:1:552 +1376:1:564 +1377:1:565 +1378:0:2475 +1379:1:570 +1380:0:2475 +1381:1:571 +1382:1:575 +1383:1:576 +1384:1:584 +1385:1:585 +1386:1:589 +1387:1:590 +1388:1:598 +1389:1:603 +1390:1:607 +1391:1:608 +1392:1:615 +1393:1:616 +1394:1:627 +1395:1:628 +1396:1:629 +1397:1:640 +1398:1:652 +1399:1:653 +1400:0:2475 +1401:1:658 +1402:0:2475 +1403:1:659 +1404:0:2475 +1405:1:660 +1406:0:2475 +1407:1:760 +1408:0:2475 +1409:1:761 +1410:0:2475 +1411:1:765 +1412:0:2475 +1413:1:766 +1414:1:770 +1415:1:771 +1416:1:779 +1417:1:780 +1418:1:784 +1419:1:785 +1420:1:793 +1421:1:798 +1422:1:802 +1423:1:803 +1424:1:810 +1425:1:811 +1426:1:822 +1427:1:823 +1428:1:824 +1429:1:835 +1430:1:847 +1431:1:848 +1432:0:2475 +1433:1:853 +1434:0:2475 +1435:1:660 +1436:0:2475 +1437:1:760 +1438:0:2475 +1439:1:761 +1440:0:2475 +1441:1:765 +1442:0:2475 +1443:1:766 +1444:1:770 +1445:1:771 +1446:1:779 +1447:1:780 +1448:1:781 +1449:1:793 +1450:1:798 +1451:1:802 +1452:1:803 +1453:1:810 +1454:1:811 +1455:1:822 +1456:1:823 +1457:1:824 +1458:1:835 +1459:1:847 +1460:1:848 +1461:0:2475 +1462:1:853 +1463:0:2475 +1464:1:857 +1465:0:2475 +1466:1:862 +1467:1:866 +1468:1:867 +1469:1:875 +1470:1:876 +1471:1:877 +1472:1:889 +1473:1:894 +1474:1:898 +1475:1:899 +1476:1:906 +1477:1:907 +1478:1:918 +1479:1:919 +1480:1:920 +1481:1:931 +1482:1:943 +1483:1:944 +1484:0:2475 +1485:1:9 +1486:0:2475 +1487:1:10 +1488:0:2475 +1489:1:11 +1490:0:2475 +1491:1:12 +1492:1:16 +1493:1:17 +1494:1:25 +1495:1:26 +1496:1:30 +1497:1:31 +1498:1:39 +1499:1:44 +1500:1:48 +1501:1:49 +1502:1:56 +1503:1:57 +1504:1:68 +1505:1:69 +1506:1:70 +1507:1:81 +1508:1:93 +1509:1:94 +1510:0:2475 +1511:1:99 +1512:0:2475 +1513:1:100 +1514:1:104 +1515:1:105 +1516:1:113 +1517:1:114 +1518:1:118 +1519:1:119 +1520:1:127 +1521:1:132 +1522:1:136 +1523:1:137 +1524:1:144 +1525:1:145 +1526:1:156 +1527:1:157 +1528:1:158 +1529:1:169 +1530:1:181 +1531:1:182 +1532:0:2475 +1533:1:187 +1534:0:2475 +1535:1:188 +1536:0:2475 +1537:1:189 +1538:1:193 +1539:1:194 +1540:1:202 +1541:1:203 +1542:1:207 +1543:1:208 +1544:1:216 +1545:1:221 +1546:1:225 +1547:1:226 +1548:1:233 +1549:1:234 +1550:1:245 +1551:1:246 +1552:1:247 +1553:1:258 +1554:1:270 +1555:1:271 +1556:0:2475 +1557:1:276 +1558:0:2475 +1559:1:384 +1560:0:2475 +1561:1:385 +1562:0:2475 +1563:1:11 +1564:0:2475 +1565:1:12 +1566:1:16 +1567:1:17 +1568:1:25 +1569:1:34 +1570:1:35 +1571:1:39 +1572:1:44 +1573:1:48 +1574:1:49 +1575:1:56 +1576:1:57 +1577:1:68 +1578:1:69 +1579:1:72 +1580:1:73 +1581:1:81 +1582:1:93 +1583:1:94 +1584:0:2475 +1585:1:99 +1586:0:2475 +1587:1:100 +1588:1:104 +1589:1:105 +1590:1:113 +1591:1:122 +1592:1:123 +1593:1:127 +1594:1:132 +1595:1:136 +1596:1:137 +1597:1:144 +1598:1:145 +1599:1:156 +1600:1:157 +1601:1:160 +1602:1:161 +1603:1:169 +1604:1:181 +1605:1:182 +1606:0:2475 +1607:1:279 +1608:0:2475 +1609:1:280 +1610:0:2475 +1611:1:384 +1612:0:2475 +1613:1:385 +1614:0:2475 +1615:1:390 +1616:0:2475 +1617:1:395 +1618:1:399 +1619:1:400 +1620:1:408 +1621:1:417 +1622:1:418 +1623:1:422 +1624:1:427 +1625:1:431 +1626:1:432 +1627:1:439 +1628:1:440 +1629:1:451 +1630:1:452 +1631:1:455 +1632:1:456 +1633:1:464 +1634:1:476 +1635:1:477 +1636:0:2475 +1637:1:482 +1638:0:2475 +1639:2:1188 +1640:2:1195 +1641:2:1198 +1642:2:1199 +1643:2:1203 +1644:2:1208 +1645:0:2475 +1646:2:1219 +1647:0:2475 +1648:2:1224 +1649:2:1231 +1650:2:1232 +1651:2:1239 +1652:2:1244 +1653:0:2475 +1654:2:1259 +1655:0:2475 +1656:2:1260 +1657:2:1264 +1658:2:1265 +1659:2:1273 +1660:2:1274 +1661:2:1278 +1662:2:1279 +1663:2:1287 +1664:2:1292 +1665:2:1296 +1666:2:1297 +1667:2:1304 +1668:2:1305 +1669:2:1316 +1670:2:1317 +1671:2:1318 +1672:2:1329 +1673:2:1334 +1674:2:1335 +1675:0:2475 +1676:2:1347 +1677:0:2475 +1678:2:1350 +1679:2:1351 +1680:2:1363 +1681:2:1364 +1682:2:1368 +1683:2:1369 +1684:2:1377 +1685:2:1382 +1686:2:1386 +1687:2:1387 +1688:2:1394 +1689:2:1395 +1690:2:1406 +1691:2:1407 +1692:2:1408 +1693:2:1419 +1694:2:1424 +1695:2:1425 +1696:0:2475 +1697:2:1437 +1698:0:2475 +1699:2:1438 +1700:0:2475 +1701:2:1439 +1702:0:2475 +1703:2:1440 +1704:0:2475 +1705:2:1441 +1706:2:1445 +1707:2:1446 +1708:2:1454 +1709:2:1455 +1710:2:1459 +1711:2:1460 +1712:2:1468 +1713:2:1473 +1714:2:1477 +1715:2:1478 +1716:2:1485 +1717:2:1486 +1718:2:1497 +1719:2:1498 +1720:2:1499 +1721:2:1510 +1722:2:1515 +1723:2:1516 +1724:0:2475 +1725:2:1633 +1726:0:2475 +1727:2:1729 +1728:0:2475 +1729:2:1730 +1730:0:2475 +1731:2:1734 +1732:0:2475 +1733:2:1740 +1734:2:1744 +1735:2:1745 +1736:2:1753 +1737:2:1754 +1738:2:1758 +1739:2:1759 +1740:2:1767 +1741:2:1772 +1742:2:1776 +1743:2:1777 +1744:2:1784 +1745:2:1785 +1746:2:1796 +1747:2:1797 +1748:2:1798 +1749:2:1809 +1750:2:1814 +1751:2:1815 +1752:0:2475 +1753:2:1827 +1754:0:2475 +1755:2:1828 +1756:2:1832 +1757:2:1833 +1758:2:1841 +1759:2:1842 +1760:2:1846 +1761:2:1847 +1762:2:1855 +1763:2:1860 +1764:2:1864 +1765:2:1865 +1766:2:1872 +1767:2:1873 +1768:2:1884 +1769:2:1885 +1770:2:1886 +1771:2:1897 +1772:2:1902 +1773:2:1903 +1774:0:2475 +1775:2:1915 +1776:0:2475 +1777:2:1918 +1778:2:1919 +1779:2:1931 +1780:2:1932 +1781:2:1936 +1782:2:1937 +1783:2:1945 +1784:2:1950 +1785:2:1954 +1786:2:1955 +1787:2:1962 +1788:2:1963 +1789:2:1974 +1790:2:1975 +1791:2:1976 +1792:2:1987 +1793:2:1992 +1794:2:1993 +1795:0:2475 +1796:2:2005 +1797:0:2475 +1798:2:2006 +1799:0:2475 +1800:2:2007 +1801:0:2475 +1802:2:2008 +1803:0:2475 +1804:2:2009 +1805:2:2013 +1806:2:2014 +1807:2:2022 +1808:2:2023 +1809:2:2027 +1810:2:2028 +1811:2:2036 +1812:2:2041 +1813:2:2045 +1814:2:2046 +1815:2:2053 +1816:2:2054 +1817:2:2065 +1818:2:2066 +1819:2:2067 +1820:2:2078 +1821:2:2083 +1822:2:2084 +1823:0:2475 +1824:2:2201 +1825:0:2475 +1826:2:2297 +1827:0:2475 +1828:2:2298 +1829:0:2475 +1830:2:2302 +1831:0:2475 +1832:2:2308 +1833:0:2475 +1834:2:2309 +1835:2:2316 +1836:2:2317 +1837:2:2324 +1838:2:2329 +1839:0:2475 +1840:2:2340 +1841:0:2475 +1842:2:2341 +1843:2:2348 +1844:2:2351 +1845:2:2352 +1846:2:2356 +1847:2:2361 +1848:0:2475 +1849:2:2372 +1850:0:2475 +1851:2:2377 +1852:2:2384 +1853:2:2385 +1854:2:2392 +1855:2:2397 +1856:0:2475 +1857:2:2412 +1858:0:2475 +1859:2:2413 +1860:0:2475 +1861:2:2416 +1862:0:2475 +1863:2:2421 +1864:0:2475 +1865:1:483 +1866:1:487 +1867:1:488 +1868:1:496 +1869:1:497 +1870:1:498 +1871:1:510 +1872:1:515 +1873:1:519 +1874:1:520 +1875:1:527 +1876:1:528 +1877:1:539 +1878:1:540 +1879:1:541 +1880:1:552 +1881:1:557 +1882:1:558 +1883:0:2475 +1884:2:2422 +1885:0:2475 +1886:1:570 +1887:0:2473 +1888:2:2421 +1889:0:2479 +1890:1:151 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.define b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.define new file mode 100644 index 0000000..5e642ef --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.define @@ -0,0 +1 @@ +#define SINGLE_FLIP diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.log b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.log new file mode 100644 index 0000000..6a9d040 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.log @@ -0,0 +1,349 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_free_single_flip.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 567) +pan: claim violated! (at depth 1353) +pan: wrote .input.spin.trail + +(Spin Version 5.1.7 -- 23 December 2008) +Warning: Search not completed + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 3705, errors: 1 + 216253 states, stored + 2924019 states, matched + 3140272 transitions (= stored+matched) + 11791015 atomic steps +hash conflicts: 155585 (resolved) + +Stats on memory usage (in Megabytes): + 17.324 equivalent memory usage for states (stored*(State-vector + overhead)) + 13.576 actual memory usage for states (compression: 78.37%) + state-vector as stored = 38 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 479.338 total actual memory usage + +unreached in proctype urcu_reader + line 289, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 61, "(1)" + line 308, "pan.___", state 91, "(1)" + line 289, "pan.___", state 104, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 136, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 149, "(1)" + line 308, "pan.___", state 179, "(1)" + line 289, "pan.___", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 225, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 238, "(1)" + line 308, "pan.___", state 268, "(1)" + line 159, "pan.___", state 289, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 159, "pan.___", state 291, "(1)" + line 163, "pan.___", state 298, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 163, "pan.___", state 300, "(1)" + line 163, "pan.___", state 301, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 163, "pan.___", state 301, "else" + line 161, "pan.___", state 306, "((j<1))" + line 161, "pan.___", state 306, "((j>=1))" + line 167, "pan.___", state 311, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 144, "pan.___", state 321, "(1)" + line 148, "pan.___", state 329, "(1)" + line 148, "pan.___", state 330, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 148, "pan.___", state 330, "else" + line 146, "pan.___", state 335, "((j<1))" + line 146, "pan.___", state 335, "((j>=1))" + line 152, "pan.___", state 341, "(1)" + line 152, "pan.___", state 342, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 152, "pan.___", state 342, "else" + line 154, "pan.___", state 345, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 154, "pan.___", state 345, "else" + line 186, "pan.___", state 347, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 186, "pan.___", state 347, "else" + line 159, "pan.___", state 352, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 167, "pan.___", state 374, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 152, "pan.___", state 404, "(1)" + line 152, "pan.___", state 405, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 159, "pan.___", state 419, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 159, "pan.___", state 421, "(1)" + line 163, "pan.___", state 428, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 163, "pan.___", state 430, "(1)" + line 163, "pan.___", state 431, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 163, "pan.___", state 431, "else" + line 161, "pan.___", state 436, "((j<1))" + line 161, "pan.___", state 436, "((j>=1))" + line 167, "pan.___", state 441, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 144, "pan.___", state 451, "(1)" + line 148, "pan.___", state 459, "(1)" + line 148, "pan.___", state 460, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 148, "pan.___", state 460, "else" + line 146, "pan.___", state 465, "((j<1))" + line 146, "pan.___", state 465, "((j>=1))" + line 152, "pan.___", state 471, "(1)" + line 152, "pan.___", state 472, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 152, "pan.___", state 472, "else" + line 154, "pan.___", state 475, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 154, "pan.___", state 475, "else" + line 186, "pan.___", state 477, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 186, "pan.___", state 477, "else" + line 289, "pan.___", state 492, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 524, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 537, "(1)" + line 308, "pan.___", state 567, "(1)" + line 289, "pan.___", state 580, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 612, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 625, "(1)" + line 308, "pan.___", state 655, "(1)" + line 289, "pan.___", state 668, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 713, "(1)" + line 308, "pan.___", state 743, "(1)" + line 159, "pan.___", state 758, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 159, "pan.___", state 760, "(1)" + line 163, "pan.___", state 767, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 163, "pan.___", state 769, "(1)" + line 163, "pan.___", state 770, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 163, "pan.___", state 770, "else" + line 161, "pan.___", state 775, "((j<1))" + line 161, "pan.___", state 775, "((j>=1))" + line 167, "pan.___", state 780, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 144, "pan.___", state 790, "(1)" + line 148, "pan.___", state 798, "(1)" + line 148, "pan.___", state 799, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 148, "pan.___", state 799, "else" + line 146, "pan.___", state 804, "((j<1))" + line 146, "pan.___", state 804, "((j>=1))" + line 152, "pan.___", state 810, "(1)" + line 152, "pan.___", state 811, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 152, "pan.___", state 811, "else" + line 154, "pan.___", state 814, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 154, "pan.___", state 814, "else" + line 186, "pan.___", state 816, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 186, "pan.___", state 816, "else" + line 159, "pan.___", state 821, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 167, "pan.___", state 843, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 152, "pan.___", state 873, "(1)" + line 152, "pan.___", state 874, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 159, "pan.___", state 888, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 159, "pan.___", state 890, "(1)" + line 163, "pan.___", state 897, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 163, "pan.___", state 899, "(1)" + line 163, "pan.___", state 900, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 163, "pan.___", state 900, "else" + line 161, "pan.___", state 905, "((j<1))" + line 161, "pan.___", state 905, "((j>=1))" + line 167, "pan.___", state 910, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 144, "pan.___", state 920, "(1)" + line 148, "pan.___", state 928, "(1)" + line 148, "pan.___", state 929, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 148, "pan.___", state 929, "else" + line 146, "pan.___", state 934, "((j<1))" + line 146, "pan.___", state 934, "((j>=1))" + line 152, "pan.___", state 940, "(1)" + line 152, "pan.___", state 941, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 152, "pan.___", state 941, "else" + line 154, "pan.___", state 944, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 154, "pan.___", state 944, "else" + line 186, "pan.___", state 946, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 186, "pan.___", state 946, "else" + line 289, "pan.___", state 956, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 988, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 1001, "(1)" + line 308, "pan.___", state 1031, "(1)" + line 289, "pan.___", state 1052, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 1084, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 1097, "(1)" + line 308, "pan.___", state 1127, "(1)" + line 434, "pan.___", state 1140, "-end-" + (125 of 1140 states) +unreached in proctype urcu_writer + line 289, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 293, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 298, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 59, "(1)" + line 303, "pan.___", state 72, "(1)" + line 308, "pan.___", state 89, "(1)" + line 289, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 293, "pan.___", state 120, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 151, "(1)" + line 303, "pan.___", state 164, "(1)" + line 468, "pan.___", state 195, "(1)" + line 159, "pan.___", state 205, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 163, "pan.___", state 214, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 144, "pan.___", state 237, "(1)" + line 148, "pan.___", state 245, "(1)" + line 152, "pan.___", state 257, "(1)" + line 159, "pan.___", state 268, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 298, "pan.___", state 910, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 299, "pan.___", state 923, "(1)" + line 299, "pan.___", state 924, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 299, "pan.___", state 924, "else" + line 299, "pan.___", state 927, "(1)" + line 299, "pan.___", state 928, "(1)" + line 299, "pan.___", state 928, "(1)" + line 303, "pan.___", state 936, "(1)" + line 303, "pan.___", state 937, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 303, "pan.___", state 937, "else" + line 303, "pan.___", state 940, "(1)" + line 303, "pan.___", state 941, "(1)" + line 303, "pan.___", state 941, "(1)" + line 301, "pan.___", state 946, "((i<1))" + line 301, "pan.___", state 946, "((i>=1))" + line 308, "pan.___", state 953, "(1)" + line 308, "pan.___", state 954, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 308, "pan.___", state 954, "else" + line 308, "pan.___", state 957, "(1)" + line 308, "pan.___", state 958, "(1)" + line 308, "pan.___", state 958, "(1)" + line 310, "pan.___", state 961, "(1)" + line 310, "pan.___", state 961, "(1)" + line 163, "pan.___", state 985, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 167, "pan.___", state 998, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 144, "pan.___", state 1008, "(1)" + line 148, "pan.___", state 1016, "(1)" + line 152, "pan.___", state 1028, "(1)" + line 159, "pan.___", state 1039, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=2))" + line 519, "pan.___", state 20, "((j<2))" + line 519, "pan.___", state 20, "((j>=2))" + line 524, "pan.___", state 33, "((j<2))" + line 524, "pan.___", state 33, "((j>=2))" + (3 of 46 states) +unreached in proctype :never: + line 572, "pan.___", state 8, "-end-" + (1 of 8 states) + +pan: elapsed time 5.58 seconds +pan: rate 38755.018 states/second +pan: avg transition delay 1.7769e-06 usec +cp .input.spin urcu_free_single_flip.spin.input +cp .input.spin.trail urcu_free_single_flip.spin.input.trail +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.spin.input b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.spin.input new file mode 100644 index 0000000..244a7b2 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.spin.input @@ -0,0 +1,532 @@ +#define SINGLE_FLIP + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + + +#if (NR_READERS == 1) + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#elif (NR_READERS == 2) + +#define read_free_race (read_generation[0] == last_free_gen || read_generation[1] == last_free_gen) +#define read_free (free_done && (data_access[0] || data_access[1])) + +#else + +#error "Too many readers" + +#endif + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +#define get_pid() (_pid) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb(i, j) +{ + if + :: get_pid() >= NR_READERS -> + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); + :: else -> skip; + fi; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +#define get_readerid() (get_pid()) +#define get_writerid() (get_readerid() + NR_READERS) + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb(i, j); +#else + ooo_mem(i); +#endif + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + ooo_mem(i); + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + ooo_mem(i); + data_access[get_readerid()] = 1; + ooo_mem(i); + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + ooo_mem(i); + //smp_mc(i); /* added */ +} + +active [NR_READERS] proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS + /* Only test progress of one random reader. They are all the + * same. */ + atomic { + if + :: get_readerid() == 0 -> +progress_reader: + skip; + :: else -> + skip; + fi; + } +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb(i, j); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb(i, j); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + skip; + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.spin.input.trail b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.spin.input.trail new file mode 100644 index 0000000..363553e --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.spin.input.trail @@ -0,0 +1,1356 @@ +-2:3:-2 +-4:-4:-4 +1:0:2372 +2:3:2324 +3:3:2327 +4:3:2327 +5:3:2330 +6:3:2338 +7:3:2338 +8:3:2341 +9:3:2347 +10:3:2351 +11:3:2351 +12:3:2354 +13:3:2362 +14:3:2366 +15:3:2367 +16:0:2372 +17:3:2369 +18:0:2372 +19:2:1142 +20:0:2372 +21:2:1148 +22:0:2372 +23:2:1149 +24:0:2372 +25:2:1150 +26:2:1154 +27:2:1155 +28:2:1163 +29:2:1164 +30:2:1168 +31:2:1169 +32:2:1177 +33:2:1182 +34:2:1186 +35:2:1187 +36:2:1194 +37:2:1195 +38:2:1206 +39:2:1207 +40:2:1208 +41:2:1219 +42:2:1224 +43:2:1225 +44:0:2372 +45:2:1237 +46:2:1238 +47:0:2372 +48:2:1242 +49:2:1246 +50:2:1247 +51:2:1255 +52:2:1256 +53:2:1260 +54:2:1261 +55:2:1269 +56:2:1274 +57:2:1275 +58:2:1286 +59:2:1287 +60:2:1298 +61:2:1299 +62:2:1300 +63:2:1311 +64:2:1316 +65:2:1317 +66:0:2372 +67:2:1329 +68:0:2372 +69:2:1330 +70:0:2372 +71:2:1340 +72:0:2372 +73:2:1341 +74:0:2372 +75:2:1345 +76:2:1346 +77:2:1350 +78:2:1354 +79:2:1355 +80:2:1359 +81:2:1367 +82:2:1368 +83:2:1373 +84:2:1380 +85:2:1381 +86:2:1388 +87:2:1393 +88:0:2372 +89:2:1404 +90:0:2372 +91:2:1408 +92:2:1409 +93:2:1413 +94:2:1417 +95:2:1418 +96:2:1422 +97:2:1430 +98:2:1431 +99:2:1436 +100:2:1443 +101:2:1444 +102:2:1451 +103:2:1456 +104:0:2372 +105:2:1467 +106:0:2372 +107:2:1475 +108:2:1476 +109:2:1480 +110:2:1484 +111:2:1485 +112:2:1489 +113:2:1497 +114:2:1498 +115:2:1503 +116:2:1510 +117:2:1511 +118:2:1518 +119:2:1523 +120:0:2372 +121:2:1538 +122:0:2372 +123:2:1539 +124:2:1543 +125:2:1544 +126:2:1552 +127:2:1553 +128:2:1557 +129:2:1558 +130:2:1566 +131:2:1571 +132:2:1575 +133:2:1576 +134:2:1583 +135:2:1584 +136:2:1595 +137:2:1596 +138:2:1597 +139:2:1608 +140:2:1613 +141:2:1614 +142:0:2372 +143:2:1626 +144:0:2372 +145:2:1629 +146:2:1630 +147:2:1642 +148:2:1643 +149:2:1647 +150:2:1648 +151:2:1656 +152:2:1661 +153:2:1665 +154:2:1666 +155:2:1673 +156:2:1674 +157:2:1685 +158:2:1686 +159:2:1687 +160:2:1698 +161:2:1703 +162:2:1704 +163:0:2372 +164:2:1716 +165:0:2372 +166:2:1717 +167:0:2372 +168:2:1718 +169:0:2372 +170:2:1719 +171:0:2372 +172:2:1720 +173:2:1724 +174:2:1725 +175:2:1733 +176:2:1734 +177:2:1738 +178:2:1739 +179:2:1747 +180:2:1752 +181:2:1756 +182:2:1757 +183:2:1764 +184:2:1765 +185:2:1776 +186:2:1777 +187:2:1778 +188:2:1789 +189:2:1794 +190:2:1795 +191:0:2372 +192:2:2005 +193:0:2372 +194:2:2101 +195:0:2372 +196:2:2102 +197:0:2372 +198:2:2106 +199:0:2372 +200:2:2112 +201:0:2372 +202:2:2116 +203:2:2117 +204:2:2121 +205:2:2125 +206:2:2126 +207:2:2130 +208:2:2138 +209:2:2139 +210:2:2144 +211:2:2151 +212:2:2152 +213:2:2159 +214:2:2164 +215:0:2372 +216:2:2175 +217:0:2372 +218:2:2179 +219:2:2180 +220:2:2184 +221:2:2188 +222:2:2189 +223:2:2193 +224:2:2201 +225:2:2202 +226:2:2207 +227:2:2214 +228:2:2215 +229:2:2222 +230:2:2227 +231:0:2372 +232:2:2238 +233:0:2372 +234:2:2246 +235:2:2247 +236:2:2251 +237:2:2255 +238:2:2256 +239:2:2260 +240:2:2268 +241:2:2269 +242:2:2274 +243:2:2281 +244:2:2282 +245:2:2289 +246:2:2294 +247:0:2372 +248:2:2309 +249:0:2372 +250:2:2310 +251:0:2372 +252:2:1149 +253:0:2372 +254:2:1150 +255:2:1154 +256:2:1155 +257:2:1163 +258:2:1164 +259:2:1168 +260:2:1169 +261:2:1177 +262:2:1182 +263:2:1186 +264:2:1187 +265:2:1194 +266:2:1195 +267:2:1206 +268:2:1207 +269:2:1208 +270:2:1219 +271:2:1224 +272:2:1225 +273:0:2372 +274:2:1237 +275:2:1238 +276:0:2372 +277:2:1242 +278:2:1246 +279:2:1247 +280:2:1255 +281:2:1256 +282:2:1260 +283:2:1261 +284:2:1269 +285:2:1274 +286:2:1275 +287:2:1286 +288:2:1287 +289:2:1298 +290:2:1299 +291:2:1300 +292:2:1311 +293:2:1316 +294:2:1317 +295:0:2372 +296:2:1329 +297:0:2372 +298:2:1330 +299:0:2372 +300:2:1340 +301:0:2372 +302:2:1341 +303:0:2372 +304:2:1345 +305:2:1346 +306:2:1350 +307:2:1354 +308:2:1355 +309:2:1359 +310:2:1367 +311:2:1368 +312:2:1373 +313:2:1380 +314:2:1381 +315:2:1388 +316:2:1393 +317:0:2372 +318:2:1404 +319:0:2372 +320:2:1408 +321:2:1409 +322:2:1413 +323:2:1417 +324:2:1418 +325:2:1422 +326:2:1430 +327:2:1431 +328:2:1436 +329:2:1443 +330:2:1444 +331:2:1451 +332:2:1456 +333:0:2372 +334:2:1467 +335:0:2372 +336:2:1475 +337:2:1476 +338:2:1480 +339:2:1484 +340:2:1485 +341:2:1489 +342:2:1497 +343:2:1498 +344:2:1503 +345:2:1510 +346:2:1511 +347:2:1518 +348:2:1523 +349:0:2372 +350:2:1538 +351:0:2372 +352:2:1539 +353:2:1543 +354:2:1544 +355:2:1552 +356:2:1553 +357:2:1557 +358:2:1558 +359:2:1566 +360:2:1571 +361:2:1575 +362:2:1576 +363:2:1583 +364:2:1584 +365:2:1595 +366:2:1596 +367:2:1597 +368:2:1608 +369:2:1613 +370:2:1614 +371:0:2372 +372:2:1626 +373:0:2372 +374:2:1629 +375:2:1630 +376:2:1642 +377:2:1643 +378:2:1647 +379:2:1648 +380:2:1656 +381:2:1661 +382:2:1665 +383:2:1666 +384:2:1673 +385:2:1674 +386:2:1685 +387:2:1686 +388:2:1687 +389:2:1698 +390:2:1703 +391:2:1704 +392:0:2372 +393:2:1716 +394:0:2372 +395:2:1717 +396:0:2372 +397:2:1718 +398:0:2372 +399:2:1719 +400:0:2372 +401:2:1720 +402:2:1724 +403:2:1725 +404:2:1733 +405:2:1734 +406:2:1738 +407:2:1739 +408:2:1747 +409:2:1752 +410:2:1756 +411:2:1757 +412:2:1764 +413:2:1765 +414:2:1776 +415:2:1777 +416:2:1778 +417:2:1789 +418:2:1794 +419:2:1795 +420:0:2372 +421:2:2005 +422:0:2372 +423:2:2101 +424:0:2372 +425:2:2102 +426:0:2372 +427:2:2106 +428:0:2372 +429:2:2112 +430:0:2372 +431:2:2116 +432:2:2117 +433:2:2121 +434:2:2125 +435:2:2126 +436:2:2130 +437:2:2138 +438:2:2139 +439:2:2144 +440:2:2151 +441:2:2152 +442:2:2159 +443:2:2164 +444:0:2372 +445:2:2175 +446:0:2372 +447:2:2179 +448:2:2180 +449:2:2184 +450:2:2188 +451:2:2189 +452:2:2193 +453:2:2201 +454:2:2202 +455:2:2207 +456:2:2214 +457:2:2215 +458:2:2222 +459:2:2227 +460:0:2372 +461:2:2238 +462:0:2372 +463:2:2246 +464:2:2247 +465:2:2251 +466:2:2255 +467:2:2256 +468:2:2260 +469:2:2268 +470:2:2269 +471:2:2274 +472:2:2281 +473:2:2282 +474:2:2289 +475:2:2294 +476:0:2372 +477:2:2309 +478:0:2372 +479:2:2310 +480:0:2372 +481:2:1149 +482:0:2372 +483:2:1150 +484:2:1154 +485:2:1155 +486:2:1163 +487:2:1164 +488:2:1168 +489:2:1169 +490:2:1177 +491:2:1182 +492:2:1186 +493:2:1187 +494:2:1194 +495:2:1195 +496:2:1206 +497:2:1207 +498:2:1208 +499:2:1219 +500:2:1224 +501:2:1225 +502:0:2372 +503:2:1237 +504:2:1238 +505:0:2372 +506:2:1242 +507:2:1246 +508:2:1247 +509:2:1255 +510:2:1256 +511:2:1260 +512:2:1261 +513:2:1269 +514:2:1274 +515:2:1275 +516:2:1286 +517:2:1287 +518:2:1298 +519:2:1299 +520:2:1300 +521:2:1311 +522:2:1316 +523:2:1317 +524:0:2372 +525:2:1329 +526:0:2372 +527:2:1330 +528:0:2372 +529:2:1340 +530:0:2372 +531:2:1341 +532:0:2372 +533:2:1345 +534:2:1346 +535:2:1350 +536:2:1354 +537:2:1355 +538:2:1359 +539:2:1367 +540:2:1368 +541:2:1373 +542:2:1380 +543:2:1381 +544:2:1388 +545:2:1393 +546:0:2372 +547:2:1404 +548:0:2372 +549:2:1408 +550:2:1409 +551:2:1413 +552:2:1417 +553:2:1418 +554:2:1422 +555:2:1430 +556:2:1431 +557:2:1436 +558:2:1443 +559:2:1444 +560:2:1451 +561:2:1456 +562:0:2372 +563:2:1467 +564:0:2372 +565:2:1475 +566:2:1476 +567:2:1480 +568:2:1484 +569:2:1485 +570:2:1489 +571:2:1497 +572:2:1498 +573:2:1503 +574:2:1510 +575:2:1511 +576:2:1518 +577:2:1523 +578:0:2372 +579:2:1538 +580:0:2372 +581:2:1539 +582:2:1543 +583:2:1544 +584:2:1552 +585:2:1553 +586:2:1557 +587:2:1558 +588:2:1566 +589:2:1571 +590:2:1575 +591:2:1576 +592:2:1583 +593:2:1584 +594:2:1595 +595:2:1596 +596:2:1597 +597:2:1608 +598:2:1613 +599:2:1614 +600:0:2372 +601:2:1626 +602:0:2372 +603:2:1629 +604:2:1630 +605:2:1642 +606:2:1643 +607:2:1647 +608:2:1648 +609:2:1656 +610:2:1661 +611:2:1665 +612:2:1666 +613:2:1673 +614:2:1674 +615:2:1685 +616:2:1686 +617:2:1687 +618:2:1698 +619:2:1703 +620:2:1704 +621:0:2372 +622:2:1716 +623:0:2372 +624:2:1717 +625:0:2372 +626:2:1718 +627:0:2372 +628:2:1719 +629:0:2372 +630:2:1720 +631:2:1724 +632:2:1725 +633:2:1733 +634:2:1734 +635:2:1738 +636:2:1739 +637:2:1747 +638:2:1752 +639:2:1756 +640:2:1757 +641:2:1764 +642:2:1765 +643:2:1776 +644:2:1777 +645:2:1778 +646:2:1789 +647:2:1794 +648:2:1795 +649:0:2372 +650:2:2005 +651:0:2372 +652:2:2101 +653:0:2372 +654:2:2102 +655:0:2372 +656:2:2106 +657:0:2372 +658:2:2112 +659:0:2372 +660:2:2116 +661:2:2117 +662:2:2121 +663:2:2125 +664:2:2126 +665:2:2130 +666:2:2138 +667:2:2139 +668:2:2144 +669:2:2151 +670:2:2152 +671:2:2159 +672:2:2164 +673:0:2372 +674:2:2175 +675:0:2372 +676:2:2179 +677:2:2180 +678:2:2184 +679:2:2188 +680:2:2189 +681:2:2193 +682:2:2201 +683:2:2202 +684:2:2207 +685:2:2214 +686:2:2215 +687:2:2222 +688:2:2227 +689:0:2372 +690:2:2238 +691:0:2372 +692:2:2246 +693:2:2247 +694:2:2251 +695:2:2255 +696:2:2256 +697:2:2260 +698:2:2268 +699:2:2269 +700:2:2274 +701:2:2281 +702:2:2282 +703:2:2289 +704:2:2294 +705:0:2372 +706:2:2309 +707:0:2372 +708:2:2310 +709:0:2372 +710:2:1149 +711:0:2372 +712:2:1150 +713:2:1154 +714:2:1155 +715:2:1163 +716:2:1164 +717:2:1168 +718:2:1169 +719:2:1177 +720:2:1182 +721:2:1186 +722:2:1187 +723:2:1194 +724:2:1195 +725:2:1206 +726:2:1207 +727:2:1208 +728:2:1219 +729:2:1224 +730:2:1225 +731:0:2372 +732:2:1237 +733:2:1238 +734:0:2372 +735:2:1242 +736:2:1246 +737:2:1247 +738:2:1255 +739:2:1256 +740:2:1260 +741:2:1261 +742:2:1269 +743:2:1274 +744:2:1275 +745:2:1286 +746:2:1287 +747:2:1298 +748:2:1299 +749:2:1300 +750:2:1311 +751:2:1316 +752:2:1317 +753:0:2372 +754:2:1329 +755:0:2372 +756:2:1330 +757:0:2372 +758:2:1340 +759:0:2372 +760:2:1341 +761:0:2372 +762:2:1345 +763:2:1346 +764:2:1350 +765:2:1354 +766:2:1355 +767:2:1359 +768:2:1367 +769:2:1368 +770:2:1373 +771:2:1380 +772:2:1381 +773:2:1388 +774:2:1393 +775:0:2372 +776:2:1404 +777:0:2372 +778:2:1408 +779:2:1409 +780:2:1413 +781:2:1417 +782:2:1418 +783:2:1422 +784:2:1430 +785:2:1431 +786:2:1436 +787:2:1443 +788:2:1444 +789:2:1451 +790:2:1456 +791:0:2372 +792:2:1467 +793:0:2372 +794:2:1475 +795:2:1476 +796:2:1480 +797:2:1484 +798:2:1485 +799:2:1489 +800:2:1497 +801:2:1498 +802:2:1503 +803:2:1510 +804:2:1511 +805:2:1518 +806:2:1523 +807:0:2372 +808:2:1538 +809:0:2372 +810:2:1539 +811:2:1543 +812:2:1544 +813:2:1552 +814:2:1553 +815:2:1557 +816:2:1558 +817:2:1566 +818:2:1571 +819:2:1575 +820:2:1576 +821:2:1583 +822:2:1584 +823:2:1595 +824:2:1596 +825:2:1597 +826:2:1608 +827:2:1613 +828:2:1614 +829:0:2372 +830:2:1626 +831:0:2372 +832:2:1629 +833:2:1630 +834:2:1642 +835:2:1643 +836:2:1647 +837:2:1648 +838:2:1656 +839:2:1661 +840:2:1665 +841:2:1666 +842:2:1673 +843:2:1674 +844:2:1685 +845:2:1686 +846:2:1687 +847:2:1698 +848:2:1703 +849:2:1704 +850:0:2372 +851:2:1716 +852:0:2372 +853:2:1717 +854:0:2372 +855:2:1718 +856:0:2372 +857:2:1719 +858:0:2372 +859:2:1720 +860:2:1724 +861:2:1725 +862:2:1733 +863:2:1734 +864:2:1738 +865:2:1739 +866:2:1747 +867:2:1752 +868:2:1756 +869:2:1757 +870:2:1764 +871:2:1765 +872:2:1776 +873:2:1777 +874:2:1778 +875:2:1789 +876:2:1794 +877:2:1795 +878:0:2372 +879:2:2005 +880:0:2372 +881:2:2101 +882:0:2372 +883:2:2102 +884:0:2372 +885:2:2106 +886:0:2372 +887:2:2112 +888:0:2372 +889:2:2116 +890:2:2117 +891:2:2121 +892:2:2125 +893:2:2126 +894:2:2130 +895:2:2138 +896:2:2139 +897:2:2144 +898:2:2151 +899:2:2152 +900:2:2159 +901:2:2164 +902:0:2372 +903:2:2175 +904:0:2372 +905:1:2 +906:0:2372 +907:1:8 +908:0:2372 +909:1:9 +910:0:2372 +911:1:10 +912:0:2372 +913:1:11 +914:0:2372 +915:1:12 +916:1:16 +917:1:17 +918:1:25 +919:1:26 +920:1:30 +921:1:31 +922:1:39 +923:1:44 +924:1:48 +925:1:49 +926:1:63 +927:1:64 +928:1:68 +929:1:69 +930:1:70 +931:1:81 +932:1:86 +933:1:87 +934:0:2372 +935:1:99 +936:0:2372 +937:1:100 +938:1:104 +939:1:105 +940:1:113 +941:1:114 +942:1:118 +943:1:119 +944:1:127 +945:1:132 +946:1:136 +947:1:137 +948:1:151 +949:1:152 +950:1:156 +951:1:157 +952:1:158 +953:1:169 +954:1:174 +955:1:175 +956:0:2372 +957:1:187 +958:0:2372 +959:1:188 +960:0:2372 +961:2:2179 +962:2:2180 +963:2:2184 +964:2:2188 +965:2:2189 +966:2:2193 +967:2:2201 +968:2:2202 +969:2:2207 +970:2:2214 +971:2:2215 +972:2:2222 +973:2:2227 +974:0:2372 +975:2:2238 +976:0:2372 +977:2:2246 +978:2:2247 +979:2:2251 +980:2:2255 +981:2:2256 +982:2:2260 +983:2:2268 +984:2:2269 +985:2:2274 +986:2:2281 +987:2:2282 +988:2:2289 +989:2:2294 +990:0:2372 +991:2:2309 +992:0:2372 +993:2:2310 +994:0:2372 +995:2:1149 +996:0:2372 +997:2:1150 +998:2:1154 +999:2:1155 +1000:2:1163 +1001:2:1164 +1002:2:1168 +1003:2:1169 +1004:2:1177 +1005:2:1182 +1006:2:1186 +1007:2:1187 +1008:2:1194 +1009:2:1195 +1010:2:1206 +1011:2:1207 +1012:2:1208 +1013:2:1219 +1014:2:1224 +1015:2:1225 +1016:0:2372 +1017:2:1237 +1018:2:1238 +1019:0:2372 +1020:2:1242 +1021:2:1246 +1022:2:1247 +1023:2:1255 +1024:2:1256 +1025:2:1260 +1026:2:1261 +1027:2:1269 +1028:2:1274 +1029:2:1275 +1030:2:1286 +1031:2:1287 +1032:2:1298 +1033:2:1299 +1034:2:1300 +1035:2:1311 +1036:2:1316 +1037:2:1317 +1038:0:2372 +1039:2:1329 +1040:0:2372 +1041:2:1330 +1042:0:2372 +1043:2:1340 +1044:0:2372 +1045:2:1341 +1046:0:2372 +1047:2:1345 +1048:2:1346 +1049:2:1350 +1050:2:1354 +1051:2:1355 +1052:2:1359 +1053:2:1367 +1054:2:1368 +1055:2:1373 +1056:2:1380 +1057:2:1381 +1058:2:1388 +1059:2:1393 +1060:0:2372 +1061:2:1404 +1062:0:2372 +1063:1:189 +1064:1:193 +1065:1:194 +1066:1:202 +1067:1:203 +1068:1:207 +1069:1:208 +1070:1:216 +1071:1:221 +1072:1:225 +1073:1:226 +1074:1:233 +1075:1:234 +1076:1:245 +1077:1:246 +1078:1:247 +1079:1:258 +1080:1:270 +1081:1:271 +1082:0:2372 +1083:1:276 +1084:0:2372 +1085:1:477 +1086:0:2372 +1087:1:478 +1088:0:2372 +1089:1:11 +1090:0:2372 +1091:1:12 +1092:1:16 +1093:1:17 +1094:1:25 +1095:1:26 +1096:1:27 +1097:1:39 +1098:1:44 +1099:1:48 +1100:1:49 +1101:1:56 +1102:1:57 +1103:1:68 +1104:1:69 +1105:1:70 +1106:1:81 +1107:1:93 +1108:1:94 +1109:0:2372 +1110:1:99 +1111:0:2372 +1112:1:100 +1113:1:104 +1114:1:105 +1115:1:113 +1116:1:114 +1117:1:118 +1118:1:119 +1119:1:127 +1120:1:132 +1121:1:136 +1122:1:137 +1123:1:144 +1124:1:145 +1125:1:156 +1126:1:157 +1127:1:158 +1128:1:169 +1129:1:181 +1130:1:182 +1131:0:2372 +1132:1:279 +1133:0:2372 +1134:1:280 +1135:0:2372 +1136:1:477 +1137:0:2372 +1138:1:478 +1139:0:2372 +1140:1:483 +1141:0:2372 +1142:1:488 +1143:1:492 +1144:1:493 +1145:1:501 +1146:1:502 +1147:1:503 +1148:1:515 +1149:1:520 +1150:1:524 +1151:1:525 +1152:1:532 +1153:1:533 +1154:1:544 +1155:1:545 +1156:1:546 +1157:1:557 +1158:1:569 +1159:1:570 +1160:0:2372 +1161:1:575 +1162:0:2372 +1163:2:1408 +1164:2:1409 +1165:2:1413 +1166:2:1417 +1167:2:1418 +1168:2:1422 +1169:2:1430 +1170:2:1431 +1171:2:1436 +1172:2:1443 +1173:2:1444 +1174:2:1451 +1175:2:1456 +1176:0:2372 +1177:2:1467 +1178:0:2372 +1179:2:1475 +1180:2:1476 +1181:2:1480 +1182:2:1484 +1183:2:1485 +1184:2:1489 +1185:2:1497 +1186:2:1498 +1187:2:1503 +1188:2:1510 +1189:2:1511 +1190:2:1518 +1191:2:1523 +1192:0:2372 +1193:2:1538 +1194:0:2372 +1195:2:1539 +1196:2:1543 +1197:2:1544 +1198:2:1552 +1199:2:1553 +1200:2:1557 +1201:2:1558 +1202:2:1566 +1203:2:1571 +1204:2:1575 +1205:2:1576 +1206:2:1583 +1207:2:1584 +1208:2:1595 +1209:2:1596 +1210:2:1597 +1211:2:1608 +1212:2:1613 +1213:2:1614 +1214:0:2372 +1215:2:1626 +1216:0:2372 +1217:2:1629 +1218:2:1630 +1219:2:1642 +1220:2:1643 +1221:2:1647 +1222:2:1648 +1223:2:1656 +1224:2:1661 +1225:2:1665 +1226:2:1666 +1227:2:1673 +1228:2:1674 +1229:2:1685 +1230:2:1686 +1231:2:1687 +1232:2:1698 +1233:2:1703 +1234:2:1704 +1235:0:2372 +1236:2:1716 +1237:0:2372 +1238:2:1717 +1239:0:2372 +1240:2:1718 +1241:0:2372 +1242:2:1719 +1243:0:2372 +1244:2:1720 +1245:2:1724 +1246:2:1725 +1247:2:1733 +1248:2:1734 +1249:2:1738 +1250:2:1739 +1251:2:1747 +1252:2:1752 +1253:2:1756 +1254:2:1757 +1255:2:1764 +1256:2:1765 +1257:2:1776 +1258:2:1777 +1259:2:1778 +1260:2:1789 +1261:2:1794 +1262:2:1795 +1263:0:2372 +1264:2:2005 +1265:0:2372 +1266:2:2101 +1267:0:2372 +1268:2:2102 +1269:0:2372 +1270:2:2106 +1271:0:2372 +1272:2:2112 +1273:0:2372 +1274:2:2116 +1275:2:2117 +1276:2:2121 +1277:2:2125 +1278:2:2126 +1279:2:2130 +1280:2:2138 +1281:2:2139 +1282:2:2144 +1283:2:2151 +1284:2:2152 +1285:2:2159 +1286:2:2164 +1287:0:2372 +1288:2:2175 +1289:0:2372 +1290:2:2179 +1291:2:2180 +1292:2:2184 +1293:2:2188 +1294:2:2189 +1295:2:2193 +1296:2:2201 +1297:2:2202 +1298:2:2207 +1299:2:2214 +1300:2:2215 +1301:2:2222 +1302:2:2227 +1303:0:2372 +1304:2:2238 +1305:0:2372 +1306:2:2246 +1307:2:2247 +1308:2:2251 +1309:2:2255 +1310:2:2256 +1311:2:2260 +1312:2:2268 +1313:2:2269 +1314:2:2274 +1315:2:2281 +1316:2:2282 +1317:2:2289 +1318:2:2294 +1319:0:2372 +1320:2:2309 +1321:0:2372 +1322:2:2310 +1323:0:2372 +1324:2:2313 +1325:0:2372 +1326:2:2318 +1327:0:2372 +1328:1:576 +1329:1:580 +1330:1:581 +1331:1:589 +1332:1:590 +1333:1:594 +1334:1:595 +1335:1:603 +1336:1:608 +1337:1:612 +1338:1:613 +1339:1:620 +1340:1:621 +1341:1:632 +1342:1:633 +1343:1:634 +1344:1:645 +1345:1:650 +1346:1:651 +1347:0:2372 +1348:2:2319 +1349:0:2372 +1350:1:663 +1351:0:2370 +1352:2:2318 +1353:0:2376 +1354:1:241 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress.ltl b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress.ltl new file mode 100644 index 0000000..8718641 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress.ltl @@ -0,0 +1 @@ +([] <> !np_) diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.define b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.define new file mode 100644 index 0000000..ff3f783 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.define @@ -0,0 +1 @@ +#define READER_PROGRESS diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.log b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.log new file mode 100644 index 0000000..ceb438f --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.log @@ -0,0 +1,16 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define > pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_progress_reader.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +spin: line 296 replacement value: tmp +spin: line 296 "pan.___", Error: formal par of wait_for_quiescent_state contains replacement value saw '-2'' near 'readerid' +spin: 1 error(s) - aborting +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.spin.input b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.spin.input new file mode 100644 index 0000000..cc55960 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.spin.input @@ -0,0 +1,410 @@ +#define READER_PROGRESS +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#define read_free_race (read_generation == last_free_gen) +#define read_free (free_done && data_access) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#define get_pid() (_pid) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), wmb_mb forces + * both. + */ + +#define DECLARE_CACHED_VAR(type, x, v) \ + type mem_##x = v; \ + type cached_##x[NR_PROCS] = v; \ + bit cache_dirty_##x[NR_PROCS] = 0 + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x[id]) + +#define READ_CACHED_VAR(x) (cached_##x[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x[get_pid()] = v; \ + cache_dirty_##x[get_pid()] = 1; \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x[id]; \ + cache_dirty_##x[id] = 0; \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + CACHE_READ_FROM_MEM(urcu_active_readers_one, i); + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + CACHE_WRITE_TO_MEM(urcu_active_readers_one, i); + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i); +#endif +#ifndef NO_RMB + smp_rmb_pid(i); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb(i) +{ + if + :: get_pid() >= NR_READERS -> + smp_mb_pid(get_pid()); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid()); + :: else -> skip; + fi; +} + +#else + +inline smp_rmb(i) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + CACHE_READ_FROM_MEM(urcu_active_readers_one, get_pid()); + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + CACHE_WRITE_TO_MEM(urcu_active_readers_one, get_pid()); + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i); +#endif +#ifndef NO_RMB + smp_rmb(i); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb and ooo_mem */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr, 1); +/* Note ! currently only one reader */ +DECLARE_CACHED_VAR(byte, urcu_active_readers_one, 0); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr, 0); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation = 1; +bit data_access = 0; + +bit write_lock = 0; + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers_one, + get_pid()); + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers_one, + get_pid()); + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +#define get_readerid() (get_pid()) +#define get_writerid() (get_readerid() + NR_READERS) + +inline wait_for_reader(tmp, id, i) +{ + do + :: 1 -> + tmp = READ_CACHED_VAR(urcu_active_readers_one); + ooo_mem(i); + if + :: (tmp & RCU_GP_CTR_NEST_MASK) + && ((tmp ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb(i); +#else + ooo_mem(i); +#endif + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, i, j) +{ + i = 0; + do + :: i < NR_READERS -> + wait_for_reader(tmp, i, j); + if + :: (NR_READERS > 1) && (i < NR_READERS - 1) + -> ooo_mem(j); + :: else + -> skip; + fi; + i++ + :: i >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +inline urcu_one_read(i, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers_one); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers_one, tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers_one, + tmp + 1); + fi; + smp_mb(i); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + ooo_mem(i); + read_generation = READ_CACHED_VAR(generation_ptr); + ooo_mem(i); + data_access = 1; + ooo_mem(i); + data_access = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb(i); + tmp2 = READ_CACHED_VAR(urcu_active_readers_one); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers_one, tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + ooo_mem(i); + //smp_mc(i); /* added */ +} + +active [NR_READERS] proctype urcu_reader() +{ + byte i, nest_i; + byte tmp, tmp2; + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, nest_i, tmp, tmp2); + od; +} + +/* Model the RCU update process. */ + +active [NR_WRITERS] proctype urcu_writer() +{ + byte i, j; + byte tmp; + byte old_gen; + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb(i); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + //smp_mc(i); + wait_for_quiescent_state(tmp, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + wait_for_quiescent_state(tmp, i, j); +#endif + smp_mb(i); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + skip; + od; +} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.spin.input.trail b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.spin.input.trail new file mode 100644 index 0000000..e65d663 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.spin.input.trail @@ -0,0 +1,9 @@ +-2:3:-2 +-4:-4:-4 +1:0:2679 +2:1:2673 +3:1:2674 +4:1:2675 +5:1:2676 +6:0:2685 +7:5:1129 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.define b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.define new file mode 100644 index 0000000..1e4417f --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.define @@ -0,0 +1 @@ +#define WRITER_PROGRESS diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.log b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.log new file mode 100644 index 0000000..985f839 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.log @@ -0,0 +1,14 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define > pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_progress_writer.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -w -DHASH64 -o pan pan.c diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.spin.input b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.spin.input new file mode 100644 index 0000000..28f1299 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.spin.input @@ -0,0 +1,410 @@ +#define WRITER_PROGRESS +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#define read_free_race (read_generation == last_free_gen) +#define read_free (free_done && data_access) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#define get_pid() (_pid) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), wmb_mb forces + * both. + */ + +#define DECLARE_CACHED_VAR(type, x, v) \ + type mem_##x = v; \ + type cached_##x[NR_PROCS] = v; \ + bit cache_dirty_##x[NR_PROCS] = 0 + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x[id]) + +#define READ_CACHED_VAR(x) (cached_##x[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x[get_pid()] = v; \ + cache_dirty_##x[get_pid()] = 1; \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x[id]; \ + cache_dirty_##x[id] = 0; \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + CACHE_READ_FROM_MEM(urcu_active_readers_one, i); + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + CACHE_WRITE_TO_MEM(urcu_active_readers_one, i); + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i); +#endif +#ifndef NO_RMB + smp_rmb_pid(i); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb(i) +{ + if + :: get_pid() >= NR_READERS -> + smp_mb_pid(get_pid()); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid()); + :: else -> skip; + fi; +} + +#else + +inline smp_rmb(i) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + CACHE_READ_FROM_MEM(urcu_active_readers_one, get_pid()); + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + CACHE_WRITE_TO_MEM(urcu_active_readers_one, get_pid()); + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i); +#endif +#ifndef NO_RMB + smp_rmb(i); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb and ooo_mem */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr, 1); +/* Note ! currently only one reader */ +DECLARE_CACHED_VAR(byte, urcu_active_readers_one, 0); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr, 0); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation = 1; +bit data_access = 0; + +bit write_lock = 0; + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers_one, + get_pid()); + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers_one, + get_pid()); + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +#define get_readerid() (get_pid()) +#define get_writerid() (get_readerid() + NR_READERS) + +inline wait_for_reader(tmp, id, i) +{ + do + :: 1 -> + tmp = READ_CACHED_VAR(urcu_active_readers_one); + ooo_mem(i); + if + :: (tmp & RCU_GP_CTR_NEST_MASK) + && ((tmp ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb(i); +#else + ooo_mem(i); +#endif + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, i, j) +{ + i = 0; + do + :: i < NR_READERS -> + wait_for_reader(tmp, i, j); + if + :: (NR_READERS > 1) && (i < NR_READERS - 1) + -> ooo_mem(j); + :: else + -> skip; + fi; + i++ + :: i >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +inline urcu_one_read(i, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers_one); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers_one, tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers_one, + tmp + 1); + fi; + smp_mb(i); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + ooo_mem(i); + read_generation = READ_CACHED_VAR(generation_ptr); + ooo_mem(i); + data_access = 1; + ooo_mem(i); + data_access = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb(i); + tmp2 = READ_CACHED_VAR(urcu_active_readers_one); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers_one, tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + ooo_mem(i); + //smp_mc(i); /* added */ +} + +active [NR_READERS] proctype urcu_reader() +{ + byte i, nest_i; + byte tmp, tmp2; + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, nest_i, tmp, tmp2); + od; +} + +/* Model the RCU update process. */ + +active [NR_WRITERS] proctype urcu_writer() +{ + byte i, j; + byte tmp; + byte old_gen; + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb(i); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + //smp_mc(i); + wait_for_quiescent_state(tmp, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + wait_for_quiescent_state(tmp, i, j); +#endif + smp_mb(i); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + skip; + od; +} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.spin.input.trail b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.spin.input.trail new file mode 100644 index 0000000..e65d663 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.spin.input.trail @@ -0,0 +1,9 @@ +-2:3:-2 +-4:-4:-4 +1:0:2679 +2:1:2673 +3:1:2674 +4:1:2675 +5:1:2676 +6:0:2685 +7:5:1129 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.define b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.define new file mode 100644 index 0000000..8d304f5 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.define @@ -0,0 +1,2 @@ +#define WRITER_PROGRESS +#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.log b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.log new file mode 100644 index 0000000..26b6236 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.log @@ -0,0 +1,16 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define > pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_progress_writer_error.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +spin: line 297 replacement value: tmp +spin: line 297 "pan.___", Error: formal par of wait_for_quiescent_state contains replacement value saw '-2'' near 'readerid' +spin: 1 error(s) - aborting +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.spin.input b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.spin.input new file mode 100644 index 0000000..43e979c --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.spin.input @@ -0,0 +1,411 @@ +#define WRITER_PROGRESS +#define GEN_ERROR_WRITER_PROGRESS +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#define read_free_race (read_generation == last_free_gen) +#define read_free (free_done && data_access) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#define get_pid() (_pid) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), wmb_mb forces + * both. + */ + +#define DECLARE_CACHED_VAR(type, x, v) \ + type mem_##x = v; \ + type cached_##x[NR_PROCS] = v; \ + bit cache_dirty_##x[NR_PROCS] = 0 + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x[id]) + +#define READ_CACHED_VAR(x) (cached_##x[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x[get_pid()] = v; \ + cache_dirty_##x[get_pid()] = 1; \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x[id]; \ + cache_dirty_##x[id] = 0; \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + CACHE_READ_FROM_MEM(urcu_active_readers_one, i); + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + CACHE_WRITE_TO_MEM(urcu_active_readers_one, i); + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i); +#endif +#ifndef NO_RMB + smp_rmb_pid(i); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb(i) +{ + if + :: get_pid() >= NR_READERS -> + smp_mb_pid(get_pid()); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid()); + :: else -> skip; + fi; +} + +#else + +inline smp_rmb(i) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + CACHE_READ_FROM_MEM(urcu_active_readers_one, get_pid()); + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + CACHE_WRITE_TO_MEM(urcu_active_readers_one, get_pid()); + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i); +#endif +#ifndef NO_RMB + smp_rmb(i); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb and ooo_mem */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr, 1); +/* Note ! currently only one reader */ +DECLARE_CACHED_VAR(byte, urcu_active_readers_one, 0); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr, 0); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation = 1; +bit data_access = 0; + +bit write_lock = 0; + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers_one, + get_pid()); + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers_one, + get_pid()); + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +#define get_readerid() (get_pid()) +#define get_writerid() (get_readerid() + NR_READERS) + +inline wait_for_reader(tmp, id, i) +{ + do + :: 1 -> + tmp = READ_CACHED_VAR(urcu_active_readers_one); + ooo_mem(i); + if + :: (tmp & RCU_GP_CTR_NEST_MASK) + && ((tmp ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb(i); +#else + ooo_mem(i); +#endif + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, i, j) +{ + i = 0; + do + :: i < NR_READERS -> + wait_for_reader(tmp, i, j); + if + :: (NR_READERS > 1) && (i < NR_READERS - 1) + -> ooo_mem(j); + :: else + -> skip; + fi; + i++ + :: i >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +inline urcu_one_read(i, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers_one); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers_one, tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers_one, + tmp + 1); + fi; + smp_mb(i); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + ooo_mem(i); + read_generation = READ_CACHED_VAR(generation_ptr); + ooo_mem(i); + data_access = 1; + ooo_mem(i); + data_access = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb(i); + tmp2 = READ_CACHED_VAR(urcu_active_readers_one); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers_one, tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + ooo_mem(i); + //smp_mc(i); /* added */ +} + +active [NR_READERS] proctype urcu_reader() +{ + byte i, nest_i; + byte tmp, tmp2; + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, nest_i, tmp, tmp2); + od; +} + +/* Model the RCU update process. */ + +active [NR_WRITERS] proctype urcu_writer() +{ + byte i, j; + byte tmp; + byte old_gen; + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb(i); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + //smp_mc(i); + wait_for_quiescent_state(tmp, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + wait_for_quiescent_state(tmp, i, j); +#endif + smp_mb(i); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + skip; + od; +} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.spin.input.trail b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.spin.input.trail new file mode 100644 index 0000000..ff6f1c5 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.spin.input.trail @@ -0,0 +1,4590 @@ +-2:2:-2 +-4:-4:-4 +1:0:2223 +2:2:908 +3:0:2223 +4:1:0 +5:0:2223 +6:1:1 +7:0:2223 +8:1:2 +9:0:2223 +10:1:3 +11:0:2223 +12:2:909 +13:0:2223 +14:2:910 +15:2:914 +16:2:915 +17:2:922 +18:2:926 +19:2:927 +20:2:934 +21:2:938 +22:2:939 +23:2:946 +24:2:947 +25:2:957 +26:2:958 +27:2:968 +28:2:969 +29:0:2221 +30:2:981 +31:2:982 +32:0:2227 +33:2:986 +34:2:990 +35:2:991 +36:2:998 +37:2:1002 +38:2:1003 +39:2:1010 +40:2:1011 +41:2:1022 +42:2:1023 +43:2:1033 +44:2:1034 +45:2:1044 +46:2:1045 +47:0:2227 +48:2:1057 +49:0:2227 +50:2:1058 +51:0:2227 +52:2:1068 +53:0:2227 +54:2:1069 +55:0:2227 +56:2:1073 +57:2:1074 +58:2:1080 +59:2:1081 +60:2:1087 +61:2:1088 +62:2:1093 +63:2:1099 +64:2:1105 +65:0:2227 +66:2:1116 +67:0:2227 +68:2:1120 +69:2:1121 +70:2:1127 +71:2:1128 +72:2:1134 +73:2:1135 +74:2:1140 +75:2:1146 +76:2:1152 +77:0:2227 +78:2:1163 +79:0:2227 +80:2:1171 +81:2:1172 +82:2:1178 +83:2:1179 +84:2:1185 +85:2:1186 +86:2:1191 +87:2:1197 +88:2:1203 +89:0:2227 +90:2:1218 +91:0:2227 +92:2:1219 +93:2:1223 +94:2:1224 +95:2:1231 +96:2:1235 +97:2:1236 +98:2:1243 +99:2:1247 +100:2:1248 +101:2:1255 +102:2:1256 +103:2:1266 +104:2:1267 +105:2:1277 +106:2:1278 +107:0:2227 +108:2:1290 +109:0:2227 +110:2:1293 +111:2:1294 +112:2:1305 +113:2:1309 +114:2:1310 +115:2:1317 +116:2:1321 +117:2:1322 +118:2:1329 +119:2:1330 +120:2:1340 +121:2:1341 +122:2:1351 +123:2:1352 +124:0:2227 +125:2:1364 +126:0:2227 +127:2:1365 +128:0:2227 +129:2:1366 +130:0:2227 +131:2:1367 +132:0:2227 +133:2:1368 +134:2:1372 +135:2:1373 +136:2:1380 +137:2:1384 +138:2:1385 +139:2:1392 +140:2:1396 +141:2:1397 +142:2:1404 +143:2:1405 +144:2:1415 +145:2:1416 +146:2:1426 +147:2:1427 +148:0:2227 +149:2:1511 +150:0:2227 +151:2:1591 +152:0:2227 +153:2:1592 +154:0:2227 +155:2:1596 +156:0:2227 +157:2:1602 +158:2:1606 +159:2:1607 +160:2:1614 +161:2:1618 +162:2:1619 +163:2:1626 +164:2:1630 +165:2:1631 +166:2:1638 +167:2:1639 +168:2:1649 +169:2:1650 +170:2:1660 +171:2:1661 +172:0:2227 +173:2:1673 +174:0:2227 +175:2:1674 +176:2:1678 +177:2:1679 +178:2:1686 +179:2:1690 +180:2:1691 +181:2:1698 +182:2:1702 +183:2:1703 +184:2:1710 +185:2:1711 +186:2:1721 +187:2:1722 +188:2:1732 +189:2:1733 +190:0:2227 +191:2:1745 +192:0:2227 +193:1:4 +194:1:8 +195:1:9 +196:1:16 +197:1:20 +198:1:21 +199:1:28 +200:1:32 +201:1:33 +202:1:40 +203:1:41 +204:1:51 +205:1:52 +206:1:62 +207:1:63 +208:0:2227 +209:1:75 +210:0:2227 +211:1:76 +212:1:80 +213:1:81 +214:1:88 +215:1:92 +216:1:93 +217:1:100 +218:1:104 +219:1:105 +220:1:112 +221:1:113 +222:1:123 +223:1:124 +224:1:134 +225:1:135 +226:0:2227 +227:1:147 +228:0:2227 +229:1:148 +230:0:2227 +231:1:149 +232:1:153 +233:1:154 +234:1:161 +235:1:165 +236:1:166 +237:1:173 +238:1:177 +239:1:178 +240:1:185 +241:1:186 +242:1:196 +243:1:197 +244:1:207 +245:1:208 +246:0:2227 +247:1:220 +248:0:2227 +249:1:373 +250:0:2227 +251:1:374 +252:0:2227 +253:1:3 +254:0:2227 +255:1:4 +256:1:8 +257:1:9 +258:1:16 +259:1:17 +260:1:28 +261:1:32 +262:1:33 +263:1:40 +264:1:41 +265:1:51 +266:1:52 +267:1:62 +268:1:63 +269:0:2227 +270:2:1748 +271:2:1749 +272:2:1760 +273:2:1764 +274:2:1765 +275:2:1772 +276:2:1776 +277:2:1777 +278:2:1784 +279:2:1785 +280:2:1795 +281:2:1796 +282:2:1806 +283:2:1807 +284:0:2227 +285:2:1819 +286:0:2227 +287:2:1820 +288:0:2227 +289:2:1821 +290:0:2227 +291:2:1822 +292:0:2227 +293:2:1823 +294:2:1827 +295:2:1828 +296:2:1835 +297:2:1839 +298:2:1840 +299:2:1847 +300:2:1851 +301:2:1852 +302:2:1859 +303:2:1860 +304:2:1870 +305:2:1871 +306:2:1881 +307:2:1882 +308:0:2227 +309:2:1894 +310:0:2227 +311:2:1895 +312:2:1899 +313:2:1900 +314:2:1907 +315:2:1911 +316:2:1912 +317:2:1919 +318:2:1923 +319:2:1924 +320:2:1931 +321:2:1932 +322:2:1942 +323:2:1943 +324:2:1953 +325:2:1954 +326:0:2227 +327:2:1821 +328:0:2227 +329:1:75 +330:0:2227 +331:2:1822 +332:0:2227 +333:2:1823 +334:2:1827 +335:2:1828 +336:2:1835 +337:2:1839 +338:2:1840 +339:2:1847 +340:2:1851 +341:2:1852 +342:2:1859 +343:2:1860 +344:2:1870 +345:2:1871 +346:2:1881 +347:2:1882 +348:0:2227 +349:2:1894 +350:0:2227 +351:2:1895 +352:2:1899 +353:2:1900 +354:2:1907 +355:2:1911 +356:2:1912 +357:2:1919 +358:2:1923 +359:2:1924 +360:2:1931 +361:2:1932 +362:2:1942 +363:2:1943 +364:2:1953 +365:2:1954 +366:0:2227 +367:2:1821 +368:0:2227 +369:1:76 +370:1:80 +371:1:81 +372:1:88 +373:1:92 +374:1:93 +375:1:100 +376:1:104 +377:1:105 +378:1:112 +379:1:113 +380:1:123 +381:1:124 +382:1:134 +383:1:135 +384:0:2227 +385:1:223 +386:0:2227 +387:2:1822 +388:0:2227 +389:2:1823 +390:2:1827 +391:2:1828 +392:2:1835 +393:2:1839 +394:2:1840 +395:2:1847 +396:2:1851 +397:2:1852 +398:2:1859 +399:2:1860 +400:2:1870 +401:2:1871 +402:2:1881 +403:2:1882 +404:0:2227 +405:2:1894 +406:0:2227 +407:2:1895 +408:2:1899 +409:2:1900 +410:2:1907 +411:2:1911 +412:2:1912 +413:2:1919 +414:2:1923 +415:2:1924 +416:2:1931 +417:2:1932 +418:2:1942 +419:2:1943 +420:2:1953 +421:2:1954 +422:0:2227 +423:2:1821 +424:0:2227 +425:1:224 +426:0:2227 +427:1:373 +428:0:2227 +429:1:374 +430:0:2227 +431:1:379 +432:0:2227 +433:2:1822 +434:0:2227 +435:2:1823 +436:2:1827 +437:2:1828 +438:2:1835 +439:2:1839 +440:2:1840 +441:2:1847 +442:2:1851 +443:2:1852 +444:2:1859 +445:2:1860 +446:2:1870 +447:2:1871 +448:2:1881 +449:2:1882 +450:0:2227 +451:2:1894 +452:0:2227 +453:2:1895 +454:2:1899 +455:2:1900 +456:2:1907 +457:2:1911 +458:2:1912 +459:2:1919 +460:2:1923 +461:2:1924 +462:2:1931 +463:2:1932 +464:2:1942 +465:2:1943 +466:2:1953 +467:2:1954 +468:0:2227 +469:2:1821 +470:0:2227 +471:1:384 +472:1:388 +473:1:389 +474:1:396 +475:1:397 +476:1:408 +477:1:412 +478:1:413 +479:1:420 +480:1:421 +481:1:431 +482:1:432 +483:1:442 +484:1:443 +485:0:2227 +486:2:1822 +487:0:2227 +488:2:1823 +489:2:1827 +490:2:1828 +491:2:1835 +492:2:1839 +493:2:1840 +494:2:1847 +495:2:1851 +496:2:1852 +497:2:1859 +498:2:1860 +499:2:1870 +500:2:1871 +501:2:1881 +502:2:1882 +503:0:2227 +504:2:1894 +505:0:2227 +506:2:1895 +507:2:1899 +508:2:1900 +509:2:1907 +510:2:1911 +511:2:1912 +512:2:1919 +513:2:1923 +514:2:1924 +515:2:1931 +516:2:1932 +517:2:1942 +518:2:1943 +519:2:1953 +520:2:1954 +521:0:2227 +522:2:1821 +523:0:2227 +524:2:1822 +525:0:2227 +526:2:1823 +527:2:1827 +528:2:1828 +529:2:1835 +530:2:1839 +531:2:1840 +532:2:1847 +533:2:1851 +534:2:1852 +535:2:1859 +536:2:1860 +537:2:1870 +538:2:1871 +539:2:1881 +540:2:1882 +541:0:2227 +542:1:455 +543:0:2227 +544:2:1894 +545:0:2227 +546:2:1895 +547:2:1899 +548:2:1900 +549:2:1907 +550:2:1911 +551:2:1912 +552:2:1919 +553:2:1923 +554:2:1924 +555:2:1931 +556:2:1932 +557:2:1942 +558:2:1943 +559:2:1953 +560:2:1954 +561:0:2227 +562:2:1821 +563:0:2227 +564:2:1822 +565:0:2227 +566:2:1823 +567:2:1827 +568:2:1828 +569:2:1835 +570:2:1839 +571:2:1840 +572:2:1847 +573:2:1851 +574:2:1852 +575:2:1859 +576:2:1860 +577:2:1870 +578:2:1871 +579:2:1881 +580:2:1882 +581:0:2227 +582:1:456 +583:1:460 +584:1:461 +585:1:468 +586:1:472 +587:1:473 +588:1:480 +589:1:484 +590:1:485 +591:1:492 +592:1:493 +593:1:503 +594:1:504 +595:1:514 +596:1:515 +597:0:2227 +598:2:1894 +599:0:2227 +600:2:1895 +601:2:1899 +602:2:1900 +603:2:1907 +604:2:1911 +605:2:1912 +606:2:1919 +607:2:1923 +608:2:1924 +609:2:1931 +610:2:1932 +611:2:1942 +612:2:1943 +613:2:1953 +614:2:1954 +615:0:2227 +616:2:1821 +617:0:2227 +618:2:1822 +619:0:2227 +620:2:1823 +621:2:1827 +622:2:1828 +623:2:1835 +624:2:1839 +625:2:1840 +626:2:1847 +627:2:1851 +628:2:1852 +629:2:1859 +630:2:1860 +631:2:1870 +632:2:1871 +633:2:1881 +634:2:1882 +635:0:2227 +636:1:527 +637:0:2227 +638:2:1894 +639:0:2227 +640:2:1895 +641:2:1899 +642:2:1900 +643:2:1907 +644:2:1911 +645:2:1912 +646:2:1919 +647:2:1923 +648:2:1924 +649:2:1931 +650:2:1932 +651:2:1942 +652:2:1943 +653:2:1953 +654:2:1954 +655:0:2227 +656:2:1821 +657:0:2227 +658:2:1822 +659:0:2227 +660:2:1823 +661:2:1827 +662:2:1828 +663:2:1835 +664:2:1839 +665:2:1840 +666:2:1847 +667:2:1851 +668:2:1852 +669:2:1859 +670:2:1860 +671:2:1870 +672:2:1871 +673:2:1881 +674:2:1882 +675:0:2227 +676:1:528 +677:1:532 +678:1:533 +679:1:540 +680:1:544 +681:1:545 +682:1:552 +683:1:556 +684:1:557 +685:1:564 +686:1:565 +687:1:575 +688:1:576 +689:1:586 +690:1:587 +691:0:2227 +692:2:1894 +693:0:2227 +694:2:1895 +695:2:1899 +696:2:1900 +697:2:1907 +698:2:1911 +699:2:1912 +700:2:1919 +701:2:1923 +702:2:1924 +703:2:1931 +704:2:1932 +705:2:1942 +706:2:1943 +707:2:1953 +708:2:1954 +709:0:2227 +710:2:1821 +711:0:2227 +712:2:1822 +713:0:2227 +714:2:1823 +715:2:1827 +716:2:1828 +717:2:1835 +718:2:1839 +719:2:1840 +720:2:1847 +721:2:1851 +722:2:1852 +723:2:1859 +724:2:1860 +725:2:1870 +726:2:1871 +727:2:1881 +728:2:1882 +729:0:2227 +730:1:599 +731:0:2227 +732:1:600 +733:0:2227 +734:1:601 +735:0:2227 +736:1:746 +737:0:2227 +738:1:747 +739:0:2227 +740:2:1894 +741:0:2227 +742:2:1895 +743:2:1899 +744:2:1900 +745:2:1907 +746:2:1911 +747:2:1912 +748:2:1919 +749:2:1923 +750:2:1924 +751:2:1931 +752:2:1932 +753:2:1942 +754:2:1943 +755:2:1953 +756:2:1954 +757:0:2227 +758:2:1821 +759:0:2227 +760:2:1822 +761:0:2227 +762:2:1823 +763:2:1827 +764:2:1828 +765:2:1835 +766:2:1839 +767:2:1840 +768:2:1847 +769:2:1851 +770:2:1852 +771:2:1859 +772:2:1860 +773:2:1870 +774:2:1871 +775:2:1881 +776:2:1882 +777:0:2227 +778:1:751 +779:0:2227 +780:2:1894 +781:0:2227 +782:2:1895 +783:2:1899 +784:2:1900 +785:2:1907 +786:2:1911 +787:2:1912 +788:2:1919 +789:2:1923 +790:2:1924 +791:2:1931 +792:2:1932 +793:2:1942 +794:2:1943 +795:2:1953 +796:2:1954 +797:0:2227 +798:2:1821 +799:0:2227 +800:2:1822 +801:0:2227 +802:2:1823 +803:2:1827 +804:2:1828 +805:2:1835 +806:2:1839 +807:2:1840 +808:2:1847 +809:2:1851 +810:2:1852 +811:2:1859 +812:2:1860 +813:2:1870 +814:2:1871 +815:2:1881 +816:2:1882 +817:0:2227 +818:1:752 +819:1:756 +820:1:757 +821:1:764 +822:1:768 +823:1:769 +824:1:776 +825:1:780 +826:1:781 +827:1:788 +828:1:789 +829:1:799 +830:1:800 +831:1:810 +832:1:811 +833:0:2227 +834:2:1894 +835:0:2227 +836:2:1895 +837:2:1899 +838:2:1900 +839:2:1907 +840:2:1911 +841:2:1912 +842:2:1919 +843:2:1923 +844:2:1924 +845:2:1931 +846:2:1932 +847:2:1942 +848:2:1943 +849:2:1953 +850:2:1954 +851:0:2227 +852:2:1821 +853:0:2227 +854:2:1822 +855:0:2227 +856:2:1823 +857:2:1827 +858:2:1828 +859:2:1835 +860:2:1839 +861:2:1840 +862:2:1847 +863:2:1851 +864:2:1852 +865:2:1859 +866:2:1860 +867:2:1870 +868:2:1871 +869:2:1881 +870:2:1882 +871:0:2227 +872:1:823 +873:0:2227 +874:1:601 +875:0:2227 +876:1:746 +877:0:2227 +878:1:747 +879:0:2227 +880:2:1894 +881:0:2227 +882:2:1895 +883:2:1899 +884:2:1900 +885:2:1907 +886:2:1911 +887:2:1912 +888:2:1919 +889:2:1923 +890:2:1924 +891:2:1931 +892:2:1932 +893:2:1942 +894:2:1943 +895:2:1953 +896:2:1954 +897:0:2227 +898:2:1821 +899:0:2227 +900:2:1822 +901:0:2227 +902:2:1823 +903:2:1827 +904:2:1828 +905:2:1835 +906:2:1839 +907:2:1840 +908:2:1847 +909:2:1851 +910:2:1852 +911:2:1859 +912:2:1860 +913:2:1870 +914:2:1871 +915:2:1881 +916:2:1882 +917:0:2227 +918:1:751 +919:0:2227 +920:2:1894 +921:0:2227 +922:2:1895 +923:2:1899 +924:2:1900 +925:2:1907 +926:2:1911 +927:2:1912 +928:2:1919 +929:2:1923 +930:2:1924 +931:2:1931 +932:2:1932 +933:2:1942 +934:2:1943 +935:2:1953 +936:2:1954 +937:0:2227 +938:2:1821 +939:0:2227 +940:2:1822 +941:0:2227 +942:2:1823 +943:2:1827 +944:2:1828 +945:2:1835 +946:2:1839 +947:2:1840 +948:2:1847 +949:2:1851 +950:2:1852 +951:2:1859 +952:2:1860 +953:2:1870 +954:2:1871 +955:2:1881 +956:2:1882 +957:0:2227 +958:1:752 +959:1:756 +960:1:757 +961:1:764 +962:1:765 +963:1:776 +964:1:780 +965:1:781 +966:1:788 +967:1:789 +968:1:799 +969:1:800 +970:1:810 +971:1:811 +972:0:2227 +973:2:1894 +974:0:2227 +975:2:1895 +976:2:1899 +977:2:1900 +978:2:1907 +979:2:1911 +980:2:1912 +981:2:1919 +982:2:1923 +983:2:1924 +984:2:1931 +985:2:1932 +986:2:1942 +987:2:1943 +988:2:1953 +989:2:1954 +990:0:2227 +991:2:1821 +992:0:2227 +993:2:1822 +994:0:2227 +995:2:1823 +996:2:1827 +997:2:1828 +998:2:1835 +999:2:1839 +1000:2:1840 +1001:2:1847 +1002:2:1851 +1003:2:1852 +1004:2:1859 +1005:2:1860 +1006:2:1870 +1007:2:1871 +1008:2:1881 +1009:2:1882 +1010:0:2227 +1011:2:1894 +1012:0:2227 +1013:1:823 +1014:0:2227 +1015:1:827 +1016:0:2227 +1017:2:1895 +1018:2:1899 +1019:2:1900 +1020:2:1907 +1021:2:1911 +1022:2:1912 +1023:2:1919 +1024:2:1923 +1025:2:1924 +1026:2:1931 +1027:2:1932 +1028:2:1942 +1029:2:1943 +1030:2:1953 +1031:2:1954 +1032:0:2227 +1033:2:1821 +1034:0:2227 +1035:2:1822 +1036:0:2227 +1037:2:1823 +1038:2:1827 +1039:2:1828 +1040:2:1835 +1041:2:1839 +1042:2:1840 +1043:2:1847 +1044:2:1851 +1045:2:1852 +1046:2:1859 +1047:2:1860 +1048:2:1870 +1049:2:1871 +1050:2:1881 +1051:2:1882 +1052:0:2227 +1053:2:1894 +1054:0:2227 +1055:1:832 +1056:1:836 +1057:1:837 +1058:1:844 +1059:1:845 +1060:1:856 +1061:1:860 +1062:1:861 +1063:1:868 +1064:1:869 +1065:1:879 +1066:1:880 +1067:1:890 +1068:1:891 +1069:0:2227 +1070:1:1 +1071:0:2227 +1072:1:2 +1073:0:2227 +1074:1:3 +1075:0:2227 +1076:2:1895 +1077:2:1899 +1078:2:1900 +1079:2:1907 +1080:2:1911 +1081:2:1912 +1082:2:1919 +1083:2:1923 +1084:2:1924 +1085:2:1931 +1086:2:1932 +1087:2:1949 +1088:2:1950 +1089:2:1953 +1090:2:1954 +1091:0:2227 +1092:2:1821 +1093:0:2227 +1094:2:1822 +1095:0:2227 +1096:2:1823 +1097:2:1827 +1098:2:1828 +1099:2:1835 +1100:2:1839 +1101:2:1840 +1102:2:1847 +1103:2:1851 +1104:2:1852 +1105:2:1859 +1106:2:1860 +1107:2:1877 +1108:2:1878 +1109:2:1881 +1110:2:1882 +1111:0:2227 +1112:2:1894 +1113:0:2227 +1114:1:4 +1115:1:8 +1116:1:9 +1117:1:16 +1118:1:20 +1119:1:21 +1120:1:28 +1121:1:32 +1122:1:33 +1123:1:40 +1124:1:41 +1125:1:51 +1126:1:52 +1127:1:62 +1128:1:63 +1129:0:2227 +1130:2:1895 +1131:2:1899 +1132:2:1900 +1133:2:1907 +1134:2:1911 +1135:2:1912 +1136:2:1919 +1137:2:1923 +1138:2:1924 +1139:2:1931 +1140:2:1932 +1141:2:1949 +1142:2:1950 +1143:2:1953 +1144:2:1954 +1145:0:2227 +1146:2:1821 +1147:0:2227 +1148:2:1822 +1149:0:2227 +1150:2:1823 +1151:2:1827 +1152:2:1828 +1153:2:1835 +1154:2:1839 +1155:2:1840 +1156:2:1847 +1157:2:1851 +1158:2:1852 +1159:2:1859 +1160:2:1860 +1161:2:1877 +1162:2:1878 +1163:2:1881 +1164:2:1882 +1165:0:2227 +1166:2:1894 +1167:0:2227 +1168:1:75 +1169:0:2227 +1170:2:1895 +1171:2:1899 +1172:2:1900 +1173:2:1907 +1174:2:1911 +1175:2:1912 +1176:2:1919 +1177:2:1923 +1178:2:1924 +1179:2:1931 +1180:2:1932 +1181:2:1949 +1182:2:1950 +1183:2:1953 +1184:2:1954 +1185:0:2227 +1186:2:1821 +1187:0:2227 +1188:2:1822 +1189:0:2227 +1190:2:1823 +1191:2:1827 +1192:2:1828 +1193:2:1835 +1194:2:1839 +1195:2:1840 +1196:2:1847 +1197:2:1851 +1198:2:1852 +1199:2:1859 +1200:2:1860 +1201:2:1877 +1202:2:1878 +1203:2:1881 +1204:2:1882 +1205:0:2227 +1206:2:1894 +1207:0:2227 +1208:1:76 +1209:1:80 +1210:1:81 +1211:1:88 +1212:1:92 +1213:1:93 +1214:1:100 +1215:1:104 +1216:1:105 +1217:1:112 +1218:1:113 +1219:1:123 +1220:1:124 +1221:1:134 +1222:1:135 +1223:0:2227 +1224:1:147 +1225:0:2227 +1226:2:1895 +1227:2:1899 +1228:2:1900 +1229:2:1907 +1230:2:1911 +1231:2:1912 +1232:2:1919 +1233:2:1923 +1234:2:1924 +1235:2:1931 +1236:2:1932 +1237:2:1949 +1238:2:1950 +1239:2:1953 +1240:2:1954 +1241:0:2227 +1242:2:1821 +1243:0:2227 +1244:2:1822 +1245:0:2227 +1246:2:1823 +1247:2:1827 +1248:2:1828 +1249:2:1835 +1250:2:1839 +1251:2:1840 +1252:2:1847 +1253:2:1851 +1254:2:1852 +1255:2:1859 +1256:2:1860 +1257:2:1877 +1258:2:1878 +1259:2:1881 +1260:2:1882 +1261:0:2227 +1262:2:1894 +1263:0:2227 +1264:1:148 +1265:0:2227 +1266:2:1895 +1267:2:1899 +1268:2:1900 +1269:2:1907 +1270:2:1911 +1271:2:1912 +1272:2:1919 +1273:2:1923 +1274:2:1924 +1275:2:1931 +1276:2:1932 +1277:2:1949 +1278:2:1950 +1279:2:1953 +1280:2:1954 +1281:0:2227 +1282:2:1821 +1283:0:2227 +1284:2:1822 +1285:0:2227 +1286:2:1823 +1287:2:1827 +1288:2:1828 +1289:2:1835 +1290:2:1839 +1291:2:1840 +1292:2:1847 +1293:2:1851 +1294:2:1852 +1295:2:1859 +1296:2:1860 +1297:2:1877 +1298:2:1878 +1299:2:1881 +1300:2:1882 +1301:0:2227 +1302:2:1894 +1303:0:2227 +1304:1:149 +1305:1:153 +1306:1:154 +1307:1:161 +1308:1:165 +1309:1:166 +1310:1:173 +1311:1:177 +1312:1:178 +1313:1:185 +1314:1:186 +1315:1:196 +1316:1:197 +1317:1:207 +1318:1:208 +1319:0:2227 +1320:2:1895 +1321:2:1899 +1322:2:1900 +1323:2:1907 +1324:2:1911 +1325:2:1912 +1326:2:1919 +1327:2:1923 +1328:2:1924 +1329:2:1931 +1330:2:1932 +1331:2:1949 +1332:2:1950 +1333:2:1953 +1334:2:1954 +1335:0:2227 +1336:2:1821 +1337:0:2227 +1338:2:1822 +1339:0:2227 +1340:2:1823 +1341:2:1827 +1342:2:1828 +1343:2:1835 +1344:2:1839 +1345:2:1840 +1346:2:1847 +1347:2:1851 +1348:2:1852 +1349:2:1859 +1350:2:1860 +1351:2:1877 +1352:2:1878 +1353:2:1881 +1354:2:1882 +1355:0:2227 +1356:2:1894 +1357:0:2227 +1358:1:220 +1359:0:2227 +1360:1:373 +1361:0:2227 +1362:1:374 +1363:0:2227 +1364:1:3 +1365:0:2227 +1366:2:1895 +1367:2:1899 +1368:2:1900 +1369:2:1907 +1370:2:1911 +1371:2:1912 +1372:2:1919 +1373:2:1923 +1374:2:1924 +1375:2:1931 +1376:2:1932 +1377:2:1949 +1378:2:1950 +1379:2:1953 +1380:2:1954 +1381:0:2227 +1382:2:1821 +1383:0:2227 +1384:2:1822 +1385:0:2227 +1386:2:1823 +1387:2:1827 +1388:2:1828 +1389:2:1835 +1390:2:1839 +1391:2:1840 +1392:2:1847 +1393:2:1851 +1394:2:1852 +1395:2:1859 +1396:2:1860 +1397:2:1877 +1398:2:1878 +1399:2:1881 +1400:2:1882 +1401:0:2227 +1402:2:1894 +1403:0:2227 +1404:1:4 +1405:1:8 +1406:1:9 +1407:1:16 +1408:1:17 +1409:1:28 +1410:1:32 +1411:1:33 +1412:1:40 +1413:1:41 +1414:1:51 +1415:1:52 +1416:1:62 +1417:1:63 +1418:0:2227 +1419:2:1895 +1420:2:1899 +1421:2:1900 +1422:2:1907 +1423:2:1911 +1424:2:1912 +1425:2:1919 +1426:2:1923 +1427:2:1924 +1428:2:1931 +1429:2:1932 +1430:2:1949 +1431:2:1950 +1432:2:1953 +1433:2:1954 +1434:0:2227 +1435:2:1821 +1436:0:2227 +1437:2:1822 +-1:-1:-1 +1438:0:2227 +1439:2:1823 +1440:2:1827 +1441:2:1828 +1442:2:1835 +1443:2:1839 +1444:2:1840 +1445:2:1847 +1446:2:1851 +1447:2:1852 +1448:2:1859 +1449:2:1860 +1450:2:1877 +1451:2:1878 +1452:2:1881 +1453:2:1882 +1454:0:2227 +1455:2:1894 +1456:0:2227 +1457:1:75 +1458:0:2227 +1459:2:1895 +1460:2:1899 +1461:2:1900 +1462:2:1907 +1463:2:1911 +1464:2:1912 +1465:2:1919 +1466:2:1923 +1467:2:1924 +1468:2:1931 +1469:2:1932 +1470:2:1949 +1471:2:1950 +1472:2:1953 +1473:2:1954 +1474:0:2227 +1475:2:1821 +1476:0:2227 +1477:2:1822 +1478:0:2227 +1479:2:1823 +1480:2:1827 +1481:2:1828 +1482:2:1835 +1483:2:1839 +1484:2:1840 +1485:2:1847 +1486:2:1851 +1487:2:1852 +1488:2:1859 +1489:2:1860 +1490:2:1877 +1491:2:1878 +1492:2:1881 +1493:2:1882 +1494:0:2227 +1495:2:1894 +1496:0:2227 +1497:1:76 +1498:1:80 +1499:1:81 +1500:1:88 +1501:1:92 +1502:1:93 +1503:1:100 +1504:1:104 +1505:1:105 +1506:1:112 +1507:1:113 +1508:1:123 +1509:1:124 +1510:1:134 +1511:1:135 +1512:0:2227 +1513:1:223 +1514:0:2227 +1515:2:1895 +1516:2:1899 +1517:2:1900 +1518:2:1907 +1519:2:1911 +1520:2:1912 +1521:2:1919 +1522:2:1923 +1523:2:1924 +1524:2:1931 +1525:2:1932 +1526:2:1949 +1527:2:1950 +1528:2:1953 +1529:2:1954 +1530:0:2227 +1531:2:1821 +1532:0:2227 +1533:2:1822 +1534:0:2227 +1535:2:1823 +1536:2:1827 +1537:2:1828 +1538:2:1835 +1539:2:1839 +1540:2:1840 +1541:2:1847 +1542:2:1851 +1543:2:1852 +1544:2:1859 +1545:2:1860 +1546:2:1877 +1547:2:1878 +1548:2:1881 +1549:2:1882 +1550:0:2227 +1551:2:1894 +1552:0:2227 +1553:1:224 +1554:0:2227 +1555:1:373 +1556:0:2227 +1557:1:374 +1558:0:2227 +1559:1:379 +1560:0:2227 +1561:2:1895 +1562:2:1899 +1563:2:1900 +1564:2:1907 +1565:2:1911 +1566:2:1912 +1567:2:1919 +1568:2:1923 +1569:2:1924 +1570:2:1931 +1571:2:1932 +1572:2:1949 +1573:2:1950 +1574:2:1953 +1575:2:1954 +1576:0:2227 +1577:2:1821 +1578:0:2227 +1579:2:1822 +1580:0:2227 +1581:2:1823 +1582:2:1827 +1583:2:1828 +1584:2:1835 +1585:2:1839 +1586:2:1840 +1587:2:1847 +1588:2:1851 +1589:2:1852 +1590:2:1859 +1591:2:1860 +1592:2:1877 +1593:2:1878 +1594:2:1881 +1595:2:1882 +1596:0:2227 +1597:2:1894 +1598:0:2227 +1599:1:384 +1600:1:388 +1601:1:389 +1602:1:396 +1603:1:397 +1604:1:408 +1605:1:412 +1606:1:413 +1607:1:420 +1608:1:421 +1609:1:431 +1610:1:432 +1611:1:442 +1612:1:443 +1613:0:2227 +1614:2:1895 +1615:2:1899 +1616:2:1900 +1617:2:1907 +1618:2:1911 +1619:2:1912 +1620:2:1919 +1621:2:1923 +1622:2:1924 +1623:2:1931 +1624:2:1932 +1625:2:1949 +1626:2:1950 +1627:2:1953 +1628:2:1954 +1629:0:2227 +1630:2:1821 +1631:0:2227 +1632:2:1822 +1633:0:2227 +1634:2:1823 +1635:2:1827 +1636:2:1828 +1637:2:1835 +1638:2:1839 +1639:2:1840 +1640:2:1847 +1641:2:1851 +1642:2:1852 +1643:2:1859 +1644:2:1860 +1645:2:1877 +1646:2:1878 +1647:2:1881 +1648:2:1882 +1649:0:2227 +1650:2:1894 +1651:0:2227 +1652:1:455 +1653:0:2227 +1654:2:1895 +1655:2:1899 +1656:2:1900 +1657:2:1907 +1658:2:1911 +1659:2:1912 +1660:2:1919 +1661:2:1923 +1662:2:1924 +1663:2:1931 +1664:2:1932 +1665:2:1949 +1666:2:1950 +1667:2:1953 +1668:2:1954 +1669:0:2227 +1670:2:1821 +1671:0:2227 +1672:2:1822 +1673:0:2227 +1674:2:1823 +1675:2:1827 +1676:2:1828 +1677:2:1835 +1678:2:1839 +1679:2:1840 +1680:2:1847 +1681:2:1851 +1682:2:1852 +1683:2:1859 +1684:2:1860 +1685:2:1877 +1686:2:1878 +1687:2:1881 +1688:2:1882 +1689:0:2227 +1690:2:1894 +1691:0:2227 +1692:1:456 +1693:1:460 +1694:1:461 +1695:1:468 +1696:1:472 +1697:1:473 +1698:1:480 +1699:1:484 +1700:1:485 +1701:1:492 +1702:1:493 +1703:1:503 +1704:1:504 +1705:1:514 +1706:1:515 +1707:0:2227 +1708:2:1895 +1709:2:1899 +1710:2:1900 +1711:2:1907 +1712:2:1911 +1713:2:1912 +1714:2:1919 +1715:2:1923 +1716:2:1924 +1717:2:1931 +1718:2:1932 +1719:2:1949 +1720:2:1950 +1721:2:1953 +1722:2:1954 +1723:0:2227 +1724:2:1821 +1725:0:2227 +1726:2:1822 +1727:0:2227 +1728:2:1823 +1729:2:1827 +1730:2:1828 +1731:2:1835 +1732:2:1839 +1733:2:1840 +1734:2:1847 +1735:2:1851 +1736:2:1852 +1737:2:1859 +1738:2:1860 +1739:2:1877 +1740:2:1878 +1741:2:1881 +1742:2:1882 +1743:0:2227 +1744:2:1894 +1745:0:2227 +1746:1:527 +1747:0:2227 +1748:2:1895 +1749:2:1899 +1750:2:1900 +1751:2:1907 +1752:2:1911 +1753:2:1912 +1754:2:1919 +1755:2:1923 +1756:2:1924 +1757:2:1931 +1758:2:1932 +1759:2:1949 +1760:2:1950 +1761:2:1953 +1762:2:1954 +1763:0:2227 +1764:2:1821 +1765:0:2227 +1766:2:1822 +1767:0:2227 +1768:2:1823 +1769:2:1827 +1770:2:1828 +1771:2:1835 +1772:2:1839 +1773:2:1840 +1774:2:1847 +1775:2:1851 +1776:2:1852 +1777:2:1859 +1778:2:1860 +1779:2:1877 +1780:2:1878 +1781:2:1881 +1782:2:1882 +1783:0:2227 +1784:2:1894 +1785:0:2227 +1786:1:528 +1787:1:532 +1788:1:533 +1789:1:540 +1790:1:544 +1791:1:545 +1792:1:552 +1793:1:556 +1794:1:557 +1795:1:564 +1796:1:565 +1797:1:575 +1798:1:576 +1799:1:586 +1800:1:587 +1801:0:2227 +1802:2:1895 +1803:2:1899 +1804:2:1900 +1805:2:1907 +1806:2:1911 +1807:2:1912 +1808:2:1919 +1809:2:1923 +1810:2:1924 +1811:2:1931 +1812:2:1932 +1813:2:1949 +1814:2:1950 +1815:2:1953 +1816:2:1954 +1817:0:2227 +1818:2:1821 +1819:0:2227 +1820:2:1822 +1821:0:2227 +1822:2:1823 +1823:2:1827 +1824:2:1828 +1825:2:1835 +1826:2:1839 +1827:2:1840 +1828:2:1847 +1829:2:1851 +1830:2:1852 +1831:2:1859 +1832:2:1860 +1833:2:1877 +1834:2:1878 +1835:2:1881 +1836:2:1882 +1837:0:2227 +1838:2:1894 +1839:0:2227 +1840:1:599 +1841:0:2227 +1842:1:600 +1843:0:2227 +1844:1:601 +1845:0:2227 +1846:1:746 +1847:0:2227 +1848:1:747 +1849:0:2227 +1850:2:1895 +1851:2:1899 +1852:2:1900 +1853:2:1907 +1854:2:1911 +1855:2:1912 +1856:2:1919 +1857:2:1923 +1858:2:1924 +1859:2:1931 +1860:2:1932 +1861:2:1949 +1862:2:1950 +1863:2:1953 +1864:2:1954 +1865:0:2227 +1866:2:1821 +1867:0:2227 +1868:2:1822 +1869:0:2227 +1870:2:1823 +1871:2:1827 +1872:2:1828 +1873:2:1835 +1874:2:1839 +1875:2:1840 +1876:2:1847 +1877:2:1851 +1878:2:1852 +1879:2:1859 +1880:2:1860 +1881:2:1877 +1882:2:1878 +1883:2:1881 +1884:2:1882 +1885:0:2227 +1886:2:1894 +1887:0:2227 +1888:1:751 +1889:0:2227 +1890:2:1895 +1891:2:1899 +1892:2:1900 +1893:2:1907 +1894:2:1911 +1895:2:1912 +1896:2:1919 +1897:2:1923 +1898:2:1924 +1899:2:1931 +1900:2:1932 +1901:2:1949 +1902:2:1950 +1903:2:1953 +1904:2:1954 +1905:0:2227 +1906:2:1821 +1907:0:2227 +1908:2:1822 +1909:0:2227 +1910:2:1823 +1911:2:1827 +1912:2:1828 +1913:2:1835 +1914:2:1839 +1915:2:1840 +1916:2:1847 +1917:2:1851 +1918:2:1852 +1919:2:1859 +1920:2:1860 +1921:2:1877 +1922:2:1878 +1923:2:1881 +1924:2:1882 +1925:0:2227 +1926:2:1894 +1927:0:2227 +1928:1:752 +1929:1:756 +1930:1:757 +1931:1:764 +1932:1:768 +1933:1:769 +1934:1:776 +1935:1:780 +1936:1:781 +1937:1:788 +1938:1:789 +1939:1:799 +1940:1:800 +1941:1:810 +1942:1:811 +1943:0:2227 +1944:2:1895 +1945:2:1899 +1946:2:1900 +1947:2:1907 +1948:2:1911 +1949:2:1912 +1950:2:1919 +1951:2:1923 +1952:2:1924 +1953:2:1931 +1954:2:1932 +1955:2:1949 +1956:2:1950 +1957:2:1953 +1958:2:1954 +1959:0:2227 +1960:2:1821 +1961:0:2227 +1962:2:1822 +1963:0:2227 +1964:2:1823 +1965:2:1827 +1966:2:1828 +1967:2:1835 +1968:2:1839 +1969:2:1840 +1970:2:1847 +1971:2:1851 +1972:2:1852 +1973:2:1859 +1974:2:1860 +1975:2:1877 +1976:2:1878 +1977:2:1881 +1978:2:1882 +1979:0:2227 +1980:2:1894 +1981:0:2227 +1982:1:823 +1983:0:2227 +1984:1:601 +1985:0:2227 +1986:1:746 +1987:0:2227 +1988:1:747 +1989:0:2227 +1990:2:1895 +1991:2:1899 +1992:2:1900 +1993:2:1907 +1994:2:1911 +1995:2:1912 +1996:2:1919 +1997:2:1923 +1998:2:1924 +1999:2:1931 +2000:2:1932 +2001:2:1949 +2002:2:1950 +2003:2:1953 +2004:2:1954 +2005:0:2227 +2006:2:1821 +2007:0:2227 +2008:2:1822 +2009:0:2227 +2010:2:1823 +2011:2:1827 +2012:2:1828 +2013:2:1835 +2014:2:1839 +2015:2:1840 +2016:2:1847 +2017:2:1851 +2018:2:1852 +2019:2:1859 +2020:2:1860 +2021:2:1877 +2022:2:1878 +2023:2:1881 +2024:2:1882 +2025:0:2227 +2026:2:1894 +2027:0:2227 +2028:1:751 +2029:0:2227 +2030:2:1895 +2031:2:1899 +2032:2:1900 +2033:2:1907 +2034:2:1911 +2035:2:1912 +2036:2:1919 +2037:2:1923 +2038:2:1924 +2039:2:1931 +2040:2:1932 +2041:2:1949 +2042:2:1950 +2043:2:1953 +2044:2:1954 +2045:0:2227 +2046:2:1821 +2047:0:2227 +2048:2:1822 +2049:0:2227 +2050:2:1823 +2051:2:1827 +2052:2:1828 +2053:2:1835 +2054:2:1839 +2055:2:1840 +2056:2:1847 +2057:2:1851 +2058:2:1852 +2059:2:1859 +2060:2:1860 +2061:2:1877 +2062:2:1878 +2063:2:1881 +2064:2:1882 +2065:0:2227 +2066:2:1894 +2067:0:2227 +2068:1:752 +2069:1:756 +2070:1:757 +2071:1:764 +2072:1:765 +2073:1:776 +2074:1:780 +2075:1:781 +2076:1:788 +2077:1:789 +2078:1:799 +2079:1:800 +2080:1:810 +2081:1:811 +2082:0:2227 +2083:2:1895 +2084:2:1899 +2085:2:1900 +2086:2:1907 +2087:2:1911 +2088:2:1912 +2089:2:1919 +2090:2:1923 +2091:2:1924 +2092:2:1931 +2093:2:1932 +2094:2:1949 +2095:2:1950 +2096:2:1953 +2097:2:1954 +2098:0:2227 +2099:2:1821 +2100:0:2227 +2101:2:1822 +2102:0:2227 +2103:2:1823 +2104:2:1827 +2105:2:1828 +2106:2:1835 +2107:2:1839 +2108:2:1840 +2109:2:1847 +2110:2:1851 +2111:2:1852 +2112:2:1859 +2113:2:1860 +2114:2:1877 +2115:2:1878 +2116:2:1881 +2117:2:1882 +2118:0:2227 +2119:2:1894 +2120:0:2227 +2121:1:823 +2122:0:2227 +2123:1:827 +2124:0:2227 +2125:2:1895 +2126:2:1899 +2127:2:1900 +2128:2:1907 +2129:2:1911 +2130:2:1912 +2131:2:1919 +2132:2:1923 +2133:2:1924 +2134:2:1931 +2135:2:1932 +2136:2:1949 +2137:2:1950 +2138:2:1953 +2139:2:1954 +2140:0:2227 +2141:2:1821 +2142:0:2227 +2143:2:1822 +2144:0:2227 +2145:2:1823 +2146:2:1827 +2147:2:1828 +2148:2:1835 +2149:2:1839 +2150:2:1840 +2151:2:1847 +2152:2:1851 +2153:2:1852 +2154:2:1859 +2155:2:1860 +2156:2:1877 +2157:2:1878 +2158:2:1881 +2159:2:1882 +2160:0:2227 +2161:2:1894 +2162:0:2227 +2163:1:832 +2164:1:836 +2165:1:837 +2166:1:844 +2167:1:845 +2168:1:856 +2169:1:860 +2170:1:861 +2171:1:868 +2172:1:869 +2173:1:879 +2174:1:880 +2175:1:890 +2176:1:891 +2177:0:2227 +2178:1:1 +2179:0:2227 +2180:1:2 +2181:0:2227 +2182:1:3 +2183:0:2227 +2184:2:1895 +2185:2:1899 +2186:2:1900 +2187:2:1907 +2188:2:1911 +2189:2:1912 +2190:2:1919 +2191:2:1923 +2192:2:1924 +2193:2:1931 +2194:2:1932 +2195:2:1949 +2196:2:1950 +2197:2:1953 +2198:2:1954 +2199:0:2227 +2200:2:1821 +2201:0:2227 +2202:2:1822 +2203:0:2227 +2204:2:1823 +2205:2:1827 +2206:2:1828 +2207:2:1835 +2208:2:1839 +2209:2:1840 +2210:2:1847 +2211:2:1851 +2212:2:1852 +2213:2:1859 +2214:2:1860 +2215:2:1877 +2216:2:1878 +2217:2:1881 +2218:2:1882 +2219:0:2227 +2220:2:1894 +2221:0:2227 +2222:1:4 +2223:1:8 +2224:1:9 +2225:1:16 +2226:1:20 +2227:1:21 +2228:1:28 +2229:1:32 +2230:1:33 +2231:1:40 +2232:1:41 +2233:1:51 +2234:1:52 +2235:1:62 +2236:1:63 +2237:0:2227 +2238:2:1895 +2239:2:1899 +2240:2:1900 +2241:2:1907 +2242:2:1911 +2243:2:1912 +2244:2:1919 +2245:2:1923 +2246:2:1924 +2247:2:1931 +2248:2:1932 +2249:2:1949 +2250:2:1950 +2251:2:1953 +2252:2:1954 +2253:0:2227 +2254:2:1821 +2255:0:2227 +2256:2:1822 +2257:0:2227 +2258:2:1823 +2259:2:1827 +2260:2:1828 +2261:2:1835 +2262:2:1839 +2263:2:1840 +2264:2:1847 +2265:2:1851 +2266:2:1852 +2267:2:1859 +2268:2:1860 +2269:2:1877 +2270:2:1878 +2271:2:1881 +2272:2:1882 +2273:0:2227 +2274:2:1894 +2275:0:2227 +2276:1:75 +2277:0:2227 +2278:2:1895 +2279:2:1899 +2280:2:1900 +2281:2:1907 +2282:2:1911 +2283:2:1912 +2284:2:1919 +2285:2:1923 +2286:2:1924 +2287:2:1931 +2288:2:1932 +2289:2:1949 +2290:2:1950 +2291:2:1953 +2292:2:1954 +2293:0:2227 +2294:2:1821 +2295:0:2227 +2296:2:1822 +2297:0:2227 +2298:2:1823 +2299:2:1827 +2300:2:1828 +2301:2:1835 +2302:2:1839 +2303:2:1840 +2304:2:1847 +2305:2:1851 +2306:2:1852 +2307:2:1859 +2308:2:1860 +2309:2:1877 +2310:2:1878 +2311:2:1881 +2312:2:1882 +2313:0:2227 +2314:2:1894 +2315:0:2227 +2316:1:76 +2317:1:80 +2318:1:81 +2319:1:88 +2320:1:92 +2321:1:93 +2322:1:100 +2323:1:104 +2324:1:105 +2325:1:112 +2326:1:113 +2327:1:123 +2328:1:124 +2329:1:134 +2330:1:135 +2331:0:2227 +2332:1:147 +2333:0:2227 +2334:2:1895 +2335:2:1899 +2336:2:1900 +2337:2:1907 +2338:2:1911 +2339:2:1912 +2340:2:1919 +2341:2:1923 +2342:2:1924 +2343:2:1931 +2344:2:1932 +2345:2:1949 +2346:2:1950 +2347:2:1953 +2348:2:1954 +2349:0:2227 +2350:2:1821 +2351:0:2227 +2352:2:1822 +2353:0:2227 +2354:2:1823 +2355:2:1827 +2356:2:1828 +2357:2:1835 +2358:2:1839 +2359:2:1840 +2360:2:1847 +2361:2:1851 +2362:2:1852 +2363:2:1859 +2364:2:1860 +2365:2:1877 +2366:2:1878 +2367:2:1881 +2368:2:1882 +2369:0:2227 +2370:2:1894 +2371:0:2227 +2372:1:148 +2373:0:2227 +2374:2:1895 +2375:2:1899 +2376:2:1900 +2377:2:1907 +2378:2:1911 +2379:2:1912 +2380:2:1919 +2381:2:1923 +2382:2:1924 +2383:2:1931 +2384:2:1932 +2385:2:1949 +2386:2:1950 +2387:2:1953 +2388:2:1954 +2389:0:2227 +2390:2:1821 +2391:0:2227 +2392:2:1822 +2393:0:2227 +2394:2:1823 +2395:2:1827 +2396:2:1828 +2397:2:1835 +2398:2:1839 +2399:2:1840 +2400:2:1847 +2401:2:1851 +2402:2:1852 +2403:2:1859 +2404:2:1860 +2405:2:1877 +2406:2:1878 +2407:2:1881 +2408:2:1882 +2409:0:2227 +2410:2:1894 +2411:0:2227 +2412:1:149 +2413:1:153 +2414:1:154 +2415:1:161 +2416:1:165 +2417:1:166 +2418:1:173 +2419:1:177 +2420:1:178 +2421:1:185 +2422:1:186 +2423:1:196 +2424:1:197 +2425:1:207 +2426:1:208 +2427:0:2227 +2428:2:1895 +2429:2:1899 +2430:2:1900 +2431:2:1907 +2432:2:1911 +2433:2:1912 +2434:2:1919 +2435:2:1923 +2436:2:1924 +2437:2:1931 +2438:2:1932 +2439:2:1949 +2440:2:1950 +2441:2:1953 +2442:2:1954 +2443:0:2227 +2444:2:1821 +2445:0:2227 +2446:2:1822 +2447:0:2227 +2448:2:1823 +2449:2:1827 +2450:2:1828 +2451:2:1835 +2452:2:1839 +2453:2:1840 +2454:2:1847 +2455:2:1851 +2456:2:1852 +2457:2:1859 +2458:2:1860 +2459:2:1877 +2460:2:1878 +2461:2:1881 +2462:2:1882 +2463:0:2227 +2464:2:1894 +2465:0:2227 +2466:1:220 +2467:0:2227 +2468:1:373 +2469:0:2227 +2470:1:374 +2471:0:2227 +2472:1:3 +2473:0:2227 +2474:2:1895 +2475:2:1899 +2476:2:1900 +2477:2:1907 +2478:2:1911 +2479:2:1912 +2480:2:1919 +2481:2:1923 +2482:2:1924 +2483:2:1931 +2484:2:1932 +2485:2:1949 +2486:2:1950 +2487:2:1953 +2488:2:1954 +2489:0:2227 +2490:2:1821 +2491:0:2227 +2492:2:1822 +2493:0:2227 +2494:2:1823 +2495:2:1827 +2496:2:1828 +2497:2:1835 +2498:2:1839 +2499:2:1840 +2500:2:1847 +2501:2:1851 +2502:2:1852 +2503:2:1859 +2504:2:1860 +2505:2:1877 +2506:2:1878 +2507:2:1881 +2508:2:1882 +2509:0:2227 +2510:2:1894 +2511:0:2227 +2512:1:4 +2513:1:8 +2514:1:9 +2515:1:24 +2516:1:25 +2517:1:28 +2518:1:32 +2519:1:33 +2520:1:40 +2521:1:41 +2522:1:51 +2523:1:54 +2524:1:55 +2525:1:62 +2526:1:63 +2527:0:2227 +2528:2:1895 +2529:2:1899 +2530:2:1900 +2531:2:1907 +2532:2:1911 +2533:2:1912 +2534:2:1919 +2535:2:1923 +2536:2:1924 +2537:2:1931 +2538:2:1932 +2539:2:1949 +2540:2:1950 +2541:2:1953 +2542:2:1954 +2543:0:2227 +2544:2:1821 +2545:0:2227 +2546:2:1822 +2547:0:2227 +2548:2:1823 +2549:2:1827 +2550:2:1828 +2551:2:1835 +2552:2:1839 +2553:2:1840 +2554:2:1847 +2555:2:1851 +2556:2:1852 +2557:2:1859 +2558:2:1860 +2559:2:1877 +2560:2:1878 +2561:2:1881 +2562:2:1882 +2563:0:2227 +2564:2:1894 +2565:0:2227 +2566:1:75 +2567:0:2227 +2568:2:1895 +2569:2:1899 +2570:2:1900 +2571:2:1907 +2572:2:1911 +2573:2:1912 +2574:2:1919 +2575:2:1923 +2576:2:1924 +2577:2:1931 +2578:2:1932 +2579:2:1949 +2580:2:1950 +2581:2:1953 +2582:2:1954 +2583:0:2227 +2584:2:1821 +2585:0:2227 +2586:2:1822 +2587:0:2227 +2588:2:1823 +2589:2:1827 +2590:2:1828 +2591:2:1835 +2592:2:1839 +2593:2:1840 +2594:2:1847 +2595:2:1851 +2596:2:1852 +2597:2:1859 +2598:2:1860 +2599:2:1877 +2600:2:1878 +2601:2:1881 +2602:2:1882 +2603:0:2227 +2604:2:1894 +2605:0:2227 +2606:1:76 +2607:1:80 +2608:1:81 +2609:1:96 +2610:1:97 +2611:1:100 +2612:1:104 +2613:1:105 +2614:1:112 +2615:1:113 +2616:1:123 +2617:1:126 +2618:1:127 +2619:1:134 +2620:1:135 +2621:0:2227 +2622:1:223 +2623:0:2227 +2624:2:1895 +2625:2:1899 +2626:2:1900 +2627:2:1907 +2628:2:1911 +2629:2:1912 +2630:2:1919 +2631:2:1923 +2632:2:1924 +2633:2:1931 +2634:2:1932 +2635:2:1949 +2636:2:1950 +2637:2:1953 +2638:2:1954 +2639:0:2227 +2640:2:1821 +2641:0:2227 +2642:2:1822 +2643:0:2227 +2644:2:1823 +2645:2:1827 +2646:2:1828 +2647:2:1835 +2648:2:1839 +2649:2:1840 +2650:2:1847 +2651:2:1851 +2652:2:1852 +2653:2:1859 +2654:2:1860 +2655:2:1877 +2656:2:1878 +2657:2:1881 +2658:2:1882 +2659:0:2227 +2660:2:1894 +2661:0:2227 +2662:1:224 +2663:0:2227 +2664:1:373 +2665:0:2227 +2666:1:374 +2667:0:2227 +2668:1:379 +2669:0:2227 +2670:2:1895 +2671:2:1899 +2672:2:1900 +2673:2:1907 +2674:2:1911 +2675:2:1912 +2676:2:1919 +2677:2:1923 +2678:2:1924 +2679:2:1931 +2680:2:1932 +2681:2:1949 +2682:2:1950 +2683:2:1953 +2684:2:1954 +2685:0:2227 +2686:2:1821 +2687:0:2227 +2688:2:1822 +2689:0:2227 +2690:2:1823 +2691:2:1827 +2692:2:1828 +2693:2:1835 +2694:2:1839 +2695:2:1840 +2696:2:1847 +2697:2:1851 +2698:2:1852 +2699:2:1859 +2700:2:1860 +2701:2:1877 +2702:2:1878 +2703:2:1881 +2704:2:1882 +2705:0:2227 +2706:2:1894 +2707:0:2227 +2708:1:384 +2709:1:388 +2710:1:389 +2711:1:404 +2712:1:405 +2713:1:408 +2714:1:412 +2715:1:413 +2716:1:420 +2717:1:421 +2718:1:431 +2719:1:434 +2720:1:435 +2721:1:442 +2722:1:443 +2723:0:2227 +2724:2:1895 +2725:2:1899 +2726:2:1900 +2727:2:1907 +2728:2:1911 +2729:2:1912 +2730:2:1919 +2731:2:1923 +2732:2:1924 +2733:2:1931 +2734:2:1932 +2735:2:1949 +2736:2:1950 +2737:2:1953 +2738:2:1954 +2739:0:2227 +2740:2:1821 +2741:0:2227 +2742:2:1822 +2743:0:2227 +2744:2:1823 +2745:2:1827 +2746:2:1828 +2747:2:1835 +2748:2:1839 +2749:2:1840 +2750:2:1847 +2751:2:1851 +2752:2:1852 +2753:2:1859 +2754:2:1860 +2755:2:1877 +2756:2:1878 +2757:2:1881 +2758:2:1882 +2759:0:2227 +2760:2:1894 +2761:0:2227 +2762:1:455 +2763:0:2227 +2764:2:1895 +2765:2:1899 +2766:2:1900 +2767:2:1907 +2768:2:1911 +2769:2:1912 +2770:2:1919 +2771:2:1923 +2772:2:1924 +2773:2:1931 +2774:2:1932 +2775:2:1949 +2776:2:1950 +2777:2:1953 +2778:2:1954 +2779:0:2227 +2780:2:1821 +2781:0:2227 +2782:2:1822 +2783:0:2227 +2784:2:1823 +2785:2:1827 +2786:2:1828 +2787:2:1835 +2788:2:1839 +2789:2:1840 +2790:2:1847 +2791:2:1851 +2792:2:1852 +2793:2:1859 +2794:2:1860 +2795:2:1877 +2796:2:1878 +2797:2:1881 +2798:2:1882 +2799:0:2227 +2800:2:1894 +2801:0:2227 +2802:1:456 +2803:1:460 +2804:1:461 +2805:1:476 +2806:1:477 +2807:1:480 +2808:1:484 +2809:1:485 +2810:1:492 +2811:1:493 +2812:1:503 +2813:1:506 +2814:1:507 +2815:1:514 +2816:1:515 +2817:0:2227 +2818:2:1895 +2819:2:1899 +2820:2:1900 +2821:2:1907 +2822:2:1911 +2823:2:1912 +2824:2:1919 +2825:2:1923 +2826:2:1924 +2827:2:1931 +2828:2:1932 +2829:2:1949 +2830:2:1950 +2831:2:1953 +2832:2:1954 +2833:0:2227 +2834:2:1821 +2835:0:2227 +2836:2:1822 +2837:0:2227 +2838:2:1823 +2839:2:1827 +2840:2:1828 +2841:2:1835 +2842:2:1839 +2843:2:1840 +2844:2:1847 +2845:2:1851 +2846:2:1852 +2847:2:1859 +2848:2:1860 +2849:2:1877 +2850:2:1878 +2851:2:1881 +2852:2:1882 +2853:0:2227 +2854:2:1894 +2855:0:2227 +2856:1:527 +2857:0:2227 +2858:2:1895 +2859:2:1899 +2860:2:1900 +2861:2:1907 +2862:2:1911 +2863:2:1912 +2864:2:1919 +2865:2:1923 +2866:2:1924 +2867:2:1931 +2868:2:1932 +2869:2:1949 +2870:2:1950 +2871:2:1953 +2872:2:1954 +2873:0:2227 +2874:2:1821 +2875:0:2227 +2876:2:1822 +2877:0:2227 +2878:2:1823 +2879:2:1827 +2880:2:1828 +2881:2:1835 +2882:2:1839 +2883:2:1840 +2884:2:1847 +2885:2:1851 +2886:2:1852 +2887:2:1859 +2888:2:1860 +2889:2:1877 +2890:2:1878 +2891:2:1881 +2892:2:1882 +2893:0:2227 +2894:2:1894 +2895:0:2227 +2896:1:528 +2897:1:532 +2898:1:533 +2899:1:548 +2900:1:549 +2901:1:552 +2902:1:556 +2903:1:557 +2904:1:564 +2905:1:565 +2906:1:575 +2907:1:578 +2908:1:579 +2909:1:586 +2910:1:587 +2911:0:2227 +2912:2:1895 +2913:2:1899 +2914:2:1900 +2915:2:1907 +2916:2:1911 +2917:2:1912 +2918:2:1919 +2919:2:1923 +2920:2:1924 +2921:2:1931 +2922:2:1932 +2923:2:1949 +2924:2:1950 +2925:2:1953 +2926:2:1954 +2927:0:2227 +2928:2:1821 +2929:0:2227 +2930:2:1822 +2931:0:2227 +2932:2:1823 +2933:2:1827 +2934:2:1828 +2935:2:1835 +2936:2:1839 +2937:2:1840 +2938:2:1847 +2939:2:1851 +2940:2:1852 +2941:2:1859 +2942:2:1860 +2943:2:1877 +2944:2:1878 +2945:2:1881 +2946:2:1882 +2947:0:2227 +2948:2:1894 +2949:0:2227 +2950:1:599 +2951:0:2227 +2952:1:600 +2953:0:2227 +2954:1:601 +2955:0:2227 +2956:1:746 +2957:0:2227 +2958:1:747 +2959:0:2227 +2960:2:1895 +2961:2:1899 +2962:2:1900 +2963:2:1907 +2964:2:1911 +2965:2:1912 +2966:2:1919 +2967:2:1923 +2968:2:1924 +2969:2:1931 +2970:2:1932 +2971:2:1949 +2972:2:1950 +2973:2:1953 +2974:2:1954 +2975:0:2227 +2976:2:1821 +2977:0:2227 +2978:2:1822 +2979:0:2227 +2980:2:1823 +2981:2:1827 +2982:2:1828 +2983:2:1835 +2984:2:1839 +2985:2:1840 +2986:2:1847 +2987:2:1851 +2988:2:1852 +2989:2:1859 +2990:2:1860 +2991:2:1877 +2992:2:1878 +2993:2:1881 +2994:2:1882 +2995:0:2227 +2996:2:1894 +2997:0:2227 +2998:1:751 +2999:0:2227 +3000:2:1895 +3001:2:1899 +3002:2:1900 +3003:2:1907 +3004:2:1911 +3005:2:1912 +3006:2:1919 +3007:2:1923 +3008:2:1924 +3009:2:1931 +3010:2:1932 +3011:2:1949 +3012:2:1950 +3013:2:1953 +3014:2:1954 +3015:0:2227 +3016:2:1821 +3017:0:2227 +3018:2:1822 +3019:0:2227 +3020:2:1823 +3021:2:1827 +3022:2:1828 +3023:2:1835 +3024:2:1839 +3025:2:1840 +3026:2:1847 +3027:2:1851 +3028:2:1852 +3029:2:1859 +3030:2:1860 +3031:2:1877 +3032:2:1878 +3033:2:1881 +3034:2:1882 +3035:0:2227 +3036:2:1894 +3037:0:2227 +3038:1:752 +3039:1:756 +3040:1:757 +3041:1:772 +3042:1:773 +3043:1:776 +3044:1:780 +3045:1:781 +3046:1:788 +3047:1:789 +3048:1:799 +3049:1:802 +3050:1:803 +3051:1:810 +3052:1:811 +3053:0:2227 +3054:2:1895 +3055:2:1899 +3056:2:1900 +3057:2:1907 +3058:2:1911 +3059:2:1912 +3060:2:1919 +3061:2:1923 +3062:2:1924 +3063:2:1931 +3064:2:1932 +3065:2:1949 +3066:2:1950 +3067:2:1953 +3068:2:1954 +3069:0:2227 +3070:2:1821 +3071:0:2227 +3072:2:1822 +3073:0:2227 +3074:2:1823 +3075:2:1827 +3076:2:1828 +3077:2:1835 +3078:2:1839 +3079:2:1840 +3080:2:1847 +3081:2:1851 +3082:2:1852 +3083:2:1859 +3084:2:1860 +3085:2:1877 +3086:2:1878 +3087:2:1881 +3088:2:1882 +3089:0:2227 +3090:2:1894 +3091:0:2227 +3092:1:823 +3093:0:2227 +3094:1:601 +3095:0:2227 +3096:1:746 +3097:0:2227 +3098:1:747 +3099:0:2227 +3100:2:1895 +3101:2:1899 +3102:2:1900 +3103:2:1907 +3104:2:1911 +3105:2:1912 +3106:2:1919 +3107:2:1923 +3108:2:1924 +3109:2:1931 +3110:2:1932 +3111:2:1949 +3112:2:1950 +3113:2:1953 +3114:2:1954 +3115:0:2227 +3116:2:1821 +3117:0:2227 +3118:2:1822 +3119:0:2227 +3120:2:1823 +3121:2:1827 +3122:2:1828 +3123:2:1835 +3124:2:1839 +3125:2:1840 +3126:2:1847 +3127:2:1851 +3128:2:1852 +3129:2:1859 +3130:2:1860 +3131:2:1877 +3132:2:1878 +3133:2:1881 +3134:2:1882 +3135:0:2227 +3136:2:1894 +3137:0:2227 +3138:1:751 +3139:0:2227 +3140:2:1895 +3141:2:1899 +3142:2:1900 +3143:2:1907 +3144:2:1911 +3145:2:1912 +3146:2:1919 +3147:2:1923 +3148:2:1924 +3149:2:1931 +3150:2:1932 +3151:2:1949 +3152:2:1950 +3153:2:1953 +3154:2:1954 +3155:0:2227 +3156:2:1821 +3157:0:2227 +3158:2:1822 +3159:0:2227 +3160:2:1823 +3161:2:1827 +3162:2:1828 +3163:2:1835 +3164:2:1839 +3165:2:1840 +3166:2:1847 +3167:2:1851 +3168:2:1852 +3169:2:1859 +3170:2:1860 +3171:2:1877 +3172:2:1878 +3173:2:1881 +3174:2:1882 +3175:0:2227 +3176:2:1894 +3177:0:2227 +3178:1:752 +3179:1:756 +3180:1:757 +3181:1:772 +3182:1:773 +3183:1:776 +3184:1:780 +3185:1:781 +3186:1:788 +3187:1:789 +3188:1:799 +3189:1:802 +3190:1:803 +3191:1:810 +3192:1:811 +3193:0:2227 +3194:2:1895 +3195:2:1899 +3196:2:1900 +3197:2:1907 +3198:2:1911 +3199:2:1912 +3200:2:1919 +3201:2:1923 +3202:2:1924 +3203:2:1931 +3204:2:1932 +3205:2:1949 +3206:2:1950 +3207:2:1953 +3208:2:1954 +3209:0:2227 +3210:2:1821 +3211:0:2227 +3212:2:1822 +3213:0:2227 +3214:2:1823 +3215:2:1827 +3216:2:1828 +3217:2:1835 +3218:2:1839 +3219:2:1840 +3220:2:1847 +3221:2:1851 +3222:2:1852 +3223:2:1859 +3224:2:1860 +3225:2:1877 +3226:2:1878 +3227:2:1881 +3228:2:1882 +3229:0:2227 +3230:2:1894 +3231:0:2227 +3232:1:823 +3233:0:2227 +3234:1:827 +3235:0:2227 +3236:2:1895 +3237:2:1899 +3238:2:1900 +3239:2:1907 +3240:2:1911 +3241:2:1912 +3242:2:1919 +3243:2:1923 +3244:2:1924 +3245:2:1931 +3246:2:1932 +3247:2:1949 +3248:2:1950 +3249:2:1953 +3250:2:1954 +3251:0:2227 +3252:2:1821 +3253:0:2227 +3254:2:1822 +3255:0:2227 +3256:2:1823 +3257:2:1827 +3258:2:1828 +3259:2:1835 +3260:2:1839 +3261:2:1840 +3262:2:1847 +3263:2:1851 +3264:2:1852 +3265:2:1859 +3266:2:1860 +3267:2:1877 +3268:2:1878 +3269:2:1881 +3270:2:1882 +3271:0:2227 +3272:2:1894 +3273:0:2227 +3274:1:832 +3275:1:836 +3276:1:837 +3277:1:852 +3278:1:853 +3279:1:856 +3280:1:860 +3281:1:861 +3282:1:868 +3283:1:869 +3284:1:879 +3285:1:882 +3286:1:883 +3287:1:890 +3288:1:891 +3289:0:2227 +3290:1:1 +3291:0:2227 +3292:1:2 +3293:0:2227 +3294:1:3 +3295:0:2227 +3296:2:1895 +3297:2:1899 +3298:2:1900 +3299:2:1907 +3300:2:1911 +3301:2:1912 +3302:2:1919 +3303:2:1923 +3304:2:1924 +3305:2:1931 +3306:2:1932 +3307:2:1949 +3308:2:1950 +3309:2:1953 +3310:2:1954 +3311:0:2227 +3312:2:1821 +3313:0:2227 +3314:2:1822 +3315:0:2227 +3316:2:1823 +3317:2:1827 +3318:2:1828 +3319:2:1835 +3320:2:1839 +3321:2:1840 +3322:2:1847 +3323:2:1851 +3324:2:1852 +3325:2:1859 +3326:2:1860 +3327:2:1877 +3328:2:1878 +3329:2:1881 +3330:2:1882 +3331:0:2227 +3332:2:1894 +3333:0:2227 +3334:1:4 +3335:1:8 +3336:1:9 +3337:1:24 +3338:1:25 +3339:1:28 +3340:1:32 +3341:1:33 +3342:1:40 +3343:1:41 +3344:1:51 +3345:1:54 +3346:1:55 +3347:1:62 +3348:1:63 +3349:0:2227 +3350:2:1895 +3351:2:1899 +3352:2:1900 +3353:2:1907 +3354:2:1911 +3355:2:1912 +3356:2:1919 +3357:2:1923 +3358:2:1924 +3359:2:1931 +3360:2:1932 +3361:2:1949 +3362:2:1950 +3363:2:1953 +3364:2:1954 +3365:0:2227 +3366:2:1821 +3367:0:2227 +3368:2:1822 +3369:0:2227 +3370:2:1823 +3371:2:1827 +3372:2:1828 +3373:2:1835 +3374:2:1839 +3375:2:1840 +3376:2:1847 +3377:2:1851 +3378:2:1852 +3379:2:1859 +3380:2:1860 +3381:2:1877 +3382:2:1878 +3383:2:1881 +3384:2:1882 +3385:0:2227 +3386:2:1894 +3387:0:2227 +3388:1:75 +3389:0:2227 +3390:2:1895 +3391:2:1899 +3392:2:1900 +3393:2:1907 +3394:2:1911 +3395:2:1912 +3396:2:1919 +3397:2:1923 +3398:2:1924 +3399:2:1931 +3400:2:1932 +3401:2:1949 +3402:2:1950 +3403:2:1953 +3404:2:1954 +3405:0:2227 +3406:2:1821 +3407:0:2227 +3408:2:1822 +3409:0:2227 +3410:2:1823 +3411:2:1827 +3412:2:1828 +3413:2:1835 +3414:2:1839 +3415:2:1840 +3416:2:1847 +3417:2:1851 +3418:2:1852 +3419:2:1859 +3420:2:1860 +3421:2:1877 +3422:2:1878 +3423:2:1881 +3424:2:1882 +3425:0:2227 +3426:2:1894 +3427:0:2227 +3428:1:76 +3429:1:80 +3430:1:81 +3431:1:96 +3432:1:97 +3433:1:100 +3434:1:104 +3435:1:105 +3436:1:112 +3437:1:113 +3438:1:123 +3439:1:126 +3440:1:127 +3441:1:134 +3442:1:135 +3443:0:2227 +3444:1:147 +3445:0:2227 +3446:2:1895 +3447:2:1899 +3448:2:1900 +3449:2:1907 +3450:2:1911 +3451:2:1912 +3452:2:1919 +3453:2:1923 +3454:2:1924 +3455:2:1931 +3456:2:1932 +3457:2:1949 +3458:2:1950 +3459:2:1953 +3460:2:1954 +3461:0:2227 +3462:2:1821 +3463:0:2227 +3464:2:1822 +3465:0:2227 +3466:2:1823 +3467:2:1827 +3468:2:1828 +3469:2:1835 +3470:2:1839 +3471:2:1840 +3472:2:1847 +3473:2:1851 +3474:2:1852 +3475:2:1859 +3476:2:1860 +3477:2:1877 +3478:2:1878 +3479:2:1881 +3480:2:1882 +3481:0:2227 +3482:2:1894 +3483:0:2227 +3484:1:148 +3485:0:2227 +3486:2:1895 +3487:2:1899 +3488:2:1900 +3489:2:1907 +3490:2:1911 +3491:2:1912 +3492:2:1919 +3493:2:1923 +3494:2:1924 +3495:2:1931 +3496:2:1932 +3497:2:1949 +3498:2:1950 +3499:2:1953 +3500:2:1954 +3501:0:2227 +3502:2:1821 +3503:0:2227 +3504:2:1822 +3505:0:2227 +3506:2:1823 +3507:2:1827 +3508:2:1828 +3509:2:1835 +3510:2:1839 +3511:2:1840 +3512:2:1847 +3513:2:1851 +3514:2:1852 +3515:2:1859 +3516:2:1860 +3517:2:1877 +3518:2:1878 +3519:2:1881 +3520:2:1882 +3521:0:2227 +3522:2:1894 +3523:0:2227 +3524:1:149 +3525:1:153 +3526:1:154 +3527:1:169 +3528:1:170 +3529:1:173 +3530:1:177 +3531:1:178 +3532:1:185 +3533:1:186 +3534:1:196 +3535:1:199 +3536:1:200 +3537:1:207 +3538:1:208 +3539:0:2227 +3540:2:1895 +3541:2:1899 +3542:2:1900 +3543:2:1907 +3544:2:1911 +3545:2:1912 +3546:2:1919 +3547:2:1923 +3548:2:1924 +3549:2:1931 +3550:2:1932 +3551:2:1949 +3552:2:1950 +3553:2:1953 +3554:2:1954 +3555:0:2227 +3556:2:1821 +3557:0:2227 +3558:2:1822 +3559:0:2227 +3560:2:1823 +3561:2:1827 +3562:2:1828 +3563:2:1835 +3564:2:1839 +3565:2:1840 +3566:2:1847 +3567:2:1851 +3568:2:1852 +3569:2:1859 +3570:2:1860 +3571:2:1877 +3572:2:1878 +3573:2:1881 +3574:2:1882 +3575:0:2227 +3576:1:220 +3577:0:2227 +3578:1:373 +3579:0:2227 +3580:1:374 +3581:0:2227 +3582:1:3 +3583:0:2227 +3584:1:4 +3585:1:8 +3586:1:9 +3587:1:16 +3588:1:17 +3589:1:28 +3590:1:32 +3591:1:33 +3592:1:40 +3593:1:41 +3594:1:51 +3595:1:52 +3596:1:62 +3597:1:63 +3598:0:2227 +3599:1:75 +3600:0:2227 +3601:1:76 +3602:1:80 +3603:1:81 +3604:1:88 +3605:1:92 +3606:1:93 +3607:1:100 +3608:1:104 +3609:1:105 +3610:1:112 +3611:1:113 +3612:1:123 +3613:1:124 +3614:1:134 +3615:1:135 +3616:0:2227 +3617:1:223 +3618:0:2227 +3619:1:224 +3620:0:2227 +3621:1:373 +3622:0:2227 +3623:1:374 +3624:0:2227 +3625:1:379 +3626:0:2227 +3627:1:384 +3628:1:388 +3629:1:389 +3630:1:396 +3631:1:397 +3632:1:408 +3633:1:412 +3634:1:413 +3635:1:420 +3636:1:421 +3637:1:431 +3638:1:432 +3639:1:442 +3640:1:443 +3641:0:2227 +3642:1:455 +3643:0:2227 +3644:1:456 +3645:1:460 +3646:1:461 +3647:1:468 +3648:1:472 +3649:1:473 +3650:1:480 +3651:1:484 +3652:1:485 +3653:1:492 +3654:1:493 +3655:1:503 +3656:1:504 +3657:1:514 +3658:1:515 +3659:0:2227 +3660:1:527 +3661:0:2227 +3662:1:528 +3663:1:532 +3664:1:533 +3665:1:540 +3666:1:544 +3667:1:545 +3668:1:552 +3669:1:556 +3670:1:557 +3671:1:564 +3672:1:565 +3673:1:575 +3674:1:576 +3675:1:586 +3676:1:587 +3677:0:2227 +3678:1:599 +3679:0:2227 +3680:1:600 +3681:0:2227 +3682:1:601 +3683:0:2227 +3684:1:746 +3685:0:2227 +3686:1:747 +3687:0:2227 +3688:1:751 +3689:0:2227 +3690:1:752 +3691:1:756 +3692:1:757 +3693:1:764 +3694:1:768 +3695:1:769 +3696:1:776 +3697:1:780 +3698:1:781 +3699:1:788 +3700:1:789 +3701:1:799 +3702:1:800 +3703:1:810 +3704:1:811 +3705:0:2227 +3706:1:823 +3707:0:2227 +3708:1:601 +3709:0:2227 +3710:1:746 +3711:0:2227 +3712:1:747 +3713:0:2227 +3714:1:751 +3715:0:2227 +3716:1:752 +3717:1:756 +3718:1:757 +3719:1:764 +3720:1:765 +3721:1:776 +3722:1:780 +3723:1:781 +3724:1:788 +3725:1:789 +3726:1:799 +3727:1:800 +3728:1:810 +3729:1:811 +3730:0:2227 +3731:1:823 +3732:0:2227 +3733:1:827 +3734:0:2227 +3735:1:832 +3736:1:836 +3737:1:837 +3738:1:844 +3739:1:845 +3740:1:856 +3741:1:860 +3742:1:861 +3743:1:868 +3744:1:869 +3745:1:879 +3746:1:880 +3747:1:890 +3748:1:891 +3749:0:2227 +3750:1:1 +3751:0:2227 +3752:1:2 +3753:0:2227 +3754:1:3 +3755:0:2227 +3756:1:4 +3757:1:8 +3758:1:9 +3759:1:16 +3760:1:20 +3761:1:21 +3762:1:28 +3763:1:32 +3764:1:33 +3765:1:40 +3766:1:41 +3767:1:51 +3768:1:52 +3769:1:62 +3770:1:63 +3771:0:2227 +3772:1:75 +3773:0:2227 +3774:1:76 +3775:1:80 +3776:1:81 +3777:1:88 +3778:1:92 +3779:1:93 +3780:1:100 +3781:1:104 +3782:1:105 +3783:1:112 +3784:1:113 +3785:1:123 +3786:1:124 +3787:1:134 +3788:1:135 +3789:0:2227 +3790:1:147 +3791:0:2227 +3792:1:148 +3793:0:2227 +3794:1:149 +3795:1:153 +3796:1:154 +3797:1:161 +3798:1:165 +3799:1:166 +3800:1:173 +3801:1:177 +3802:1:178 +3803:1:185 +3804:1:186 +3805:1:196 +3806:1:197 +3807:1:207 +3808:1:208 +3809:0:2227 +3810:1:220 +3811:0:2227 +3812:2:1894 +3813:0:2227 +3814:1:373 +3815:0:2227 +3816:2:1895 +3817:2:1899 +3818:2:1900 +3819:2:1907 +3820:2:1911 +3821:2:1912 +3822:2:1919 +3823:2:1923 +3824:2:1924 +3825:2:1931 +3826:2:1932 +3827:2:1949 +3828:2:1950 +3829:2:1953 +3830:2:1954 +3831:0:2227 +3832:2:1821 +3833:0:2227 +3834:1:374 +3835:0:2227 +3836:1:3 +3837:0:2227 +3838:1:4 +3839:1:8 +3840:1:9 +3841:1:16 +3842:1:17 +3843:1:28 +3844:1:32 +3845:1:33 +3846:1:40 +3847:1:41 +3848:1:51 +3849:1:52 +3850:1:62 +3851:1:63 +3852:0:2227 +3853:1:75 +3854:0:2227 +3855:1:76 +3856:1:80 +3857:1:81 +3858:1:88 +3859:1:92 +3860:1:93 +3861:1:100 +3862:1:104 +3863:1:105 +3864:1:112 +3865:1:113 +3866:1:123 +3867:1:124 +3868:1:134 +3869:1:135 +3870:0:2227 +3871:1:223 +3872:0:2227 +3873:1:224 +3874:0:2227 +3875:1:373 +3876:0:2227 +3877:1:374 +3878:0:2227 +3879:1:379 +3880:0:2227 +3881:1:384 +3882:1:388 +3883:1:389 +3884:1:396 +3885:1:397 +3886:1:408 +3887:1:412 +3888:1:413 +3889:1:420 +3890:1:421 +3891:1:431 +3892:1:432 +3893:1:442 +3894:1:443 +3895:0:2227 +3896:1:455 +3897:0:2227 +3898:1:456 +3899:1:460 +3900:1:461 +3901:1:468 +3902:1:472 +3903:1:473 +3904:1:480 +3905:1:484 +3906:1:485 +3907:1:492 +3908:1:493 +3909:1:503 +3910:1:504 +3911:1:514 +3912:1:515 +3913:0:2227 +3914:1:527 +3915:0:2227 +3916:1:528 +3917:1:532 +3918:1:533 +3919:1:540 +3920:1:544 +3921:1:545 +3922:1:552 +3923:1:556 +3924:1:557 +3925:1:564 +3926:1:565 +3927:1:575 +3928:1:576 +3929:1:586 +3930:1:587 +3931:0:2227 +3932:1:599 +3933:0:2227 +3934:1:600 +3935:0:2227 +3936:1:601 +3937:0:2227 +3938:1:746 +3939:0:2227 +3940:1:747 +3941:0:2227 +3942:1:751 +3943:0:2227 +3944:1:752 +3945:1:756 +3946:1:757 +3947:1:764 +3948:1:768 +3949:1:769 +3950:1:776 +3951:1:780 +3952:1:781 +3953:1:788 +3954:1:789 +3955:1:799 +3956:1:800 +3957:1:810 +3958:1:811 +3959:0:2227 +3960:1:823 +3961:0:2227 +3962:1:601 +3963:0:2227 +3964:1:746 +3965:0:2227 +3966:1:747 +3967:0:2227 +3968:1:751 +3969:0:2227 +3970:1:752 +3971:1:756 +3972:1:757 +3973:1:764 +3974:1:765 +3975:1:776 +3976:1:780 +3977:1:781 +3978:1:788 +3979:1:789 +3980:1:799 +3981:1:800 +3982:1:810 +3983:1:811 +3984:0:2227 +3985:1:823 +3986:0:2227 +3987:1:827 +3988:0:2227 +3989:1:832 +3990:1:836 +3991:1:837 +3992:1:844 +3993:1:845 +3994:1:856 +3995:1:860 +3996:1:861 +3997:1:868 +3998:1:869 +3999:1:879 +4000:1:880 +4001:1:890 +4002:1:891 +4003:0:2227 +4004:1:1 +4005:0:2227 +4006:1:2 +4007:0:2227 +4008:1:3 +4009:0:2227 +4010:1:4 +4011:1:8 +4012:1:9 +4013:1:16 +4014:1:20 +4015:1:21 +4016:1:28 +4017:1:32 +4018:1:33 +4019:1:40 +4020:1:41 +4021:1:51 +4022:1:52 +4023:1:62 +4024:1:63 +4025:0:2227 +4026:1:75 +4027:0:2227 +4028:1:76 +4029:1:80 +4030:1:81 +4031:1:88 +4032:1:92 +4033:1:93 +4034:1:100 +4035:1:104 +4036:1:105 +4037:1:112 +4038:1:113 +4039:1:123 +4040:1:124 +4041:1:134 +4042:1:135 +4043:0:2227 +4044:1:147 +4045:0:2227 +4046:1:148 +4047:0:2227 +4048:1:149 +4049:1:153 +4050:1:154 +4051:1:161 +4052:1:165 +4053:1:166 +4054:1:173 +4055:1:177 +4056:1:178 +4057:1:185 +4058:1:186 +4059:1:196 +4060:1:197 +4061:1:207 +4062:1:208 +4063:0:2227 +4064:1:220 +4065:0:2227 +4066:1:373 +4067:0:2227 +4068:1:374 +4069:0:2227 +4070:2:1822 +4071:0:2227 +4072:1:3 +4073:0:2227 +4074:1:4 +4075:1:8 +4076:1:9 +4077:1:16 +4078:1:17 +4079:1:28 +4080:1:32 +4081:1:33 +4082:1:40 +4083:1:41 +4084:1:51 +4085:1:52 +4086:1:62 +4087:1:63 +4088:0:2227 +4089:1:75 +4090:0:2227 +4091:1:76 +4092:1:80 +4093:1:81 +4094:1:88 +4095:1:92 +4096:1:93 +4097:1:100 +4098:1:104 +4099:1:105 +4100:1:112 +4101:1:113 +4102:1:123 +4103:1:124 +4104:1:134 +4105:1:135 +4106:0:2227 +4107:1:223 +4108:0:2227 +4109:1:224 +4110:0:2227 +4111:1:373 +4112:0:2227 +4113:1:374 +4114:0:2227 +4115:1:379 +4116:0:2227 +4117:1:384 +4118:1:388 +4119:1:389 +4120:1:396 +4121:1:397 +4122:1:408 +4123:1:412 +4124:1:413 +4125:1:420 +4126:1:421 +4127:1:431 +4128:1:432 +4129:1:442 +4130:1:443 +4131:0:2227 +4132:1:455 +4133:0:2227 +4134:1:456 +4135:1:460 +4136:1:461 +4137:1:468 +4138:1:472 +4139:1:473 +4140:1:480 +4141:1:484 +4142:1:485 +4143:1:492 +4144:1:493 +4145:1:503 +4146:1:504 +4147:1:514 +4148:1:515 +4149:0:2227 +4150:1:527 +4151:0:2227 +4152:1:528 +4153:1:532 +4154:1:533 +4155:1:540 +4156:1:544 +4157:1:545 +4158:1:552 +4159:1:556 +4160:1:557 +4161:1:564 +4162:1:565 +4163:1:575 +4164:1:576 +4165:1:586 +4166:1:587 +4167:0:2227 +4168:1:599 +4169:0:2227 +4170:1:600 +4171:0:2227 +4172:1:601 +4173:0:2227 +4174:1:746 +4175:0:2227 +4176:1:747 +4177:0:2227 +4178:1:751 +4179:0:2227 +4180:1:752 +4181:1:756 +4182:1:757 +4183:1:764 +4184:1:768 +4185:1:769 +4186:1:776 +4187:1:780 +4188:1:781 +4189:1:788 +4190:1:789 +4191:1:799 +4192:1:800 +4193:1:810 +4194:1:811 +4195:0:2227 +4196:1:823 +4197:0:2227 +4198:1:601 +4199:0:2227 +4200:1:746 +4201:0:2227 +4202:1:747 +4203:0:2227 +4204:1:751 +4205:0:2227 +4206:1:752 +4207:1:756 +4208:1:757 +4209:1:764 +4210:1:765 +4211:1:776 +4212:1:780 +4213:1:781 +4214:1:788 +4215:1:789 +4216:1:799 +4217:1:800 +4218:1:810 +4219:1:811 +4220:0:2227 +4221:1:823 +4222:0:2227 +4223:1:827 +4224:0:2227 +4225:1:832 +4226:1:836 +4227:1:837 +4228:1:852 +4229:1:853 +4230:1:856 +4231:1:860 +4232:1:861 +4233:1:868 +4234:1:869 +4235:1:879 +4236:1:882 +4237:1:883 +4238:1:890 +4239:1:891 +4240:0:2227 +4241:1:1 +4242:0:2227 +4243:1:2 +4244:0:2227 +4245:1:3 +4246:0:2227 +4247:2:1823 +4248:2:1827 +4249:2:1828 +4250:2:1835 +4251:2:1839 +4252:2:1840 +4253:2:1847 +4254:2:1851 +4255:2:1852 +4256:2:1859 +4257:2:1860 +4258:2:1877 +4259:2:1878 +4260:2:1881 +4261:2:1882 +4262:0:2227 +4263:2:1894 +4264:0:2227 +4265:2:1895 +4266:2:1899 +4267:2:1900 +4268:2:1907 +4269:2:1911 +4270:2:1912 +4271:2:1919 +4272:2:1923 +4273:2:1924 +4274:2:1931 +4275:2:1932 +4276:2:1949 +4277:2:1950 +4278:2:1953 +4279:2:1954 +4280:0:2227 +4281:2:1821 +4282:0:2227 +4283:2:1822 +4284:0:2227 +4285:1:4 +4286:1:8 +4287:1:9 +4288:1:16 +4289:1:17 +4290:1:28 +4291:1:32 +4292:1:33 +4293:1:40 +4294:1:41 +4295:1:51 +4296:1:52 +4297:1:62 +4298:1:63 +4299:0:2227 +4300:2:1823 +4301:2:1827 +4302:2:1828 +4303:2:1835 +4304:2:1839 +4305:2:1840 +4306:2:1847 +4307:2:1851 +4308:2:1852 +4309:2:1859 +4310:2:1860 +4311:2:1877 +4312:2:1878 +4313:2:1881 +4314:2:1882 +4315:0:2227 +4316:2:1894 +4317:0:2227 +4318:2:1895 +4319:2:1899 +4320:2:1900 +4321:2:1907 +4322:2:1911 +4323:2:1912 +4324:2:1919 +4325:2:1923 +4326:2:1924 +4327:2:1931 +4328:2:1932 +4329:2:1949 +4330:2:1950 +4331:2:1953 +4332:2:1954 +4333:0:2227 +4334:2:1821 +4335:0:2227 +4336:2:1822 +4337:0:2227 +4338:1:75 +4339:0:2227 +4340:2:1823 +4341:2:1827 +4342:2:1828 +4343:2:1835 +4344:2:1839 +4345:2:1840 +4346:2:1847 +4347:2:1851 +4348:2:1852 +4349:2:1859 +4350:2:1860 +4351:2:1877 +4352:2:1878 +4353:2:1881 +4354:2:1882 +4355:0:2227 +4356:2:1894 +4357:0:2227 +4358:2:1895 +4359:2:1899 +4360:2:1900 +4361:2:1907 +4362:2:1911 +4363:2:1912 +4364:2:1919 +4365:2:1923 +4366:2:1924 +4367:2:1931 +4368:2:1932 +4369:2:1949 +4370:2:1950 +4371:2:1953 +4372:2:1954 +4373:0:2227 +4374:2:1821 +4375:0:2227 +4376:2:1822 +4377:0:2227 +4378:1:76 +4379:1:80 +4380:1:81 +4381:1:88 +4382:1:92 +4383:1:93 +4384:1:100 +4385:1:104 +4386:1:105 +4387:1:112 +4388:1:113 +4389:1:123 +4390:1:124 +4391:1:134 +4392:1:135 +4393:0:2227 +4394:1:147 +4395:0:2227 +4396:2:1823 +4397:2:1827 +4398:2:1828 +4399:2:1835 +4400:2:1839 +4401:2:1840 +4402:2:1847 +4403:2:1851 +4404:2:1852 +4405:2:1859 +4406:2:1860 +4407:2:1877 +4408:2:1878 +4409:2:1881 +4410:2:1882 +4411:0:2227 +4412:2:1894 +4413:0:2227 +4414:2:1895 +4415:2:1899 +4416:2:1900 +4417:2:1907 +4418:2:1911 +4419:2:1912 +4420:2:1919 +4421:2:1923 +4422:2:1924 +4423:2:1931 +4424:2:1932 +4425:2:1949 +4426:2:1950 +4427:2:1953 +4428:2:1954 +4429:0:2227 +4430:2:1821 +4431:0:2227 +4432:2:1822 +4433:0:2227 +4434:1:148 +4435:0:2227 +4436:2:1823 +4437:2:1827 +4438:2:1828 +4439:2:1835 +4440:2:1839 +4441:2:1840 +4442:2:1847 +4443:2:1851 +4444:2:1852 +4445:2:1859 +4446:2:1860 +4447:2:1877 +4448:2:1878 +4449:2:1881 +4450:2:1882 +4451:0:2227 +4452:2:1894 +4453:0:2227 +4454:2:1895 +4455:2:1899 +4456:2:1900 +4457:2:1907 +4458:2:1911 +4459:2:1912 +4460:2:1919 +4461:2:1923 +4462:2:1924 +4463:2:1931 +4464:2:1932 +4465:2:1949 +4466:2:1950 +4467:2:1953 +4468:2:1954 +4469:0:2227 +4470:2:1821 +4471:0:2227 +4472:2:1822 +4473:0:2227 +4474:1:149 +4475:1:153 +4476:1:154 +4477:1:161 +4478:1:165 +4479:1:166 +4480:1:173 +4481:1:177 +4482:1:178 +4483:1:185 +4484:1:186 +4485:1:196 +4486:1:197 +4487:1:207 +4488:1:208 +4489:0:2227 +4490:2:1823 +4491:2:1827 +4492:2:1828 +4493:2:1835 +4494:2:1839 +4495:2:1840 +4496:2:1847 +4497:2:1851 +4498:2:1852 +4499:2:1859 +4500:2:1860 +4501:2:1877 +4502:2:1878 +4503:2:1881 +4504:2:1882 +4505:0:2227 +4506:2:1894 +4507:0:2227 +4508:2:1895 +4509:2:1899 +4510:2:1900 +4511:2:1907 +4512:2:1911 +4513:2:1912 +4514:2:1919 +4515:2:1923 +4516:2:1924 +4517:2:1931 +4518:2:1932 +4519:2:1949 +4520:2:1950 +4521:2:1953 +4522:2:1954 +4523:0:2227 +4524:2:1821 +4525:0:2227 +4526:2:1822 +4527:0:2227 +4528:1:220 +4529:0:2227 +4530:1:373 +4531:0:2227 +4532:1:374 +4533:0:2227 +4534:1:3 +4535:0:2227 +4536:2:1823 +4537:2:1827 +4538:2:1828 +4539:2:1835 +4540:2:1839 +4541:2:1840 +4542:2:1847 +4543:2:1851 +4544:2:1852 +4545:2:1859 +4546:2:1860 +4547:2:1877 +4548:2:1878 +4549:2:1881 +4550:2:1882 +4551:0:2227 +4552:2:1894 +4553:0:2227 +4554:2:1895 +4555:2:1899 +4556:2:1900 +4557:2:1907 +4558:2:1911 +4559:2:1912 +4560:2:1919 +4561:2:1923 +4562:2:1924 +4563:2:1931 +4564:2:1932 +4565:2:1949 +4566:2:1950 +4567:2:1953 +4568:2:1954 +4569:0:2227 +4570:2:1821 +4571:0:2227 +4572:2:1822 +4573:0:2227 +4574:1:4 +4575:1:8 +4576:1:9 +4577:1:16 +4578:1:17 +4579:1:28 +4580:1:32 +4581:1:33 +4582:1:40 +4583:1:41 +4584:1:51 +4585:1:52 +4586:1:62 +4587:1:63 diff --git a/formal-model/urcu/result-signal-over-writer/urcu.sh b/formal-model/urcu/result-signal-over-writer/urcu.sh new file mode 100644 index 0000000..65ff517 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu.sh @@ -0,0 +1,29 @@ +#!/bin/sh +# +# Compiles and runs the urcu.spin Promela model. +# +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Copyright (C) IBM Corporation, 2009 +# Mathieu Desnoyers, 2009 +# +# Authors: Paul E. McKenney +# Mathieu Desnoyers + +# Basic execution, without LTL clauses. See Makefile. + +spin -a urcu.spin +cc -DSAFETY -o pan pan.c +./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu/result-signal-over-writer/urcu.spin b/formal-model/urcu/result-signal-over-writer/urcu.spin new file mode 100644 index 0000000..2cfcb70 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu.spin @@ -0,0 +1,705 @@ +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free.log b/formal-model/urcu/result-signal-over-writer/urcu_free.log new file mode 100644 index 0000000..9a22c47 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_free.log @@ -0,0 +1,345 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 741) + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 10669, errors: 0 + 20146 states, stored + 191615 states, matched + 211761 transitions (= stored+matched) + 712676 atomic steps +hash conflicts: 1523 (resolved) + +Stats on memory usage (in Megabytes): + 1.614 equivalent memory usage for states (stored*(State-vector + overhead)) + 1.661 actual memory usage for states (unsuccessful compression: 102.92%) + state-vector as stored = 58 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 467.326 total actual memory usage + +unreached in proctype urcu_reader_sig + line 401, "pan.___", state 330, "(1)" + line 612, "pan.___", state 411, "-end-" + (2 of 411 states) +unreached in proctype urcu_writer + line 397, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 406, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 407, "pan.___", state 59, "(1)" + line 416, "pan.___", state 89, "(1)" + line 397, "pan.___", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 407, "pan.___", state 160, "(1)" + line 650, "pan.___", state 213, "(1)" + line 173, "pan.___", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 177, "pan.___", state 233, "(1)" + line 158, "pan.___", state 254, "(1)" + line 162, "pan.___", state 262, "(1)" + line 166, "pan.___", state 274, "(1)" + line 173, "pan.___", state 285, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 181, "pan.___", state 742, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 158, "pan.___", state 752, "(1)" + line 162, "pan.___", state 760, "(1)" + line 162, "pan.___", state 761, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 162, "pan.___", state 761, "else" + line 160, "pan.___", state 766, "((j<1))" + line 160, "pan.___", state 766, "((j>=1))" + line 166, "pan.___", state 772, "(1)" + line 166, "pan.___", state 773, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 166, "pan.___", state 773, "else" + line 168, "pan.___", state 776, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 168, "pan.___", state 776, "else" + line 173, "pan.___", state 783, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 181, "pan.___", state 805, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 166, "pan.___", state 835, "(1)" + line 166, "pan.___", state 836, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 173, "pan.___", state 850, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 173, "pan.___", state 852, "(1)" + line 177, "pan.___", state 859, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 177, "pan.___", state 861, "(1)" + line 177, "pan.___", state 862, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 177, "pan.___", state 862, "else" + line 175, "pan.___", state 867, "((j<1))" + line 175, "pan.___", state 867, "((j>=1))" + line 181, "pan.___", state 872, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 158, "pan.___", state 882, "(1)" + line 162, "pan.___", state 890, "(1)" + line 162, "pan.___", state 891, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 162, "pan.___", state 891, "else" + line 160, "pan.___", state 896, "((j<1))" + line 160, "pan.___", state 896, "((j>=1))" + line 166, "pan.___", state 902, "(1)" + line 166, "pan.___", state 903, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 166, "pan.___", state 903, "else" + line 168, "pan.___", state 906, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 168, "pan.___", state 906, "else" + line 200, "pan.___", state 908, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 200, "pan.___", state 908, "else" + line 219, "pan.___", state 909, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 219, "pan.___", state 909, "else" + line 354, "pan.___", state 915, "((sighand_exec==1))" + line 354, "pan.___", state 915, "else" + line 360, "pan.___", state 918, "sighand_exec = 1" + line 397, "pan.___", state 931, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 397, "pan.___", state 933, "(1)" + line 397, "pan.___", state 934, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 397, "pan.___", state 934, "else" + line 397, "pan.___", state 937, "(1)" + line 401, "pan.___", state 945, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 401, "pan.___", state 947, "(1)" + line 401, "pan.___", state 948, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 401, "pan.___", state 948, "else" + line 401, "pan.___", state 951, "(1)" + line 401, "pan.___", state 952, "(1)" + line 401, "pan.___", state 952, "(1)" + line 399, "pan.___", state 957, "((i<1))" + line 399, "pan.___", state 957, "((i>=1))" + line 406, "pan.___", state 963, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 407, "pan.___", state 976, "(1)" + line 407, "pan.___", state 977, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 407, "pan.___", state 977, "else" + line 407, "pan.___", state 980, "(1)" + line 407, "pan.___", state 981, "(1)" + line 407, "pan.___", state 981, "(1)" + line 411, "pan.___", state 989, "(1)" + line 411, "pan.___", state 990, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 411, "pan.___", state 990, "else" + line 411, "pan.___", state 993, "(1)" + line 411, "pan.___", state 994, "(1)" + line 411, "pan.___", state 994, "(1)" + line 409, "pan.___", state 999, "((i<1))" + line 409, "pan.___", state 999, "((i>=1))" + line 416, "pan.___", state 1006, "(1)" + line 416, "pan.___", state 1007, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 416, "pan.___", state 1007, "else" + line 416, "pan.___", state 1010, "(1)" + line 416, "pan.___", state 1011, "(1)" + line 416, "pan.___", state 1011, "(1)" + line 418, "pan.___", state 1014, "(1)" + line 418, "pan.___", state 1014, "(1)" + line 360, "pan.___", state 1023, "sighand_exec = 1" + line 401, "pan.___", state 1054, "(1)" + line 406, "pan.___", state 1070, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 416, "pan.___", state 1113, "(1)" + line 401, "pan.___", state 1151, "(1)" + line 406, "pan.___", state 1167, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 416, "pan.___", state 1210, "(1)" + line 397, "pan.___", state 1236, "(1)" + line 401, "pan.___", state 1250, "(1)" + line 406, "pan.___", state 1266, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 416, "pan.___", state 1309, "(1)" + line 401, "pan.___", state 1350, "(1)" + line 406, "pan.___", state 1366, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 416, "pan.___", state 1409, "(1)" + line 173, "pan.___", state 1430, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 173, "pan.___", state 1432, "(1)" + line 177, "pan.___", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 177, "pan.___", state 1441, "(1)" + line 177, "pan.___", state 1442, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 177, "pan.___", state 1442, "else" + line 175, "pan.___", state 1447, "((j<1))" + line 175, "pan.___", state 1447, "((j>=1))" + line 181, "pan.___", state 1452, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 158, "pan.___", state 1462, "(1)" + line 162, "pan.___", state 1470, "(1)" + line 162, "pan.___", state 1471, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 162, "pan.___", state 1471, "else" + line 160, "pan.___", state 1476, "((j<1))" + line 160, "pan.___", state 1476, "((j>=1))" + line 166, "pan.___", state 1482, "(1)" + line 166, "pan.___", state 1483, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 166, "pan.___", state 1483, "else" + line 168, "pan.___", state 1486, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 168, "pan.___", state 1486, "else" + line 173, "pan.___", state 1493, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 181, "pan.___", state 1515, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 166, "pan.___", state 1545, "(1)" + line 166, "pan.___", state 1546, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 173, "pan.___", state 1560, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 173, "pan.___", state 1562, "(1)" + line 177, "pan.___", state 1569, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 177, "pan.___", state 1571, "(1)" + line 177, "pan.___", state 1572, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 177, "pan.___", state 1572, "else" + line 175, "pan.___", state 1577, "((j<1))" + line 175, "pan.___", state 1577, "((j>=1))" + line 181, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 158, "pan.___", state 1592, "(1)" + line 162, "pan.___", state 1600, "(1)" + line 162, "pan.___", state 1601, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 162, "pan.___", state 1601, "else" + line 160, "pan.___", state 1606, "((j<1))" + line 160, "pan.___", state 1606, "((j>=1))" + line 166, "pan.___", state 1612, "(1)" + line 166, "pan.___", state 1613, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 166, "pan.___", state 1613, "else" + line 168, "pan.___", state 1616, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 168, "pan.___", state 1616, "else" + line 200, "pan.___", state 1618, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 200, "pan.___", state 1618, "else" + line 219, "pan.___", state 1619, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 219, "pan.___", state 1619, "else" + line 354, "pan.___", state 1625, "((sighand_exec==1))" + line 354, "pan.___", state 1625, "else" + line 360, "pan.___", state 1628, "sighand_exec = 1" + line 397, "pan.___", state 1641, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 397, "pan.___", state 1643, "(1)" + line 397, "pan.___", state 1644, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 397, "pan.___", state 1644, "else" + line 397, "pan.___", state 1647, "(1)" + line 401, "pan.___", state 1655, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 401, "pan.___", state 1657, "(1)" + line 401, "pan.___", state 1658, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 401, "pan.___", state 1658, "else" + line 401, "pan.___", state 1661, "(1)" + line 401, "pan.___", state 1662, "(1)" + line 401, "pan.___", state 1662, "(1)" + line 399, "pan.___", state 1667, "((i<1))" + line 399, "pan.___", state 1667, "((i>=1))" + line 406, "pan.___", state 1673, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 407, "pan.___", state 1686, "(1)" + line 407, "pan.___", state 1687, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 407, "pan.___", state 1687, "else" + line 407, "pan.___", state 1690, "(1)" + line 407, "pan.___", state 1691, "(1)" + line 407, "pan.___", state 1691, "(1)" + line 411, "pan.___", state 1699, "(1)" + line 411, "pan.___", state 1700, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 411, "pan.___", state 1700, "else" + line 411, "pan.___", state 1703, "(1)" + line 411, "pan.___", state 1704, "(1)" + line 411, "pan.___", state 1704, "(1)" + line 409, "pan.___", state 1709, "((i<1))" + line 409, "pan.___", state 1709, "((i>=1))" + line 416, "pan.___", state 1716, "(1)" + line 416, "pan.___", state 1717, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 416, "pan.___", state 1717, "else" + line 416, "pan.___", state 1720, "(1)" + line 416, "pan.___", state 1721, "(1)" + line 416, "pan.___", state 1721, "(1)" + line 418, "pan.___", state 1724, "(1)" + line 418, "pan.___", state 1724, "(1)" + line 360, "pan.___", state 1733, "sighand_exec = 1" + line 177, "pan.___", state 1758, "(1)" + line 181, "pan.___", state 1769, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 158, "pan.___", state 1779, "(1)" + line 162, "pan.___", state 1787, "(1)" + line 166, "pan.___", state 1799, "(1)" + line 173, "pan.___", state 1810, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< !read_free_race) diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free.spin.input b/formal-model/urcu/result-signal-over-writer/urcu_free.spin.input new file mode 100644 index 0000000..953115f --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_free.spin.input @@ -0,0 +1,721 @@ + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#define TEST_SIGNAL +//#define TEST_SIGNAL_ON_READ +#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 1 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free.spin.input.trail b/formal-model/urcu/result-signal-over-writer/urcu_free.spin.input.trail new file mode 100644 index 0000000..837f3d9 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_free.spin.input.trail @@ -0,0 +1,15043 @@ +-2:4:-2 +-4:-4:-4 +1:0:4365 +2:4:4317 +3:4:4320 +4:4:4320 +5:4:4320 +6:4:4323 +7:4:4331 +8:4:4331 +9:4:4331 +10:4:4334 +11:4:4340 +12:4:4344 +13:4:4344 +14:4:4344 +15:4:4347 +16:4:4340 +17:4:4344 +18:4:4344 +19:4:4344 +20:4:4347 +21:4:4355 +22:4:4359 +23:4:4360 +24:0:4365 +25:4:4362 +26:0:4365 +27:3:2331 +28:0:4365 +29:3:2337 +30:0:4365 +31:3:2338 +32:0:4365 +33:3:2339 +34:3:2343 +35:3:2344 +36:3:2352 +37:3:2353 +38:3:2357 +39:3:2358 +40:3:2352 +41:3:2353 +42:3:2357 +43:3:2358 +44:3:2366 +45:3:2371 +46:3:2375 +47:3:2376 +48:3:2383 +49:3:2384 +50:3:2395 +51:3:2396 +52:3:2397 +53:3:2395 +54:3:2396 +55:3:2397 +56:3:2408 +57:3:2413 +58:3:2414 +59:0:4365 +60:3:2426 +61:0:4365 +62:3:2427 +63:0:4365 +64:2:1162 +65:0:4365 +66:3:2428 +67:0:4365 +68:2:1168 +69:0:4365 +70:2:1169 +71:0:4365 +72:3:2427 +73:0:4365 +74:2:1170 +75:0:4365 +76:3:2428 +77:0:4365 +78:3:2429 +79:0:4365 +80:3:2435 +81:3:2436 +82:0:4365 +83:3:2440 +84:3:2444 +85:3:2445 +86:3:2453 +87:3:2454 +88:3:2458 +89:3:2459 +90:3:2453 +91:3:2454 +92:3:2458 +93:3:2459 +94:3:2467 +95:3:2472 +96:3:2473 +97:3:2484 +98:3:2485 +99:3:2496 +100:3:2497 +101:3:2498 +102:3:2496 +103:3:2497 +104:3:2498 +105:3:2509 +106:3:2514 +107:3:2515 +108:0:4365 +109:3:2527 +110:0:4365 +111:3:2528 +112:0:4365 +113:2:1173 +114:0:4365 +115:3:2529 +116:0:4365 +117:2:1179 +118:0:4365 +119:2:1180 +120:0:4365 +121:3:2528 +122:0:4365 +123:2:1181 +124:2:1185 +125:2:1186 +126:2:1194 +127:2:1195 +128:2:1199 +129:2:1200 +130:2:1194 +131:2:1195 +132:2:1199 +133:2:1200 +134:2:1208 +135:2:1213 +136:2:1217 +137:2:1218 +138:2:1225 +139:2:1226 +140:2:1237 +141:2:1238 +142:2:1239 +143:2:1237 +144:2:1238 +145:2:1239 +146:2:1250 +147:2:1255 +148:2:1256 +149:0:4365 +150:3:2529 +151:0:4365 +152:2:1268 +153:0:4365 +154:3:2528 +155:0:4365 +156:2:1270 +157:0:4365 +158:3:2529 +159:0:4365 +160:2:1271 +161:2:1275 +162:2:1276 +163:2:1284 +164:2:1285 +165:2:1289 +166:2:1290 +167:2:1284 +168:2:1285 +169:2:1289 +170:2:1290 +171:2:1298 +172:2:1303 +173:2:1307 +174:2:1308 +175:2:1315 +176:2:1316 +177:2:1327 +178:2:1328 +179:2:1329 +180:2:1327 +181:2:1328 +182:2:1329 +183:2:1340 +184:2:1345 +185:2:1346 +186:0:4365 +187:2:1358 +188:0:4365 +189:2:1360 +190:0:4365 +191:3:2528 +192:0:4365 +193:2:1361 +194:0:4365 +195:3:2529 +196:0:4365 +197:2:1362 +198:2:1366 +199:2:1367 +200:2:1375 +201:2:1376 +202:2:1380 +203:2:1381 +204:2:1375 +205:2:1376 +206:2:1380 +207:2:1381 +208:2:1389 +209:2:1394 +210:2:1398 +211:2:1399 +212:2:1406 +213:2:1407 +214:2:1418 +215:2:1419 +216:2:1420 +217:2:1418 +218:2:1419 +219:2:1420 +220:2:1431 +221:2:1436 +222:2:1437 +223:0:4365 +224:2:1449 +225:0:4365 +226:3:2528 +227:0:4365 +228:2:1451 +229:0:4365 +230:3:2529 +231:0:4365 +232:2:1652 +233:0:4365 +234:2:1653 +235:0:4365 +236:2:1657 +237:0:4365 +238:2:1180 +239:0:4365 +240:3:2528 +241:0:4365 +242:2:1181 +243:2:1185 +244:2:1186 +245:2:1194 +246:2:1195 +247:2:1199 +248:2:1200 +249:2:1194 +250:2:1195 +251:2:1196 +252:2:1208 +253:2:1213 +254:2:1217 +255:2:1218 +256:2:1225 +257:2:1226 +258:2:1237 +259:2:1238 +260:2:1239 +261:2:1237 +262:2:1238 +263:2:1239 +264:2:1250 +265:2:1255 +266:2:1256 +267:0:4365 +268:3:2529 +269:0:4365 +270:2:1268 +271:0:4365 +272:3:2528 +273:0:4365 +274:2:1270 +275:0:4365 +276:3:2529 +277:0:4365 +278:2:1271 +279:2:1275 +280:2:1276 +281:2:1284 +282:2:1285 +283:2:1289 +284:2:1290 +285:2:1284 +286:2:1285 +287:2:1289 +288:2:1290 +289:2:1298 +290:2:1303 +291:2:1307 +292:2:1308 +293:2:1315 +294:2:1316 +295:2:1327 +296:2:1328 +297:2:1329 +298:2:1327 +299:2:1328 +300:2:1329 +301:2:1340 +302:2:1345 +303:2:1346 +304:0:4365 +305:2:1358 +306:0:4365 +307:2:1454 +308:0:4365 +309:3:2528 +310:0:4365 +311:2:1455 +312:0:4365 +313:3:2529 +314:0:4365 +315:2:1652 +316:0:4365 +317:2:1653 +318:0:4365 +319:2:1657 +320:0:4365 +321:2:1660 +322:0:4365 +323:3:2528 +324:0:4365 +325:2:1665 +326:2:1669 +327:2:1670 +328:2:1678 +329:2:1679 +330:2:1683 +331:2:1684 +332:2:1678 +333:2:1679 +334:2:1680 +335:2:1692 +336:2:1697 +337:2:1701 +338:2:1702 +339:2:1709 +340:2:1710 +341:2:1721 +342:2:1722 +343:2:1723 +344:2:1721 +345:2:1722 +346:2:1723 +347:2:1734 +348:2:1739 +349:2:1740 +350:0:4365 +351:3:2529 +352:0:4365 +353:2:1752 +354:0:4365 +355:3:2528 +356:0:4365 +357:2:1754 +358:0:4365 +359:3:2529 +360:0:4365 +361:2:1755 +362:2:1759 +363:2:1760 +364:2:1768 +365:2:1769 +366:2:1773 +367:2:1774 +368:2:1768 +369:2:1769 +370:2:1773 +371:2:1774 +372:2:1782 +373:2:1787 +374:2:1791 +375:2:1792 +376:2:1799 +377:2:1800 +378:2:1811 +379:2:1812 +380:2:1813 +381:2:1811 +382:2:1812 +383:2:1813 +384:2:1824 +385:2:1829 +386:2:1830 +387:0:4365 +388:2:1842 +389:0:4365 +390:3:2528 +391:0:4365 +392:2:1844 +393:0:4365 +394:3:2529 +395:0:4365 +396:2:1845 +397:2:1849 +398:2:1850 +399:2:1858 +400:2:1859 +401:2:1863 +402:2:1864 +403:2:1858 +404:2:1859 +405:2:1863 +406:2:1864 +407:2:1872 +408:2:1877 +409:2:1881 +410:2:1882 +411:2:1889 +412:2:1890 +413:2:1901 +414:2:1902 +415:2:1903 +416:2:1901 +417:2:1902 +418:2:1903 +419:2:1914 +420:2:1919 +421:2:1920 +422:0:4365 +423:2:1932 +424:0:4365 +425:3:2528 +426:0:4365 +427:2:1934 +428:0:4365 +429:3:2529 +430:0:4365 +431:2:1935 +432:0:4365 +433:2:1936 +434:0:4365 +435:2:2129 +436:0:4365 +437:2:2130 +438:0:4365 +439:2:2134 +440:0:4365 +441:3:2528 +442:0:4365 +443:2:2136 +444:0:4365 +445:3:2529 +446:0:4365 +447:2:2137 +448:2:2141 +449:2:2142 +450:2:2150 +451:2:2151 +452:2:2155 +453:2:2156 +454:2:2150 +455:2:2151 +456:2:2155 +457:2:2156 +458:2:2164 +459:2:2169 +460:2:2173 +461:2:2174 +462:2:2181 +463:2:2182 +464:2:2193 +465:2:2194 +466:2:2195 +467:2:2193 +468:2:2194 +469:2:2195 +470:2:2206 +471:2:2211 +472:2:2212 +473:0:4365 +474:2:2224 +475:0:4365 +476:3:2528 +477:0:4365 +478:2:2226 +479:0:4365 +480:3:2529 +481:0:4365 +482:2:1936 +483:0:4365 +484:2:2129 +485:0:4365 +486:2:2130 +487:0:4365 +488:2:2134 +489:0:4365 +490:3:2528 +491:0:4365 +492:2:2136 +493:0:4365 +494:3:2529 +495:0:4365 +496:2:2137 +497:2:2141 +498:2:2142 +499:2:2150 +500:2:2151 +501:2:2155 +502:2:2156 +503:2:2150 +504:2:2151 +505:2:2152 +506:2:2164 +507:2:2169 +508:2:2173 +509:2:2174 +510:2:2181 +511:2:2182 +512:2:2193 +513:2:2194 +514:2:2195 +515:2:2193 +516:2:2194 +517:2:2195 +518:2:2206 +519:2:2211 +520:2:2212 +521:0:4365 +522:2:2224 +523:0:4365 +524:3:2528 +525:0:4365 +526:2:2226 +527:0:4365 +528:3:2529 +529:0:4365 +530:2:2230 +531:0:4365 +532:3:2528 +533:0:4365 +534:2:2235 +535:2:2239 +536:2:2240 +537:2:2248 +538:2:2249 +539:2:2253 +540:2:2254 +541:2:2248 +542:2:2249 +543:2:2250 +544:2:2262 +545:2:2267 +546:2:2271 +547:2:2272 +548:2:2279 +549:2:2280 +550:2:2291 +551:2:2292 +552:2:2293 +553:2:2291 +554:2:2292 +555:2:2293 +556:2:2304 +557:2:2309 +558:2:2310 +559:0:4365 +560:3:2529 +561:0:4365 +562:2:2322 +563:0:4365 +564:2:1169 +565:0:4365 +566:3:2528 +567:0:4365 +568:2:1170 +569:0:4365 +570:3:2529 +571:0:4365 +572:3:2530 +573:0:4365 +574:3:2536 +575:0:4365 +576:3:2537 +577:0:4365 +578:3:2547 +579:0:4365 +580:3:2548 +581:0:4365 +582:3:2552 +583:3:2553 +584:3:2557 +585:3:2561 +586:3:2562 +587:3:2557 +588:3:2561 +589:3:2562 +590:3:2566 +591:3:2574 +592:3:2575 +593:3:2580 +594:3:2587 +595:3:2588 +596:3:2587 +597:3:2588 +598:3:2595 +599:3:2600 +600:0:4365 +601:3:2611 +602:0:4365 +603:3:2615 +604:3:2616 +605:3:2620 +606:3:2624 +607:3:2625 +608:3:2620 +609:3:2624 +610:3:2625 +611:3:2629 +612:3:2637 +613:3:2638 +614:3:2643 +615:3:2650 +616:3:2651 +617:3:2650 +618:3:2651 +619:3:2658 +620:3:2663 +621:0:4365 +622:3:2611 +623:0:4365 +624:3:2615 +625:3:2616 +626:3:2620 +627:3:2624 +628:3:2625 +629:3:2620 +630:3:2624 +631:3:2625 +632:3:2629 +633:3:2637 +634:3:2638 +635:3:2643 +636:3:2650 +637:3:2651 +638:3:2650 +639:3:2651 +640:3:2658 +641:3:2663 +642:0:4365 +643:3:2674 +644:0:4365 +645:3:2682 +646:3:2683 +647:3:2687 +648:3:2691 +649:3:2692 +650:3:2687 +651:3:2691 +652:3:2692 +653:3:2696 +654:3:2704 +655:3:2705 +656:3:2710 +657:3:2717 +658:3:2718 +659:3:2717 +660:3:2718 +661:3:2725 +662:3:2730 +663:0:4365 +664:3:2745 +665:0:4365 +666:3:2746 +667:0:4365 +668:2:1173 +669:0:4365 +670:3:2747 +671:0:4365 +672:2:1179 +673:0:4365 +674:2:1180 +675:0:4365 +676:3:2746 +677:0:4365 +678:2:1181 +679:2:1185 +680:2:1186 +681:2:1194 +682:2:1195 +683:2:1199 +684:2:1200 +685:2:1194 +686:2:1195 +687:2:1199 +688:2:1200 +689:2:1208 +690:2:1213 +691:2:1217 +692:2:1218 +693:2:1225 +694:2:1226 +695:2:1237 +696:2:1238 +697:2:1239 +698:2:1237 +699:2:1238 +700:2:1239 +701:2:1250 +702:2:1255 +703:2:1256 +704:0:4365 +705:3:2747 +706:0:4365 +707:2:1268 +708:0:4365 +709:3:2746 +710:0:4365 +711:2:1270 +712:0:4365 +713:3:2747 +714:0:4365 +715:2:1271 +716:2:1275 +717:2:1276 +718:2:1284 +719:2:1285 +720:2:1289 +721:2:1290 +722:2:1284 +723:2:1285 +724:2:1289 +725:2:1290 +726:2:1298 +727:2:1303 +728:2:1307 +729:2:1308 +730:2:1315 +731:2:1316 +732:2:1327 +733:2:1328 +734:2:1329 +735:2:1327 +736:2:1328 +737:2:1329 +738:2:1340 +739:2:1345 +740:2:1346 +741:0:4365 +742:2:1358 +743:0:4365 +744:2:1360 +745:0:4365 +746:3:2746 +747:0:4365 +748:2:1361 +749:0:4365 +750:3:2747 +751:0:4365 +752:2:1362 +753:2:1366 +754:2:1367 +755:2:1375 +756:2:1376 +757:2:1380 +758:2:1381 +759:2:1375 +760:2:1376 +761:2:1380 +762:2:1381 +763:2:1389 +764:2:1394 +765:2:1398 +766:2:1399 +767:2:1406 +768:2:1407 +769:2:1418 +770:2:1419 +771:2:1420 +772:2:1418 +773:2:1419 +774:2:1420 +775:2:1431 +776:2:1436 +777:2:1437 +778:0:4365 +779:2:1449 +780:0:4365 +781:3:2746 +782:0:4365 +783:2:1451 +784:0:4365 +785:3:2747 +786:0:4365 +787:2:1652 +788:0:4365 +789:2:1653 +790:0:4365 +791:2:1657 +792:0:4365 +793:2:1180 +794:0:4365 +795:3:2746 +796:0:4365 +797:2:1181 +798:2:1185 +799:2:1186 +800:2:1194 +801:2:1195 +802:2:1199 +803:2:1200 +804:2:1194 +805:2:1195 +806:2:1196 +807:2:1208 +808:2:1213 +809:2:1217 +810:2:1218 +811:2:1225 +812:2:1226 +813:2:1237 +814:2:1238 +815:2:1239 +816:2:1237 +817:2:1238 +818:2:1239 +819:2:1250 +820:2:1255 +821:2:1256 +822:0:4365 +823:3:2747 +824:0:4365 +825:2:1268 +826:0:4365 +827:3:2746 +828:0:4365 +829:2:1270 +830:0:4365 +831:3:2747 +832:0:4365 +833:2:1271 +834:2:1275 +835:2:1276 +836:2:1284 +837:2:1285 +838:2:1289 +839:2:1290 +840:2:1284 +841:2:1285 +842:2:1289 +843:2:1290 +844:2:1298 +845:2:1303 +846:2:1307 +847:2:1308 +848:2:1315 +849:2:1316 +850:2:1327 +851:2:1328 +852:2:1329 +853:2:1327 +854:2:1328 +855:2:1329 +856:2:1340 +857:2:1345 +858:2:1346 +859:0:4365 +860:2:1358 +861:0:4365 +862:2:1454 +863:0:4365 +864:3:2746 +865:0:4365 +866:2:1455 +867:0:4365 +868:3:2747 +869:0:4365 +870:2:1652 +871:0:4365 +872:2:1653 +873:0:4365 +874:2:1657 +875:0:4365 +876:2:1660 +877:0:4365 +878:3:2746 +879:0:4365 +880:2:1665 +881:2:1669 +882:2:1670 +883:2:1678 +884:2:1679 +885:2:1683 +886:2:1684 +887:2:1678 +888:2:1679 +889:2:1680 +890:2:1692 +891:2:1697 +892:2:1701 +893:2:1702 +894:2:1709 +895:2:1710 +896:2:1721 +897:2:1722 +898:2:1723 +899:2:1721 +900:2:1722 +901:2:1723 +902:2:1734 +903:2:1739 +904:2:1740 +905:0:4365 +906:3:2747 +907:0:4365 +908:2:1752 +909:0:4365 +910:3:2746 +911:0:4365 +912:2:1754 +913:0:4365 +914:3:2747 +915:0:4365 +916:2:1755 +917:2:1759 +918:2:1760 +919:2:1768 +920:2:1769 +921:2:1773 +922:2:1774 +923:2:1768 +924:2:1769 +925:2:1773 +926:2:1774 +927:2:1782 +928:2:1787 +929:2:1791 +930:2:1792 +931:2:1799 +932:2:1800 +933:2:1811 +934:2:1812 +935:2:1813 +936:2:1811 +937:2:1812 +938:2:1813 +939:2:1824 +940:2:1829 +941:2:1830 +942:0:4365 +943:2:1842 +944:0:4365 +945:3:2746 +946:0:4365 +947:2:1844 +948:0:4365 +949:3:2747 +950:0:4365 +951:2:1845 +952:2:1849 +953:2:1850 +954:2:1858 +955:2:1859 +956:2:1863 +957:2:1864 +958:2:1858 +959:2:1859 +960:2:1863 +961:2:1864 +962:2:1872 +963:2:1877 +964:2:1881 +965:2:1882 +966:2:1889 +967:2:1890 +968:2:1901 +969:2:1902 +970:2:1903 +971:2:1901 +972:2:1902 +973:2:1903 +974:2:1914 +975:2:1919 +976:2:1920 +977:0:4365 +978:2:1932 +979:0:4365 +980:3:2746 +981:0:4365 +982:2:1934 +983:0:4365 +984:3:2747 +985:0:4365 +986:2:1935 +987:0:4365 +988:2:1936 +989:0:4365 +990:2:2129 +991:0:4365 +992:2:2130 +993:0:4365 +994:2:2134 +995:0:4365 +996:3:2746 +997:0:4365 +998:2:2136 +999:0:4365 +1000:3:2747 +1001:0:4365 +1002:2:2137 +1003:2:2141 +1004:2:2142 +1005:2:2150 +1006:2:2151 +1007:2:2155 +1008:2:2156 +1009:2:2150 +1010:2:2151 +1011:2:2155 +1012:2:2156 +1013:2:2164 +1014:2:2169 +1015:2:2173 +1016:2:2174 +1017:2:2181 +1018:2:2182 +1019:2:2193 +1020:2:2194 +1021:2:2195 +1022:2:2193 +1023:2:2194 +1024:2:2195 +1025:2:2206 +1026:2:2211 +1027:2:2212 +1028:0:4365 +1029:2:2224 +1030:0:4365 +1031:3:2746 +1032:0:4365 +1033:2:2226 +1034:0:4365 +1035:3:2747 +1036:0:4365 +1037:2:1936 +1038:0:4365 +1039:2:2129 +1040:0:4365 +1041:2:2130 +1042:0:4365 +1043:2:2134 +1044:0:4365 +1045:3:2746 +1046:0:4365 +1047:2:2136 +1048:0:4365 +1049:3:2747 +1050:0:4365 +1051:2:2137 +1052:2:2141 +1053:2:2142 +1054:2:2150 +1055:2:2151 +1056:2:2155 +1057:2:2156 +1058:2:2150 +1059:2:2151 +1060:2:2152 +1061:2:2164 +1062:2:2169 +1063:2:2173 +1064:2:2174 +1065:2:2181 +1066:2:2182 +1067:2:2193 +1068:2:2194 +1069:2:2195 +1070:2:2193 +1071:2:2194 +1072:2:2195 +1073:2:2206 +1074:2:2211 +1075:2:2212 +1076:0:4365 +1077:2:2224 +1078:0:4365 +1079:3:2746 +1080:0:4365 +1081:2:2226 +1082:0:4365 +1083:3:2747 +1084:0:4365 +1085:2:2230 +1086:0:4365 +1087:3:2746 +1088:0:4365 +1089:2:2235 +1090:2:2239 +1091:2:2240 +1092:2:2248 +1093:2:2249 +1094:2:2253 +1095:2:2254 +1096:2:2248 +1097:2:2249 +1098:2:2250 +1099:2:2262 +1100:2:2267 +1101:2:2271 +1102:2:2272 +1103:2:2279 +1104:2:2280 +1105:2:2291 +1106:2:2292 +1107:2:2293 +1108:2:2291 +1109:2:2292 +1110:2:2293 +1111:2:2304 +1112:2:2309 +1113:2:2310 +1114:0:4365 +1115:3:2747 +1116:0:4365 +1117:2:2322 +1118:0:4365 +1119:2:1169 +1120:0:4365 +1121:3:2746 +1122:0:4365 +1123:2:1170 +1124:0:4365 +1125:3:2747 +1126:0:4365 +1127:3:2748 +1128:0:4365 +1129:3:2754 +1130:0:4365 +1131:3:2755 +1132:3:2759 +1133:3:2760 +1134:3:2768 +1135:3:2769 +1136:3:2773 +1137:3:2774 +1138:3:2768 +1139:3:2769 +1140:3:2773 +1141:3:2774 +1142:3:2782 +1143:3:2787 +1144:3:2791 +1145:3:2792 +1146:3:2799 +1147:3:2800 +1148:3:2811 +1149:3:2812 +1150:3:2813 +1151:3:2811 +1152:3:2812 +1153:3:2813 +1154:3:2824 +1155:3:2829 +1156:3:2830 +1157:0:4365 +1158:3:2842 +1159:0:4365 +1160:3:2843 +1161:0:4365 +1162:2:1173 +1163:0:4365 +1164:3:2844 +1165:0:4365 +1166:2:1179 +1167:0:4365 +1168:2:1180 +1169:0:4365 +1170:3:2843 +1171:0:4365 +1172:2:1181 +1173:2:1185 +1174:2:1186 +1175:2:1194 +1176:2:1195 +1177:2:1199 +1178:2:1200 +1179:2:1194 +1180:2:1195 +1181:2:1199 +1182:2:1200 +1183:2:1208 +1184:2:1213 +1185:2:1217 +1186:2:1218 +1187:2:1225 +1188:2:1226 +1189:2:1237 +1190:2:1238 +1191:2:1239 +1192:2:1237 +1193:2:1238 +1194:2:1239 +1195:2:1250 +1196:2:1255 +1197:2:1256 +1198:0:4365 +1199:3:2844 +1200:0:4365 +1201:2:1268 +1202:0:4365 +1203:3:2843 +1204:0:4365 +1205:2:1270 +1206:0:4365 +1207:3:2844 +1208:0:4365 +1209:2:1271 +1210:2:1275 +1211:2:1276 +1212:2:1284 +1213:2:1285 +1214:2:1289 +1215:2:1290 +1216:2:1284 +1217:2:1285 +1218:2:1289 +1219:2:1290 +1220:2:1298 +1221:2:1303 +1222:2:1307 +1223:2:1308 +1224:2:1315 +1225:2:1316 +1226:2:1327 +1227:2:1328 +1228:2:1329 +1229:2:1327 +1230:2:1328 +1231:2:1329 +1232:2:1340 +1233:2:1345 +1234:2:1346 +1235:0:4365 +1236:2:1358 +1237:0:4365 +1238:2:1360 +1239:0:4365 +1240:3:2843 +1241:0:4365 +1242:2:1361 +1243:0:4365 +1244:3:2844 +1245:0:4365 +1246:2:1362 +1247:2:1366 +1248:2:1367 +1249:2:1375 +1250:2:1376 +1251:2:1380 +1252:2:1381 +1253:2:1375 +1254:2:1376 +1255:2:1380 +1256:2:1381 +1257:2:1389 +1258:2:1394 +1259:2:1398 +1260:2:1399 +1261:2:1406 +1262:2:1407 +1263:2:1418 +1264:2:1419 +1265:2:1420 +1266:2:1418 +1267:2:1419 +1268:2:1420 +1269:2:1431 +1270:2:1436 +1271:2:1437 +1272:0:4365 +1273:2:1449 +1274:0:4365 +1275:3:2843 +1276:0:4365 +1277:2:1451 +1278:0:4365 +1279:3:2844 +1280:0:4365 +1281:2:1652 +1282:0:4365 +1283:2:1653 +1284:0:4365 +1285:2:1657 +1286:0:4365 +1287:2:1180 +1288:0:4365 +1289:3:2843 +1290:0:4365 +1291:2:1181 +1292:2:1185 +1293:2:1186 +1294:2:1194 +1295:2:1195 +1296:2:1199 +1297:2:1200 +1298:2:1194 +1299:2:1195 +1300:2:1196 +1301:2:1208 +1302:2:1213 +1303:2:1217 +1304:2:1218 +1305:2:1225 +1306:2:1226 +1307:2:1237 +1308:2:1238 +1309:2:1239 +1310:2:1237 +1311:2:1238 +1312:2:1239 +1313:2:1250 +1314:2:1255 +1315:2:1256 +1316:0:4365 +1317:3:2844 +1318:0:4365 +1319:2:1268 +1320:0:4365 +1321:3:2843 +1322:0:4365 +1323:2:1270 +1324:0:4365 +1325:3:2844 +1326:0:4365 +1327:2:1271 +1328:2:1275 +1329:2:1276 +1330:2:1284 +1331:2:1285 +1332:2:1289 +1333:2:1290 +1334:2:1284 +1335:2:1285 +1336:2:1289 +1337:2:1290 +1338:2:1298 +1339:2:1303 +1340:2:1307 +1341:2:1308 +1342:2:1315 +1343:2:1316 +1344:2:1327 +1345:2:1328 +1346:2:1329 +1347:2:1327 +1348:2:1328 +1349:2:1329 +1350:2:1340 +1351:2:1345 +1352:2:1346 +1353:0:4365 +1354:2:1358 +1355:0:4365 +1356:2:1454 +1357:0:4365 +1358:3:2843 +1359:0:4365 +1360:2:1455 +1361:0:4365 +1362:3:2844 +1363:0:4365 +1364:2:1652 +1365:0:4365 +1366:2:1653 +1367:0:4365 +1368:2:1657 +1369:0:4365 +1370:2:1660 +1371:0:4365 +1372:3:2843 +1373:0:4365 +1374:2:1665 +1375:2:1669 +1376:2:1670 +1377:2:1678 +1378:2:1679 +1379:2:1683 +1380:2:1684 +1381:2:1678 +1382:2:1679 +1383:2:1680 +1384:2:1692 +1385:2:1697 +1386:2:1701 +1387:2:1702 +1388:2:1709 +1389:2:1710 +1390:2:1721 +1391:2:1722 +1392:2:1723 +1393:2:1721 +1394:2:1722 +1395:2:1723 +1396:2:1734 +1397:2:1739 +1398:2:1740 +1399:0:4365 +1400:3:2844 +1401:0:4365 +1402:2:1752 +1403:0:4365 +1404:3:2843 +1405:0:4365 +1406:2:1754 +1407:0:4365 +1408:3:2844 +1409:0:4365 +1410:2:1755 +1411:2:1759 +1412:2:1760 +1413:2:1768 +1414:2:1769 +1415:2:1773 +1416:2:1774 +1417:2:1768 +1418:2:1769 +1419:2:1773 +1420:2:1774 +1421:2:1782 +1422:2:1787 +1423:2:1791 +1424:2:1792 +1425:2:1799 +1426:2:1800 +1427:2:1811 +1428:2:1812 +1429:2:1813 +1430:2:1811 +1431:2:1812 +1432:2:1813 +1433:2:1824 +1434:2:1829 +1435:2:1830 +1436:0:4365 +1437:2:1842 +1438:0:4365 +1439:3:2843 +1440:0:4365 +1441:2:1844 +1442:0:4365 +1443:3:2844 +1444:0:4365 +1445:2:1845 +1446:2:1849 +1447:2:1850 +1448:2:1858 +1449:2:1859 +1450:2:1863 +1451:2:1864 +1452:2:1858 +1453:2:1859 +1454:2:1863 +1455:2:1864 +1456:2:1872 +1457:2:1877 +1458:2:1881 +1459:2:1882 +1460:2:1889 +1461:2:1890 +1462:2:1901 +1463:2:1902 +1464:2:1903 +1465:2:1901 +1466:2:1902 +1467:2:1903 +1468:2:1914 +1469:2:1919 +1470:2:1920 +1471:0:4365 +1472:2:1932 +1473:0:4365 +1474:3:2843 +1475:0:4365 +1476:2:1934 +1477:0:4365 +1478:3:2844 +1479:0:4365 +1480:2:1935 +1481:0:4365 +1482:2:1936 +1483:0:4365 +1484:2:2129 +1485:0:4365 +1486:2:2130 +1487:0:4365 +1488:2:2134 +1489:0:4365 +1490:3:2843 +1491:0:4365 +1492:2:2136 +1493:0:4365 +1494:3:2844 +1495:0:4365 +1496:2:2137 +1497:2:2141 +1498:2:2142 +1499:2:2150 +1500:2:2151 +1501:2:2155 +1502:2:2156 +1503:2:2150 +1504:2:2151 +1505:2:2155 +1506:2:2156 +1507:2:2164 +1508:2:2169 +1509:2:2173 +1510:2:2174 +1511:2:2181 +1512:2:2182 +1513:2:2193 +1514:2:2194 +1515:2:2195 +1516:2:2193 +1517:2:2194 +1518:2:2195 +1519:2:2206 +1520:2:2211 +1521:2:2212 +1522:0:4365 +1523:2:2224 +1524:0:4365 +1525:3:2843 +1526:0:4365 +1527:2:2226 +1528:0:4365 +1529:3:2844 +1530:0:4365 +1531:2:1936 +1532:0:4365 +1533:2:2129 +1534:0:4365 +1535:2:2130 +1536:0:4365 +1537:2:2134 +1538:0:4365 +1539:3:2843 +1540:0:4365 +1541:2:2136 +1542:0:4365 +1543:3:2844 +1544:0:4365 +1545:2:2137 +1546:2:2141 +1547:2:2142 +1548:2:2150 +1549:2:2151 +1550:2:2155 +1551:2:2156 +1552:2:2150 +1553:2:2151 +1554:2:2152 +1555:2:2164 +1556:2:2169 +1557:2:2173 +1558:2:2174 +1559:2:2181 +1560:2:2182 +1561:2:2193 +1562:2:2194 +1563:2:2195 +1564:2:2193 +1565:2:2194 +1566:2:2195 +1567:2:2206 +1568:2:2211 +1569:2:2212 +1570:0:4365 +1571:2:2224 +1572:0:4365 +1573:3:2843 +1574:0:4365 +1575:2:2226 +1576:0:4365 +1577:3:2844 +1578:0:4365 +1579:2:2230 +1580:0:4365 +1581:3:2843 +1582:0:4365 +1583:2:2235 +1584:2:2239 +1585:2:2240 +1586:2:2248 +1587:2:2249 +1588:2:2253 +1589:2:2254 +1590:2:2248 +1591:2:2249 +1592:2:2250 +1593:2:2262 +1594:2:2267 +1595:2:2271 +1596:2:2272 +1597:2:2279 +1598:2:2280 +1599:2:2291 +1600:2:2292 +1601:2:2293 +1602:2:2291 +1603:2:2292 +1604:2:2293 +1605:2:2304 +1606:2:2309 +1607:2:2310 +1608:0:4365 +1609:3:2844 +1610:0:4365 +1611:2:2322 +1612:0:4365 +1613:2:1169 +1614:0:4365 +1615:3:2843 +1616:0:4365 +1617:2:1170 +1618:0:4365 +1619:3:2844 +1620:0:4365 +1621:3:2845 +1622:0:4365 +1623:3:2851 +1624:0:4365 +1625:3:2854 +1626:3:2855 +1627:3:2867 +1628:3:2868 +1629:3:2872 +1630:3:2873 +1631:3:2867 +1632:3:2868 +1633:3:2872 +1634:3:2873 +1635:3:2881 +1636:3:2886 +1637:3:2890 +1638:3:2891 +1639:3:2898 +1640:3:2899 +1641:3:2910 +1642:3:2911 +1643:3:2912 +1644:3:2910 +1645:3:2911 +1646:3:2912 +1647:3:2923 +1648:3:2928 +1649:3:2929 +1650:0:4365 +1651:3:2941 +1652:0:4365 +1653:3:2942 +1654:0:4365 +1655:2:1173 +1656:0:4365 +1657:3:2943 +1658:0:4365 +1659:2:1179 +1660:0:4365 +1661:2:1180 +1662:0:4365 +1663:3:2942 +1664:0:4365 +1665:2:1181 +1666:2:1185 +1667:2:1186 +1668:2:1194 +1669:2:1195 +1670:2:1199 +1671:2:1200 +1672:2:1194 +1673:2:1195 +1674:2:1199 +1675:2:1200 +1676:2:1208 +1677:2:1213 +1678:2:1217 +1679:2:1218 +1680:2:1225 +1681:2:1226 +1682:2:1237 +1683:2:1238 +1684:2:1239 +1685:2:1237 +1686:2:1238 +1687:2:1239 +1688:2:1250 +1689:2:1255 +1690:2:1256 +1691:0:4365 +1692:3:2943 +1693:0:4365 +1694:2:1268 +1695:0:4365 +1696:3:2942 +1697:0:4365 +1698:2:1270 +1699:0:4365 +1700:3:2943 +1701:0:4365 +1702:2:1271 +1703:2:1275 +1704:2:1276 +1705:2:1284 +1706:2:1285 +1707:2:1289 +1708:2:1290 +1709:2:1284 +1710:2:1285 +1711:2:1289 +1712:2:1290 +1713:2:1298 +1714:2:1303 +1715:2:1307 +1716:2:1308 +1717:2:1315 +1718:2:1316 +1719:2:1327 +1720:2:1328 +1721:2:1329 +1722:2:1327 +1723:2:1328 +1724:2:1329 +1725:2:1340 +1726:2:1345 +1727:2:1346 +1728:0:4365 +1729:2:1358 +1730:0:4365 +1731:2:1360 +1732:0:4365 +1733:3:2942 +1734:0:4365 +1735:2:1361 +1736:0:4365 +1737:3:2943 +1738:0:4365 +1739:2:1362 +1740:2:1366 +1741:2:1367 +1742:2:1375 +1743:2:1376 +1744:2:1380 +1745:2:1381 +1746:2:1375 +1747:2:1376 +1748:2:1380 +1749:2:1381 +1750:2:1389 +1751:2:1394 +1752:2:1398 +1753:2:1399 +1754:2:1406 +1755:2:1407 +1756:2:1418 +1757:2:1419 +1758:2:1420 +1759:2:1418 +1760:2:1419 +1761:2:1420 +1762:2:1431 +1763:2:1436 +1764:2:1437 +1765:0:4365 +1766:2:1449 +1767:0:4365 +1768:3:2942 +1769:0:4365 +1770:2:1451 +1771:0:4365 +1772:3:2943 +1773:0:4365 +1774:2:1652 +1775:0:4365 +1776:2:1653 +1777:0:4365 +1778:2:1657 +1779:0:4365 +1780:2:1180 +1781:0:4365 +1782:3:2942 +1783:0:4365 +1784:2:1181 +1785:2:1185 +1786:2:1186 +1787:2:1194 +1788:2:1195 +1789:2:1199 +1790:2:1200 +1791:2:1194 +1792:2:1195 +1793:2:1196 +1794:2:1208 +1795:2:1213 +1796:2:1217 +1797:2:1218 +1798:2:1225 +1799:2:1226 +1800:2:1237 +1801:2:1238 +1802:2:1239 +1803:2:1237 +1804:2:1238 +1805:2:1239 +1806:2:1250 +1807:2:1255 +1808:2:1256 +1809:0:4365 +1810:3:2943 +1811:0:4365 +1812:2:1268 +1813:0:4365 +1814:3:2942 +1815:0:4365 +1816:2:1270 +1817:0:4365 +1818:3:2943 +1819:0:4365 +1820:2:1271 +1821:2:1275 +1822:2:1276 +1823:2:1284 +1824:2:1285 +1825:2:1289 +1826:2:1290 +1827:2:1284 +1828:2:1285 +1829:2:1289 +1830:2:1290 +1831:2:1298 +1832:2:1303 +1833:2:1307 +1834:2:1308 +1835:2:1315 +1836:2:1316 +1837:2:1327 +1838:2:1328 +1839:2:1329 +1840:2:1327 +1841:2:1328 +1842:2:1329 +1843:2:1340 +1844:2:1345 +1845:2:1346 +1846:0:4365 +1847:2:1358 +1848:0:4365 +1849:2:1454 +1850:0:4365 +1851:3:2942 +1852:0:4365 +1853:2:1455 +1854:0:4365 +1855:3:2943 +1856:0:4365 +1857:2:1652 +1858:0:4365 +1859:2:1653 +1860:0:4365 +1861:2:1657 +1862:0:4365 +1863:2:1660 +1864:0:4365 +1865:3:2942 +1866:0:4365 +1867:2:1665 +1868:2:1669 +1869:2:1670 +1870:2:1678 +1871:2:1679 +1872:2:1683 +1873:2:1684 +1874:2:1678 +1875:2:1679 +1876:2:1680 +1877:2:1692 +1878:2:1697 +1879:2:1701 +1880:2:1702 +1881:2:1709 +1882:2:1710 +1883:2:1721 +1884:2:1722 +1885:2:1723 +1886:2:1721 +1887:2:1722 +1888:2:1723 +1889:2:1734 +1890:2:1739 +1891:2:1740 +1892:0:4365 +1893:3:2943 +1894:0:4365 +1895:2:1752 +1896:0:4365 +1897:3:2942 +1898:0:4365 +1899:2:1754 +1900:0:4365 +1901:3:2943 +1902:0:4365 +1903:2:1755 +1904:2:1759 +1905:2:1760 +1906:2:1768 +1907:2:1769 +1908:2:1773 +1909:2:1774 +1910:2:1768 +1911:2:1769 +1912:2:1773 +1913:2:1774 +1914:2:1782 +1915:2:1787 +1916:2:1791 +1917:2:1792 +1918:2:1799 +1919:2:1800 +1920:2:1811 +1921:2:1812 +1922:2:1813 +1923:2:1811 +1924:2:1812 +1925:2:1813 +1926:2:1824 +1927:2:1829 +1928:2:1830 +1929:0:4365 +1930:2:1842 +1931:0:4365 +1932:3:2942 +1933:0:4365 +1934:2:1844 +1935:0:4365 +1936:3:2943 +1937:0:4365 +1938:2:1845 +1939:2:1849 +1940:2:1850 +1941:2:1858 +1942:2:1859 +1943:2:1863 +1944:2:1864 +1945:2:1858 +1946:2:1859 +1947:2:1863 +1948:2:1864 +1949:2:1872 +1950:2:1877 +1951:2:1881 +1952:2:1882 +1953:2:1889 +1954:2:1890 +1955:2:1901 +1956:2:1902 +1957:2:1903 +1958:2:1901 +1959:2:1902 +1960:2:1903 +1961:2:1914 +1962:2:1919 +1963:2:1920 +1964:0:4365 +1965:2:1932 +1966:0:4365 +1967:3:2942 +1968:0:4365 +1969:2:1934 +1970:0:4365 +1971:3:2943 +1972:0:4365 +1973:2:1935 +1974:0:4365 +1975:2:1936 +1976:0:4365 +1977:2:2129 +1978:0:4365 +1979:2:2130 +1980:0:4365 +1981:2:2134 +1982:0:4365 +1983:3:2942 +1984:0:4365 +1985:2:2136 +1986:0:4365 +1987:3:2943 +1988:0:4365 +1989:2:2137 +1990:2:2141 +1991:2:2142 +1992:2:2150 +1993:2:2151 +1994:2:2155 +1995:2:2156 +1996:2:2150 +1997:2:2151 +1998:2:2155 +1999:2:2156 +2000:2:2164 +2001:2:2169 +2002:2:2173 +2003:2:2174 +2004:2:2181 +2005:2:2182 +2006:2:2193 +2007:2:2194 +2008:2:2195 +2009:2:2193 +2010:2:2194 +2011:2:2195 +2012:2:2206 +2013:2:2211 +2014:2:2212 +2015:0:4365 +2016:2:2224 +2017:0:4365 +2018:3:2942 +2019:0:4365 +2020:2:2226 +2021:0:4365 +2022:3:2943 +2023:0:4365 +2024:2:1936 +2025:0:4365 +2026:2:2129 +2027:0:4365 +2028:2:2130 +2029:0:4365 +2030:2:2134 +2031:0:4365 +2032:3:2942 +2033:0:4365 +2034:2:2136 +2035:0:4365 +2036:3:2943 +2037:0:4365 +2038:2:2137 +2039:2:2141 +2040:2:2142 +2041:2:2150 +2042:2:2151 +2043:2:2155 +2044:2:2156 +2045:2:2150 +2046:2:2151 +2047:2:2152 +2048:2:2164 +2049:2:2169 +2050:2:2173 +2051:2:2174 +2052:2:2181 +2053:2:2182 +2054:2:2193 +2055:2:2194 +2056:2:2195 +2057:2:2193 +2058:2:2194 +2059:2:2195 +2060:2:2206 +2061:2:2211 +2062:2:2212 +2063:0:4365 +2064:2:2224 +2065:0:4365 +2066:3:2942 +2067:0:4365 +2068:2:2226 +2069:0:4365 +2070:3:2943 +2071:0:4365 +2072:2:2230 +2073:0:4365 +2074:3:2942 +2075:0:4365 +2076:2:2235 +2077:2:2239 +2078:2:2240 +2079:2:2248 +2080:2:2249 +2081:2:2253 +2082:2:2254 +2083:2:2248 +2084:2:2249 +2085:2:2250 +2086:2:2262 +2087:2:2267 +2088:2:2271 +2089:2:2272 +2090:2:2279 +2091:2:2280 +2092:2:2291 +2093:2:2292 +2094:2:2293 +2095:2:2291 +2096:2:2292 +2097:2:2293 +2098:2:2304 +2099:2:2309 +2100:2:2310 +2101:0:4365 +2102:3:2943 +2103:0:4365 +2104:2:2322 +2105:0:4365 +2106:2:1169 +2107:0:4365 +2108:3:2942 +2109:0:4365 +2110:2:1170 +2111:0:4365 +2112:3:2943 +2113:0:4365 +2114:3:2944 +2115:0:4365 +2116:3:2950 +2117:0:4365 +2118:3:2951 +2119:0:4365 +2120:3:2952 +2121:0:4365 +2122:3:2953 +2123:0:4365 +2124:3:2954 +2125:3:2958 +2126:3:2959 +2127:3:2967 +2128:3:2968 +2129:3:2972 +2130:3:2973 +2131:3:2967 +2132:3:2968 +2133:3:2972 +2134:3:2973 +2135:3:2981 +2136:3:2986 +2137:3:2990 +2138:3:2991 +2139:3:2998 +2140:3:2999 +2141:3:3010 +2142:3:3011 +2143:3:3012 +2144:3:3010 +2145:3:3011 +2146:3:3012 +2147:3:3023 +2148:3:3028 +2149:3:3029 +2150:0:4365 +2151:3:3041 +2152:0:4365 +2153:3:3042 +2154:0:4365 +2155:2:1173 +2156:0:4365 +2157:3:3043 +2158:0:4365 +2159:2:1179 +2160:0:4365 +2161:2:1180 +2162:0:4365 +2163:3:3042 +2164:0:4365 +2165:2:1181 +2166:2:1185 +2167:2:1186 +2168:2:1194 +2169:2:1195 +2170:2:1199 +2171:2:1200 +2172:2:1194 +2173:2:1195 +2174:2:1199 +2175:2:1200 +2176:2:1208 +2177:2:1213 +2178:2:1217 +2179:2:1218 +2180:2:1225 +2181:2:1226 +2182:2:1237 +2183:2:1238 +2184:2:1239 +2185:2:1237 +2186:2:1238 +2187:2:1239 +2188:2:1250 +2189:2:1255 +2190:2:1256 +2191:0:4365 +2192:3:3043 +2193:0:4365 +2194:2:1268 +2195:0:4365 +2196:3:3042 +2197:0:4365 +2198:2:1270 +2199:0:4365 +2200:3:3043 +2201:0:4365 +2202:2:1271 +2203:2:1275 +2204:2:1276 +2205:2:1284 +2206:2:1285 +2207:2:1289 +2208:2:1290 +2209:2:1284 +2210:2:1285 +2211:2:1289 +2212:2:1290 +2213:2:1298 +2214:2:1303 +2215:2:1307 +2216:2:1308 +2217:2:1315 +2218:2:1316 +2219:2:1327 +2220:2:1328 +2221:2:1329 +2222:2:1327 +2223:2:1328 +2224:2:1329 +2225:2:1340 +2226:2:1345 +2227:2:1346 +2228:0:4365 +2229:2:1358 +2230:0:4365 +2231:2:1360 +2232:0:4365 +2233:3:3042 +2234:0:4365 +2235:2:1361 +2236:0:4365 +2237:3:3043 +2238:0:4365 +2239:2:1362 +2240:2:1366 +2241:2:1367 +2242:2:1375 +2243:2:1376 +2244:2:1380 +2245:2:1381 +2246:2:1375 +2247:2:1376 +2248:2:1380 +2249:2:1381 +2250:2:1389 +2251:2:1394 +2252:2:1398 +2253:2:1399 +2254:2:1406 +2255:2:1407 +2256:2:1418 +2257:2:1419 +2258:2:1420 +2259:2:1418 +2260:2:1419 +2261:2:1420 +2262:2:1431 +2263:2:1436 +2264:2:1437 +2265:0:4365 +2266:2:1449 +2267:0:4365 +2268:3:3042 +2269:0:4365 +2270:2:1451 +2271:0:4365 +2272:3:3043 +2273:0:4365 +2274:2:1652 +2275:0:4365 +2276:2:1653 +2277:0:4365 +2278:2:1657 +2279:0:4365 +2280:2:1180 +2281:0:4365 +2282:3:3042 +2283:0:4365 +2284:2:1181 +2285:2:1185 +2286:2:1186 +2287:2:1194 +2288:2:1195 +2289:2:1199 +2290:2:1200 +2291:2:1194 +2292:2:1195 +2293:2:1196 +2294:2:1208 +2295:2:1213 +2296:2:1217 +2297:2:1218 +2298:2:1225 +2299:2:1226 +2300:2:1237 +2301:2:1238 +2302:2:1239 +2303:2:1237 +2304:2:1238 +2305:2:1239 +2306:2:1250 +2307:2:1255 +2308:2:1256 +2309:0:4365 +2310:3:3043 +2311:0:4365 +2312:2:1268 +2313:0:4365 +2314:3:3042 +2315:0:4365 +2316:2:1270 +2317:0:4365 +2318:3:3043 +2319:0:4365 +2320:2:1271 +2321:2:1275 +2322:2:1276 +2323:2:1284 +2324:2:1285 +2325:2:1289 +2326:2:1290 +2327:2:1284 +2328:2:1285 +2329:2:1289 +2330:2:1290 +2331:2:1298 +2332:2:1303 +2333:2:1307 +2334:2:1308 +2335:2:1315 +2336:2:1316 +2337:2:1327 +2338:2:1328 +2339:2:1329 +2340:2:1327 +2341:2:1328 +2342:2:1329 +2343:2:1340 +2344:2:1345 +2345:2:1346 +2346:0:4365 +2347:2:1358 +2348:0:4365 +2349:2:1454 +2350:0:4365 +2351:3:3042 +2352:0:4365 +2353:2:1455 +2354:0:4365 +2355:3:3043 +2356:0:4365 +2357:2:1652 +2358:0:4365 +2359:2:1653 +2360:0:4365 +2361:2:1657 +2362:0:4365 +2363:2:1660 +2364:0:4365 +2365:3:3042 +2366:0:4365 +2367:2:1665 +2368:2:1669 +2369:2:1670 +2370:2:1678 +2371:2:1679 +2372:2:1683 +2373:2:1684 +2374:2:1678 +2375:2:1679 +2376:2:1680 +2377:2:1692 +2378:2:1697 +2379:2:1701 +2380:2:1702 +2381:2:1709 +2382:2:1710 +2383:2:1721 +2384:2:1722 +2385:2:1723 +2386:2:1721 +2387:2:1722 +2388:2:1723 +2389:2:1734 +2390:2:1739 +2391:2:1740 +2392:0:4365 +2393:3:3043 +2394:0:4365 +2395:2:1752 +2396:0:4365 +2397:3:3042 +2398:0:4365 +2399:2:1754 +2400:0:4365 +2401:3:3043 +2402:0:4365 +2403:2:1755 +2404:2:1759 +2405:2:1760 +2406:2:1768 +2407:2:1769 +2408:2:1773 +2409:2:1774 +2410:2:1768 +2411:2:1769 +2412:2:1773 +2413:2:1774 +2414:2:1782 +2415:2:1787 +2416:2:1791 +2417:2:1792 +2418:2:1799 +2419:2:1800 +2420:2:1811 +2421:2:1812 +2422:2:1813 +2423:2:1811 +2424:2:1812 +2425:2:1813 +2426:2:1824 +2427:2:1829 +2428:2:1830 +2429:0:4365 +2430:2:1842 +2431:0:4365 +2432:3:3042 +2433:0:4365 +2434:2:1844 +2435:0:4365 +2436:3:3043 +2437:0:4365 +2438:2:1845 +2439:2:1849 +2440:2:1850 +2441:2:1858 +2442:2:1859 +2443:2:1863 +2444:2:1864 +2445:2:1858 +2446:2:1859 +2447:2:1863 +2448:2:1864 +2449:2:1872 +2450:2:1877 +2451:2:1881 +2452:2:1882 +2453:2:1889 +2454:2:1890 +2455:2:1901 +2456:2:1902 +2457:2:1903 +2458:2:1901 +2459:2:1902 +2460:2:1903 +2461:2:1914 +2462:2:1919 +2463:2:1920 +2464:0:4365 +2465:2:1932 +2466:0:4365 +2467:3:3042 +2468:0:4365 +2469:2:1934 +2470:0:4365 +2471:3:3043 +2472:0:4365 +2473:2:1935 +2474:0:4365 +2475:2:1936 +2476:0:4365 +2477:2:2129 +2478:0:4365 +2479:2:2130 +2480:0:4365 +2481:2:2134 +2482:0:4365 +2483:3:3042 +2484:0:4365 +2485:2:2136 +2486:0:4365 +2487:3:3043 +2488:0:4365 +2489:2:2137 +2490:2:2141 +2491:2:2142 +2492:2:2150 +2493:2:2151 +2494:2:2155 +2495:2:2156 +2496:2:2150 +2497:2:2151 +2498:2:2155 +2499:2:2156 +2500:2:2164 +2501:2:2169 +2502:2:2173 +2503:2:2174 +2504:2:2181 +2505:2:2182 +2506:2:2193 +2507:2:2194 +2508:2:2195 +2509:2:2193 +2510:2:2194 +2511:2:2195 +2512:2:2206 +2513:2:2211 +2514:2:2212 +2515:0:4365 +2516:2:2224 +2517:0:4365 +2518:3:3042 +2519:0:4365 +2520:2:2226 +2521:0:4365 +2522:3:3043 +2523:0:4365 +2524:2:1936 +2525:0:4365 +2526:2:2129 +2527:0:4365 +2528:2:2130 +2529:0:4365 +2530:2:2134 +2531:0:4365 +2532:3:3042 +2533:0:4365 +2534:2:2136 +2535:0:4365 +2536:3:3043 +2537:0:4365 +2538:2:2137 +2539:2:2141 +2540:2:2142 +2541:2:2150 +2542:2:2151 +2543:2:2155 +2544:2:2156 +2545:2:2150 +2546:2:2151 +2547:2:2152 +2548:2:2164 +2549:2:2169 +2550:2:2173 +2551:2:2174 +2552:2:2181 +2553:2:2182 +2554:2:2193 +2555:2:2194 +2556:2:2195 +2557:2:2193 +2558:2:2194 +2559:2:2195 +2560:2:2206 +2561:2:2211 +2562:2:2212 +2563:0:4365 +2564:2:2224 +2565:0:4365 +2566:3:3042 +2567:0:4365 +2568:2:2226 +2569:0:4365 +2570:3:3043 +2571:0:4365 +2572:2:2230 +2573:0:4365 +2574:3:3042 +2575:0:4365 +2576:2:2235 +2577:2:2239 +2578:2:2240 +2579:2:2248 +2580:2:2249 +2581:2:2253 +2582:2:2254 +2583:2:2248 +2584:2:2249 +2585:2:2250 +2586:2:2262 +2587:2:2267 +2588:2:2271 +2589:2:2272 +2590:2:2279 +2591:2:2280 +2592:2:2291 +2593:2:2292 +2594:2:2293 +2595:2:2291 +2596:2:2292 +2597:2:2293 +2598:2:2304 +2599:2:2309 +2600:2:2310 +2601:0:4365 +2602:3:3043 +2603:0:4365 +2604:2:2322 +2605:0:4365 +2606:2:1169 +2607:0:4365 +2608:3:3042 +2609:0:4365 +2610:2:1170 +2611:0:4365 +2612:3:3043 +2613:0:4365 +2614:3:3044 +2615:0:4365 +2616:3:3257 +2617:0:4365 +2618:3:3265 +2619:0:4365 +2620:3:3266 +2621:3:3270 +2622:3:3271 +2623:3:3279 +2624:3:3280 +2625:3:3284 +2626:3:3285 +2627:3:3279 +2628:3:3280 +2629:3:3284 +2630:3:3285 +2631:3:3293 +2632:3:3298 +2633:3:3302 +2634:3:3303 +2635:3:3310 +2636:3:3311 +2637:3:3322 +2638:3:3323 +2639:3:3324 +2640:3:3322 +2641:3:3323 +2642:3:3324 +2643:3:3335 +2644:3:3340 +2645:3:3341 +2646:0:4365 +2647:3:3353 +2648:0:4365 +2649:3:3354 +2650:0:4365 +2651:2:1173 +2652:0:4365 +2653:3:3355 +2654:0:4365 +2655:2:1179 +2656:0:4365 +2657:2:1180 +2658:0:4365 +2659:3:3354 +2660:0:4365 +2661:2:1181 +2662:2:1185 +2663:2:1186 +2664:2:1194 +2665:2:1195 +2666:2:1199 +2667:2:1200 +2668:2:1194 +2669:2:1195 +2670:2:1199 +2671:2:1200 +2672:2:1208 +2673:2:1213 +2674:2:1217 +2675:2:1218 +2676:2:1225 +2677:2:1226 +2678:2:1237 +2679:2:1238 +2680:2:1239 +2681:2:1237 +2682:2:1238 +2683:2:1239 +2684:2:1250 +2685:2:1255 +2686:2:1256 +2687:0:4365 +2688:3:3355 +2689:0:4365 +2690:2:1268 +2691:0:4365 +2692:3:3354 +2693:0:4365 +2694:2:1270 +2695:0:4365 +2696:3:3355 +2697:0:4365 +2698:2:1271 +2699:2:1275 +2700:2:1276 +2701:2:1284 +2702:2:1285 +2703:2:1289 +2704:2:1290 +2705:2:1284 +2706:2:1285 +2707:2:1289 +2708:2:1290 +2709:2:1298 +2710:2:1303 +2711:2:1307 +2712:2:1308 +2713:2:1315 +2714:2:1316 +2715:2:1327 +2716:2:1328 +2717:2:1329 +2718:2:1327 +2719:2:1328 +2720:2:1329 +2721:2:1340 +2722:2:1345 +2723:2:1346 +2724:0:4365 +2725:2:1358 +2726:0:4365 +2727:2:1360 +2728:0:4365 +2729:3:3354 +2730:0:4365 +2731:2:1361 +2732:0:4365 +2733:3:3355 +2734:0:4365 +2735:2:1362 +2736:2:1366 +2737:2:1367 +2738:2:1375 +2739:2:1376 +2740:2:1380 +2741:2:1381 +2742:2:1375 +2743:2:1376 +2744:2:1380 +2745:2:1381 +2746:2:1389 +2747:2:1394 +2748:2:1398 +2749:2:1399 +2750:2:1406 +2751:2:1407 +2752:2:1418 +2753:2:1419 +2754:2:1420 +2755:2:1418 +2756:2:1419 +2757:2:1420 +2758:2:1431 +2759:2:1436 +2760:2:1437 +2761:0:4365 +2762:2:1449 +2763:0:4365 +2764:3:3354 +2765:0:4365 +2766:2:1451 +2767:0:4365 +2768:3:3355 +2769:0:4365 +2770:2:1652 +2771:0:4365 +2772:2:1653 +2773:0:4365 +2774:2:1657 +2775:0:4365 +2776:2:1180 +2777:0:4365 +2778:3:3354 +2779:0:4365 +2780:2:1181 +2781:2:1185 +2782:2:1186 +2783:2:1194 +2784:2:1195 +2785:2:1199 +2786:2:1200 +2787:2:1194 +2788:2:1195 +2789:2:1196 +2790:2:1208 +2791:2:1213 +2792:2:1217 +2793:2:1218 +2794:2:1225 +2795:2:1226 +2796:2:1237 +2797:2:1238 +2798:2:1239 +2799:2:1237 +2800:2:1238 +2801:2:1239 +2802:2:1250 +2803:2:1255 +2804:2:1256 +2805:0:4365 +2806:3:3355 +2807:0:4365 +2808:2:1268 +2809:0:4365 +2810:3:3354 +2811:0:4365 +2812:2:1270 +2813:0:4365 +2814:3:3355 +2815:0:4365 +2816:2:1271 +2817:2:1275 +2818:2:1276 +2819:2:1284 +2820:2:1285 +2821:2:1289 +2822:2:1290 +2823:2:1284 +2824:2:1285 +2825:2:1289 +2826:2:1290 +2827:2:1298 +2828:2:1303 +2829:2:1307 +2830:2:1308 +2831:2:1315 +2832:2:1316 +2833:2:1327 +2834:2:1328 +2835:2:1329 +2836:2:1327 +2837:2:1328 +2838:2:1329 +2839:2:1340 +2840:2:1345 +2841:2:1346 +2842:0:4365 +2843:2:1358 +2844:0:4365 +2845:2:1454 +2846:0:4365 +2847:3:3354 +2848:0:4365 +2849:2:1455 +2850:0:4365 +2851:3:3355 +2852:0:4365 +2853:2:1652 +2854:0:4365 +2855:2:1653 +2856:0:4365 +2857:2:1657 +2858:0:4365 +2859:2:1660 +2860:0:4365 +2861:3:3354 +2862:0:4365 +2863:2:1665 +2864:2:1669 +2865:2:1670 +2866:2:1678 +2867:2:1679 +2868:2:1683 +2869:2:1684 +2870:2:1678 +2871:2:1679 +2872:2:1680 +2873:2:1692 +2874:2:1697 +2875:2:1701 +2876:2:1702 +2877:2:1709 +2878:2:1710 +2879:2:1721 +2880:2:1722 +2881:2:1723 +2882:2:1721 +2883:2:1722 +2884:2:1723 +2885:2:1734 +2886:2:1739 +2887:2:1740 +2888:0:4365 +2889:3:3355 +2890:0:4365 +2891:2:1752 +2892:0:4365 +2893:3:3354 +2894:0:4365 +2895:2:1754 +2896:0:4365 +2897:3:3355 +2898:0:4365 +2899:2:1755 +2900:2:1759 +2901:2:1760 +2902:2:1768 +2903:2:1769 +2904:2:1773 +2905:2:1774 +2906:2:1768 +2907:2:1769 +2908:2:1773 +2909:2:1774 +2910:2:1782 +2911:2:1787 +2912:2:1791 +2913:2:1792 +2914:2:1799 +2915:2:1800 +2916:2:1811 +2917:2:1812 +2918:2:1813 +2919:2:1811 +2920:2:1812 +2921:2:1813 +2922:2:1824 +2923:2:1829 +2924:2:1830 +2925:0:4365 +2926:2:1842 +2927:0:4365 +2928:3:3354 +2929:0:4365 +2930:2:1844 +2931:0:4365 +2932:3:3355 +2933:0:4365 +2934:2:1845 +2935:2:1849 +2936:2:1850 +2937:2:1858 +2938:2:1859 +2939:2:1863 +2940:2:1864 +2941:2:1858 +2942:2:1859 +2943:2:1863 +2944:2:1864 +2945:2:1872 +2946:2:1877 +2947:2:1881 +2948:2:1882 +2949:2:1889 +2950:2:1890 +2951:2:1901 +2952:2:1902 +2953:2:1903 +2954:2:1901 +2955:2:1902 +2956:2:1903 +2957:2:1914 +2958:2:1919 +2959:2:1920 +2960:0:4365 +2961:2:1932 +2962:0:4365 +2963:3:3354 +2964:0:4365 +2965:2:1934 +2966:0:4365 +2967:3:3355 +2968:0:4365 +2969:2:1935 +2970:0:4365 +2971:2:1936 +2972:0:4365 +2973:2:2129 +2974:0:4365 +2975:2:2130 +2976:0:4365 +2977:2:2134 +2978:0:4365 +2979:3:3354 +2980:0:4365 +2981:2:2136 +2982:0:4365 +2983:3:3355 +2984:0:4365 +2985:2:2137 +2986:2:2141 +2987:2:2142 +2988:2:2150 +2989:2:2151 +2990:2:2155 +2991:2:2156 +2992:2:2150 +2993:2:2151 +2994:2:2155 +2995:2:2156 +2996:2:2164 +2997:2:2169 +2998:2:2173 +2999:2:2174 +3000:2:2181 +3001:2:2182 +3002:2:2193 +3003:2:2194 +3004:2:2195 +3005:2:2193 +3006:2:2194 +3007:2:2195 +3008:2:2206 +3009:2:2211 +3010:2:2212 +3011:0:4365 +3012:2:2224 +3013:0:4365 +3014:3:3354 +3015:0:4365 +3016:2:2226 +3017:0:4365 +3018:3:3355 +3019:0:4365 +3020:2:1936 +3021:0:4365 +3022:2:2129 +3023:0:4365 +3024:2:2130 +3025:0:4365 +3026:2:2134 +3027:0:4365 +3028:3:3354 +3029:0:4365 +3030:2:2136 +3031:0:4365 +3032:3:3355 +3033:0:4365 +3034:2:2137 +3035:2:2141 +3036:2:2142 +3037:2:2150 +3038:2:2151 +3039:2:2155 +3040:2:2156 +3041:2:2150 +3042:2:2151 +3043:2:2152 +3044:2:2164 +3045:2:2169 +3046:2:2173 +3047:2:2174 +3048:2:2181 +3049:2:2182 +3050:2:2193 +3051:2:2194 +3052:2:2195 +3053:2:2193 +3054:2:2194 +3055:2:2195 +3056:2:2206 +3057:2:2211 +3058:2:2212 +3059:0:4365 +3060:2:2224 +3061:0:4365 +3062:3:3354 +3063:0:4365 +3064:2:2226 +3065:0:4365 +3066:3:3355 +3067:0:4365 +3068:2:2230 +3069:0:4365 +3070:3:3354 +3071:0:4365 +3072:2:2235 +3073:2:2239 +3074:2:2240 +3075:2:2248 +3076:2:2249 +3077:2:2253 +3078:2:2254 +3079:2:2248 +3080:2:2249 +3081:2:2250 +3082:2:2262 +3083:2:2267 +3084:2:2271 +3085:2:2272 +3086:2:2279 +3087:2:2280 +3088:2:2291 +3089:2:2292 +3090:2:2293 +3091:2:2291 +3092:2:2292 +3093:2:2293 +3094:2:2304 +3095:2:2309 +3096:2:2310 +3097:0:4365 +3098:3:3355 +3099:0:4365 +3100:2:2322 +3101:0:4365 +3102:2:1169 +3103:0:4365 +3104:3:3354 +3105:0:4365 +3106:2:1170 +3107:0:4365 +3108:3:3355 +3109:0:4365 +3110:3:3356 +3111:0:4365 +3112:3:3366 +3113:0:4365 +3114:3:2951 +3115:0:4365 +3116:3:2952 +3117:0:4365 +3118:3:2953 +3119:0:4365 +3120:3:2954 +3121:3:2958 +3122:3:2959 +3123:3:2967 +3124:3:2968 +3125:3:2972 +3126:3:2973 +3127:3:2967 +3128:3:2968 +3129:3:2972 +3130:3:2973 +3131:3:2981 +3132:3:2986 +3133:3:2990 +3134:3:2991 +3135:3:2998 +3136:3:2999 +3137:3:3010 +3138:3:3011 +3139:3:3012 +3140:3:3010 +3141:3:3011 +3142:3:3012 +3143:3:3023 +3144:3:3028 +3145:3:3029 +3146:0:4365 +3147:3:3041 +3148:0:4365 +3149:3:3042 +3150:0:4365 +3151:2:1173 +3152:0:4365 +3153:3:3043 +3154:0:4365 +3155:2:1179 +3156:0:4365 +3157:2:1180 +3158:0:4365 +3159:3:3042 +3160:0:4365 +3161:2:1181 +3162:2:1185 +3163:2:1186 +3164:2:1194 +3165:2:1195 +3166:2:1199 +3167:2:1200 +3168:2:1194 +3169:2:1195 +3170:2:1199 +3171:2:1200 +3172:2:1208 +3173:2:1213 +3174:2:1217 +3175:2:1218 +3176:2:1225 +3177:2:1226 +3178:2:1237 +3179:2:1238 +3180:2:1239 +3181:2:1237 +3182:2:1238 +3183:2:1239 +3184:2:1250 +3185:2:1255 +3186:2:1256 +3187:0:4365 +3188:3:3043 +3189:0:4365 +3190:2:1268 +3191:0:4365 +3192:3:3042 +3193:0:4365 +3194:2:1270 +3195:0:4365 +3196:3:3043 +3197:0:4365 +3198:2:1271 +3199:2:1275 +3200:2:1276 +3201:2:1284 +3202:2:1285 +3203:2:1289 +3204:2:1290 +3205:2:1284 +3206:2:1285 +3207:2:1289 +3208:2:1290 +3209:2:1298 +3210:2:1303 +3211:2:1307 +3212:2:1308 +3213:2:1315 +3214:2:1316 +3215:2:1327 +3216:2:1328 +3217:2:1329 +3218:2:1327 +3219:2:1328 +3220:2:1329 +3221:2:1340 +3222:2:1345 +3223:2:1346 +3224:0:4365 +3225:2:1358 +3226:0:4365 +3227:2:1360 +3228:0:4365 +3229:3:3042 +3230:0:4365 +3231:2:1361 +3232:0:4365 +3233:3:3043 +3234:0:4365 +3235:2:1362 +3236:2:1366 +3237:2:1367 +3238:2:1375 +3239:2:1376 +3240:2:1380 +3241:2:1381 +3242:2:1375 +3243:2:1376 +3244:2:1380 +3245:2:1381 +3246:2:1389 +3247:2:1394 +3248:2:1398 +3249:2:1399 +3250:2:1406 +3251:2:1407 +3252:2:1418 +3253:2:1419 +3254:2:1420 +3255:2:1418 +3256:2:1419 +3257:2:1420 +3258:2:1431 +3259:2:1436 +3260:2:1437 +3261:0:4365 +3262:2:1449 +3263:0:4365 +3264:3:3042 +3265:0:4365 +3266:2:1451 +3267:0:4365 +3268:3:3043 +3269:0:4365 +3270:2:1652 +3271:0:4365 +3272:2:1653 +3273:0:4365 +3274:2:1657 +3275:0:4365 +3276:2:1180 +3277:0:4365 +3278:3:3042 +3279:0:4365 +3280:2:1181 +3281:2:1185 +3282:2:1186 +3283:2:1194 +3284:2:1195 +3285:2:1199 +3286:2:1200 +3287:2:1194 +3288:2:1195 +3289:2:1196 +3290:2:1208 +3291:2:1213 +3292:2:1217 +3293:2:1218 +3294:2:1225 +3295:2:1226 +3296:2:1237 +3297:2:1238 +3298:2:1239 +3299:2:1237 +3300:2:1238 +3301:2:1239 +3302:2:1250 +3303:2:1255 +3304:2:1256 +3305:0:4365 +3306:3:3043 +3307:0:4365 +3308:2:1268 +3309:0:4365 +3310:3:3042 +3311:0:4365 +3312:2:1270 +3313:0:4365 +3314:3:3043 +3315:0:4365 +3316:2:1271 +3317:2:1275 +3318:2:1276 +3319:2:1284 +3320:2:1285 +3321:2:1289 +3322:2:1290 +3323:2:1284 +3324:2:1285 +3325:2:1289 +3326:2:1290 +3327:2:1298 +3328:2:1303 +3329:2:1307 +3330:2:1308 +3331:2:1315 +3332:2:1316 +3333:2:1327 +3334:2:1328 +3335:2:1329 +3336:2:1327 +3337:2:1328 +3338:2:1329 +3339:2:1340 +3340:2:1345 +3341:2:1346 +3342:0:4365 +3343:2:1358 +3344:0:4365 +3345:2:1454 +3346:0:4365 +3347:3:3042 +3348:0:4365 +3349:2:1455 +3350:0:4365 +3351:3:3043 +3352:0:4365 +3353:2:1652 +3354:0:4365 +3355:2:1653 +3356:0:4365 +3357:2:1657 +3358:0:4365 +3359:2:1660 +3360:0:4365 +3361:3:3042 +3362:0:4365 +3363:2:1665 +3364:2:1669 +3365:2:1670 +3366:2:1678 +3367:2:1679 +3368:2:1683 +3369:2:1684 +3370:2:1678 +3371:2:1679 +3372:2:1680 +3373:2:1692 +3374:2:1697 +3375:2:1701 +3376:2:1702 +3377:2:1709 +3378:2:1710 +3379:2:1721 +3380:2:1722 +3381:2:1723 +3382:2:1721 +3383:2:1722 +3384:2:1723 +3385:2:1734 +3386:2:1739 +3387:2:1740 +3388:0:4365 +3389:3:3043 +3390:0:4365 +3391:2:1752 +3392:0:4365 +3393:3:3042 +3394:0:4365 +3395:2:1754 +3396:0:4365 +3397:3:3043 +3398:0:4365 +3399:2:1755 +3400:2:1759 +3401:2:1760 +3402:2:1768 +3403:2:1769 +3404:2:1773 +3405:2:1774 +3406:2:1768 +3407:2:1769 +3408:2:1773 +3409:2:1774 +3410:2:1782 +3411:2:1787 +3412:2:1791 +3413:2:1792 +3414:2:1799 +3415:2:1800 +3416:2:1811 +3417:2:1812 +3418:2:1813 +3419:2:1811 +3420:2:1812 +3421:2:1813 +3422:2:1824 +3423:2:1829 +3424:2:1830 +3425:0:4365 +3426:2:1842 +3427:0:4365 +3428:3:3042 +3429:0:4365 +3430:2:1844 +3431:0:4365 +3432:3:3043 +3433:0:4365 +3434:2:1845 +3435:2:1849 +3436:2:1850 +3437:2:1858 +3438:2:1859 +3439:2:1863 +3440:2:1864 +3441:2:1858 +3442:2:1859 +3443:2:1863 +3444:2:1864 +3445:2:1872 +3446:2:1877 +3447:2:1881 +3448:2:1882 +3449:2:1889 +3450:2:1890 +3451:2:1901 +3452:2:1902 +3453:2:1903 +3454:2:1901 +3455:2:1902 +3456:2:1903 +3457:2:1914 +3458:2:1919 +3459:2:1920 +3460:0:4365 +3461:2:1932 +3462:0:4365 +3463:3:3042 +3464:0:4365 +3465:2:1934 +3466:0:4365 +3467:3:3043 +3468:0:4365 +3469:2:1935 +3470:0:4365 +3471:2:1936 +3472:0:4365 +3473:2:2129 +3474:0:4365 +3475:2:2130 +3476:0:4365 +3477:2:2134 +3478:0:4365 +3479:3:3042 +3480:0:4365 +3481:2:2136 +3482:0:4365 +3483:3:3043 +3484:0:4365 +3485:2:2137 +3486:2:2141 +3487:2:2142 +3488:2:2150 +3489:2:2151 +3490:2:2155 +3491:2:2156 +3492:2:2150 +3493:2:2151 +3494:2:2155 +3495:2:2156 +3496:2:2164 +3497:2:2169 +3498:2:2173 +3499:2:2174 +3500:2:2181 +3501:2:2182 +3502:2:2193 +3503:2:2194 +3504:2:2195 +3505:2:2193 +3506:2:2194 +3507:2:2195 +3508:2:2206 +3509:2:2211 +3510:2:2212 +3511:0:4365 +3512:2:2224 +3513:0:4365 +3514:3:3042 +3515:0:4365 +3516:2:2226 +3517:0:4365 +3518:3:3043 +3519:0:4365 +3520:2:1936 +3521:0:4365 +3522:2:2129 +3523:0:4365 +3524:2:2130 +3525:0:4365 +3526:2:2134 +3527:0:4365 +3528:3:3042 +3529:0:4365 +3530:2:2136 +3531:0:4365 +3532:3:3043 +3533:0:4365 +3534:2:2137 +3535:2:2141 +3536:2:2142 +3537:2:2150 +3538:2:2151 +3539:2:2155 +3540:2:2156 +3541:2:2150 +3542:2:2151 +3543:2:2152 +3544:2:2164 +3545:2:2169 +3546:2:2173 +3547:2:2174 +3548:2:2181 +3549:2:2182 +3550:2:2193 +3551:2:2194 +3552:2:2195 +3553:2:2193 +3554:2:2194 +3555:2:2195 +3556:2:2206 +3557:2:2211 +3558:2:2212 +3559:0:4365 +3560:2:2224 +3561:0:4365 +3562:3:3042 +3563:0:4365 +3564:2:2226 +3565:0:4365 +3566:3:3043 +3567:0:4365 +3568:2:2230 +3569:0:4365 +3570:3:3042 +3571:0:4365 +3572:2:2235 +3573:2:2239 +3574:2:2240 +3575:2:2248 +3576:2:2249 +3577:2:2253 +3578:2:2254 +3579:2:2248 +3580:2:2249 +3581:2:2250 +3582:2:2262 +3583:2:2267 +3584:2:2271 +3585:2:2272 +3586:2:2279 +3587:2:2280 +3588:2:2291 +3589:2:2292 +3590:2:2293 +3591:2:2291 +3592:2:2292 +3593:2:2293 +3594:2:2304 +3595:2:2309 +3596:2:2310 +3597:0:4365 +3598:3:3043 +3599:0:4365 +3600:2:2322 +3601:0:4365 +3602:2:1169 +3603:0:4365 +3604:3:3042 +3605:0:4365 +3606:2:1170 +3607:0:4365 +3608:3:3043 +3609:0:4365 +3610:3:3044 +3611:0:4365 +3612:3:3257 +3613:0:4365 +3614:3:3362 +3615:0:4365 +3616:3:3363 +3617:0:4365 +3618:3:3367 +3619:0:4365 +3620:3:3373 +3621:3:3377 +3622:3:3378 +3623:3:3386 +3624:3:3387 +3625:3:3391 +3626:3:3392 +3627:3:3386 +3628:3:3387 +3629:3:3391 +3630:3:3392 +3631:3:3400 +3632:3:3405 +3633:3:3409 +3634:3:3410 +3635:3:3417 +3636:3:3418 +3637:3:3429 +3638:3:3430 +3639:3:3431 +3640:3:3429 +3641:3:3430 +3642:3:3431 +3643:3:3442 +3644:3:3447 +3645:3:3448 +3646:0:4365 +3647:3:3460 +3648:0:4365 +3649:3:3461 +3650:0:4365 +3651:2:1173 +3652:0:4365 +3653:3:3462 +3654:0:4365 +3655:2:1179 +3656:0:4365 +3657:2:1180 +3658:0:4365 +3659:3:3461 +3660:0:4365 +3661:2:1181 +3662:2:1185 +3663:2:1186 +3664:2:1194 +3665:2:1195 +3666:2:1199 +3667:2:1200 +3668:2:1194 +3669:2:1195 +3670:2:1199 +3671:2:1200 +3672:2:1208 +3673:2:1213 +3674:2:1217 +3675:2:1218 +3676:2:1225 +3677:2:1226 +3678:2:1237 +3679:2:1238 +3680:2:1239 +3681:2:1237 +3682:2:1238 +3683:2:1239 +3684:2:1250 +3685:2:1255 +3686:2:1256 +3687:0:4365 +3688:3:3462 +3689:0:4365 +3690:2:1268 +3691:0:4365 +3692:3:3461 +3693:0:4365 +3694:2:1270 +3695:0:4365 +3696:3:3462 +3697:0:4365 +3698:2:1271 +3699:2:1275 +3700:2:1276 +3701:2:1284 +3702:2:1285 +3703:2:1289 +3704:2:1290 +3705:2:1284 +3706:2:1285 +3707:2:1289 +3708:2:1290 +3709:2:1298 +3710:2:1303 +3711:2:1307 +3712:2:1308 +3713:2:1315 +3714:2:1316 +3715:2:1327 +3716:2:1328 +3717:2:1329 +3718:2:1327 +3719:2:1328 +3720:2:1329 +3721:2:1340 +3722:2:1345 +3723:2:1346 +3724:0:4365 +3725:2:1358 +3726:0:4365 +3727:2:1360 +3728:0:4365 +3729:3:3461 +3730:0:4365 +3731:2:1361 +3732:0:4365 +3733:3:3462 +3734:0:4365 +3735:2:1362 +3736:2:1366 +3737:2:1367 +3738:2:1375 +3739:2:1376 +3740:2:1380 +3741:2:1381 +3742:2:1375 +3743:2:1376 +3744:2:1380 +3745:2:1381 +3746:2:1389 +3747:2:1394 +3748:2:1398 +3749:2:1399 +3750:2:1406 +3751:2:1407 +3752:2:1418 +3753:2:1419 +3754:2:1420 +3755:2:1418 +3756:2:1419 +3757:2:1420 +3758:2:1431 +3759:2:1436 +3760:2:1437 +3761:0:4365 +3762:2:1449 +3763:0:4365 +3764:3:3461 +3765:0:4365 +3766:2:1451 +3767:0:4365 +3768:3:3462 +3769:0:4365 +3770:2:1652 +3771:0:4365 +3772:2:1653 +3773:0:4365 +3774:2:1657 +3775:0:4365 +3776:2:1180 +3777:0:4365 +3778:3:3461 +3779:0:4365 +3780:2:1181 +3781:2:1185 +3782:2:1186 +3783:2:1194 +3784:2:1195 +3785:2:1199 +3786:2:1200 +3787:2:1194 +3788:2:1195 +3789:2:1196 +3790:2:1208 +3791:2:1213 +3792:2:1217 +3793:2:1218 +3794:2:1225 +3795:2:1226 +3796:2:1237 +3797:2:1238 +3798:2:1239 +3799:2:1237 +3800:2:1238 +3801:2:1239 +3802:2:1250 +3803:2:1255 +3804:2:1256 +3805:0:4365 +3806:3:3462 +3807:0:4365 +3808:2:1268 +3809:0:4365 +3810:3:3461 +3811:0:4365 +3812:2:1270 +3813:0:4365 +3814:3:3462 +3815:0:4365 +3816:2:1271 +3817:2:1275 +3818:2:1276 +3819:2:1284 +3820:2:1285 +3821:2:1289 +3822:2:1290 +3823:2:1284 +3824:2:1285 +3825:2:1289 +3826:2:1290 +3827:2:1298 +3828:2:1303 +3829:2:1307 +3830:2:1308 +3831:2:1315 +3832:2:1316 +3833:2:1327 +3834:2:1328 +3835:2:1329 +3836:2:1327 +3837:2:1328 +3838:2:1329 +3839:2:1340 +3840:2:1345 +3841:2:1346 +3842:0:4365 +3843:2:1358 +3844:0:4365 +3845:2:1454 +3846:0:4365 +3847:3:3461 +3848:0:4365 +3849:2:1455 +3850:0:4365 +3851:3:3462 +3852:0:4365 +3853:2:1652 +3854:0:4365 +3855:2:1653 +3856:0:4365 +3857:2:1657 +3858:0:4365 +3859:2:1660 +3860:0:4365 +3861:3:3461 +3862:0:4365 +3863:2:1665 +3864:2:1669 +3865:2:1670 +3866:2:1678 +3867:2:1679 +3868:2:1683 +3869:2:1684 +3870:2:1678 +3871:2:1679 +3872:2:1680 +3873:2:1692 +3874:2:1697 +3875:2:1701 +3876:2:1702 +3877:2:1709 +3878:2:1710 +3879:2:1721 +3880:2:1722 +3881:2:1723 +3882:2:1721 +3883:2:1722 +3884:2:1723 +3885:2:1734 +3886:2:1739 +3887:2:1740 +3888:0:4365 +3889:3:3462 +3890:0:4365 +3891:2:1752 +3892:0:4365 +3893:3:3461 +3894:0:4365 +3895:2:1754 +3896:0:4365 +3897:3:3462 +3898:0:4365 +3899:2:1755 +3900:2:1759 +3901:2:1760 +3902:2:1768 +3903:2:1769 +3904:2:1773 +3905:2:1774 +3906:2:1768 +3907:2:1769 +3908:2:1773 +3909:2:1774 +3910:2:1782 +3911:2:1787 +3912:2:1791 +3913:2:1792 +3914:2:1799 +3915:2:1800 +3916:2:1811 +3917:2:1812 +3918:2:1813 +3919:2:1811 +3920:2:1812 +3921:2:1813 +3922:2:1824 +3923:2:1829 +3924:2:1830 +3925:0:4365 +3926:2:1842 +3927:0:4365 +3928:3:3461 +3929:0:4365 +3930:2:1844 +3931:0:4365 +3932:3:3462 +3933:0:4365 +3934:2:1845 +3935:2:1849 +3936:2:1850 +3937:2:1858 +3938:2:1859 +3939:2:1863 +3940:2:1864 +3941:2:1858 +3942:2:1859 +3943:2:1863 +3944:2:1864 +3945:2:1872 +3946:2:1877 +3947:2:1881 +3948:2:1882 +3949:2:1889 +3950:2:1890 +3951:2:1901 +3952:2:1902 +3953:2:1903 +3954:2:1901 +3955:2:1902 +3956:2:1903 +3957:2:1914 +3958:2:1919 +3959:2:1920 +3960:0:4365 +3961:2:1932 +3962:0:4365 +3963:3:3461 +3964:0:4365 +3965:2:1934 +3966:0:4365 +3967:3:3462 +3968:0:4365 +3969:2:1935 +3970:0:4365 +3971:2:1936 +3972:0:4365 +3973:2:2129 +3974:0:4365 +3975:2:2130 +3976:0:4365 +3977:2:2134 +3978:0:4365 +3979:3:3461 +3980:0:4365 +3981:2:2136 +3982:0:4365 +3983:3:3462 +3984:0:4365 +3985:2:2137 +3986:2:2141 +3987:2:2142 +3988:2:2150 +3989:2:2151 +3990:2:2155 +3991:2:2156 +3992:2:2150 +3993:2:2151 +3994:2:2155 +3995:2:2156 +3996:2:2164 +3997:2:2169 +3998:2:2173 +3999:2:2174 +4000:2:2181 +4001:2:2182 +4002:2:2193 +4003:2:2194 +4004:2:2195 +4005:2:2193 +4006:2:2194 +4007:2:2195 +4008:2:2206 +4009:2:2211 +4010:2:2212 +4011:0:4365 +4012:2:2224 +4013:0:4365 +4014:3:3461 +4015:0:4365 +4016:2:2226 +4017:0:4365 +4018:3:3462 +4019:0:4365 +4020:2:1936 +4021:0:4365 +4022:2:2129 +4023:0:4365 +4024:2:2130 +4025:0:4365 +4026:2:2134 +4027:0:4365 +4028:3:3461 +4029:0:4365 +4030:2:2136 +4031:0:4365 +4032:3:3462 +4033:0:4365 +4034:2:2137 +4035:2:2141 +4036:2:2142 +4037:2:2150 +4038:2:2151 +4039:2:2155 +4040:2:2156 +4041:2:2150 +4042:2:2151 +4043:2:2152 +4044:2:2164 +4045:2:2169 +4046:2:2173 +4047:2:2174 +4048:2:2181 +4049:2:2182 +4050:2:2193 +4051:2:2194 +4052:2:2195 +4053:2:2193 +4054:2:2194 +4055:2:2195 +4056:2:2206 +4057:2:2211 +4058:2:2212 +4059:0:4365 +4060:2:2224 +4061:0:4365 +4062:3:3461 +4063:0:4365 +4064:2:2226 +4065:0:4365 +4066:3:3462 +4067:0:4365 +4068:2:2230 +4069:0:4365 +4070:3:3461 +4071:0:4365 +4072:2:2235 +4073:2:2239 +4074:2:2240 +4075:2:2248 +4076:2:2249 +4077:2:2253 +4078:2:2254 +4079:2:2248 +4080:2:2249 +4081:2:2250 +4082:2:2262 +4083:2:2267 +4084:2:2271 +4085:2:2272 +4086:2:2279 +4087:2:2280 +4088:2:2291 +4089:2:2292 +4090:2:2293 +4091:2:2291 +4092:2:2292 +4093:2:2293 +4094:2:2304 +4095:2:2309 +4096:2:2310 +4097:0:4365 +4098:3:3462 +4099:0:4365 +4100:2:2322 +4101:0:4365 +4102:2:1169 +4103:0:4365 +4104:3:3461 +4105:0:4365 +4106:2:1170 +4107:0:4365 +4108:3:3462 +4109:0:4365 +4110:3:3463 +4111:0:4365 +4112:3:3469 +4113:0:4365 +4114:3:3470 +4115:3:3474 +4116:3:3475 +4117:3:3483 +4118:3:3484 +4119:3:3488 +4120:3:3489 +4121:3:3483 +4122:3:3484 +4123:3:3488 +4124:3:3489 +4125:3:3497 +4126:3:3502 +4127:3:3506 +4128:3:3507 +4129:3:3514 +4130:3:3515 +4131:3:3526 +4132:3:3527 +4133:3:3528 +4134:3:3526 +4135:3:3527 +4136:3:3528 +4137:3:3539 +4138:3:3544 +4139:3:3545 +4140:0:4365 +4141:3:3557 +4142:0:4365 +4143:3:3558 +4144:0:4365 +4145:2:1173 +4146:0:4365 +4147:3:3559 +4148:0:4365 +4149:2:1179 +4150:0:4365 +4151:2:1180 +4152:0:4365 +4153:3:3558 +4154:0:4365 +4155:2:1181 +4156:2:1185 +4157:2:1186 +4158:2:1194 +4159:2:1195 +4160:2:1199 +4161:2:1200 +4162:2:1194 +4163:2:1195 +4164:2:1199 +4165:2:1200 +4166:2:1208 +4167:2:1213 +4168:2:1217 +4169:2:1218 +4170:2:1225 +4171:2:1226 +4172:2:1237 +4173:2:1238 +4174:2:1239 +4175:2:1237 +4176:2:1238 +4177:2:1239 +4178:2:1250 +4179:2:1255 +4180:2:1256 +4181:0:4365 +4182:3:3559 +4183:0:4365 +4184:2:1268 +4185:0:4365 +4186:3:3558 +4187:0:4365 +4188:2:1270 +4189:0:4365 +4190:3:3559 +4191:0:4365 +4192:2:1271 +4193:2:1275 +4194:2:1276 +4195:2:1284 +4196:2:1285 +4197:2:1289 +4198:2:1290 +4199:2:1284 +4200:2:1285 +4201:2:1289 +4202:2:1290 +4203:2:1298 +4204:2:1303 +4205:2:1307 +4206:2:1308 +4207:2:1315 +4208:2:1316 +4209:2:1327 +4210:2:1328 +4211:2:1329 +4212:2:1327 +4213:2:1328 +4214:2:1329 +4215:2:1340 +4216:2:1345 +4217:2:1346 +4218:0:4365 +4219:2:1358 +4220:0:4365 +4221:2:1360 +4222:0:4365 +4223:3:3558 +4224:0:4365 +4225:2:1361 +4226:0:4365 +4227:3:3559 +4228:0:4365 +4229:2:1362 +4230:2:1366 +4231:2:1367 +4232:2:1375 +4233:2:1376 +4234:2:1380 +4235:2:1381 +4236:2:1375 +4237:2:1376 +4238:2:1380 +4239:2:1381 +4240:2:1389 +4241:2:1394 +4242:2:1398 +4243:2:1399 +4244:2:1406 +4245:2:1407 +4246:2:1418 +4247:2:1419 +4248:2:1420 +4249:2:1418 +4250:2:1419 +4251:2:1420 +4252:2:1431 +4253:2:1436 +4254:2:1437 +4255:0:4365 +4256:2:1449 +4257:0:4365 +4258:3:3558 +4259:0:4365 +4260:2:1451 +4261:0:4365 +4262:3:3559 +4263:0:4365 +4264:2:1652 +4265:0:4365 +4266:2:1653 +4267:0:4365 +4268:2:1657 +4269:0:4365 +4270:2:1180 +4271:0:4365 +4272:3:3558 +4273:0:4365 +4274:2:1181 +4275:2:1185 +4276:2:1186 +4277:2:1194 +4278:2:1195 +4279:2:1199 +4280:2:1200 +4281:2:1194 +4282:2:1195 +4283:2:1196 +4284:2:1208 +4285:2:1213 +4286:2:1217 +4287:2:1218 +4288:2:1225 +4289:2:1226 +4290:2:1237 +4291:2:1238 +4292:2:1239 +4293:2:1237 +4294:2:1238 +4295:2:1239 +4296:2:1250 +4297:2:1255 +4298:2:1256 +4299:0:4365 +4300:3:3559 +4301:0:4365 +4302:2:1268 +4303:0:4365 +4304:3:3558 +4305:0:4365 +4306:2:1270 +4307:0:4365 +4308:3:3559 +4309:0:4365 +4310:2:1271 +4311:2:1275 +4312:2:1276 +4313:2:1284 +4314:2:1285 +4315:2:1289 +4316:2:1290 +4317:2:1284 +4318:2:1285 +4319:2:1289 +4320:2:1290 +4321:2:1298 +4322:2:1303 +4323:2:1307 +4324:2:1308 +4325:2:1315 +4326:2:1316 +4327:2:1327 +4328:2:1328 +4329:2:1329 +4330:2:1327 +4331:2:1328 +4332:2:1329 +4333:2:1340 +4334:2:1345 +4335:2:1346 +4336:0:4365 +4337:2:1358 +4338:0:4365 +4339:2:1454 +4340:0:4365 +4341:3:3558 +4342:0:4365 +4343:2:1455 +4344:0:4365 +4345:3:3559 +4346:0:4365 +4347:2:1652 +4348:0:4365 +4349:2:1653 +4350:0:4365 +4351:2:1657 +4352:0:4365 +4353:2:1660 +4354:0:4365 +4355:3:3558 +4356:0:4365 +4357:2:1665 +4358:2:1669 +4359:2:1670 +4360:2:1678 +4361:2:1679 +4362:2:1683 +4363:2:1684 +4364:2:1678 +4365:2:1679 +4366:2:1680 +4367:2:1692 +4368:2:1697 +4369:2:1701 +4370:2:1702 +4371:2:1709 +4372:2:1710 +4373:2:1721 +4374:2:1722 +4375:2:1723 +4376:2:1721 +4377:2:1722 +4378:2:1723 +4379:2:1734 +4380:2:1739 +4381:2:1740 +4382:0:4365 +4383:3:3559 +4384:0:4365 +4385:2:1752 +4386:0:4365 +4387:3:3558 +4388:0:4365 +4389:2:1754 +4390:0:4365 +4391:3:3559 +4392:0:4365 +4393:2:1755 +4394:2:1759 +4395:2:1760 +4396:2:1768 +4397:2:1769 +4398:2:1773 +4399:2:1774 +4400:2:1768 +4401:2:1769 +4402:2:1773 +4403:2:1774 +4404:2:1782 +4405:2:1787 +4406:2:1791 +4407:2:1792 +4408:2:1799 +4409:2:1800 +4410:2:1811 +4411:2:1812 +4412:2:1813 +4413:2:1811 +4414:2:1812 +4415:2:1813 +4416:2:1824 +4417:2:1829 +4418:2:1830 +4419:0:4365 +4420:2:1842 +4421:0:4365 +4422:3:3558 +4423:0:4365 +4424:2:1844 +4425:0:4365 +4426:3:3559 +4427:0:4365 +4428:2:1845 +4429:2:1849 +4430:2:1850 +4431:2:1858 +4432:2:1859 +4433:2:1863 +4434:2:1864 +4435:2:1858 +4436:2:1859 +4437:2:1863 +4438:2:1864 +4439:2:1872 +4440:2:1877 +4441:2:1881 +4442:2:1882 +4443:2:1889 +4444:2:1890 +4445:2:1901 +4446:2:1902 +4447:2:1903 +4448:2:1901 +4449:2:1902 +4450:2:1903 +4451:2:1914 +4452:2:1919 +4453:2:1920 +4454:0:4365 +4455:2:1932 +4456:0:4365 +4457:3:3558 +4458:0:4365 +4459:2:1934 +4460:0:4365 +4461:3:3559 +4462:0:4365 +4463:2:1935 +4464:0:4365 +4465:2:1936 +4466:0:4365 +4467:2:2129 +4468:0:4365 +4469:2:2130 +4470:0:4365 +4471:2:2134 +4472:0:4365 +4473:3:3558 +4474:0:4365 +4475:2:2136 +4476:0:4365 +4477:3:3559 +4478:0:4365 +4479:2:2137 +4480:2:2141 +4481:2:2142 +4482:2:2150 +4483:2:2151 +4484:2:2155 +4485:2:2156 +4486:2:2150 +4487:2:2151 +4488:2:2155 +4489:2:2156 +4490:2:2164 +4491:2:2169 +4492:2:2173 +4493:2:2174 +4494:2:2181 +4495:2:2182 +4496:2:2193 +4497:2:2194 +4498:2:2195 +4499:2:2193 +4500:2:2194 +4501:2:2195 +4502:2:2206 +4503:2:2211 +4504:2:2212 +4505:0:4365 +4506:2:2224 +4507:0:4365 +4508:3:3558 +4509:0:4365 +4510:2:2226 +4511:0:4365 +4512:3:3559 +4513:0:4365 +4514:2:1936 +4515:0:4365 +4516:2:2129 +4517:0:4365 +4518:2:2130 +4519:0:4365 +4520:2:2134 +4521:0:4365 +4522:3:3558 +4523:0:4365 +4524:2:2136 +4525:0:4365 +4526:3:3559 +4527:0:4365 +4528:2:2137 +4529:2:2141 +4530:2:2142 +4531:2:2150 +4532:2:2151 +4533:2:2155 +4534:2:2156 +4535:2:2150 +4536:2:2151 +4537:2:2152 +4538:2:2164 +4539:2:2169 +4540:2:2173 +4541:2:2174 +4542:2:2181 +4543:2:2182 +4544:2:2193 +4545:2:2194 +4546:2:2195 +4547:2:2193 +4548:2:2194 +4549:2:2195 +4550:2:2206 +4551:2:2211 +4552:2:2212 +4553:0:4365 +4554:2:2224 +4555:0:4365 +4556:3:3558 +4557:0:4365 +4558:2:2226 +4559:0:4365 +4560:3:3559 +4561:0:4365 +4562:2:2230 +4563:0:4365 +4564:3:3558 +4565:0:4365 +4566:2:2235 +4567:2:2239 +4568:2:2240 +4569:2:2248 +4570:2:2249 +4571:2:2253 +4572:2:2254 +4573:2:2248 +4574:2:2249 +4575:2:2250 +4576:2:2262 +4577:2:2267 +4578:2:2271 +4579:2:2272 +4580:2:2279 +4581:2:2280 +4582:2:2291 +4583:2:2292 +4584:2:2293 +4585:2:2291 +4586:2:2292 +4587:2:2293 +4588:2:2304 +4589:2:2309 +4590:2:2310 +4591:0:4365 +4592:3:3559 +4593:0:4365 +4594:2:2322 +4595:0:4365 +4596:2:1169 +4597:0:4365 +4598:3:3558 +4599:0:4365 +4600:2:1170 +4601:0:4365 +4602:3:3559 +4603:0:4365 +4604:3:3560 +4605:0:4365 +4606:3:3566 +4607:0:4365 +4608:3:3569 +4609:3:3570 +4610:3:3582 +4611:3:3583 +4612:3:3587 +4613:3:3588 +4614:3:3582 +4615:3:3583 +4616:3:3587 +4617:3:3588 +4618:3:3596 +4619:3:3601 +4620:3:3605 +4621:3:3606 +4622:3:3613 +4623:3:3614 +4624:3:3625 +4625:3:3626 +4626:3:3627 +4627:3:3625 +4628:3:3626 +4629:3:3627 +4630:3:3638 +4631:3:3643 +4632:3:3644 +4633:0:4365 +4634:3:3656 +4635:0:4365 +4636:3:3657 +4637:0:4365 +4638:2:1173 +4639:0:4365 +4640:3:3658 +4641:0:4365 +4642:2:1179 +4643:0:4365 +4644:2:1180 +4645:0:4365 +4646:3:3657 +4647:0:4365 +4648:2:1181 +4649:2:1185 +4650:2:1186 +4651:2:1194 +4652:2:1195 +4653:2:1199 +4654:2:1200 +4655:2:1194 +4656:2:1195 +4657:2:1199 +4658:2:1200 +4659:2:1208 +4660:2:1213 +4661:2:1217 +4662:2:1218 +4663:2:1225 +4664:2:1226 +4665:2:1237 +4666:2:1238 +4667:2:1239 +4668:2:1237 +4669:2:1238 +4670:2:1239 +4671:2:1250 +4672:2:1255 +4673:2:1256 +4674:0:4365 +4675:3:3658 +4676:0:4365 +4677:2:1268 +4678:0:4365 +4679:3:3657 +4680:0:4365 +4681:2:1270 +4682:0:4365 +4683:3:3658 +4684:0:4365 +4685:2:1271 +4686:2:1275 +4687:2:1276 +4688:2:1284 +4689:2:1285 +4690:2:1289 +4691:2:1290 +4692:2:1284 +4693:2:1285 +4694:2:1289 +4695:2:1290 +4696:2:1298 +4697:2:1303 +4698:2:1307 +4699:2:1308 +4700:2:1315 +4701:2:1316 +4702:2:1327 +4703:2:1328 +4704:2:1329 +4705:2:1327 +4706:2:1328 +4707:2:1329 +4708:2:1340 +4709:2:1345 +4710:2:1346 +4711:0:4365 +4712:2:1358 +4713:0:4365 +4714:2:1360 +4715:0:4365 +4716:3:3657 +4717:0:4365 +4718:2:1361 +4719:0:4365 +4720:3:3658 +4721:0:4365 +4722:2:1362 +4723:2:1366 +4724:2:1367 +4725:2:1375 +4726:2:1376 +4727:2:1380 +4728:2:1381 +4729:2:1375 +4730:2:1376 +4731:2:1380 +4732:2:1381 +4733:2:1389 +4734:2:1394 +4735:2:1398 +4736:2:1399 +4737:2:1406 +4738:2:1407 +4739:2:1418 +4740:2:1419 +4741:2:1420 +4742:2:1418 +4743:2:1419 +4744:2:1420 +4745:2:1431 +4746:2:1436 +4747:2:1437 +4748:0:4365 +4749:2:1449 +4750:0:4365 +4751:3:3657 +4752:0:4365 +4753:2:1451 +4754:0:4365 +4755:3:3658 +4756:0:4365 +4757:2:1652 +4758:0:4365 +4759:2:1653 +4760:0:4365 +4761:2:1657 +4762:0:4365 +4763:2:1180 +4764:0:4365 +4765:3:3657 +4766:0:4365 +4767:2:1181 +4768:2:1185 +4769:2:1186 +4770:2:1194 +4771:2:1195 +4772:2:1199 +4773:2:1200 +4774:2:1194 +4775:2:1195 +4776:2:1196 +4777:2:1208 +4778:2:1213 +4779:2:1217 +4780:2:1218 +4781:2:1225 +4782:2:1226 +4783:2:1237 +4784:2:1238 +4785:2:1239 +4786:2:1237 +4787:2:1238 +4788:2:1239 +4789:2:1250 +4790:2:1255 +4791:2:1256 +4792:0:4365 +4793:3:3658 +4794:0:4365 +4795:2:1268 +4796:0:4365 +4797:3:3657 +4798:0:4365 +4799:2:1270 +4800:0:4365 +4801:3:3658 +4802:0:4365 +4803:2:1271 +4804:2:1275 +4805:2:1276 +4806:2:1284 +4807:2:1285 +4808:2:1289 +4809:2:1290 +4810:2:1284 +4811:2:1285 +4812:2:1289 +4813:2:1290 +4814:2:1298 +4815:2:1303 +4816:2:1307 +4817:2:1308 +4818:2:1315 +4819:2:1316 +4820:2:1327 +4821:2:1328 +4822:2:1329 +4823:2:1327 +4824:2:1328 +4825:2:1329 +4826:2:1340 +4827:2:1345 +4828:2:1346 +4829:0:4365 +4830:2:1358 +4831:0:4365 +4832:2:1454 +4833:0:4365 +4834:3:3657 +4835:0:4365 +4836:2:1455 +4837:0:4365 +4838:3:3658 +4839:0:4365 +4840:2:1652 +4841:0:4365 +4842:2:1653 +4843:0:4365 +4844:2:1657 +4845:0:4365 +4846:2:1660 +4847:0:4365 +4848:3:3657 +4849:0:4365 +4850:2:1665 +4851:2:1669 +4852:2:1670 +4853:2:1678 +4854:2:1679 +4855:2:1683 +4856:2:1684 +4857:2:1678 +4858:2:1679 +4859:2:1680 +4860:2:1692 +4861:2:1697 +4862:2:1701 +4863:2:1702 +4864:2:1709 +4865:2:1710 +4866:2:1721 +4867:2:1722 +4868:2:1723 +4869:2:1721 +4870:2:1722 +4871:2:1723 +4872:2:1734 +4873:2:1739 +4874:2:1740 +4875:0:4365 +4876:3:3658 +4877:0:4365 +4878:2:1752 +4879:0:4365 +4880:3:3657 +4881:0:4365 +4882:2:1754 +4883:0:4365 +4884:3:3658 +4885:0:4365 +4886:2:1755 +4887:2:1759 +4888:2:1760 +4889:2:1768 +4890:2:1769 +4891:2:1773 +4892:2:1774 +4893:2:1768 +4894:2:1769 +4895:2:1773 +4896:2:1774 +4897:2:1782 +4898:2:1787 +4899:2:1791 +4900:2:1792 +4901:2:1799 +4902:2:1800 +4903:2:1811 +4904:2:1812 +4905:2:1813 +4906:2:1811 +4907:2:1812 +4908:2:1813 +4909:2:1824 +4910:2:1829 +4911:2:1830 +4912:0:4365 +4913:2:1842 +4914:0:4365 +4915:3:3657 +4916:0:4365 +4917:2:1844 +4918:0:4365 +4919:3:3658 +4920:0:4365 +4921:2:1845 +4922:2:1849 +4923:2:1850 +4924:2:1858 +4925:2:1859 +4926:2:1863 +4927:2:1864 +4928:2:1858 +4929:2:1859 +4930:2:1863 +4931:2:1864 +4932:2:1872 +4933:2:1877 +4934:2:1881 +4935:2:1882 +4936:2:1889 +4937:2:1890 +4938:2:1901 +4939:2:1902 +4940:2:1903 +4941:2:1901 +4942:2:1902 +4943:2:1903 +4944:2:1914 +4945:2:1919 +4946:2:1920 +4947:0:4365 +4948:2:1932 +4949:0:4365 +4950:3:3657 +4951:0:4365 +4952:2:1934 +4953:0:4365 +4954:3:3658 +4955:0:4365 +4956:2:1935 +4957:0:4365 +4958:2:1936 +4959:0:4365 +4960:2:2129 +4961:0:4365 +4962:2:2130 +4963:0:4365 +4964:2:2134 +4965:0:4365 +4966:3:3657 +4967:0:4365 +4968:2:2136 +4969:0:4365 +4970:3:3658 +4971:0:4365 +4972:2:2137 +4973:2:2141 +4974:2:2142 +4975:2:2150 +4976:2:2151 +4977:2:2155 +4978:2:2156 +4979:2:2150 +4980:2:2151 +4981:2:2155 +4982:2:2156 +4983:2:2164 +4984:2:2169 +4985:2:2173 +4986:2:2174 +4987:2:2181 +4988:2:2182 +4989:2:2193 +4990:2:2194 +4991:2:2195 +4992:2:2193 +4993:2:2194 +4994:2:2195 +4995:2:2206 +4996:2:2211 +4997:2:2212 +4998:0:4365 +4999:2:2224 +5000:0:4365 +5001:3:3657 +5002:0:4365 +5003:2:2226 +5004:0:4365 +5005:3:3658 +5006:0:4365 +5007:2:1936 +5008:0:4365 +5009:2:2129 +5010:0:4365 +5011:2:2130 +5012:0:4365 +5013:2:2134 +5014:0:4365 +5015:3:3657 +5016:0:4365 +5017:2:2136 +5018:0:4365 +5019:3:3658 +5020:0:4365 +5021:2:2137 +5022:2:2141 +5023:2:2142 +5024:2:2150 +5025:2:2151 +5026:2:2155 +5027:2:2156 +5028:2:2150 +5029:2:2151 +5030:2:2152 +5031:2:2164 +5032:2:2169 +5033:2:2173 +5034:2:2174 +5035:2:2181 +5036:2:2182 +5037:2:2193 +5038:2:2194 +5039:2:2195 +5040:2:2193 +5041:2:2194 +5042:2:2195 +5043:2:2206 +5044:2:2211 +5045:2:2212 +5046:0:4365 +5047:2:2224 +5048:0:4365 +5049:3:3657 +5050:0:4365 +5051:2:2226 +5052:0:4365 +5053:3:3658 +5054:0:4365 +5055:2:2230 +5056:0:4365 +5057:3:3657 +5058:0:4365 +5059:2:2235 +5060:2:2239 +5061:2:2240 +5062:2:2248 +5063:2:2249 +5064:2:2253 +5065:2:2254 +5066:2:2248 +5067:2:2249 +5068:2:2250 +5069:2:2262 +5070:2:2267 +5071:2:2271 +5072:2:2272 +5073:2:2279 +5074:2:2280 +5075:2:2291 +5076:2:2292 +5077:2:2293 +5078:2:2291 +5079:2:2292 +5080:2:2293 +5081:2:2304 +5082:2:2309 +5083:2:2310 +5084:0:4365 +5085:3:3658 +5086:0:4365 +5087:2:2322 +5088:0:4365 +5089:2:1169 +5090:0:4365 +5091:3:3657 +5092:0:4365 +5093:2:1170 +5094:0:4365 +5095:3:3658 +5096:0:4365 +5097:3:3659 +5098:0:4365 +5099:3:3665 +5100:0:4365 +5101:3:3666 +5102:0:4365 +5103:3:3667 +5104:0:4365 +5105:3:3668 +5106:0:4365 +5107:3:3669 +5108:3:3673 +5109:3:3674 +5110:3:3682 +5111:3:3683 +5112:3:3687 +5113:3:3688 +5114:3:3682 +5115:3:3683 +5116:3:3687 +5117:3:3688 +5118:3:3696 +5119:3:3701 +5120:3:3705 +5121:3:3706 +5122:3:3713 +5123:3:3714 +5124:3:3725 +5125:3:3726 +5126:3:3727 +5127:3:3725 +5128:3:3726 +5129:3:3727 +5130:3:3738 +5131:3:3743 +5132:3:3744 +5133:0:4365 +5134:3:3756 +5135:0:4365 +5136:3:3757 +5137:0:4365 +5138:2:1173 +5139:0:4365 +5140:3:3758 +5141:0:4365 +5142:2:1179 +5143:0:4365 +5144:2:1180 +5145:0:4365 +5146:3:3757 +5147:0:4365 +5148:2:1181 +5149:2:1185 +5150:2:1186 +5151:2:1194 +5152:2:1195 +5153:2:1199 +5154:2:1200 +5155:2:1194 +5156:2:1195 +5157:2:1199 +5158:2:1200 +5159:2:1208 +5160:2:1213 +5161:2:1217 +5162:2:1218 +5163:2:1225 +5164:2:1226 +5165:2:1237 +5166:2:1238 +5167:2:1239 +5168:2:1237 +5169:2:1238 +5170:2:1239 +5171:2:1250 +5172:2:1255 +5173:2:1256 +5174:0:4365 +5175:3:3758 +5176:0:4365 +5177:2:1268 +5178:0:4365 +5179:3:3757 +5180:0:4365 +5181:2:1270 +5182:0:4365 +5183:3:3758 +5184:0:4365 +5185:2:1271 +5186:2:1275 +5187:2:1276 +5188:2:1284 +5189:2:1285 +5190:2:1289 +5191:2:1290 +5192:2:1284 +5193:2:1285 +5194:2:1289 +5195:2:1290 +5196:2:1298 +5197:2:1303 +5198:2:1307 +5199:2:1308 +5200:2:1315 +5201:2:1316 +5202:2:1327 +5203:2:1328 +5204:2:1329 +5205:2:1327 +5206:2:1328 +5207:2:1329 +5208:2:1340 +5209:2:1345 +5210:2:1346 +5211:0:4365 +5212:2:1358 +5213:0:4365 +5214:2:1360 +5215:0:4365 +5216:3:3757 +5217:0:4365 +5218:2:1361 +5219:0:4365 +5220:3:3758 +5221:0:4365 +5222:2:1362 +5223:2:1366 +5224:2:1367 +5225:2:1375 +5226:2:1376 +5227:2:1380 +5228:2:1381 +5229:2:1375 +5230:2:1376 +5231:2:1380 +5232:2:1381 +5233:2:1389 +5234:2:1394 +5235:2:1398 +5236:2:1399 +5237:2:1406 +5238:2:1407 +5239:2:1418 +5240:2:1419 +5241:2:1420 +5242:2:1418 +5243:2:1419 +5244:2:1420 +5245:2:1431 +5246:2:1436 +5247:2:1437 +5248:0:4365 +5249:2:1449 +5250:0:4365 +5251:3:3757 +5252:0:4365 +5253:2:1451 +5254:0:4365 +5255:3:3758 +5256:0:4365 +5257:2:1652 +5258:0:4365 +5259:2:1653 +5260:0:4365 +5261:2:1657 +5262:0:4365 +5263:2:1180 +5264:0:4365 +5265:3:3757 +5266:0:4365 +5267:2:1181 +5268:2:1185 +5269:2:1186 +5270:2:1194 +5271:2:1195 +5272:2:1199 +5273:2:1200 +5274:2:1194 +5275:2:1195 +5276:2:1196 +5277:2:1208 +5278:2:1213 +5279:2:1217 +5280:2:1218 +5281:2:1225 +5282:2:1226 +5283:2:1237 +5284:2:1238 +5285:2:1239 +5286:2:1237 +5287:2:1238 +5288:2:1239 +5289:2:1250 +5290:2:1255 +5291:2:1256 +5292:0:4365 +5293:3:3758 +5294:0:4365 +5295:2:1268 +5296:0:4365 +5297:3:3757 +5298:0:4365 +5299:2:1270 +5300:0:4365 +5301:3:3758 +5302:0:4365 +5303:2:1271 +5304:2:1275 +5305:2:1276 +5306:2:1284 +5307:2:1285 +5308:2:1289 +5309:2:1290 +5310:2:1284 +5311:2:1285 +5312:2:1289 +5313:2:1290 +5314:2:1298 +5315:2:1303 +5316:2:1307 +5317:2:1308 +5318:2:1315 +5319:2:1316 +5320:2:1327 +5321:2:1328 +5322:2:1329 +5323:2:1327 +5324:2:1328 +5325:2:1329 +5326:2:1340 +5327:2:1345 +5328:2:1346 +5329:0:4365 +5330:2:1358 +5331:0:4365 +5332:2:1454 +5333:0:4365 +5334:3:3757 +5335:0:4365 +5336:2:1455 +5337:0:4365 +5338:3:3758 +5339:0:4365 +5340:2:1652 +5341:0:4365 +5342:2:1653 +5343:0:4365 +5344:2:1657 +5345:0:4365 +5346:2:1660 +5347:0:4365 +5348:3:3757 +5349:0:4365 +5350:2:1665 +5351:2:1669 +5352:2:1670 +5353:2:1678 +5354:2:1679 +5355:2:1683 +5356:2:1684 +5357:2:1678 +5358:2:1679 +5359:2:1680 +5360:2:1692 +5361:2:1697 +5362:2:1701 +5363:2:1702 +5364:2:1709 +5365:2:1710 +5366:2:1721 +5367:2:1722 +5368:2:1723 +5369:2:1721 +5370:2:1722 +5371:2:1723 +5372:2:1734 +5373:2:1739 +5374:2:1740 +5375:0:4365 +5376:3:3758 +5377:0:4365 +5378:2:1752 +5379:0:4365 +5380:3:3757 +5381:0:4365 +5382:2:1754 +5383:0:4365 +5384:3:3758 +5385:0:4365 +5386:2:1755 +5387:2:1759 +5388:2:1760 +5389:2:1768 +5390:2:1769 +5391:2:1773 +5392:2:1774 +5393:2:1768 +5394:2:1769 +5395:2:1773 +5396:2:1774 +5397:2:1782 +5398:2:1787 +5399:2:1791 +5400:2:1792 +5401:2:1799 +5402:2:1800 +5403:2:1811 +5404:2:1812 +5405:2:1813 +5406:2:1811 +5407:2:1812 +5408:2:1813 +5409:2:1824 +5410:2:1829 +5411:2:1830 +5412:0:4365 +5413:2:1842 +5414:0:4365 +5415:3:3757 +5416:0:4365 +5417:2:1844 +5418:0:4365 +5419:3:3758 +5420:0:4365 +5421:2:1845 +5422:2:1849 +5423:2:1850 +5424:2:1858 +5425:2:1859 +5426:2:1863 +5427:2:1864 +5428:2:1858 +5429:2:1859 +5430:2:1863 +5431:2:1864 +5432:2:1872 +5433:2:1877 +5434:2:1881 +5435:2:1882 +5436:2:1889 +5437:2:1890 +5438:2:1901 +5439:2:1902 +5440:2:1903 +5441:2:1901 +5442:2:1902 +5443:2:1903 +5444:2:1914 +5445:2:1919 +5446:2:1920 +5447:0:4365 +5448:2:1932 +5449:0:4365 +5450:3:3757 +5451:0:4365 +5452:2:1934 +5453:0:4365 +5454:3:3758 +5455:0:4365 +5456:2:1935 +5457:0:4365 +5458:2:1936 +5459:0:4365 +5460:2:2129 +5461:0:4365 +5462:2:2130 +5463:0:4365 +5464:2:2134 +5465:0:4365 +5466:3:3757 +5467:0:4365 +5468:2:2136 +5469:0:4365 +5470:3:3758 +5471:0:4365 +5472:2:2137 +5473:2:2141 +5474:2:2142 +5475:2:2150 +5476:2:2151 +5477:2:2155 +5478:2:2156 +5479:2:2150 +5480:2:2151 +5481:2:2155 +5482:2:2156 +5483:2:2164 +5484:2:2169 +5485:2:2173 +5486:2:2174 +5487:2:2181 +5488:2:2182 +5489:2:2193 +5490:2:2194 +5491:2:2195 +5492:2:2193 +5493:2:2194 +5494:2:2195 +5495:2:2206 +5496:2:2211 +5497:2:2212 +5498:0:4365 +5499:2:2224 +5500:0:4365 +5501:3:3757 +5502:0:4365 +5503:2:2226 +5504:0:4365 +5505:3:3758 +5506:0:4365 +5507:2:1936 +5508:0:4365 +5509:2:2129 +5510:0:4365 +5511:2:2130 +5512:0:4365 +5513:2:2134 +5514:0:4365 +5515:3:3757 +5516:0:4365 +5517:2:2136 +5518:0:4365 +5519:3:3758 +5520:0:4365 +5521:2:2137 +5522:2:2141 +5523:2:2142 +5524:2:2150 +5525:2:2151 +5526:2:2155 +5527:2:2156 +5528:2:2150 +5529:2:2151 +5530:2:2152 +5531:2:2164 +5532:2:2169 +5533:2:2173 +5534:2:2174 +5535:2:2181 +5536:2:2182 +5537:2:2193 +5538:2:2194 +5539:2:2195 +5540:2:2193 +5541:2:2194 +5542:2:2195 +5543:2:2206 +5544:2:2211 +5545:2:2212 +5546:0:4365 +5547:2:2224 +5548:0:4365 +5549:3:3757 +5550:0:4365 +5551:2:2226 +5552:0:4365 +5553:3:3758 +5554:0:4365 +5555:2:2230 +5556:0:4365 +5557:3:3757 +5558:0:4365 +5559:2:2235 +5560:2:2239 +5561:2:2240 +5562:2:2248 +5563:2:2249 +5564:2:2253 +5565:2:2254 +5566:2:2248 +5567:2:2249 +5568:2:2250 +5569:2:2262 +5570:2:2267 +5571:2:2271 +5572:2:2272 +5573:2:2279 +5574:2:2280 +5575:2:2291 +5576:2:2292 +5577:2:2293 +5578:2:2291 +5579:2:2292 +5580:2:2293 +5581:2:2304 +5582:2:2309 +5583:2:2310 +5584:0:4365 +5585:3:3758 +5586:0:4365 +5587:2:2322 +5588:0:4365 +5589:2:1169 +5590:0:4365 +5591:3:3757 +5592:0:4365 +5593:2:1170 +5594:0:4365 +5595:3:3758 +5596:0:4365 +5597:3:3759 +5598:0:4365 +5599:3:3972 +5600:0:4365 +5601:3:3980 +5602:0:4365 +5603:3:3981 +5604:3:3985 +5605:3:3986 +5606:3:3994 +5607:3:3995 +5608:3:3999 +5609:3:4000 +5610:3:3994 +5611:3:3995 +5612:3:3999 +5613:3:4000 +5614:3:4008 +5615:3:4013 +5616:3:4017 +5617:3:4018 +5618:3:4025 +5619:3:4026 +5620:3:4037 +5621:3:4038 +5622:3:4039 +5623:3:4037 +5624:3:4038 +5625:3:4039 +5626:3:4050 +5627:3:4055 +5628:3:4056 +5629:0:4365 +5630:3:4068 +5631:0:4365 +5632:3:4069 +5633:0:4365 +5634:2:1173 +5635:0:4365 +5636:3:4070 +5637:0:4365 +5638:2:1179 +5639:0:4365 +5640:2:1180 +5641:0:4365 +5642:3:4069 +5643:0:4365 +5644:2:1181 +5645:2:1185 +5646:2:1186 +5647:2:1194 +5648:2:1195 +5649:2:1199 +5650:2:1200 +5651:2:1194 +5652:2:1195 +5653:2:1199 +5654:2:1200 +5655:2:1208 +5656:2:1213 +5657:2:1217 +5658:2:1218 +5659:2:1225 +5660:2:1226 +5661:2:1237 +5662:2:1238 +5663:2:1239 +5664:2:1237 +5665:2:1238 +5666:2:1239 +5667:2:1250 +5668:2:1255 +5669:2:1256 +5670:0:4365 +5671:3:4070 +5672:0:4365 +5673:2:1268 +5674:0:4365 +5675:3:4069 +5676:0:4365 +5677:2:1270 +5678:0:4365 +5679:3:4070 +5680:0:4365 +5681:2:1271 +5682:2:1275 +5683:2:1276 +5684:2:1284 +5685:2:1285 +5686:2:1289 +5687:2:1290 +5688:2:1284 +5689:2:1285 +5690:2:1289 +5691:2:1290 +5692:2:1298 +5693:2:1303 +5694:2:1307 +5695:2:1308 +5696:2:1315 +5697:2:1316 +5698:2:1327 +5699:2:1328 +5700:2:1329 +5701:2:1327 +5702:2:1328 +5703:2:1329 +5704:2:1340 +5705:2:1345 +5706:2:1346 +5707:0:4365 +5708:2:1358 +5709:0:4365 +5710:2:1360 +5711:0:4365 +5712:3:4069 +5713:0:4365 +5714:2:1361 +5715:0:4365 +5716:3:4070 +5717:0:4365 +5718:2:1362 +5719:2:1366 +5720:2:1367 +5721:2:1375 +5722:2:1376 +5723:2:1380 +5724:2:1381 +5725:2:1375 +5726:2:1376 +5727:2:1380 +5728:2:1381 +5729:2:1389 +5730:2:1394 +5731:2:1398 +5732:2:1399 +5733:2:1406 +5734:2:1407 +5735:2:1418 +5736:2:1419 +5737:2:1420 +5738:2:1418 +5739:2:1419 +5740:2:1420 +5741:2:1431 +5742:2:1436 +5743:2:1437 +5744:0:4365 +5745:2:1449 +5746:0:4365 +5747:3:4069 +5748:0:4365 +5749:2:1451 +5750:0:4365 +5751:3:4070 +5752:0:4365 +5753:2:1652 +5754:0:4365 +5755:2:1653 +5756:0:4365 +5757:2:1657 +5758:0:4365 +5759:2:1180 +5760:0:4365 +5761:3:4069 +5762:0:4365 +5763:2:1181 +5764:2:1185 +5765:2:1186 +5766:2:1194 +5767:2:1195 +5768:2:1199 +5769:2:1200 +5770:2:1194 +5771:2:1195 +5772:2:1196 +5773:2:1208 +5774:2:1213 +5775:2:1217 +5776:2:1218 +5777:2:1225 +5778:2:1226 +5779:2:1237 +5780:2:1238 +5781:2:1239 +5782:2:1237 +5783:2:1238 +5784:2:1239 +5785:2:1250 +5786:2:1255 +5787:2:1256 +5788:0:4365 +5789:3:4070 +5790:0:4365 +5791:2:1268 +5792:0:4365 +5793:3:4069 +5794:0:4365 +5795:2:1270 +5796:0:4365 +5797:3:4070 +5798:0:4365 +5799:2:1271 +5800:2:1275 +5801:2:1276 +5802:2:1284 +5803:2:1285 +5804:2:1289 +5805:2:1290 +5806:2:1284 +5807:2:1285 +5808:2:1289 +5809:2:1290 +5810:2:1298 +5811:2:1303 +5812:2:1307 +5813:2:1308 +5814:2:1315 +5815:2:1316 +5816:2:1327 +5817:2:1328 +5818:2:1329 +5819:2:1327 +5820:2:1328 +5821:2:1329 +5822:2:1340 +5823:2:1345 +5824:2:1346 +5825:0:4365 +5826:2:1358 +5827:0:4365 +5828:2:1454 +5829:0:4365 +5830:3:4069 +5831:0:4365 +5832:2:1455 +5833:0:4365 +5834:3:4070 +5835:0:4365 +5836:2:1652 +5837:0:4365 +5838:2:1653 +5839:0:4365 +5840:2:1657 +5841:0:4365 +5842:2:1660 +5843:0:4365 +5844:3:4069 +5845:0:4365 +5846:2:1665 +5847:2:1669 +5848:2:1670 +5849:2:1678 +5850:2:1679 +5851:2:1683 +5852:2:1684 +5853:2:1678 +5854:2:1679 +5855:2:1680 +5856:2:1692 +5857:2:1697 +5858:2:1701 +5859:2:1702 +5860:2:1709 +5861:2:1710 +5862:2:1721 +5863:2:1722 +5864:2:1723 +5865:2:1721 +5866:2:1722 +5867:2:1723 +5868:2:1734 +5869:2:1739 +5870:2:1740 +5871:0:4365 +5872:3:4070 +5873:0:4365 +5874:2:1752 +5875:0:4365 +5876:3:4069 +5877:0:4365 +5878:2:1754 +5879:0:4365 +5880:3:4070 +5881:0:4365 +5882:2:1755 +5883:2:1759 +5884:2:1760 +5885:2:1768 +5886:2:1769 +5887:2:1773 +5888:2:1774 +5889:2:1768 +5890:2:1769 +5891:2:1773 +5892:2:1774 +5893:2:1782 +5894:2:1787 +5895:2:1791 +5896:2:1792 +5897:2:1799 +5898:2:1800 +5899:2:1811 +5900:2:1812 +5901:2:1813 +5902:2:1811 +5903:2:1812 +5904:2:1813 +5905:2:1824 +5906:2:1829 +5907:2:1830 +5908:0:4365 +5909:2:1842 +5910:0:4365 +5911:3:4069 +5912:0:4365 +5913:2:1844 +5914:0:4365 +5915:3:4070 +5916:0:4365 +5917:2:1845 +5918:2:1849 +5919:2:1850 +5920:2:1858 +5921:2:1859 +5922:2:1863 +5923:2:1864 +5924:2:1858 +5925:2:1859 +5926:2:1863 +5927:2:1864 +5928:2:1872 +5929:2:1877 +5930:2:1881 +5931:2:1882 +5932:2:1889 +5933:2:1890 +5934:2:1901 +5935:2:1902 +5936:2:1903 +5937:2:1901 +5938:2:1902 +5939:2:1903 +5940:2:1914 +5941:2:1919 +5942:2:1920 +5943:0:4365 +5944:2:1932 +5945:0:4365 +5946:3:4069 +5947:0:4365 +5948:2:1934 +5949:0:4365 +5950:3:4070 +5951:0:4365 +5952:2:1935 +5953:0:4365 +5954:2:1936 +5955:0:4365 +5956:2:2129 +5957:0:4365 +5958:2:2130 +5959:0:4365 +5960:2:2134 +5961:0:4365 +5962:3:4069 +5963:0:4365 +5964:2:2136 +5965:0:4365 +5966:3:4070 +5967:0:4365 +5968:2:2137 +5969:2:2141 +5970:2:2142 +5971:2:2150 +5972:2:2151 +5973:2:2155 +5974:2:2156 +5975:2:2150 +5976:2:2151 +5977:2:2155 +5978:2:2156 +5979:2:2164 +5980:2:2169 +5981:2:2173 +5982:2:2174 +5983:2:2181 +5984:2:2182 +5985:2:2193 +5986:2:2194 +5987:2:2195 +5988:2:2193 +5989:2:2194 +5990:2:2195 +5991:2:2206 +5992:2:2211 +5993:2:2212 +5994:0:4365 +5995:2:2224 +5996:0:4365 +5997:3:4069 +5998:0:4365 +5999:2:2226 +6000:0:4365 +6001:3:4070 +6002:0:4365 +6003:2:1936 +6004:0:4365 +6005:2:2129 +6006:0:4365 +6007:2:2130 +6008:0:4365 +6009:2:2134 +6010:0:4365 +6011:3:4069 +6012:0:4365 +6013:2:2136 +6014:0:4365 +6015:3:4070 +6016:0:4365 +6017:2:2137 +6018:2:2141 +6019:2:2142 +6020:2:2150 +6021:2:2151 +6022:2:2155 +6023:2:2156 +6024:2:2150 +6025:2:2151 +6026:2:2152 +6027:2:2164 +6028:2:2169 +6029:2:2173 +6030:2:2174 +6031:2:2181 +6032:2:2182 +6033:2:2193 +6034:2:2194 +6035:2:2195 +6036:2:2193 +6037:2:2194 +6038:2:2195 +6039:2:2206 +6040:2:2211 +6041:2:2212 +6042:0:4365 +6043:2:2224 +6044:0:4365 +6045:3:4069 +6046:0:4365 +6047:2:2226 +6048:0:4365 +6049:3:4070 +6050:0:4365 +6051:2:2230 +6052:0:4365 +6053:3:4069 +6054:0:4365 +6055:2:2235 +6056:2:2239 +6057:2:2240 +6058:2:2248 +6059:2:2249 +6060:2:2253 +6061:2:2254 +6062:2:2248 +6063:2:2249 +6064:2:2250 +6065:2:2262 +6066:2:2267 +6067:2:2271 +6068:2:2272 +6069:2:2279 +6070:2:2280 +6071:2:2291 +6072:2:2292 +6073:2:2293 +6074:2:2291 +6075:2:2292 +6076:2:2293 +6077:2:2304 +6078:2:2309 +6079:2:2310 +6080:0:4365 +6081:3:4070 +6082:0:4365 +6083:2:2322 +6084:0:4365 +6085:2:1169 +6086:0:4365 +6087:3:4069 +6088:0:4365 +6089:2:1170 +6090:0:4365 +6091:3:4070 +6092:0:4365 +6093:3:4071 +6094:0:4365 +6095:3:4081 +6096:0:4365 +6097:3:3666 +6098:0:4365 +6099:3:3667 +6100:0:4365 +6101:3:3668 +6102:0:4365 +6103:3:3669 +6104:3:3673 +6105:3:3674 +6106:3:3682 +6107:3:3683 +6108:3:3687 +6109:3:3688 +6110:3:3682 +6111:3:3683 +6112:3:3687 +6113:3:3688 +6114:3:3696 +6115:3:3701 +6116:3:3705 +6117:3:3706 +6118:3:3713 +6119:3:3714 +6120:3:3725 +6121:3:3726 +6122:3:3727 +6123:3:3725 +6124:3:3726 +6125:3:3727 +6126:3:3738 +6127:3:3743 +6128:3:3744 +6129:0:4365 +6130:3:3756 +6131:0:4365 +6132:3:3757 +6133:0:4365 +6134:2:1173 +6135:0:4365 +6136:3:3758 +6137:0:4365 +6138:2:1179 +6139:0:4365 +6140:2:1180 +6141:0:4365 +6142:3:3757 +6143:0:4365 +6144:2:1181 +6145:2:1185 +6146:2:1186 +6147:2:1194 +6148:2:1195 +6149:2:1199 +6150:2:1200 +6151:2:1194 +6152:2:1195 +6153:2:1199 +6154:2:1200 +6155:2:1208 +6156:2:1213 +6157:2:1217 +6158:2:1218 +6159:2:1225 +6160:2:1226 +6161:2:1237 +6162:2:1238 +6163:2:1239 +6164:2:1237 +6165:2:1238 +6166:2:1239 +6167:2:1250 +6168:2:1255 +6169:2:1256 +6170:0:4365 +6171:3:3758 +6172:0:4365 +6173:2:1268 +6174:0:4365 +6175:3:3757 +6176:0:4365 +6177:2:1270 +6178:0:4365 +6179:3:3758 +6180:0:4365 +6181:2:1271 +6182:2:1275 +6183:2:1276 +6184:2:1284 +6185:2:1285 +6186:2:1289 +6187:2:1290 +6188:2:1284 +6189:2:1285 +6190:2:1289 +6191:2:1290 +6192:2:1298 +6193:2:1303 +6194:2:1307 +6195:2:1308 +6196:2:1315 +6197:2:1316 +6198:2:1327 +6199:2:1328 +6200:2:1329 +6201:2:1327 +6202:2:1328 +6203:2:1329 +6204:2:1340 +6205:2:1345 +6206:2:1346 +6207:0:4365 +6208:2:1358 +6209:0:4365 +6210:2:1360 +6211:0:4365 +6212:3:3757 +6213:0:4365 +6214:2:1361 +6215:0:4365 +6216:3:3758 +6217:0:4365 +6218:2:1362 +6219:2:1366 +6220:2:1367 +6221:2:1375 +6222:2:1376 +6223:2:1380 +6224:2:1381 +6225:2:1375 +6226:2:1376 +6227:2:1380 +6228:2:1381 +6229:2:1389 +6230:2:1394 +6231:2:1398 +6232:2:1399 +6233:2:1406 +6234:2:1407 +6235:2:1418 +6236:2:1419 +6237:2:1420 +6238:2:1418 +6239:2:1419 +6240:2:1420 +6241:2:1431 +6242:2:1436 +6243:2:1437 +6244:0:4365 +6245:2:1449 +6246:0:4365 +6247:3:3757 +6248:0:4365 +6249:2:1451 +6250:0:4365 +6251:3:3758 +6252:0:4365 +6253:2:1652 +6254:0:4365 +6255:2:1653 +6256:0:4365 +6257:2:1657 +6258:0:4365 +6259:2:1180 +6260:0:4365 +6261:3:3757 +6262:0:4365 +6263:2:1181 +6264:2:1185 +6265:2:1186 +6266:2:1194 +6267:2:1195 +6268:2:1199 +6269:2:1200 +6270:2:1194 +6271:2:1195 +6272:2:1196 +6273:2:1208 +6274:2:1213 +6275:2:1217 +6276:2:1218 +6277:2:1225 +6278:2:1226 +6279:2:1237 +6280:2:1238 +6281:2:1239 +6282:2:1237 +6283:2:1238 +6284:2:1239 +6285:2:1250 +6286:2:1255 +6287:2:1256 +6288:0:4365 +6289:3:3758 +6290:0:4365 +6291:2:1268 +6292:0:4365 +6293:3:3757 +6294:0:4365 +6295:2:1270 +6296:0:4365 +6297:3:3758 +6298:0:4365 +6299:2:1271 +6300:2:1275 +6301:2:1276 +6302:2:1284 +6303:2:1285 +6304:2:1289 +6305:2:1290 +6306:2:1284 +6307:2:1285 +6308:2:1289 +6309:2:1290 +6310:2:1298 +6311:2:1303 +6312:2:1307 +6313:2:1308 +6314:2:1315 +6315:2:1316 +6316:2:1327 +6317:2:1328 +6318:2:1329 +6319:2:1327 +6320:2:1328 +6321:2:1329 +6322:2:1340 +6323:2:1345 +6324:2:1346 +6325:0:4365 +6326:2:1358 +6327:0:4365 +6328:2:1454 +6329:0:4365 +6330:3:3757 +6331:0:4365 +6332:2:1455 +6333:0:4365 +6334:3:3758 +6335:0:4365 +6336:2:1652 +6337:0:4365 +6338:2:1653 +6339:0:4365 +6340:2:1657 +6341:0:4365 +6342:2:1660 +6343:0:4365 +6344:3:3757 +6345:0:4365 +6346:2:1665 +6347:2:1669 +6348:2:1670 +6349:2:1678 +6350:2:1679 +6351:2:1683 +6352:2:1684 +6353:2:1678 +6354:2:1679 +6355:2:1680 +6356:2:1692 +6357:2:1697 +6358:2:1701 +6359:2:1702 +6360:2:1709 +6361:2:1710 +6362:2:1721 +6363:2:1722 +6364:2:1723 +6365:2:1721 +6366:2:1722 +6367:2:1723 +6368:2:1734 +6369:2:1739 +6370:2:1740 +6371:0:4365 +6372:3:3758 +6373:0:4365 +6374:2:1752 +6375:0:4365 +6376:3:3757 +6377:0:4365 +6378:2:1754 +6379:0:4365 +6380:3:3758 +6381:0:4365 +6382:2:1755 +6383:2:1759 +6384:2:1760 +6385:2:1768 +6386:2:1769 +6387:2:1773 +6388:2:1774 +6389:2:1768 +6390:2:1769 +6391:2:1773 +6392:2:1774 +6393:2:1782 +6394:2:1787 +6395:2:1791 +6396:2:1792 +6397:2:1799 +6398:2:1800 +6399:2:1811 +6400:2:1812 +6401:2:1813 +6402:2:1811 +6403:2:1812 +6404:2:1813 +6405:2:1824 +6406:2:1829 +6407:2:1830 +6408:0:4365 +6409:2:1842 +6410:0:4365 +6411:3:3757 +6412:0:4365 +6413:2:1844 +6414:0:4365 +6415:3:3758 +6416:0:4365 +6417:2:1845 +6418:2:1849 +6419:2:1850 +6420:2:1858 +6421:2:1859 +6422:2:1863 +6423:2:1864 +6424:2:1858 +6425:2:1859 +6426:2:1863 +6427:2:1864 +6428:2:1872 +6429:2:1877 +6430:2:1881 +6431:2:1882 +6432:2:1889 +6433:2:1890 +6434:2:1901 +6435:2:1902 +6436:2:1903 +6437:2:1901 +6438:2:1902 +6439:2:1903 +6440:2:1914 +6441:2:1919 +6442:2:1920 +6443:0:4365 +6444:2:1932 +6445:0:4365 +6446:3:3757 +6447:0:4365 +6448:2:1934 +6449:0:4365 +6450:3:3758 +6451:0:4365 +6452:2:1935 +6453:0:4365 +6454:2:1936 +6455:0:4365 +6456:2:2129 +6457:0:4365 +6458:2:2130 +6459:0:4365 +6460:2:2134 +6461:0:4365 +6462:3:3757 +6463:0:4365 +6464:2:2136 +6465:0:4365 +6466:3:3758 +6467:0:4365 +6468:2:2137 +6469:2:2141 +6470:2:2142 +6471:2:2150 +6472:2:2151 +6473:2:2155 +6474:2:2156 +6475:2:2150 +6476:2:2151 +6477:2:2155 +6478:2:2156 +6479:2:2164 +6480:2:2169 +6481:2:2173 +6482:2:2174 +6483:2:2181 +6484:2:2182 +6485:2:2193 +6486:2:2194 +6487:2:2195 +6488:2:2193 +6489:2:2194 +6490:2:2195 +6491:2:2206 +6492:2:2211 +6493:2:2212 +6494:0:4365 +6495:2:2224 +6496:0:4365 +6497:3:3757 +6498:0:4365 +6499:2:2226 +6500:0:4365 +6501:3:3758 +6502:0:4365 +6503:2:1936 +6504:0:4365 +6505:2:2129 +6506:0:4365 +6507:2:2130 +6508:0:4365 +6509:2:2134 +6510:0:4365 +6511:3:3757 +6512:0:4365 +6513:2:2136 +6514:0:4365 +6515:3:3758 +6516:0:4365 +6517:2:2137 +6518:2:2141 +6519:2:2142 +6520:2:2150 +6521:2:2151 +6522:2:2155 +6523:2:2156 +6524:2:2150 +6525:2:2151 +6526:2:2152 +6527:2:2164 +6528:2:2169 +6529:2:2173 +6530:2:2174 +6531:2:2181 +6532:2:2182 +6533:2:2193 +6534:2:2194 +6535:2:2195 +6536:2:2193 +6537:2:2194 +6538:2:2195 +6539:2:2206 +6540:2:2211 +6541:2:2212 +6542:0:4365 +6543:2:2224 +6544:0:4365 +6545:3:3757 +6546:0:4365 +6547:2:2226 +6548:0:4365 +6549:3:3758 +6550:0:4365 +6551:2:2230 +6552:0:4365 +6553:3:3757 +6554:0:4365 +6555:2:2235 +6556:2:2239 +6557:2:2240 +6558:2:2248 +6559:2:2249 +6560:2:2253 +6561:2:2254 +6562:2:2248 +6563:2:2249 +6564:2:2250 +6565:2:2262 +6566:2:2267 +6567:2:2271 +6568:2:2272 +6569:2:2279 +6570:2:2280 +6571:2:2291 +6572:2:2292 +6573:2:2293 +6574:2:2291 +6575:2:2292 +6576:2:2293 +6577:2:2304 +6578:2:2309 +6579:2:2310 +6580:0:4365 +6581:3:3758 +6582:0:4365 +6583:2:2322 +6584:0:4365 +6585:2:1169 +6586:0:4365 +6587:3:3757 +6588:0:4365 +6589:2:1170 +6590:0:4365 +6591:3:3758 +6592:0:4365 +6593:3:3759 +6594:0:4365 +6595:3:3972 +6596:0:4365 +6597:3:4077 +6598:0:4365 +6599:3:4078 +6600:0:4365 +6601:3:4082 +6602:0:4365 +6603:3:4088 +6604:0:4365 +6605:3:4092 +6606:3:4093 +6607:3:4097 +6608:3:4101 +6609:3:4102 +6610:3:4097 +6611:3:4101 +6612:3:4102 +6613:3:4106 +6614:3:4114 +6615:3:4115 +6616:3:4120 +6617:3:4127 +6618:3:4128 +6619:3:4127 +6620:3:4128 +6621:3:4135 +6622:3:4140 +6623:0:4365 +6624:3:4151 +6625:0:4365 +6626:3:4155 +6627:3:4156 +6628:3:4160 +6629:3:4164 +6630:3:4165 +6631:3:4160 +6632:3:4164 +6633:3:4165 +6634:3:4169 +6635:3:4177 +6636:3:4178 +6637:3:4183 +6638:3:4190 +6639:3:4191 +6640:3:4190 +6641:3:4191 +6642:3:4198 +6643:3:4203 +6644:0:4365 +6645:3:4151 +6646:0:4365 +6647:3:4155 +6648:3:4156 +6649:3:4160 +6650:3:4164 +6651:3:4165 +6652:3:4160 +6653:3:4164 +6654:3:4165 +6655:3:4169 +6656:3:4177 +6657:3:4178 +6658:3:4183 +6659:3:4190 +6660:3:4191 +6661:3:4190 +6662:3:4191 +6663:3:4198 +6664:3:4203 +6665:0:4365 +6666:3:4214 +6667:0:4365 +6668:3:4222 +6669:3:4223 +6670:3:4227 +6671:3:4231 +6672:3:4232 +6673:3:4227 +6674:3:4231 +6675:3:4232 +6676:3:4236 +6677:3:4244 +6678:3:4245 +6679:3:4250 +6680:3:4257 +6681:3:4258 +6682:3:4257 +6683:3:4258 +6684:3:4265 +6685:3:4270 +6686:0:4365 +6687:3:4285 +6688:0:4365 +6689:3:4286 +6690:0:4365 +6691:2:1173 +6692:0:4365 +6693:3:4287 +6694:0:4365 +6695:2:1179 +6696:0:4365 +6697:2:1180 +6698:0:4365 +6699:3:4286 +6700:0:4365 +6701:2:1181 +6702:2:1185 +6703:2:1186 +6704:2:1194 +6705:2:1195 +6706:2:1199 +6707:2:1200 +6708:2:1194 +6709:2:1195 +6710:2:1199 +6711:2:1200 +6712:2:1208 +6713:2:1213 +6714:2:1217 +6715:2:1218 +6716:2:1225 +6717:2:1226 +6718:2:1237 +6719:2:1238 +6720:2:1239 +6721:2:1237 +6722:2:1238 +6723:2:1239 +6724:2:1250 +6725:2:1255 +6726:2:1256 +6727:0:4365 +6728:3:4287 +6729:0:4365 +6730:2:1268 +6731:0:4365 +6732:3:4286 +6733:0:4365 +6734:2:1270 +6735:0:4365 +6736:3:4287 +6737:0:4365 +6738:2:1271 +6739:2:1275 +6740:2:1276 +6741:2:1284 +6742:2:1285 +6743:2:1289 +6744:2:1290 +6745:2:1284 +6746:2:1285 +6747:2:1289 +6748:2:1290 +6749:2:1298 +6750:2:1303 +6751:2:1307 +6752:2:1308 +6753:2:1315 +6754:2:1316 +6755:2:1327 +6756:2:1328 +6757:2:1329 +6758:2:1327 +6759:2:1328 +6760:2:1329 +6761:2:1340 +6762:2:1345 +6763:2:1346 +6764:0:4365 +6765:2:1358 +6766:0:4365 +6767:2:1360 +6768:0:4365 +6769:3:4286 +6770:0:4365 +6771:2:1361 +6772:0:4365 +6773:3:4287 +6774:0:4365 +6775:2:1362 +6776:2:1366 +6777:2:1367 +6778:2:1375 +6779:2:1376 +6780:2:1380 +6781:2:1381 +6782:2:1375 +6783:2:1376 +6784:2:1380 +6785:2:1381 +6786:2:1389 +6787:2:1394 +6788:2:1398 +6789:2:1399 +6790:2:1406 +6791:2:1407 +6792:2:1418 +6793:2:1419 +6794:2:1420 +6795:2:1418 +6796:2:1419 +6797:2:1420 +6798:2:1431 +6799:2:1436 +6800:2:1437 +6801:0:4365 +6802:2:1449 +6803:0:4365 +6804:3:4286 +6805:0:4365 +6806:2:1451 +6807:0:4365 +6808:3:4287 +6809:0:4365 +6810:2:1652 +6811:0:4365 +6812:2:1653 +6813:0:4365 +6814:2:1657 +6815:0:4365 +6816:2:1180 +6817:0:4365 +6818:3:4286 +6819:0:4365 +6820:2:1181 +6821:2:1185 +6822:2:1186 +6823:2:1194 +6824:2:1195 +6825:2:1199 +6826:2:1200 +6827:2:1194 +6828:2:1195 +6829:2:1196 +6830:2:1208 +6831:2:1213 +6832:2:1217 +6833:2:1218 +6834:2:1225 +6835:2:1226 +6836:2:1237 +6837:2:1238 +6838:2:1239 +6839:2:1237 +6840:2:1238 +6841:2:1239 +6842:2:1250 +6843:2:1255 +6844:2:1256 +6845:0:4365 +6846:3:4287 +6847:0:4365 +6848:2:1268 +6849:0:4365 +6850:3:4286 +6851:0:4365 +6852:2:1270 +6853:0:4365 +6854:3:4287 +6855:0:4365 +6856:2:1271 +6857:2:1275 +6858:2:1276 +6859:2:1284 +6860:2:1285 +6861:2:1289 +6862:2:1290 +6863:2:1284 +6864:2:1285 +6865:2:1289 +6866:2:1290 +6867:2:1298 +6868:2:1303 +6869:2:1307 +6870:2:1308 +6871:2:1315 +6872:2:1316 +6873:2:1327 +6874:2:1328 +6875:2:1329 +6876:2:1327 +6877:2:1328 +6878:2:1329 +6879:2:1340 +6880:2:1345 +6881:2:1346 +6882:0:4365 +6883:2:1358 +6884:0:4365 +6885:2:1454 +6886:0:4365 +6887:3:4286 +6888:0:4365 +6889:2:1455 +6890:0:4365 +6891:3:4287 +6892:0:4365 +6893:2:1652 +6894:0:4365 +6895:2:1653 +6896:0:4365 +6897:2:1657 +6898:0:4365 +6899:2:1660 +6900:0:4365 +6901:3:4286 +6902:0:4365 +6903:2:1665 +6904:2:1669 +6905:2:1670 +6906:2:1678 +6907:2:1679 +6908:2:1683 +6909:2:1684 +6910:2:1678 +6911:2:1679 +6912:2:1680 +6913:2:1692 +6914:2:1697 +6915:2:1701 +6916:2:1702 +6917:2:1709 +6918:2:1710 +6919:2:1721 +6920:2:1722 +6921:2:1723 +6922:2:1721 +6923:2:1722 +6924:2:1723 +6925:2:1734 +6926:2:1739 +6927:2:1740 +6928:0:4365 +6929:3:4287 +6930:0:4365 +6931:2:1752 +6932:0:4365 +6933:3:4286 +6934:0:4365 +6935:2:1754 +6936:0:4365 +6937:3:4287 +6938:0:4365 +6939:2:1755 +6940:2:1759 +6941:2:1760 +6942:2:1768 +6943:2:1769 +6944:2:1773 +6945:2:1774 +6946:2:1768 +6947:2:1769 +6948:2:1773 +6949:2:1774 +6950:2:1782 +6951:2:1787 +6952:2:1791 +6953:2:1792 +6954:2:1799 +6955:2:1800 +6956:2:1811 +6957:2:1812 +6958:2:1813 +6959:2:1811 +6960:2:1812 +6961:2:1813 +6962:2:1824 +6963:2:1829 +6964:2:1830 +6965:0:4365 +6966:2:1842 +6967:0:4365 +6968:3:4286 +6969:0:4365 +6970:2:1844 +6971:0:4365 +6972:3:4287 +6973:0:4365 +6974:2:1845 +6975:2:1849 +6976:2:1850 +6977:2:1858 +6978:2:1859 +6979:2:1863 +6980:2:1864 +6981:2:1858 +6982:2:1859 +6983:2:1863 +6984:2:1864 +6985:2:1872 +6986:2:1877 +6987:2:1881 +6988:2:1882 +6989:2:1889 +6990:2:1890 +6991:2:1901 +6992:2:1902 +6993:2:1903 +6994:2:1901 +6995:2:1902 +6996:2:1903 +6997:2:1914 +6998:2:1919 +6999:2:1920 +7000:0:4365 +7001:2:1932 +7002:0:4365 +7003:3:4286 +7004:0:4365 +7005:2:1934 +7006:0:4365 +7007:3:4287 +7008:0:4365 +7009:2:1935 +7010:0:4365 +7011:2:1936 +7012:0:4365 +7013:2:2129 +7014:0:4365 +7015:2:2130 +7016:0:4365 +7017:2:2134 +7018:0:4365 +7019:3:4286 +7020:0:4365 +7021:2:2136 +7022:0:4365 +7023:3:4287 +7024:0:4365 +7025:2:2137 +7026:2:2141 +7027:2:2142 +7028:2:2150 +7029:2:2151 +7030:2:2155 +7031:2:2156 +7032:2:2150 +7033:2:2151 +7034:2:2155 +7035:2:2156 +7036:2:2164 +7037:2:2169 +7038:2:2173 +7039:2:2174 +7040:2:2181 +7041:2:2182 +7042:2:2193 +7043:2:2194 +7044:2:2195 +7045:2:2193 +7046:2:2194 +7047:2:2195 +7048:2:2206 +7049:2:2211 +7050:2:2212 +7051:0:4365 +7052:2:2224 +7053:0:4365 +7054:3:4286 +7055:0:4365 +7056:2:2226 +7057:0:4365 +7058:3:4287 +7059:0:4365 +7060:2:1936 +7061:0:4365 +7062:2:2129 +7063:0:4365 +7064:2:2130 +7065:0:4365 +7066:2:2134 +7067:0:4365 +7068:3:4286 +7069:0:4365 +7070:2:2136 +7071:0:4365 +7072:3:4287 +7073:0:4365 +7074:2:2137 +7075:2:2141 +7076:2:2142 +7077:2:2150 +7078:2:2151 +7079:2:2155 +7080:2:2156 +7081:2:2150 +7082:2:2151 +7083:2:2152 +7084:2:2164 +7085:2:2169 +7086:2:2173 +7087:2:2174 +7088:2:2181 +7089:2:2182 +7090:2:2193 +7091:2:2194 +7092:2:2195 +7093:2:2193 +7094:2:2194 +7095:2:2195 +7096:2:2206 +7097:2:2211 +7098:2:2212 +7099:0:4365 +7100:2:2224 +7101:0:4365 +7102:3:4286 +7103:0:4365 +7104:2:2226 +7105:0:4365 +7106:3:4287 +7107:0:4365 +7108:2:2230 +7109:0:4365 +7110:3:4286 +7111:0:4365 +7112:2:2235 +7113:2:2239 +7114:2:2240 +7115:2:2248 +7116:2:2249 +7117:2:2253 +7118:2:2254 +7119:2:2248 +7120:2:2249 +7121:2:2250 +7122:2:2262 +7123:2:2267 +7124:2:2271 +7125:2:2272 +7126:2:2279 +7127:2:2280 +7128:2:2291 +7129:2:2292 +7130:2:2293 +7131:2:2291 +7132:2:2292 +7133:2:2293 +7134:2:2304 +7135:2:2309 +7136:2:2310 +7137:0:4365 +7138:3:4287 +7139:0:4365 +7140:2:2322 +7141:0:4365 +7142:2:1169 +7143:0:4365 +7144:3:4286 +7145:0:4365 +7146:2:1170 +7147:0:4365 +7148:3:4287 +7149:0:4365 +7150:3:4288 +7151:0:4365 +7152:3:4294 +7153:0:4365 +7154:3:4295 +7155:0:4365 +7156:3:2338 +7157:0:4365 +7158:3:2339 +7159:3:2343 +7160:3:2344 +7161:3:2352 +7162:3:2353 +7163:3:2357 +7164:3:2358 +7165:3:2352 +7166:3:2353 +7167:3:2357 +7168:3:2358 +7169:3:2366 +7170:3:2371 +7171:3:2375 +7172:3:2376 +7173:3:2383 +7174:3:2384 +7175:3:2395 +7176:3:2396 +7177:3:2397 +7178:3:2395 +7179:3:2396 +7180:3:2397 +7181:3:2408 +7182:3:2413 +7183:3:2414 +7184:0:4365 +7185:3:2426 +7186:0:4365 +7187:3:2427 +7188:0:4365 +7189:2:1173 +7190:0:4365 +7191:3:2428 +7192:0:4365 +7193:2:1179 +7194:0:4365 +7195:2:1180 +7196:0:4365 +7197:3:2427 +7198:0:4365 +7199:2:1181 +7200:2:1185 +7201:2:1186 +7202:2:1194 +7203:2:1195 +7204:2:1199 +7205:2:1200 +7206:2:1194 +7207:2:1195 +7208:2:1199 +7209:2:1200 +7210:2:1208 +7211:2:1213 +7212:2:1217 +7213:2:1218 +7214:2:1225 +7215:2:1226 +7216:2:1237 +7217:2:1238 +7218:2:1239 +7219:2:1237 +7220:2:1238 +7221:2:1239 +7222:2:1250 +7223:2:1255 +7224:2:1256 +7225:0:4365 +7226:3:2428 +7227:0:4365 +7228:2:1268 +7229:0:4365 +7230:3:2427 +7231:0:4365 +7232:2:1270 +7233:0:4365 +7234:3:2428 +7235:0:4365 +7236:2:1271 +7237:2:1275 +7238:2:1276 +7239:2:1284 +7240:2:1285 +7241:2:1289 +7242:2:1290 +7243:2:1284 +7244:2:1285 +7245:2:1289 +7246:2:1290 +7247:2:1298 +7248:2:1303 +7249:2:1307 +7250:2:1308 +7251:2:1315 +7252:2:1316 +7253:2:1327 +7254:2:1328 +7255:2:1329 +7256:2:1327 +7257:2:1328 +7258:2:1329 +7259:2:1340 +7260:2:1345 +7261:2:1346 +7262:0:4365 +7263:2:1358 +7264:0:4365 +7265:2:1360 +7266:0:4365 +7267:3:2427 +7268:0:4365 +7269:2:1361 +7270:0:4365 +7271:3:2428 +7272:0:4365 +7273:2:1362 +7274:2:1366 +7275:2:1367 +7276:2:1375 +7277:2:1376 +7278:2:1380 +7279:2:1381 +7280:2:1375 +7281:2:1376 +7282:2:1380 +7283:2:1381 +7284:2:1389 +7285:2:1394 +7286:2:1398 +7287:2:1399 +7288:2:1406 +7289:2:1407 +7290:2:1418 +7291:2:1419 +7292:2:1420 +7293:2:1418 +7294:2:1419 +7295:2:1420 +7296:2:1431 +7297:2:1436 +7298:2:1437 +7299:0:4365 +7300:2:1449 +7301:0:4365 +7302:3:2427 +7303:0:4365 +7304:2:1451 +7305:0:4365 +7306:3:2428 +7307:0:4365 +7308:2:1652 +7309:0:4365 +7310:2:1653 +7311:0:4365 +7312:2:1657 +7313:0:4365 +7314:2:1180 +7315:0:4365 +7316:3:2427 +7317:0:4365 +7318:2:1181 +7319:2:1185 +7320:2:1186 +7321:2:1194 +7322:2:1195 +7323:2:1199 +7324:2:1200 +7325:2:1194 +7326:2:1195 +7327:2:1196 +7328:2:1208 +7329:2:1213 +7330:2:1217 +7331:2:1218 +7332:2:1225 +7333:2:1226 +7334:2:1237 +7335:2:1238 +7336:2:1239 +7337:2:1237 +7338:2:1238 +7339:2:1239 +7340:2:1250 +7341:2:1255 +7342:2:1256 +7343:0:4365 +7344:3:2428 +7345:0:4365 +7346:2:1268 +7347:0:4365 +7348:3:2427 +7349:0:4365 +7350:2:1270 +7351:0:4365 +7352:3:2428 +7353:0:4365 +7354:2:1271 +7355:2:1275 +7356:2:1276 +7357:2:1284 +7358:2:1285 +7359:2:1289 +7360:2:1290 +7361:2:1284 +7362:2:1285 +7363:2:1289 +7364:2:1290 +7365:2:1298 +7366:2:1303 +7367:2:1307 +7368:2:1308 +7369:2:1315 +7370:2:1316 +7371:2:1327 +7372:2:1328 +7373:2:1329 +7374:2:1327 +7375:2:1328 +7376:2:1329 +7377:2:1340 +7378:2:1345 +7379:2:1346 +7380:0:4365 +7381:2:1358 +7382:0:4365 +7383:2:1454 +7384:0:4365 +7385:3:2427 +7386:0:4365 +7387:2:1455 +7388:0:4365 +7389:3:2428 +7390:0:4365 +7391:2:1652 +7392:0:4365 +7393:2:1653 +7394:0:4365 +7395:2:1657 +7396:0:4365 +7397:2:1660 +7398:0:4365 +7399:3:2427 +7400:0:4365 +7401:2:1665 +7402:2:1669 +7403:2:1670 +7404:2:1678 +7405:2:1679 +7406:2:1683 +7407:2:1684 +7408:2:1678 +7409:2:1679 +7410:2:1680 +7411:2:1692 +7412:2:1697 +7413:2:1701 +7414:2:1702 +7415:2:1709 +7416:2:1710 +7417:2:1721 +7418:2:1722 +7419:2:1723 +7420:2:1721 +7421:2:1722 +7422:2:1723 +7423:2:1734 +7424:2:1739 +7425:2:1740 +7426:0:4365 +7427:3:2428 +7428:0:4365 +7429:2:1752 +7430:0:4365 +7431:3:2427 +7432:0:4365 +7433:2:1754 +7434:0:4365 +7435:3:2428 +7436:0:4365 +7437:2:1755 +7438:2:1759 +7439:2:1760 +7440:2:1768 +7441:2:1769 +7442:2:1773 +7443:2:1774 +7444:2:1768 +7445:2:1769 +7446:2:1773 +7447:2:1774 +7448:2:1782 +7449:2:1787 +7450:2:1791 +7451:2:1792 +7452:2:1799 +7453:2:1800 +7454:2:1811 +7455:2:1812 +7456:2:1813 +7457:2:1811 +7458:2:1812 +7459:2:1813 +7460:2:1824 +7461:2:1829 +7462:2:1830 +7463:0:4365 +7464:2:1842 +7465:0:4365 +7466:3:2427 +7467:0:4365 +7468:2:1844 +7469:0:4365 +7470:3:2428 +7471:0:4365 +7472:2:1845 +7473:2:1849 +7474:2:1850 +7475:2:1858 +7476:2:1859 +7477:2:1863 +7478:2:1864 +7479:2:1858 +7480:2:1859 +7481:2:1863 +7482:2:1864 +7483:2:1872 +7484:2:1877 +7485:2:1881 +7486:2:1882 +7487:2:1889 +7488:2:1890 +7489:2:1901 +7490:2:1902 +7491:2:1903 +7492:2:1901 +7493:2:1902 +7494:2:1903 +7495:2:1914 +7496:2:1919 +7497:2:1920 +7498:0:4365 +7499:2:1932 +7500:0:4365 +7501:3:2427 +7502:0:4365 +7503:2:1934 +7504:0:4365 +7505:3:2428 +7506:0:4365 +7507:2:1935 +7508:0:4365 +7509:2:1936 +7510:0:4365 +7511:2:2129 +7512:0:4365 +7513:2:2130 +7514:0:4365 +7515:2:2134 +7516:0:4365 +7517:3:2427 +7518:0:4365 +7519:2:2136 +7520:0:4365 +7521:3:2428 +7522:0:4365 +7523:2:2137 +7524:2:2141 +7525:2:2142 +7526:2:2150 +7527:2:2151 +7528:2:2155 +7529:2:2156 +7530:2:2150 +7531:2:2151 +7532:2:2155 +7533:2:2156 +7534:2:2164 +7535:2:2169 +7536:2:2173 +7537:2:2174 +7538:2:2181 +7539:2:2182 +7540:2:2193 +7541:2:2194 +7542:2:2195 +7543:2:2193 +7544:2:2194 +7545:2:2195 +7546:2:2206 +7547:2:2211 +7548:2:2212 +7549:0:4365 +7550:2:2224 +7551:0:4365 +7552:3:2427 +7553:0:4365 +7554:2:2226 +7555:0:4365 +7556:3:2428 +7557:0:4365 +7558:2:1936 +7559:0:4365 +7560:2:2129 +7561:0:4365 +7562:2:2130 +7563:0:4365 +7564:2:2134 +7565:0:4365 +7566:3:2427 +7567:0:4365 +7568:2:2136 +7569:0:4365 +7570:3:2428 +7571:0:4365 +7572:2:2137 +7573:2:2141 +7574:2:2142 +7575:2:2150 +7576:2:2151 +7577:2:2155 +7578:2:2156 +7579:2:2150 +7580:2:2151 +7581:2:2152 +7582:2:2164 +7583:2:2169 +7584:2:2173 +7585:2:2174 +7586:2:2181 +7587:2:2182 +7588:2:2193 +7589:2:2194 +7590:2:2195 +7591:2:2193 +7592:2:2194 +7593:2:2195 +7594:2:2206 +7595:2:2211 +7596:2:2212 +7597:0:4365 +7598:2:2224 +7599:0:4365 +7600:3:2427 +7601:0:4365 +7602:2:2226 +7603:0:4365 +7604:3:2428 +7605:0:4365 +7606:2:2230 +7607:0:4365 +7608:3:2427 +7609:0:4365 +7610:2:2235 +7611:2:2239 +7612:2:2240 +7613:2:2248 +7614:2:2249 +7615:2:2253 +7616:2:2254 +7617:2:2248 +7618:2:2249 +7619:2:2250 +7620:2:2262 +7621:2:2267 +7622:2:2271 +7623:2:2272 +7624:2:2279 +7625:2:2280 +7626:2:2291 +7627:2:2292 +7628:2:2293 +7629:2:2291 +7630:2:2292 +7631:2:2293 +7632:2:2304 +7633:2:2309 +7634:2:2310 +7635:0:4365 +7636:3:2428 +7637:0:4365 +7638:2:2322 +7639:0:4365 +7640:2:1169 +7641:0:4365 +7642:3:2427 +7643:0:4365 +7644:2:1170 +7645:0:4365 +7646:3:2428 +7647:0:4365 +7648:3:2429 +7649:0:4365 +7650:3:2435 +7651:3:2436 +7652:0:4365 +7653:3:2440 +7654:3:2444 +7655:3:2445 +7656:3:2453 +7657:3:2454 +7658:3:2458 +7659:3:2459 +7660:3:2453 +7661:3:2454 +7662:3:2458 +7663:3:2459 +7664:3:2467 +7665:3:2472 +7666:3:2473 +7667:3:2484 +7668:3:2485 +7669:3:2496 +7670:3:2497 +7671:3:2498 +7672:3:2496 +7673:3:2497 +7674:3:2498 +7675:3:2509 +7676:3:2514 +7677:3:2515 +7678:0:4365 +7679:3:2527 +7680:0:4365 +7681:3:2528 +7682:0:4365 +7683:2:1173 +7684:0:4365 +7685:3:2529 +7686:0:4365 +7687:2:1179 +7688:0:4365 +7689:2:1180 +7690:0:4365 +7691:3:2528 +7692:0:4365 +7693:2:1181 +7694:2:1185 +7695:2:1186 +7696:2:1194 +7697:2:1195 +7698:2:1199 +7699:2:1200 +7700:2:1194 +7701:2:1195 +7702:2:1199 +7703:2:1200 +7704:2:1208 +7705:2:1213 +7706:2:1217 +7707:2:1218 +7708:2:1225 +7709:2:1226 +7710:2:1237 +7711:2:1238 +7712:2:1239 +7713:2:1237 +7714:2:1238 +7715:2:1239 +7716:2:1250 +7717:2:1255 +7718:2:1256 +7719:0:4365 +7720:3:2529 +7721:0:4365 +7722:2:1268 +7723:0:4365 +7724:3:2528 +7725:0:4365 +7726:2:1270 +7727:0:4365 +7728:3:2529 +7729:0:4365 +7730:2:1271 +7731:2:1275 +7732:2:1276 +7733:2:1284 +7734:2:1285 +7735:2:1289 +7736:2:1290 +7737:2:1284 +7738:2:1285 +7739:2:1289 +7740:2:1290 +7741:2:1298 +7742:2:1303 +7743:2:1307 +7744:2:1308 +7745:2:1315 +7746:2:1316 +7747:2:1327 +7748:2:1328 +7749:2:1329 +7750:2:1327 +7751:2:1328 +7752:2:1329 +7753:2:1340 +7754:2:1345 +7755:2:1346 +7756:0:4365 +7757:2:1358 +7758:0:4365 +7759:2:1360 +7760:0:4365 +7761:3:2528 +7762:0:4365 +7763:2:1361 +7764:0:4365 +7765:3:2529 +7766:0:4365 +7767:2:1362 +7768:2:1366 +7769:2:1367 +7770:2:1375 +7771:2:1376 +7772:2:1380 +7773:2:1381 +7774:2:1375 +7775:2:1376 +7776:2:1380 +7777:2:1381 +7778:2:1389 +7779:2:1394 +7780:2:1398 +7781:2:1399 +7782:2:1406 +7783:2:1407 +7784:2:1418 +7785:2:1419 +7786:2:1420 +7787:2:1418 +7788:2:1419 +7789:2:1420 +7790:2:1431 +7791:2:1436 +7792:2:1437 +7793:0:4365 +7794:2:1449 +7795:0:4365 +7796:3:2528 +7797:0:4365 +7798:2:1451 +7799:0:4365 +7800:3:2529 +7801:0:4365 +7802:2:1652 +7803:0:4365 +7804:2:1653 +7805:0:4365 +7806:2:1657 +7807:0:4365 +7808:2:1180 +7809:0:4365 +7810:3:2528 +7811:0:4365 +7812:2:1181 +7813:2:1185 +7814:2:1186 +7815:2:1194 +7816:2:1195 +7817:2:1199 +7818:2:1200 +7819:2:1194 +7820:2:1195 +7821:2:1196 +7822:2:1208 +7823:2:1213 +7824:2:1217 +7825:2:1218 +7826:2:1225 +7827:2:1226 +7828:2:1237 +7829:2:1238 +7830:2:1239 +7831:2:1237 +7832:2:1238 +7833:2:1239 +7834:2:1250 +7835:2:1255 +7836:2:1256 +7837:0:4365 +7838:3:2529 +7839:0:4365 +7840:2:1268 +7841:0:4365 +7842:3:2528 +7843:0:4365 +7844:2:1270 +7845:0:4365 +7846:3:2529 +7847:0:4365 +7848:2:1271 +7849:2:1275 +7850:2:1276 +7851:2:1284 +7852:2:1285 +7853:2:1289 +7854:2:1290 +7855:2:1284 +7856:2:1285 +7857:2:1289 +7858:2:1290 +7859:2:1298 +7860:2:1303 +7861:2:1307 +7862:2:1308 +7863:2:1315 +7864:2:1316 +7865:2:1327 +7866:2:1328 +7867:2:1329 +7868:2:1327 +7869:2:1328 +7870:2:1329 +7871:2:1340 +7872:2:1345 +7873:2:1346 +7874:0:4365 +7875:2:1358 +7876:0:4365 +7877:2:1454 +7878:0:4365 +7879:3:2528 +7880:0:4365 +7881:2:1455 +7882:0:4365 +7883:3:2529 +7884:0:4365 +7885:2:1652 +7886:0:4365 +7887:2:1653 +7888:0:4365 +7889:2:1657 +7890:0:4365 +7891:2:1660 +7892:0:4365 +7893:3:2528 +7894:0:4365 +7895:2:1665 +7896:2:1669 +7897:2:1670 +7898:2:1678 +7899:2:1679 +7900:2:1683 +7901:2:1684 +7902:2:1678 +7903:2:1679 +7904:2:1680 +7905:2:1692 +7906:2:1697 +7907:2:1701 +7908:2:1702 +7909:2:1709 +7910:2:1710 +7911:2:1721 +7912:2:1722 +7913:2:1723 +7914:2:1721 +7915:2:1722 +7916:2:1723 +7917:2:1734 +7918:2:1739 +7919:2:1740 +7920:0:4365 +7921:3:2529 +7922:0:4365 +7923:2:1752 +7924:0:4365 +7925:3:2528 +7926:0:4365 +7927:2:1754 +7928:0:4365 +7929:3:2529 +7930:0:4365 +7931:2:1755 +7932:2:1759 +7933:2:1760 +7934:2:1768 +7935:2:1769 +7936:2:1773 +7937:2:1774 +7938:2:1768 +7939:2:1769 +7940:2:1773 +7941:2:1774 +7942:2:1782 +7943:2:1787 +7944:2:1791 +7945:2:1792 +7946:2:1799 +7947:2:1800 +7948:2:1811 +7949:2:1812 +7950:2:1813 +7951:2:1811 +7952:2:1812 +7953:2:1813 +7954:2:1824 +7955:2:1829 +7956:2:1830 +7957:0:4365 +7958:2:1842 +7959:0:4365 +7960:3:2528 +7961:0:4365 +7962:2:1844 +7963:0:4365 +7964:3:2529 +7965:0:4365 +7966:2:1845 +7967:2:1849 +7968:2:1850 +7969:2:1858 +7970:2:1859 +7971:2:1863 +7972:2:1864 +7973:2:1858 +7974:2:1859 +7975:2:1863 +7976:2:1864 +7977:2:1872 +7978:2:1877 +7979:2:1881 +7980:2:1882 +7981:2:1889 +7982:2:1890 +7983:2:1901 +7984:2:1902 +7985:2:1903 +7986:2:1901 +7987:2:1902 +7988:2:1903 +7989:2:1914 +7990:2:1919 +7991:2:1920 +7992:0:4365 +7993:2:1932 +7994:0:4365 +7995:3:2528 +7996:0:4365 +7997:2:1934 +7998:0:4365 +7999:3:2529 +8000:0:4365 +8001:2:1935 +8002:0:4365 +8003:2:1936 +8004:0:4365 +8005:2:2129 +8006:0:4365 +8007:2:2130 +8008:0:4365 +8009:2:2134 +8010:0:4365 +8011:3:2528 +8012:0:4365 +8013:2:2136 +8014:0:4365 +8015:3:2529 +8016:0:4365 +8017:2:2137 +8018:2:2141 +8019:2:2142 +8020:2:2150 +8021:2:2151 +8022:2:2155 +8023:2:2156 +8024:2:2150 +8025:2:2151 +8026:2:2155 +8027:2:2156 +8028:2:2164 +8029:2:2169 +8030:2:2173 +8031:2:2174 +8032:2:2181 +8033:2:2182 +8034:2:2193 +8035:2:2194 +8036:2:2195 +8037:2:2193 +8038:2:2194 +8039:2:2195 +8040:2:2206 +8041:2:2211 +8042:2:2212 +8043:0:4365 +8044:2:2224 +8045:0:4365 +8046:3:2528 +8047:0:4365 +8048:2:2226 +8049:0:4365 +8050:3:2529 +8051:0:4365 +8052:2:1936 +8053:0:4365 +8054:2:2129 +8055:0:4365 +8056:2:2130 +8057:0:4365 +8058:2:2134 +8059:0:4365 +8060:3:2528 +8061:0:4365 +8062:2:2136 +8063:0:4365 +8064:3:2529 +8065:0:4365 +8066:2:2137 +8067:2:2141 +8068:2:2142 +8069:2:2150 +8070:2:2151 +8071:2:2155 +8072:2:2156 +8073:2:2150 +8074:2:2151 +8075:2:2152 +8076:2:2164 +8077:2:2169 +8078:2:2173 +8079:2:2174 +8080:2:2181 +8081:2:2182 +8082:2:2193 +8083:2:2194 +8084:2:2195 +8085:2:2193 +8086:2:2194 +8087:2:2195 +8088:2:2206 +8089:2:2211 +8090:2:2212 +8091:0:4365 +8092:2:2224 +8093:0:4365 +8094:3:2528 +8095:0:4365 +8096:2:2226 +8097:0:4365 +8098:3:2529 +8099:0:4365 +8100:2:2230 +8101:0:4365 +8102:3:2528 +8103:0:4365 +8104:2:2235 +8105:2:2239 +8106:2:2240 +8107:2:2248 +8108:2:2249 +8109:2:2253 +8110:2:2254 +8111:2:2248 +8112:2:2249 +8113:2:2250 +8114:2:2262 +8115:2:2267 +8116:2:2271 +8117:2:2272 +8118:2:2279 +8119:2:2280 +8120:2:2291 +8121:2:2292 +8122:2:2293 +8123:2:2291 +8124:2:2292 +8125:2:2293 +8126:2:2304 +8127:2:2309 +8128:2:2310 +8129:0:4365 +8130:3:2529 +8131:0:4365 +8132:2:2322 +8133:0:4365 +8134:2:1169 +8135:0:4365 +8136:3:2528 +8137:0:4365 +8138:2:1170 +8139:0:4365 +8140:3:2529 +8141:0:4365 +8142:3:2530 +8143:0:4365 +8144:3:2536 +8145:0:4365 +8146:3:2537 +8147:0:4365 +8148:3:2547 +8149:0:4365 +8150:3:2548 +8151:0:4365 +8152:3:2552 +8153:3:2553 +8154:3:2557 +8155:3:2561 +8156:3:2562 +8157:3:2557 +8158:3:2561 +8159:3:2562 +8160:3:2566 +8161:3:2574 +8162:3:2575 +8163:3:2580 +8164:3:2587 +8165:3:2588 +8166:3:2587 +8167:3:2588 +8168:3:2595 +8169:3:2600 +8170:0:4365 +8171:3:2611 +8172:0:4365 +8173:3:2615 +8174:3:2616 +8175:3:2620 +8176:3:2624 +8177:3:2625 +8178:3:2620 +8179:3:2624 +8180:3:2625 +8181:3:2629 +8182:3:2637 +8183:3:2638 +8184:3:2643 +8185:3:2650 +8186:3:2651 +8187:3:2650 +8188:3:2651 +8189:3:2658 +8190:3:2663 +8191:0:4365 +8192:3:2611 +8193:0:4365 +8194:3:2615 +8195:3:2616 +8196:3:2620 +8197:3:2624 +8198:3:2625 +8199:3:2620 +8200:3:2624 +8201:3:2625 +8202:3:2629 +8203:3:2637 +8204:3:2638 +8205:3:2643 +8206:3:2650 +8207:3:2651 +8208:3:2650 +8209:3:2651 +8210:3:2658 +8211:3:2663 +8212:0:4365 +8213:3:2674 +8214:0:4365 +8215:3:2682 +8216:3:2683 +8217:3:2687 +8218:3:2691 +8219:3:2692 +8220:3:2687 +8221:3:2691 +8222:3:2692 +8223:3:2696 +8224:3:2704 +8225:3:2705 +8226:3:2710 +8227:3:2717 +8228:3:2718 +8229:3:2717 +8230:3:2718 +8231:3:2725 +8232:3:2730 +8233:0:4365 +8234:3:2745 +8235:0:4365 +8236:3:2746 +8237:0:4365 +8238:2:1173 +8239:0:4365 +8240:3:2747 +8241:0:4365 +8242:2:1179 +8243:0:4365 +8244:2:1180 +8245:0:4365 +8246:3:2746 +8247:0:4365 +8248:2:1181 +8249:2:1185 +8250:2:1186 +8251:2:1194 +8252:2:1195 +8253:2:1199 +8254:2:1200 +8255:2:1194 +8256:2:1195 +8257:2:1199 +8258:2:1200 +8259:2:1208 +8260:2:1213 +8261:2:1217 +8262:2:1218 +8263:2:1225 +8264:2:1226 +8265:2:1237 +8266:2:1238 +8267:2:1239 +8268:2:1237 +8269:2:1238 +8270:2:1239 +8271:2:1250 +8272:2:1255 +8273:2:1256 +8274:0:4365 +8275:3:2747 +8276:0:4365 +8277:2:1268 +8278:0:4365 +8279:3:2746 +8280:0:4365 +8281:2:1270 +8282:0:4365 +8283:3:2747 +8284:0:4365 +8285:2:1271 +8286:2:1275 +8287:2:1276 +8288:2:1284 +8289:2:1285 +8290:2:1289 +8291:2:1290 +8292:2:1284 +8293:2:1285 +8294:2:1289 +8295:2:1290 +8296:2:1298 +8297:2:1303 +8298:2:1307 +8299:2:1308 +8300:2:1315 +8301:2:1316 +8302:2:1327 +8303:2:1328 +8304:2:1329 +8305:2:1327 +8306:2:1328 +8307:2:1329 +8308:2:1340 +8309:2:1345 +8310:2:1346 +8311:0:4365 +8312:2:1358 +8313:0:4365 +8314:2:1360 +8315:0:4365 +8316:3:2746 +8317:0:4365 +8318:2:1361 +8319:0:4365 +8320:3:2747 +8321:0:4365 +8322:2:1362 +8323:2:1366 +8324:2:1367 +8325:2:1375 +8326:2:1376 +8327:2:1380 +8328:2:1381 +8329:2:1375 +8330:2:1376 +8331:2:1380 +8332:2:1381 +8333:2:1389 +8334:2:1394 +8335:2:1398 +8336:2:1399 +8337:2:1406 +8338:2:1407 +8339:2:1418 +8340:2:1419 +8341:2:1420 +8342:2:1418 +8343:2:1419 +8344:2:1420 +8345:2:1431 +8346:2:1436 +8347:2:1437 +8348:0:4365 +8349:2:1449 +8350:0:4365 +8351:3:2746 +8352:0:4365 +8353:2:1451 +8354:0:4365 +8355:3:2747 +8356:0:4365 +8357:2:1652 +8358:0:4365 +8359:2:1653 +8360:0:4365 +8361:2:1657 +8362:0:4365 +8363:2:1180 +8364:0:4365 +8365:3:2746 +8366:0:4365 +8367:2:1181 +8368:2:1185 +8369:2:1186 +8370:2:1194 +8371:2:1195 +8372:2:1199 +8373:2:1200 +8374:2:1194 +8375:2:1195 +8376:2:1196 +8377:2:1208 +8378:2:1213 +8379:2:1217 +8380:2:1218 +8381:2:1225 +8382:2:1226 +8383:2:1237 +8384:2:1238 +8385:2:1239 +8386:2:1237 +8387:2:1238 +8388:2:1239 +8389:2:1250 +8390:2:1255 +8391:2:1256 +8392:0:4365 +8393:3:2747 +8394:0:4365 +8395:2:1268 +8396:0:4365 +8397:3:2746 +8398:0:4365 +8399:2:1270 +8400:0:4365 +8401:3:2747 +8402:0:4365 +8403:2:1271 +8404:2:1275 +8405:2:1276 +8406:2:1284 +8407:2:1285 +8408:2:1289 +8409:2:1290 +8410:2:1284 +8411:2:1285 +8412:2:1289 +8413:2:1290 +8414:2:1298 +8415:2:1303 +8416:2:1307 +8417:2:1308 +8418:2:1315 +8419:2:1316 +8420:2:1327 +8421:2:1328 +8422:2:1329 +8423:2:1327 +8424:2:1328 +8425:2:1329 +8426:2:1340 +8427:2:1345 +8428:2:1346 +8429:0:4365 +8430:2:1358 +8431:0:4365 +8432:2:1454 +8433:0:4365 +8434:3:2746 +8435:0:4365 +8436:2:1455 +8437:0:4365 +8438:3:2747 +8439:0:4365 +8440:2:1652 +8441:0:4365 +8442:2:1653 +8443:0:4365 +8444:2:1657 +8445:0:4365 +8446:2:1660 +8447:0:4365 +8448:3:2746 +8449:0:4365 +8450:2:1665 +8451:2:1669 +8452:2:1670 +8453:2:1678 +8454:2:1679 +8455:2:1683 +8456:2:1684 +8457:2:1678 +8458:2:1679 +8459:2:1680 +8460:2:1692 +8461:2:1697 +8462:2:1701 +8463:2:1702 +8464:2:1709 +8465:2:1710 +8466:2:1721 +8467:2:1722 +8468:2:1723 +8469:2:1721 +8470:2:1722 +8471:2:1723 +8472:2:1734 +8473:2:1739 +8474:2:1740 +8475:0:4365 +8476:3:2747 +8477:0:4365 +8478:2:1752 +8479:0:4365 +8480:3:2746 +8481:0:4365 +8482:2:1754 +8483:0:4365 +8484:3:2747 +8485:0:4365 +8486:2:1755 +8487:2:1759 +8488:2:1760 +8489:2:1768 +8490:2:1769 +8491:2:1773 +8492:2:1774 +8493:2:1768 +8494:2:1769 +8495:2:1773 +8496:2:1774 +8497:2:1782 +8498:2:1787 +8499:2:1791 +8500:2:1792 +8501:2:1799 +8502:2:1800 +8503:2:1811 +8504:2:1812 +8505:2:1813 +8506:2:1811 +8507:2:1812 +8508:2:1813 +8509:2:1824 +8510:2:1829 +8511:2:1830 +8512:0:4365 +8513:2:1842 +8514:0:4365 +8515:3:2746 +8516:0:4365 +8517:2:1844 +8518:0:4365 +8519:3:2747 +8520:0:4365 +8521:2:1845 +8522:2:1849 +8523:2:1850 +8524:2:1858 +8525:2:1859 +8526:2:1863 +8527:2:1864 +8528:2:1858 +8529:2:1859 +8530:2:1863 +8531:2:1864 +8532:2:1872 +8533:2:1877 +8534:2:1881 +8535:2:1882 +8536:2:1889 +8537:2:1890 +8538:2:1901 +8539:2:1902 +8540:2:1903 +8541:2:1901 +8542:2:1902 +8543:2:1903 +8544:2:1914 +8545:2:1919 +8546:2:1920 +8547:0:4365 +8548:2:1932 +8549:0:4365 +8550:3:2746 +8551:0:4365 +8552:2:1934 +8553:0:4365 +8554:3:2747 +8555:0:4365 +8556:2:1935 +8557:0:4365 +8558:2:1936 +8559:0:4365 +8560:2:2129 +8561:0:4365 +8562:2:2130 +8563:0:4365 +8564:2:2134 +8565:0:4365 +8566:3:2746 +8567:0:4365 +8568:2:2136 +8569:0:4365 +8570:3:2747 +8571:0:4365 +8572:2:2137 +8573:2:2141 +8574:2:2142 +8575:2:2150 +8576:2:2151 +8577:2:2155 +8578:2:2156 +8579:2:2150 +8580:2:2151 +8581:2:2155 +8582:2:2156 +8583:2:2164 +8584:2:2169 +8585:2:2173 +8586:2:2174 +8587:2:2181 +8588:2:2182 +8589:2:2193 +8590:2:2194 +8591:2:2195 +8592:2:2193 +8593:2:2194 +8594:2:2195 +8595:2:2206 +8596:2:2211 +8597:2:2212 +8598:0:4365 +8599:2:2224 +8600:0:4365 +8601:3:2746 +8602:0:4365 +8603:2:2226 +8604:0:4365 +8605:3:2747 +8606:0:4365 +8607:2:1936 +8608:0:4365 +8609:2:2129 +8610:0:4365 +8611:2:2130 +8612:0:4365 +8613:2:2134 +8614:0:4365 +8615:3:2746 +8616:0:4365 +8617:2:2136 +8618:0:4365 +8619:3:2747 +8620:0:4365 +8621:2:2137 +8622:2:2141 +8623:2:2142 +8624:2:2150 +8625:2:2151 +8626:2:2155 +8627:2:2156 +8628:2:2150 +8629:2:2151 +8630:2:2152 +8631:2:2164 +8632:2:2169 +8633:2:2173 +8634:2:2174 +8635:2:2181 +8636:2:2182 +8637:2:2193 +8638:2:2194 +8639:2:2195 +8640:2:2193 +8641:2:2194 +8642:2:2195 +8643:2:2206 +8644:2:2211 +8645:2:2212 +8646:0:4365 +8647:2:2224 +8648:0:4365 +8649:3:2746 +8650:0:4365 +8651:2:2226 +8652:0:4365 +8653:3:2747 +8654:0:4365 +8655:2:2230 +8656:0:4365 +8657:3:2746 +8658:0:4365 +8659:2:2235 +8660:2:2239 +8661:2:2240 +8662:2:2248 +8663:2:2249 +8664:2:2253 +8665:2:2254 +8666:2:2248 +8667:2:2249 +8668:2:2250 +8669:2:2262 +8670:2:2267 +8671:2:2271 +8672:2:2272 +8673:2:2279 +8674:2:2280 +8675:2:2291 +8676:2:2292 +8677:2:2293 +8678:2:2291 +8679:2:2292 +8680:2:2293 +8681:2:2304 +8682:2:2309 +8683:2:2310 +8684:0:4365 +8685:3:2747 +8686:0:4365 +8687:2:2322 +8688:0:4365 +8689:2:1169 +8690:0:4365 +8691:3:2746 +8692:0:4365 +8693:2:1170 +8694:0:4365 +8695:3:2747 +8696:0:4365 +8697:3:2748 +8698:0:4365 +8699:3:2754 +8700:0:4365 +8701:3:2755 +8702:3:2759 +8703:3:2760 +8704:3:2768 +8705:3:2769 +8706:3:2773 +8707:3:2774 +8708:3:2768 +8709:3:2769 +8710:3:2773 +8711:3:2774 +8712:3:2782 +8713:3:2787 +8714:3:2791 +8715:3:2792 +8716:3:2799 +8717:3:2800 +8718:3:2811 +8719:3:2812 +8720:3:2813 +8721:3:2811 +8722:3:2812 +8723:3:2813 +8724:3:2824 +8725:3:2829 +8726:3:2830 +8727:0:4365 +8728:3:2842 +8729:0:4365 +8730:3:2843 +8731:0:4365 +8732:2:1173 +8733:0:4365 +8734:3:2844 +8735:0:4365 +8736:2:1179 +8737:0:4365 +8738:2:1180 +8739:0:4365 +8740:3:2843 +8741:0:4365 +8742:2:1181 +8743:2:1185 +8744:2:1186 +8745:2:1194 +8746:2:1195 +8747:2:1199 +8748:2:1200 +8749:2:1194 +8750:2:1195 +8751:2:1199 +8752:2:1200 +8753:2:1208 +8754:2:1213 +8755:2:1217 +8756:2:1218 +8757:2:1225 +8758:2:1226 +8759:2:1237 +8760:2:1238 +8761:2:1239 +8762:2:1237 +8763:2:1238 +8764:2:1239 +8765:2:1250 +8766:2:1255 +8767:2:1256 +8768:0:4365 +8769:3:2844 +8770:0:4365 +8771:2:1268 +8772:0:4365 +8773:3:2843 +8774:0:4365 +8775:2:1270 +8776:0:4365 +8777:3:2844 +8778:0:4365 +8779:2:1271 +8780:2:1275 +8781:2:1276 +8782:2:1284 +8783:2:1285 +8784:2:1289 +8785:2:1290 +8786:2:1284 +8787:2:1285 +8788:2:1289 +8789:2:1290 +8790:2:1298 +8791:2:1303 +8792:2:1307 +8793:2:1308 +8794:2:1315 +8795:2:1316 +8796:2:1327 +8797:2:1328 +8798:2:1329 +8799:2:1327 +8800:2:1328 +8801:2:1329 +8802:2:1340 +8803:2:1345 +8804:2:1346 +8805:0:4365 +8806:2:1358 +8807:0:4365 +8808:2:1360 +8809:0:4365 +8810:3:2843 +8811:0:4365 +8812:2:1361 +8813:0:4365 +8814:3:2844 +8815:0:4365 +8816:2:1362 +8817:2:1366 +8818:2:1367 +8819:2:1375 +8820:2:1376 +8821:2:1380 +8822:2:1381 +8823:2:1375 +8824:2:1376 +8825:2:1380 +8826:2:1381 +8827:2:1389 +8828:2:1394 +8829:2:1398 +8830:2:1399 +8831:2:1406 +8832:2:1407 +8833:2:1418 +8834:2:1419 +8835:2:1420 +8836:2:1418 +8837:2:1419 +8838:2:1420 +8839:2:1431 +8840:2:1436 +8841:2:1437 +8842:0:4365 +8843:2:1449 +8844:0:4365 +8845:3:2843 +8846:0:4365 +8847:2:1451 +8848:0:4365 +8849:3:2844 +8850:0:4365 +8851:2:1652 +8852:0:4365 +8853:2:1653 +8854:0:4365 +8855:2:1657 +8856:0:4365 +8857:2:1180 +8858:0:4365 +8859:3:2843 +8860:0:4365 +8861:2:1181 +8862:2:1185 +8863:2:1186 +8864:2:1194 +8865:2:1195 +8866:2:1199 +8867:2:1200 +8868:2:1194 +8869:2:1195 +8870:2:1196 +8871:2:1208 +8872:2:1213 +8873:2:1217 +8874:2:1218 +8875:2:1225 +8876:2:1226 +8877:2:1237 +8878:2:1238 +8879:2:1239 +8880:2:1237 +8881:2:1238 +8882:2:1239 +8883:2:1250 +8884:2:1255 +8885:2:1256 +8886:0:4365 +8887:3:2844 +8888:0:4365 +8889:2:1268 +8890:0:4365 +8891:3:2843 +8892:0:4365 +8893:2:1270 +8894:0:4365 +8895:3:2844 +8896:0:4365 +8897:2:1271 +8898:2:1275 +8899:2:1276 +8900:2:1284 +8901:2:1285 +8902:2:1289 +8903:2:1290 +8904:2:1284 +8905:2:1285 +8906:2:1289 +8907:2:1290 +8908:2:1298 +8909:2:1303 +8910:2:1307 +8911:2:1308 +8912:2:1315 +8913:2:1316 +8914:2:1327 +8915:2:1328 +8916:2:1329 +8917:2:1327 +8918:2:1328 +8919:2:1329 +8920:2:1340 +8921:2:1345 +8922:2:1346 +8923:0:4365 +8924:2:1358 +8925:0:4365 +8926:2:1454 +8927:0:4365 +8928:3:2843 +8929:0:4365 +8930:2:1455 +8931:0:4365 +8932:3:2844 +8933:0:4365 +8934:2:1652 +8935:0:4365 +8936:2:1653 +8937:0:4365 +8938:2:1657 +8939:0:4365 +8940:2:1660 +8941:0:4365 +8942:3:2843 +8943:0:4365 +8944:2:1665 +8945:2:1669 +8946:2:1670 +8947:2:1678 +8948:2:1679 +8949:2:1683 +8950:2:1684 +8951:2:1678 +8952:2:1679 +8953:2:1680 +8954:2:1692 +8955:2:1697 +8956:2:1701 +8957:2:1702 +8958:2:1709 +8959:2:1710 +8960:2:1721 +8961:2:1722 +8962:2:1723 +8963:2:1721 +8964:2:1722 +8965:2:1723 +8966:2:1734 +8967:2:1739 +8968:2:1740 +8969:0:4365 +8970:3:2844 +8971:0:4365 +8972:2:1752 +8973:0:4365 +8974:3:2843 +8975:0:4365 +8976:2:1754 +8977:0:4365 +8978:3:2844 +8979:0:4365 +8980:2:1755 +8981:2:1759 +8982:2:1760 +8983:2:1768 +8984:2:1769 +8985:2:1773 +8986:2:1774 +8987:2:1768 +8988:2:1769 +8989:2:1773 +8990:2:1774 +8991:2:1782 +8992:2:1787 +8993:2:1791 +8994:2:1792 +8995:2:1799 +8996:2:1800 +8997:2:1811 +8998:2:1812 +8999:2:1813 +9000:2:1811 +9001:2:1812 +9002:2:1813 +9003:2:1824 +9004:2:1829 +9005:2:1830 +9006:0:4365 +9007:2:1842 +9008:0:4365 +9009:3:2843 +9010:0:4365 +9011:2:1844 +9012:0:4365 +9013:3:2844 +9014:0:4365 +9015:2:1845 +9016:2:1849 +9017:2:1850 +9018:2:1858 +9019:2:1859 +9020:2:1863 +9021:2:1864 +9022:2:1858 +9023:2:1859 +9024:2:1863 +9025:2:1864 +9026:2:1872 +9027:2:1877 +9028:2:1881 +9029:2:1882 +9030:2:1889 +9031:2:1890 +9032:2:1901 +9033:2:1902 +9034:2:1903 +9035:2:1901 +9036:2:1902 +9037:2:1903 +9038:2:1914 +9039:2:1919 +9040:2:1920 +9041:0:4365 +9042:2:1932 +9043:0:4365 +9044:3:2843 +9045:0:4365 +9046:2:1934 +9047:0:4365 +9048:3:2844 +9049:0:4365 +9050:2:1935 +9051:0:4365 +9052:2:1936 +9053:0:4365 +9054:2:2129 +9055:0:4365 +9056:2:2130 +9057:0:4365 +9058:2:2134 +9059:0:4365 +9060:3:2843 +9061:0:4365 +9062:2:2136 +9063:0:4365 +9064:3:2844 +9065:0:4365 +9066:2:2137 +9067:2:2141 +9068:2:2142 +9069:2:2150 +9070:2:2151 +9071:2:2155 +9072:2:2156 +9073:2:2150 +9074:2:2151 +9075:2:2155 +9076:2:2156 +9077:2:2164 +9078:2:2169 +9079:2:2173 +9080:2:2174 +9081:2:2181 +9082:2:2182 +9083:2:2193 +9084:2:2194 +9085:2:2195 +9086:2:2193 +9087:2:2194 +9088:2:2195 +9089:2:2206 +9090:2:2211 +9091:2:2212 +9092:0:4365 +9093:2:2224 +9094:0:4365 +9095:3:2843 +9096:0:4365 +9097:2:2226 +9098:0:4365 +9099:3:2844 +9100:0:4365 +9101:2:1936 +9102:0:4365 +9103:2:2129 +9104:0:4365 +9105:2:2130 +9106:0:4365 +9107:2:2134 +9108:0:4365 +9109:3:2843 +9110:0:4365 +9111:2:2136 +9112:0:4365 +9113:3:2844 +9114:0:4365 +9115:2:2137 +9116:2:2141 +9117:2:2142 +9118:2:2150 +9119:2:2151 +9120:2:2155 +9121:2:2156 +9122:2:2150 +9123:2:2151 +9124:2:2152 +9125:2:2164 +9126:2:2169 +9127:2:2173 +9128:2:2174 +9129:2:2181 +9130:2:2182 +9131:2:2193 +9132:2:2194 +9133:2:2195 +9134:2:2193 +9135:2:2194 +9136:2:2195 +9137:2:2206 +9138:2:2211 +9139:2:2212 +9140:0:4365 +9141:2:2224 +9142:0:4365 +9143:3:2843 +9144:0:4365 +9145:2:2226 +9146:0:4365 +9147:3:2844 +9148:0:4365 +9149:2:2230 +9150:0:4365 +9151:3:2843 +9152:0:4365 +9153:2:2235 +9154:2:2239 +9155:2:2240 +9156:2:2248 +9157:2:2249 +9158:2:2253 +9159:2:2254 +9160:2:2248 +9161:2:2249 +9162:2:2250 +9163:2:2262 +9164:2:2267 +9165:2:2271 +9166:2:2272 +9167:2:2279 +9168:2:2280 +9169:2:2291 +9170:2:2292 +9171:2:2293 +9172:2:2291 +9173:2:2292 +9174:2:2293 +9175:2:2304 +9176:2:2309 +9177:2:2310 +9178:0:4365 +9179:3:2844 +9180:0:4365 +9181:2:2322 +9182:0:4365 +9183:2:1169 +9184:0:4365 +9185:3:2843 +9186:0:4365 +9187:2:1170 +9188:0:4365 +9189:3:2844 +9190:0:4365 +9191:3:2845 +9192:0:4365 +9193:3:2851 +9194:0:4365 +9195:3:2854 +9196:3:2855 +9197:3:2867 +9198:3:2868 +9199:3:2872 +9200:3:2873 +9201:3:2867 +9202:3:2868 +9203:3:2872 +9204:3:2873 +9205:3:2881 +9206:3:2886 +9207:3:2890 +9208:3:2891 +9209:3:2898 +9210:3:2899 +9211:3:2910 +9212:3:2911 +9213:3:2912 +9214:3:2910 +9215:3:2911 +9216:3:2912 +9217:3:2923 +9218:3:2928 +9219:3:2929 +9220:0:4365 +9221:3:2941 +9222:0:4365 +9223:3:2942 +9224:0:4365 +9225:2:1173 +9226:0:4365 +9227:3:2943 +9228:0:4365 +9229:2:1179 +9230:0:4365 +9231:2:1180 +9232:0:4365 +9233:3:2942 +9234:0:4365 +9235:2:1181 +9236:2:1185 +9237:2:1186 +9238:2:1194 +9239:2:1195 +9240:2:1199 +9241:2:1200 +9242:2:1194 +9243:2:1195 +9244:2:1199 +9245:2:1200 +9246:2:1208 +9247:2:1213 +9248:2:1217 +9249:2:1218 +9250:2:1225 +9251:2:1226 +9252:2:1237 +9253:2:1238 +9254:2:1239 +9255:2:1237 +9256:2:1238 +9257:2:1239 +9258:2:1250 +9259:2:1255 +9260:2:1256 +9261:0:4365 +9262:3:2943 +9263:0:4365 +9264:2:1268 +9265:0:4365 +9266:3:2942 +9267:0:4365 +9268:2:1270 +9269:0:4365 +9270:3:2943 +9271:0:4365 +9272:2:1271 +9273:2:1275 +9274:2:1276 +9275:2:1284 +9276:2:1285 +9277:2:1289 +9278:2:1290 +9279:2:1284 +9280:2:1285 +9281:2:1289 +9282:2:1290 +9283:2:1298 +9284:2:1303 +9285:2:1307 +9286:2:1308 +9287:2:1315 +9288:2:1316 +9289:2:1327 +9290:2:1328 +9291:2:1329 +9292:2:1327 +9293:2:1328 +9294:2:1329 +9295:2:1340 +9296:2:1345 +9297:2:1346 +9298:0:4365 +9299:2:1358 +9300:0:4365 +9301:2:1360 +9302:0:4365 +9303:3:2942 +9304:0:4365 +9305:2:1361 +9306:0:4365 +9307:3:2943 +9308:0:4365 +9309:2:1362 +9310:2:1366 +9311:2:1367 +9312:2:1375 +9313:2:1376 +9314:2:1380 +9315:2:1381 +9316:2:1375 +9317:2:1376 +9318:2:1380 +9319:2:1381 +9320:2:1389 +9321:2:1394 +9322:2:1398 +9323:2:1399 +9324:2:1406 +9325:2:1407 +9326:2:1418 +9327:2:1419 +9328:2:1420 +9329:2:1418 +9330:2:1419 +9331:2:1420 +9332:2:1431 +9333:2:1436 +9334:2:1437 +9335:0:4365 +9336:2:1449 +9337:0:4365 +9338:3:2942 +9339:0:4365 +9340:2:1451 +9341:0:4365 +9342:3:2943 +9343:0:4365 +9344:2:1652 +9345:0:4365 +9346:2:1653 +9347:0:4365 +9348:2:1657 +9349:0:4365 +9350:2:1180 +9351:0:4365 +9352:3:2942 +9353:0:4365 +9354:2:1181 +9355:2:1185 +9356:2:1186 +9357:2:1194 +9358:2:1195 +9359:2:1199 +9360:2:1200 +9361:2:1194 +9362:2:1195 +9363:2:1196 +9364:2:1208 +9365:2:1213 +9366:2:1217 +9367:2:1218 +9368:2:1225 +9369:2:1226 +9370:2:1237 +9371:2:1238 +9372:2:1239 +9373:2:1237 +9374:2:1238 +9375:2:1239 +9376:2:1250 +9377:2:1255 +9378:2:1256 +9379:0:4365 +9380:3:2943 +9381:0:4365 +9382:2:1268 +9383:0:4365 +9384:3:2942 +9385:0:4365 +9386:2:1270 +9387:0:4365 +9388:3:2943 +9389:0:4365 +9390:2:1271 +9391:2:1275 +9392:2:1276 +9393:2:1284 +9394:2:1285 +9395:2:1289 +9396:2:1290 +9397:2:1284 +9398:2:1285 +9399:2:1289 +9400:2:1290 +9401:2:1298 +9402:2:1303 +9403:2:1307 +9404:2:1308 +9405:2:1315 +9406:2:1316 +9407:2:1327 +9408:2:1328 +9409:2:1329 +9410:2:1327 +9411:2:1328 +9412:2:1329 +9413:2:1340 +9414:2:1345 +9415:2:1346 +9416:0:4365 +9417:2:1358 +9418:0:4365 +9419:2:1454 +9420:0:4365 +9421:3:2942 +9422:0:4365 +9423:2:1455 +9424:0:4365 +9425:3:2943 +9426:0:4365 +9427:2:1652 +9428:0:4365 +9429:2:1653 +9430:0:4365 +9431:2:1657 +9432:0:4365 +9433:2:1660 +9434:0:4365 +9435:3:2942 +9436:0:4365 +9437:2:1665 +9438:2:1669 +9439:2:1670 +9440:2:1678 +9441:2:1679 +9442:2:1683 +9443:2:1684 +9444:2:1678 +9445:2:1679 +9446:2:1680 +9447:2:1692 +9448:2:1697 +9449:2:1701 +9450:2:1702 +9451:2:1709 +9452:2:1710 +9453:2:1721 +9454:2:1722 +9455:2:1723 +9456:2:1721 +9457:2:1722 +9458:2:1723 +9459:2:1734 +9460:2:1739 +9461:2:1740 +9462:0:4365 +9463:3:2943 +9464:0:4365 +9465:2:1752 +9466:0:4365 +9467:3:2942 +9468:0:4365 +9469:2:1754 +9470:0:4365 +9471:3:2943 +9472:0:4365 +9473:2:1755 +9474:2:1759 +9475:2:1760 +9476:2:1768 +9477:2:1769 +9478:2:1773 +9479:2:1774 +9480:2:1768 +9481:2:1769 +9482:2:1773 +9483:2:1774 +9484:2:1782 +9485:2:1787 +9486:2:1791 +9487:2:1792 +9488:2:1799 +9489:2:1800 +9490:2:1811 +9491:2:1812 +9492:2:1813 +9493:2:1811 +9494:2:1812 +9495:2:1813 +9496:2:1824 +9497:2:1829 +9498:2:1830 +9499:0:4365 +9500:2:1842 +9501:0:4365 +9502:3:2942 +9503:0:4365 +9504:2:1844 +9505:0:4365 +9506:3:2943 +9507:0:4365 +9508:2:1845 +9509:2:1849 +9510:2:1850 +9511:2:1858 +9512:2:1859 +9513:2:1863 +9514:2:1864 +9515:2:1858 +9516:2:1859 +9517:2:1863 +9518:2:1864 +9519:2:1872 +9520:2:1877 +9521:2:1881 +9522:2:1882 +9523:2:1889 +9524:2:1890 +9525:2:1901 +9526:2:1902 +9527:2:1903 +9528:2:1901 +9529:2:1902 +9530:2:1903 +9531:2:1914 +9532:2:1919 +9533:2:1920 +9534:0:4365 +9535:2:1932 +9536:0:4365 +9537:3:2942 +9538:0:4365 +9539:2:1934 +9540:0:4365 +9541:3:2943 +9542:0:4365 +9543:2:1935 +9544:0:4365 +9545:2:1936 +9546:0:4365 +9547:2:2129 +9548:0:4365 +9549:2:2130 +9550:0:4365 +9551:2:2134 +9552:0:4365 +9553:3:2942 +9554:0:4365 +9555:2:2136 +9556:0:4365 +9557:3:2943 +9558:0:4365 +9559:2:2137 +9560:2:2141 +9561:2:2142 +9562:2:2150 +9563:2:2151 +9564:2:2155 +9565:2:2156 +9566:2:2150 +9567:2:2151 +9568:2:2155 +9569:2:2156 +9570:2:2164 +9571:2:2169 +9572:2:2173 +9573:2:2174 +9574:2:2181 +9575:2:2182 +9576:2:2193 +9577:2:2194 +9578:2:2195 +9579:2:2193 +9580:2:2194 +9581:2:2195 +9582:2:2206 +9583:2:2211 +9584:2:2212 +9585:0:4365 +9586:2:2224 +9587:0:4365 +9588:3:2942 +9589:0:4365 +9590:2:2226 +9591:0:4365 +9592:3:2943 +9593:0:4365 +9594:2:1936 +9595:0:4365 +9596:2:2129 +9597:0:4365 +9598:2:2130 +9599:0:4365 +9600:2:2134 +9601:0:4365 +9602:3:2942 +9603:0:4365 +9604:2:2136 +9605:0:4365 +9606:3:2943 +9607:0:4365 +9608:2:2137 +9609:2:2141 +9610:2:2142 +9611:2:2150 +9612:2:2151 +9613:2:2155 +9614:2:2156 +9615:2:2150 +9616:2:2151 +9617:2:2152 +9618:2:2164 +9619:2:2169 +9620:2:2173 +9621:2:2174 +9622:2:2181 +9623:2:2182 +9624:2:2193 +9625:2:2194 +9626:2:2195 +9627:2:2193 +9628:2:2194 +9629:2:2195 +9630:2:2206 +9631:2:2211 +9632:2:2212 +9633:0:4365 +9634:2:2224 +9635:0:4365 +9636:3:2942 +9637:0:4365 +9638:2:2226 +9639:0:4365 +9640:3:2943 +9641:0:4365 +9642:2:2230 +9643:0:4365 +9644:3:2942 +9645:0:4365 +9646:2:2235 +9647:2:2239 +9648:2:2240 +9649:2:2248 +9650:2:2249 +9651:2:2253 +9652:2:2254 +9653:2:2248 +9654:2:2249 +9655:2:2250 +9656:2:2262 +9657:2:2267 +9658:2:2271 +9659:2:2272 +9660:2:2279 +9661:2:2280 +9662:2:2291 +9663:2:2292 +9664:2:2293 +9665:2:2291 +9666:2:2292 +9667:2:2293 +9668:2:2304 +9669:2:2309 +9670:2:2310 +9671:0:4365 +9672:3:2943 +9673:0:4365 +9674:2:2322 +9675:0:4365 +9676:2:1169 +9677:0:4365 +9678:3:2942 +9679:0:4365 +9680:2:1170 +9681:0:4365 +9682:3:2943 +9683:0:4365 +9684:3:2944 +9685:0:4365 +9686:3:2950 +9687:0:4365 +9688:3:2951 +9689:0:4365 +9690:3:2952 +9691:0:4365 +9692:3:2953 +9693:0:4365 +9694:3:2954 +9695:3:2958 +9696:3:2959 +9697:3:2967 +9698:3:2968 +9699:3:2972 +9700:3:2973 +9701:3:2967 +9702:3:2968 +9703:3:2972 +9704:3:2973 +9705:3:2981 +9706:3:2986 +9707:3:2990 +9708:3:2991 +9709:3:2998 +9710:3:2999 +9711:3:3010 +9712:3:3011 +9713:3:3012 +9714:3:3010 +9715:3:3011 +9716:3:3012 +9717:3:3023 +9718:3:3028 +9719:3:3029 +9720:0:4365 +9721:3:3041 +9722:0:4365 +9723:3:3042 +9724:0:4365 +9725:2:1173 +9726:0:4365 +9727:3:3043 +9728:0:4365 +9729:2:1179 +9730:0:4365 +9731:2:1180 +9732:0:4365 +9733:3:3042 +9734:0:4365 +9735:2:1181 +9736:2:1185 +9737:2:1186 +9738:2:1194 +9739:2:1195 +9740:2:1199 +9741:2:1200 +9742:2:1194 +9743:2:1195 +9744:2:1199 +9745:2:1200 +9746:2:1208 +9747:2:1213 +9748:2:1217 +9749:2:1218 +9750:2:1225 +9751:2:1226 +9752:2:1237 +9753:2:1238 +9754:2:1239 +9755:2:1237 +9756:2:1238 +9757:2:1239 +9758:2:1250 +9759:2:1255 +9760:2:1256 +9761:0:4365 +9762:3:3043 +9763:0:4365 +9764:2:1268 +9765:0:4365 +9766:3:3042 +9767:0:4365 +9768:2:1270 +9769:0:4365 +9770:3:3043 +9771:0:4365 +9772:2:1271 +9773:2:1275 +9774:2:1276 +9775:2:1284 +9776:2:1285 +9777:2:1289 +9778:2:1290 +9779:2:1284 +9780:2:1285 +9781:2:1289 +9782:2:1290 +9783:2:1298 +9784:2:1303 +9785:2:1307 +9786:2:1308 +9787:2:1315 +9788:2:1316 +9789:2:1327 +9790:2:1328 +9791:2:1329 +9792:2:1327 +9793:2:1328 +9794:2:1329 +9795:2:1340 +9796:2:1345 +9797:2:1346 +9798:0:4365 +9799:2:1358 +9800:0:4365 +9801:2:1360 +9802:0:4365 +9803:3:3042 +9804:0:4365 +9805:2:1361 +9806:0:4365 +9807:3:3043 +9808:0:4365 +9809:2:1362 +9810:2:1366 +9811:2:1367 +9812:2:1375 +9813:2:1376 +9814:2:1380 +9815:2:1381 +9816:2:1375 +9817:2:1376 +9818:2:1380 +9819:2:1381 +9820:2:1389 +9821:2:1394 +9822:2:1398 +9823:2:1399 +9824:2:1406 +9825:2:1407 +9826:2:1418 +9827:2:1419 +9828:2:1420 +9829:2:1418 +9830:2:1419 +9831:2:1420 +9832:2:1431 +9833:2:1436 +9834:2:1437 +9835:0:4365 +9836:2:1449 +9837:0:4365 +9838:3:3042 +9839:0:4365 +9840:2:1451 +9841:0:4365 +9842:3:3043 +9843:0:4365 +9844:2:1652 +9845:0:4365 +9846:2:1653 +9847:0:4365 +9848:2:1657 +9849:0:4365 +9850:2:1180 +9851:0:4365 +9852:3:3042 +9853:0:4365 +9854:2:1181 +9855:2:1185 +9856:2:1186 +9857:2:1194 +9858:2:1195 +9859:2:1199 +9860:2:1200 +9861:2:1194 +9862:2:1195 +9863:2:1196 +9864:2:1208 +9865:2:1213 +9866:2:1217 +9867:2:1218 +9868:2:1225 +9869:2:1226 +9870:2:1237 +9871:2:1238 +9872:2:1239 +9873:2:1237 +9874:2:1238 +9875:2:1239 +9876:2:1250 +9877:2:1255 +9878:2:1256 +9879:0:4365 +9880:3:3043 +9881:0:4365 +9882:2:1268 +9883:0:4365 +9884:3:3042 +9885:0:4365 +9886:2:1270 +9887:0:4365 +9888:3:3043 +9889:0:4365 +9890:2:1271 +9891:2:1275 +9892:2:1276 +9893:2:1284 +9894:2:1285 +9895:2:1289 +9896:2:1290 +9897:2:1284 +9898:2:1285 +9899:2:1289 +9900:2:1290 +9901:2:1298 +9902:2:1303 +9903:2:1307 +9904:2:1308 +9905:2:1315 +9906:2:1316 +9907:2:1327 +9908:2:1328 +9909:2:1329 +9910:2:1327 +9911:2:1328 +9912:2:1329 +9913:2:1340 +9914:2:1345 +9915:2:1346 +9916:0:4365 +9917:2:1358 +9918:0:4365 +9919:2:1454 +9920:0:4365 +9921:3:3042 +9922:0:4365 +9923:2:1455 +9924:0:4365 +9925:3:3043 +9926:0:4365 +9927:2:1652 +9928:0:4365 +9929:2:1653 +9930:0:4365 +9931:2:1657 +9932:0:4365 +9933:2:1660 +9934:0:4365 +9935:3:3042 +9936:0:4365 +9937:2:1665 +9938:2:1669 +9939:2:1670 +9940:2:1678 +9941:2:1679 +9942:2:1683 +9943:2:1684 +9944:2:1678 +9945:2:1679 +9946:2:1680 +9947:2:1692 +9948:2:1697 +9949:2:1701 +9950:2:1702 +9951:2:1709 +9952:2:1710 +9953:2:1721 +9954:2:1722 +9955:2:1723 +9956:2:1721 +9957:2:1722 +9958:2:1723 +9959:2:1734 +9960:2:1739 +9961:2:1740 +9962:0:4365 +9963:3:3043 +9964:0:4365 +9965:2:1752 +9966:0:4365 +9967:3:3042 +9968:0:4365 +9969:2:1754 +9970:0:4365 +9971:3:3043 +9972:0:4365 +9973:2:1755 +9974:2:1759 +9975:2:1760 +9976:2:1768 +9977:2:1769 +9978:2:1773 +9979:2:1774 +9980:2:1768 +9981:2:1769 +9982:2:1773 +9983:2:1774 +9984:2:1782 +9985:2:1787 +9986:2:1791 +9987:2:1792 +9988:2:1799 +9989:2:1800 +9990:2:1811 +9991:2:1812 +9992:2:1813 +9993:2:1811 +9994:2:1812 +9995:2:1813 +9996:2:1824 +9997:2:1829 +9998:2:1830 +9999:0:4365 +10000:2:1842 +10001:0:4365 +10002:3:3042 +10003:0:4365 +10004:2:1844 +10005:0:4365 +10006:3:3043 +10007:0:4365 +10008:2:1845 +10009:2:1849 +10010:2:1850 +10011:2:1858 +10012:2:1859 +10013:2:1863 +10014:2:1864 +10015:2:1858 +10016:2:1859 +10017:2:1863 +10018:2:1864 +10019:2:1872 +10020:2:1877 +10021:2:1881 +10022:2:1882 +10023:2:1889 +10024:2:1890 +10025:2:1901 +10026:2:1902 +10027:2:1903 +10028:2:1901 +10029:2:1902 +10030:2:1903 +10031:2:1914 +10032:2:1919 +10033:2:1920 +10034:0:4365 +10035:2:1932 +10036:0:4365 +10037:3:3042 +10038:0:4365 +10039:2:1934 +10040:0:4365 +10041:3:3043 +10042:0:4365 +10043:2:1935 +10044:0:4365 +10045:2:1936 +10046:0:4365 +10047:2:2129 +10048:0:4365 +10049:2:2130 +10050:0:4365 +10051:2:2134 +10052:0:4365 +10053:3:3042 +10054:0:4365 +10055:2:2136 +10056:0:4365 +10057:3:3043 +10058:0:4365 +10059:2:2137 +10060:2:2141 +10061:2:2142 +10062:2:2150 +10063:2:2151 +10064:2:2155 +10065:2:2156 +10066:2:2150 +10067:2:2151 +10068:2:2155 +10069:2:2156 +10070:2:2164 +10071:2:2169 +10072:2:2173 +10073:2:2174 +10074:2:2181 +10075:2:2182 +10076:2:2193 +10077:2:2194 +10078:2:2195 +10079:2:2193 +10080:2:2194 +10081:2:2195 +10082:2:2206 +10083:2:2211 +10084:2:2212 +10085:0:4365 +10086:2:2224 +10087:0:4365 +10088:3:3042 +10089:0:4365 +10090:2:2226 +10091:0:4365 +10092:3:3043 +10093:0:4365 +10094:2:1936 +10095:0:4365 +10096:2:2129 +10097:0:4365 +10098:2:2130 +10099:0:4365 +10100:2:2134 +10101:0:4365 +10102:3:3042 +10103:0:4365 +10104:2:2136 +10105:0:4365 +10106:3:3043 +10107:0:4365 +10108:2:2137 +10109:2:2141 +10110:2:2142 +10111:2:2150 +10112:2:2151 +10113:2:2155 +10114:2:2156 +10115:2:2150 +10116:2:2151 +10117:2:2152 +10118:2:2164 +10119:2:2169 +10120:2:2173 +10121:2:2174 +10122:2:2181 +10123:2:2182 +10124:2:2193 +10125:2:2194 +10126:2:2195 +10127:2:2193 +10128:2:2194 +10129:2:2195 +10130:2:2206 +10131:2:2211 +10132:2:2212 +10133:0:4365 +10134:2:2224 +10135:0:4365 +10136:3:3042 +10137:0:4365 +10138:2:2226 +10139:0:4365 +10140:3:3043 +10141:0:4365 +10142:2:2230 +10143:0:4365 +10144:3:3042 +10145:0:4365 +10146:2:2235 +10147:2:2239 +10148:2:2240 +10149:2:2248 +10150:2:2249 +10151:2:2253 +10152:2:2254 +10153:2:2248 +10154:2:2249 +10155:2:2250 +10156:2:2262 +10157:2:2267 +10158:2:2271 +10159:2:2272 +10160:2:2279 +10161:2:2280 +10162:2:2291 +10163:2:2292 +10164:2:2293 +10165:2:2291 +10166:2:2292 +10167:2:2293 +10168:2:2304 +10169:2:2309 +10170:2:2310 +10171:0:4365 +10172:3:3043 +10173:0:4365 +10174:2:2322 +10175:0:4365 +10176:2:1169 +10177:0:4365 +10178:3:3042 +10179:0:4365 +10180:2:1170 +10181:0:4365 +10182:3:3043 +10183:0:4365 +10184:3:3044 +10185:0:4365 +10186:3:3257 +10187:0:4365 +10188:3:3265 +10189:0:4365 +10190:3:3266 +10191:3:3270 +10192:3:3271 +10193:3:3279 +10194:3:3280 +10195:3:3284 +10196:3:3285 +10197:3:3279 +10198:3:3280 +10199:3:3284 +10200:3:3285 +10201:3:3293 +10202:3:3298 +10203:3:3302 +10204:3:3303 +10205:3:3310 +10206:3:3311 +10207:3:3322 +10208:3:3323 +10209:3:3324 +10210:3:3322 +10211:3:3323 +10212:3:3324 +10213:3:3335 +10214:3:3340 +10215:3:3341 +10216:0:4365 +10217:3:3353 +10218:0:4365 +10219:3:3354 +10220:0:4365 +10221:2:1173 +10222:0:4365 +10223:3:3355 +10224:0:4365 +10225:2:1179 +10226:0:4365 +10227:2:1180 +10228:0:4365 +10229:3:3354 +10230:0:4365 +10231:2:1181 +10232:2:1185 +10233:2:1186 +10234:2:1194 +10235:2:1195 +10236:2:1199 +10237:2:1200 +10238:2:1194 +10239:2:1195 +10240:2:1199 +10241:2:1200 +10242:2:1208 +10243:2:1213 +10244:2:1217 +10245:2:1218 +10246:2:1225 +10247:2:1226 +10248:2:1237 +10249:2:1238 +10250:2:1239 +10251:2:1237 +10252:2:1238 +10253:2:1239 +10254:2:1250 +10255:2:1255 +10256:2:1256 +10257:0:4365 +10258:3:3355 +10259:0:4365 +10260:2:1268 +10261:0:4365 +10262:3:3354 +10263:0:4365 +10264:2:1270 +10265:0:4365 +10266:3:3355 +10267:0:4365 +10268:2:1271 +10269:2:1275 +10270:2:1276 +10271:2:1284 +10272:2:1285 +10273:2:1289 +10274:2:1290 +10275:2:1284 +10276:2:1285 +10277:2:1289 +10278:2:1290 +10279:2:1298 +10280:2:1303 +10281:2:1307 +10282:2:1308 +10283:2:1315 +10284:2:1316 +10285:2:1327 +10286:2:1328 +10287:2:1329 +10288:2:1327 +10289:2:1328 +10290:2:1329 +10291:2:1340 +10292:2:1345 +10293:2:1346 +10294:0:4365 +10295:2:1358 +10296:0:4365 +10297:2:1360 +10298:0:4365 +10299:3:3354 +10300:0:4365 +10301:2:1361 +10302:0:4365 +10303:3:3355 +10304:0:4365 +10305:2:1362 +10306:2:1366 +10307:2:1367 +10308:2:1375 +10309:2:1376 +10310:2:1380 +10311:2:1381 +10312:2:1375 +10313:2:1376 +10314:2:1380 +10315:2:1381 +10316:2:1389 +10317:2:1394 +10318:2:1398 +10319:2:1399 +10320:2:1406 +10321:2:1407 +10322:2:1418 +10323:2:1419 +10324:2:1420 +10325:2:1418 +10326:2:1419 +10327:2:1420 +10328:2:1431 +10329:2:1436 +10330:2:1437 +10331:0:4365 +10332:2:1449 +10333:0:4365 +10334:3:3354 +10335:0:4365 +10336:2:1451 +10337:0:4365 +10338:3:3355 +10339:0:4365 +10340:2:1652 +10341:0:4365 +10342:2:1653 +10343:0:4365 +10344:2:1657 +10345:0:4365 +10346:2:1180 +10347:0:4365 +10348:3:3354 +10349:0:4365 +10350:2:1181 +10351:2:1185 +10352:2:1186 +10353:2:1194 +10354:2:1195 +10355:2:1199 +10356:2:1200 +10357:2:1194 +10358:2:1195 +10359:2:1196 +10360:2:1208 +10361:2:1213 +10362:2:1217 +10363:2:1218 +10364:2:1225 +10365:2:1226 +10366:2:1237 +10367:2:1238 +10368:2:1239 +10369:2:1237 +10370:2:1238 +10371:2:1239 +10372:2:1250 +10373:2:1255 +10374:2:1256 +10375:0:4365 +10376:3:3355 +10377:0:4365 +10378:2:1268 +10379:0:4365 +10380:3:3354 +10381:0:4365 +10382:2:1270 +10383:0:4365 +10384:3:3355 +10385:0:4365 +10386:2:1271 +10387:2:1275 +10388:2:1276 +10389:2:1284 +10390:2:1285 +10391:2:1289 +10392:2:1290 +10393:2:1284 +10394:2:1285 +10395:2:1289 +10396:2:1290 +10397:2:1298 +10398:2:1303 +10399:2:1307 +10400:2:1308 +10401:2:1315 +10402:2:1316 +10403:2:1327 +10404:2:1328 +10405:2:1329 +10406:2:1327 +10407:2:1328 +10408:2:1329 +10409:2:1340 +10410:2:1345 +10411:2:1346 +10412:0:4365 +10413:2:1358 +10414:0:4365 +10415:2:1454 +10416:0:4365 +10417:3:3354 +10418:0:4365 +10419:2:1455 +10420:0:4365 +10421:3:3355 +10422:0:4365 +10423:2:1652 +10424:0:4365 +10425:2:1653 +10426:0:4365 +10427:2:1657 +10428:0:4365 +10429:2:1660 +10430:0:4365 +10431:3:3354 +10432:0:4365 +10433:2:1665 +10434:2:1669 +10435:2:1670 +10436:2:1678 +10437:2:1679 +10438:2:1683 +10439:2:1684 +10440:2:1678 +10441:2:1679 +10442:2:1680 +10443:2:1692 +10444:2:1697 +10445:2:1701 +10446:2:1702 +10447:2:1709 +10448:2:1710 +10449:2:1721 +10450:2:1722 +10451:2:1723 +10452:2:1721 +10453:2:1722 +10454:2:1723 +10455:2:1734 +10456:2:1739 +10457:2:1740 +10458:0:4365 +10459:3:3355 +10460:0:4365 +10461:2:1752 +10462:0:4365 +10463:3:3354 +10464:0:4365 +10465:2:1754 +10466:0:4365 +10467:3:3355 +10468:0:4365 +10469:2:1755 +10470:2:1759 +10471:2:1760 +10472:2:1768 +10473:2:1769 +10474:2:1773 +10475:2:1774 +10476:2:1768 +10477:2:1769 +10478:2:1773 +10479:2:1774 +10480:2:1782 +10481:2:1787 +10482:2:1791 +10483:2:1792 +10484:2:1799 +10485:2:1800 +10486:2:1811 +10487:2:1812 +10488:2:1813 +10489:2:1811 +10490:2:1812 +10491:2:1813 +10492:2:1824 +10493:2:1829 +10494:2:1830 +10495:0:4365 +10496:2:1842 +10497:0:4365 +10498:3:3354 +10499:0:4365 +10500:2:1844 +10501:0:4365 +10502:3:3355 +10503:0:4365 +10504:2:1845 +10505:2:1849 +10506:2:1850 +10507:2:1858 +10508:2:1859 +10509:2:1863 +10510:2:1864 +10511:2:1858 +10512:2:1859 +10513:2:1863 +10514:2:1864 +10515:2:1872 +10516:2:1877 +10517:2:1881 +10518:2:1882 +10519:2:1889 +10520:2:1890 +10521:2:1901 +10522:2:1902 +10523:2:1903 +10524:2:1901 +10525:2:1902 +10526:2:1903 +10527:2:1914 +10528:2:1919 +10529:2:1920 +10530:0:4365 +10531:2:1932 +10532:0:4365 +10533:3:3354 +10534:0:4365 +10535:2:1934 +10536:0:4365 +10537:3:3355 +10538:0:4365 +10539:2:1935 +10540:0:4365 +10541:2:1936 +10542:0:4365 +10543:2:2129 +10544:0:4365 +10545:2:2130 +10546:0:4365 +10547:2:2134 +10548:0:4365 +10549:3:3354 +10550:0:4365 +10551:2:2136 +10552:0:4365 +10553:3:3355 +10554:0:4365 +10555:2:2137 +10556:2:2141 +10557:2:2142 +10558:2:2150 +10559:2:2151 +10560:2:2155 +10561:2:2156 +10562:2:2150 +10563:2:2151 +10564:2:2155 +10565:2:2156 +10566:2:2164 +10567:2:2169 +10568:2:2173 +10569:2:2174 +10570:2:2181 +10571:2:2182 +10572:2:2193 +10573:2:2194 +10574:2:2195 +10575:2:2193 +10576:2:2194 +10577:2:2195 +10578:2:2206 +10579:2:2211 +10580:2:2212 +10581:0:4365 +10582:2:2224 +10583:0:4365 +10584:3:3354 +10585:0:4365 +10586:2:2226 +10587:0:4365 +10588:3:3355 +10589:0:4365 +10590:2:1936 +10591:0:4365 +10592:2:2129 +10593:0:4365 +10594:2:2130 +10595:0:4365 +10596:2:2134 +10597:0:4365 +10598:3:3354 +10599:0:4365 +10600:2:2136 +10601:0:4365 +10602:3:3355 +10603:0:4365 +10604:2:2137 +10605:2:2141 +10606:2:2142 +10607:2:2150 +10608:2:2151 +10609:2:2155 +10610:2:2156 +10611:2:2150 +10612:2:2151 +10613:2:2152 +10614:2:2164 +10615:2:2169 +10616:2:2173 +10617:2:2174 +10618:2:2181 +10619:2:2182 +10620:2:2193 +10621:2:2194 +10622:2:2195 +10623:2:2193 +10624:2:2194 +10625:2:2195 +10626:2:2206 +10627:2:2211 +10628:2:2212 +10629:0:4365 +10630:2:2224 +10631:0:4365 +10632:3:3354 +10633:0:4365 +10634:2:2226 +10635:0:4365 +10636:3:3355 +10637:0:4365 +10638:2:2230 +10639:0:4365 +10640:3:3354 +10641:0:4365 +10642:2:2235 +10643:2:2239 +10644:2:2240 +10645:2:2248 +10646:2:2249 +10647:2:2253 +10648:2:2254 +10649:2:2248 +10650:2:2249 +10651:2:2250 +10652:2:2262 +10653:2:2267 +10654:2:2271 +10655:2:2272 +10656:2:2279 +10657:2:2280 +10658:2:2291 +10659:2:2292 +10660:2:2293 +10661:2:2291 +10662:2:2292 +10663:2:2293 +10664:2:2304 +10665:2:2309 +10666:2:2310 +10667:0:4365 +10668:3:3355 +10669:0:4365 +10670:2:2322 +10671:0:4365 +10672:2:1169 +10673:0:4365 +10674:3:3354 +10675:0:4365 +10676:2:1170 +10677:0:4365 +10678:3:3355 +10679:0:4365 +10680:3:3356 +10681:0:4365 +10682:3:3366 +10683:0:4365 +10684:3:2951 +10685:0:4365 +10686:3:2952 +10687:0:4365 +10688:3:2953 +10689:0:4365 +10690:3:2954 +10691:3:2958 +10692:3:2959 +10693:3:2967 +10694:3:2968 +10695:3:2972 +10696:3:2973 +10697:3:2967 +10698:3:2968 +10699:3:2972 +10700:3:2973 +10701:3:2981 +10702:3:2986 +10703:3:2990 +10704:3:2991 +10705:3:2998 +10706:3:2999 +10707:3:3010 +10708:3:3011 +10709:3:3012 +10710:3:3010 +10711:3:3011 +10712:3:3012 +10713:3:3023 +10714:3:3028 +10715:3:3029 +10716:0:4365 +10717:3:3041 +10718:0:4365 +10719:3:3042 +10720:0:4365 +10721:2:1173 +10722:0:4365 +10723:3:3043 +10724:0:4365 +10725:2:1179 +10726:0:4365 +10727:2:1180 +10728:0:4365 +10729:3:3042 +10730:0:4365 +10731:2:1181 +10732:2:1185 +10733:2:1186 +10734:2:1194 +10735:2:1195 +10736:2:1199 +10737:2:1200 +10738:2:1194 +10739:2:1195 +10740:2:1199 +10741:2:1200 +10742:2:1208 +10743:2:1213 +10744:2:1217 +10745:2:1218 +10746:2:1225 +10747:2:1226 +10748:2:1237 +10749:2:1238 +10750:2:1239 +10751:2:1237 +10752:2:1238 +10753:2:1239 +10754:2:1250 +10755:2:1255 +10756:2:1256 +10757:0:4365 +10758:3:3043 +10759:0:4365 +10760:2:1268 +10761:0:4365 +10762:3:3042 +10763:0:4365 +10764:2:1270 +10765:0:4365 +10766:3:3043 +10767:0:4365 +10768:2:1271 +10769:2:1275 +10770:2:1276 +10771:2:1284 +10772:2:1285 +10773:2:1289 +10774:2:1290 +10775:2:1284 +10776:2:1285 +10777:2:1289 +10778:2:1290 +10779:2:1298 +10780:2:1303 +10781:2:1307 +10782:2:1308 +10783:2:1315 +10784:2:1316 +10785:2:1327 +10786:2:1328 +10787:2:1329 +10788:2:1327 +10789:2:1328 +10790:2:1329 +10791:2:1340 +10792:2:1345 +10793:2:1346 +10794:0:4365 +10795:2:1358 +10796:0:4365 +10797:2:1360 +10798:0:4365 +10799:3:3042 +10800:0:4365 +10801:2:1361 +10802:0:4365 +10803:3:3043 +10804:0:4365 +10805:2:1362 +10806:2:1366 +10807:2:1367 +10808:2:1375 +10809:2:1376 +10810:2:1380 +10811:2:1381 +10812:2:1375 +10813:2:1376 +10814:2:1380 +10815:2:1381 +10816:2:1389 +10817:2:1394 +10818:2:1398 +10819:2:1399 +10820:2:1406 +10821:2:1407 +10822:2:1418 +10823:2:1419 +10824:2:1420 +10825:2:1418 +10826:2:1419 +10827:2:1420 +10828:2:1431 +10829:2:1436 +10830:2:1437 +10831:0:4365 +10832:2:1449 +10833:0:4365 +10834:3:3042 +10835:0:4365 +10836:2:1451 +10837:0:4365 +10838:3:3043 +10839:0:4365 +10840:2:1652 +10841:0:4365 +10842:2:1653 +10843:0:4365 +10844:2:1657 +10845:0:4365 +10846:2:1180 +10847:0:4365 +10848:3:3042 +10849:0:4365 +10850:2:1181 +10851:2:1185 +10852:2:1186 +10853:2:1194 +10854:2:1195 +10855:2:1199 +10856:2:1200 +10857:2:1194 +10858:2:1195 +10859:2:1196 +10860:2:1208 +10861:2:1213 +10862:2:1217 +10863:2:1218 +10864:2:1225 +10865:2:1226 +10866:2:1237 +10867:2:1238 +10868:2:1239 +10869:2:1237 +10870:2:1238 +10871:2:1239 +10872:2:1250 +10873:2:1255 +10874:2:1256 +10875:0:4365 +10876:3:3043 +10877:0:4365 +10878:2:1268 +10879:0:4365 +10880:3:3042 +10881:0:4365 +10882:2:1270 +10883:0:4365 +10884:3:3043 +10885:0:4365 +10886:2:1271 +10887:2:1275 +10888:2:1276 +10889:2:1284 +10890:2:1285 +10891:2:1289 +10892:2:1290 +10893:2:1284 +10894:2:1285 +10895:2:1289 +10896:2:1290 +10897:2:1298 +10898:2:1303 +10899:2:1307 +10900:2:1308 +10901:2:1315 +10902:2:1316 +10903:2:1327 +10904:2:1328 +10905:2:1329 +10906:2:1327 +10907:2:1328 +10908:2:1329 +10909:2:1340 +10910:2:1345 +10911:2:1346 +10912:0:4365 +10913:2:1358 +10914:0:4365 +10915:2:1454 +10916:0:4365 +10917:3:3042 +10918:0:4365 +10919:2:1455 +10920:0:4365 +10921:3:3043 +10922:0:4365 +10923:2:1652 +10924:0:4365 +10925:2:1653 +10926:0:4365 +10927:2:1657 +10928:0:4365 +10929:2:1660 +10930:0:4365 +10931:3:3042 +10932:0:4365 +10933:2:1665 +10934:2:1669 +10935:2:1670 +10936:2:1678 +10937:2:1679 +10938:2:1683 +10939:2:1684 +10940:2:1678 +10941:2:1679 +10942:2:1680 +10943:2:1692 +10944:2:1697 +10945:2:1701 +10946:2:1702 +10947:2:1709 +10948:2:1710 +10949:2:1721 +10950:2:1722 +10951:2:1723 +10952:2:1721 +10953:2:1722 +10954:2:1723 +10955:2:1734 +10956:2:1739 +10957:2:1740 +10958:0:4365 +10959:3:3043 +10960:0:4365 +10961:2:1752 +10962:0:4365 +10963:3:3042 +10964:0:4365 +10965:2:1754 +10966:0:4365 +10967:3:3043 +10968:0:4365 +10969:2:1755 +10970:2:1759 +10971:2:1760 +10972:2:1768 +10973:2:1769 +10974:2:1773 +10975:2:1774 +10976:2:1768 +10977:2:1769 +10978:2:1773 +10979:2:1774 +10980:2:1782 +10981:2:1787 +10982:2:1791 +10983:2:1792 +10984:2:1799 +10985:2:1800 +10986:2:1811 +10987:2:1812 +10988:2:1813 +10989:2:1811 +10990:2:1812 +10991:2:1813 +10992:2:1824 +10993:2:1829 +10994:2:1830 +10995:0:4365 +10996:2:1842 +10997:0:4365 +10998:3:3042 +10999:0:4365 +11000:2:1844 +11001:0:4365 +11002:3:3043 +11003:0:4365 +11004:2:1845 +11005:2:1849 +11006:2:1850 +11007:2:1858 +11008:2:1859 +11009:2:1863 +11010:2:1864 +11011:2:1858 +11012:2:1859 +11013:2:1863 +11014:2:1864 +11015:2:1872 +11016:2:1877 +11017:2:1881 +11018:2:1882 +11019:2:1889 +11020:2:1890 +11021:2:1901 +11022:2:1902 +11023:2:1903 +11024:2:1901 +11025:2:1902 +11026:2:1903 +11027:2:1914 +11028:2:1919 +11029:2:1920 +11030:0:4365 +11031:2:1932 +11032:0:4365 +11033:3:3042 +11034:0:4365 +11035:2:1934 +11036:0:4365 +11037:3:3043 +11038:0:4365 +11039:2:1935 +11040:0:4365 +11041:2:1936 +11042:0:4365 +11043:2:2129 +11044:0:4365 +11045:2:2130 +11046:0:4365 +11047:2:2134 +11048:0:4365 +11049:3:3042 +11050:0:4365 +11051:2:2136 +11052:0:4365 +11053:3:3043 +11054:0:4365 +11055:2:2137 +11056:2:2141 +11057:2:2142 +11058:2:2150 +11059:2:2151 +11060:2:2155 +11061:2:2156 +11062:2:2150 +11063:2:2151 +11064:2:2155 +11065:2:2156 +11066:2:2164 +11067:2:2169 +11068:2:2173 +11069:2:2174 +11070:2:2181 +11071:2:2182 +11072:2:2193 +11073:2:2194 +11074:2:2195 +11075:2:2193 +11076:2:2194 +11077:2:2195 +11078:2:2206 +11079:2:2211 +11080:2:2212 +11081:0:4365 +11082:2:2224 +11083:0:4365 +11084:3:3042 +11085:0:4365 +11086:2:2226 +11087:0:4365 +11088:3:3043 +11089:0:4365 +11090:2:1936 +11091:0:4365 +11092:2:2129 +11093:0:4365 +11094:2:2130 +11095:0:4365 +11096:2:2134 +11097:0:4365 +11098:3:3042 +11099:0:4365 +11100:2:2136 +11101:0:4365 +11102:3:3043 +11103:0:4365 +11104:2:2137 +11105:2:2141 +11106:2:2142 +11107:2:2150 +11108:2:2151 +11109:2:2155 +11110:2:2156 +11111:2:2150 +11112:2:2151 +11113:2:2152 +11114:2:2164 +11115:2:2169 +11116:2:2173 +11117:2:2174 +11118:2:2181 +11119:2:2182 +11120:2:2193 +11121:2:2194 +11122:2:2195 +11123:2:2193 +11124:2:2194 +11125:2:2195 +11126:2:2206 +11127:2:2211 +11128:2:2212 +11129:0:4365 +11130:2:2224 +11131:0:4365 +11132:3:3042 +11133:0:4365 +11134:2:2226 +11135:0:4365 +11136:3:3043 +11137:0:4365 +11138:2:2230 +11139:0:4365 +11140:3:3042 +11141:0:4365 +11142:2:2235 +11143:2:2239 +11144:2:2240 +11145:2:2248 +11146:2:2249 +11147:2:2253 +11148:2:2254 +11149:2:2248 +11150:2:2249 +11151:2:2250 +11152:2:2262 +11153:2:2267 +11154:2:2271 +11155:2:2272 +11156:2:2279 +11157:2:2280 +11158:2:2291 +11159:2:2292 +11160:2:2293 +11161:2:2291 +11162:2:2292 +11163:2:2293 +11164:2:2304 +11165:2:2309 +11166:2:2310 +11167:0:4365 +11168:3:3043 +11169:0:4365 +11170:2:2322 +11171:0:4365 +11172:2:1169 +11173:0:4365 +11174:3:3042 +11175:0:4365 +11176:2:1170 +11177:0:4365 +11178:3:3043 +11179:0:4365 +11180:3:3044 +11181:0:4365 +11182:3:3257 +11183:0:4365 +11184:3:3362 +11185:0:4365 +11186:3:3363 +11187:0:4365 +11188:3:3367 +11189:0:4365 +11190:3:3373 +11191:3:3377 +11192:3:3378 +11193:3:3386 +11194:3:3387 +11195:3:3391 +11196:3:3392 +11197:3:3386 +11198:3:3387 +11199:3:3391 +11200:3:3392 +11201:3:3400 +11202:3:3405 +11203:3:3409 +11204:3:3410 +11205:3:3417 +11206:3:3418 +11207:3:3429 +11208:3:3430 +11209:3:3431 +11210:3:3429 +11211:3:3430 +11212:3:3431 +11213:3:3442 +11214:3:3447 +11215:3:3448 +11216:0:4365 +11217:3:3460 +11218:0:4365 +11219:3:3461 +11220:0:4365 +11221:2:1173 +11222:0:4365 +11223:3:3462 +11224:0:4365 +11225:2:1179 +11226:0:4365 +11227:2:1180 +11228:0:4365 +11229:3:3461 +11230:0:4365 +11231:2:1181 +11232:2:1185 +11233:2:1186 +11234:2:1194 +11235:2:1195 +11236:2:1199 +11237:2:1200 +11238:2:1194 +11239:2:1195 +11240:2:1199 +11241:2:1200 +11242:2:1208 +11243:2:1213 +11244:2:1217 +11245:2:1218 +11246:2:1225 +11247:2:1226 +11248:2:1237 +11249:2:1238 +11250:2:1239 +11251:2:1237 +11252:2:1238 +11253:2:1239 +11254:2:1250 +11255:2:1255 +11256:2:1256 +11257:0:4365 +11258:3:3462 +11259:0:4365 +11260:2:1268 +11261:0:4365 +11262:3:3461 +11263:0:4365 +11264:2:1270 +11265:0:4365 +11266:3:3462 +11267:0:4365 +11268:2:1271 +11269:2:1275 +11270:2:1276 +11271:2:1284 +11272:2:1285 +11273:2:1289 +11274:2:1290 +11275:2:1284 +11276:2:1285 +11277:2:1289 +11278:2:1290 +11279:2:1298 +11280:2:1303 +11281:2:1307 +11282:2:1308 +11283:2:1315 +11284:2:1316 +11285:2:1327 +11286:2:1328 +11287:2:1329 +11288:2:1327 +11289:2:1328 +11290:2:1329 +11291:2:1340 +11292:2:1345 +11293:2:1346 +11294:0:4365 +11295:2:1358 +11296:0:4365 +11297:2:1360 +11298:0:4365 +11299:3:3461 +11300:0:4365 +11301:2:1361 +11302:0:4365 +11303:3:3462 +11304:0:4365 +11305:2:1362 +11306:2:1366 +11307:2:1367 +11308:2:1375 +11309:2:1376 +11310:2:1380 +11311:2:1381 +11312:2:1375 +11313:2:1376 +11314:2:1380 +11315:2:1381 +11316:2:1389 +11317:2:1394 +11318:2:1398 +11319:2:1399 +11320:2:1406 +11321:2:1407 +11322:2:1418 +11323:2:1419 +11324:2:1420 +11325:2:1418 +11326:2:1419 +11327:2:1420 +11328:2:1431 +11329:2:1436 +11330:2:1437 +11331:0:4365 +11332:2:1449 +11333:0:4365 +11334:3:3461 +11335:0:4365 +11336:2:1451 +11337:0:4365 +11338:3:3462 +11339:0:4365 +11340:2:1652 +11341:0:4365 +11342:2:1653 +11343:0:4365 +11344:2:1657 +11345:0:4365 +11346:2:1180 +11347:0:4365 +11348:3:3461 +11349:0:4365 +11350:2:1181 +11351:2:1185 +11352:2:1186 +11353:2:1194 +11354:2:1195 +11355:2:1199 +11356:2:1200 +11357:2:1194 +11358:2:1195 +11359:2:1196 +11360:2:1208 +11361:2:1213 +11362:2:1217 +11363:2:1218 +11364:2:1225 +11365:2:1226 +11366:2:1237 +11367:2:1238 +11368:2:1239 +11369:2:1237 +11370:2:1238 +11371:2:1239 +11372:2:1250 +11373:2:1255 +11374:2:1256 +11375:0:4365 +11376:3:3462 +11377:0:4365 +11378:2:1268 +11379:0:4365 +11380:3:3461 +11381:0:4365 +11382:2:1270 +11383:0:4365 +11384:3:3462 +11385:0:4365 +11386:2:1271 +11387:2:1275 +11388:2:1276 +11389:2:1284 +11390:2:1285 +11391:2:1289 +11392:2:1290 +11393:2:1284 +11394:2:1285 +11395:2:1289 +11396:2:1290 +11397:2:1298 +11398:2:1303 +11399:2:1307 +11400:2:1308 +11401:2:1315 +11402:2:1316 +11403:2:1327 +11404:2:1328 +11405:2:1329 +11406:2:1327 +11407:2:1328 +11408:2:1329 +11409:2:1340 +11410:2:1345 +11411:2:1346 +11412:0:4365 +11413:2:1358 +11414:0:4365 +11415:2:1454 +11416:0:4365 +11417:3:3461 +11418:0:4365 +11419:2:1455 +11420:0:4365 +11421:3:3462 +11422:0:4365 +11423:2:1652 +11424:0:4365 +11425:2:1653 +11426:0:4365 +11427:2:1657 +11428:0:4365 +11429:2:1660 +11430:0:4365 +11431:3:3461 +11432:0:4365 +11433:2:1665 +11434:2:1669 +11435:2:1670 +11436:2:1678 +11437:2:1679 +11438:2:1683 +11439:2:1684 +11440:2:1678 +11441:2:1679 +11442:2:1680 +11443:2:1692 +11444:2:1697 +11445:2:1701 +11446:2:1702 +11447:2:1709 +11448:2:1710 +11449:2:1721 +11450:2:1722 +11451:2:1723 +11452:2:1721 +11453:2:1722 +11454:2:1723 +11455:2:1734 +11456:2:1739 +11457:2:1740 +11458:0:4365 +11459:3:3462 +11460:0:4365 +11461:2:1752 +11462:0:4365 +11463:3:3461 +11464:0:4365 +11465:2:1754 +11466:0:4365 +11467:3:3462 +11468:0:4365 +11469:2:1755 +11470:2:1759 +11471:2:1760 +11472:2:1768 +11473:2:1769 +11474:2:1773 +11475:2:1774 +11476:2:1768 +11477:2:1769 +11478:2:1773 +11479:2:1774 +11480:2:1782 +11481:2:1787 +11482:2:1791 +11483:2:1792 +11484:2:1799 +11485:2:1800 +11486:2:1811 +11487:2:1812 +11488:2:1813 +11489:2:1811 +11490:2:1812 +11491:2:1813 +11492:2:1824 +11493:2:1829 +11494:2:1830 +11495:0:4365 +11496:2:1842 +11497:0:4365 +11498:3:3461 +11499:0:4365 +11500:2:1844 +11501:0:4365 +11502:3:3462 +11503:0:4365 +11504:2:1845 +11505:2:1849 +11506:2:1850 +11507:2:1858 +11508:2:1859 +11509:2:1863 +11510:2:1864 +11511:2:1858 +11512:2:1859 +11513:2:1863 +11514:2:1864 +11515:2:1872 +11516:2:1877 +11517:2:1881 +11518:2:1882 +11519:2:1889 +11520:2:1890 +11521:2:1901 +11522:2:1902 +11523:2:1903 +11524:2:1901 +11525:2:1902 +11526:2:1903 +11527:2:1914 +11528:2:1919 +11529:2:1920 +11530:0:4365 +11531:2:1932 +11532:0:4365 +11533:3:3461 +11534:0:4365 +11535:2:1934 +11536:0:4365 +11537:3:3462 +11538:0:4365 +11539:2:1935 +11540:0:4365 +11541:2:1936 +11542:0:4365 +11543:2:2129 +11544:0:4365 +11545:2:2130 +11546:0:4365 +11547:2:2134 +11548:0:4365 +11549:3:3461 +11550:0:4365 +11551:2:2136 +11552:0:4365 +11553:3:3462 +11554:0:4365 +11555:2:2137 +11556:2:2141 +11557:2:2142 +11558:2:2150 +11559:2:2151 +11560:2:2155 +11561:2:2156 +11562:2:2150 +11563:2:2151 +11564:2:2155 +11565:2:2156 +11566:2:2164 +11567:2:2169 +11568:2:2173 +11569:2:2174 +11570:2:2181 +11571:2:2182 +11572:2:2193 +11573:2:2194 +11574:2:2195 +11575:2:2193 +11576:2:2194 +11577:2:2195 +11578:2:2206 +11579:2:2211 +11580:2:2212 +11581:0:4365 +11582:2:2224 +11583:0:4365 +11584:3:3461 +11585:0:4365 +11586:2:2226 +11587:0:4365 +11588:3:3462 +11589:0:4365 +11590:2:1936 +11591:0:4365 +11592:2:2129 +11593:0:4365 +11594:2:2130 +11595:0:4365 +11596:2:2134 +11597:0:4365 +11598:3:3461 +11599:0:4365 +11600:2:2136 +11601:0:4365 +11602:3:3462 +11603:0:4365 +11604:2:2137 +11605:2:2141 +11606:2:2142 +11607:2:2150 +11608:2:2151 +11609:2:2155 +11610:2:2156 +11611:2:2150 +11612:2:2151 +11613:2:2152 +11614:2:2164 +11615:2:2169 +11616:2:2173 +11617:2:2174 +11618:2:2181 +11619:2:2182 +11620:2:2193 +11621:2:2194 +11622:2:2195 +11623:2:2193 +11624:2:2194 +11625:2:2195 +11626:2:2206 +11627:2:2211 +11628:2:2212 +11629:0:4365 +11630:2:2224 +11631:0:4365 +11632:3:3461 +11633:0:4365 +11634:2:2226 +11635:0:4365 +11636:3:3462 +11637:0:4365 +11638:2:2230 +11639:0:4365 +11640:3:3461 +11641:0:4365 +11642:2:2235 +11643:2:2239 +11644:2:2240 +11645:2:2248 +11646:2:2249 +11647:2:2253 +11648:2:2254 +11649:2:2248 +11650:2:2249 +11651:2:2250 +11652:2:2262 +11653:2:2267 +11654:2:2271 +11655:2:2272 +11656:2:2279 +11657:2:2280 +11658:2:2291 +11659:2:2292 +11660:2:2293 +11661:2:2291 +11662:2:2292 +11663:2:2293 +11664:2:2304 +11665:2:2309 +11666:2:2310 +11667:0:4365 +11668:3:3462 +11669:0:4365 +11670:2:2322 +11671:0:4365 +11672:2:1169 +11673:0:4365 +11674:3:3461 +11675:0:4365 +11676:2:1170 +11677:0:4365 +11678:3:3462 +11679:0:4365 +11680:3:3463 +11681:0:4365 +11682:3:3469 +11683:0:4365 +11684:3:3470 +11685:3:3474 +11686:3:3475 +11687:3:3483 +11688:3:3484 +11689:3:3488 +11690:3:3489 +11691:3:3483 +11692:3:3484 +11693:3:3488 +11694:3:3489 +11695:3:3497 +11696:3:3502 +11697:3:3506 +11698:3:3507 +11699:3:3514 +11700:3:3515 +11701:3:3526 +11702:3:3527 +11703:3:3528 +11704:3:3526 +11705:3:3527 +11706:3:3528 +11707:3:3539 +11708:3:3544 +11709:3:3545 +11710:0:4365 +11711:3:3557 +11712:0:4365 +11713:3:3558 +11714:0:4365 +11715:2:1173 +11716:0:4365 +11717:3:3559 +11718:0:4365 +11719:2:1179 +11720:0:4365 +11721:2:1180 +11722:0:4365 +11723:3:3558 +11724:0:4365 +11725:2:1181 +11726:2:1185 +11727:2:1186 +11728:2:1194 +11729:2:1195 +11730:2:1199 +11731:2:1200 +11732:2:1194 +11733:2:1195 +11734:2:1199 +11735:2:1200 +11736:2:1208 +11737:2:1213 +11738:2:1217 +11739:2:1218 +11740:2:1225 +11741:2:1226 +11742:2:1237 +11743:2:1238 +11744:2:1239 +11745:2:1237 +11746:2:1238 +11747:2:1239 +11748:2:1250 +11749:2:1255 +11750:2:1256 +11751:0:4365 +11752:3:3559 +11753:0:4365 +11754:2:1268 +11755:0:4365 +11756:3:3558 +11757:0:4365 +11758:2:1270 +11759:0:4365 +11760:3:3559 +11761:0:4365 +11762:2:1271 +11763:2:1275 +11764:2:1276 +11765:2:1284 +11766:2:1285 +11767:2:1289 +11768:2:1290 +11769:2:1284 +11770:2:1285 +11771:2:1289 +11772:2:1290 +11773:2:1298 +11774:2:1303 +11775:2:1307 +11776:2:1308 +11777:2:1315 +11778:2:1316 +11779:2:1327 +11780:2:1328 +11781:2:1329 +11782:2:1327 +11783:2:1328 +11784:2:1329 +11785:2:1340 +11786:2:1345 +11787:2:1346 +11788:0:4365 +11789:2:1358 +11790:0:4365 +11791:2:1360 +11792:0:4365 +11793:3:3558 +11794:0:4365 +11795:2:1361 +11796:0:4365 +11797:3:3559 +11798:0:4365 +11799:2:1362 +11800:2:1366 +11801:2:1367 +11802:2:1375 +11803:2:1376 +11804:2:1380 +11805:2:1381 +11806:2:1375 +11807:2:1376 +11808:2:1380 +11809:2:1381 +11810:2:1389 +11811:2:1394 +11812:2:1398 +11813:2:1399 +11814:2:1406 +11815:2:1407 +11816:2:1418 +11817:2:1419 +11818:2:1420 +11819:2:1418 +11820:2:1419 +11821:2:1420 +11822:2:1431 +11823:2:1436 +11824:2:1437 +11825:0:4365 +11826:2:1449 +11827:0:4365 +11828:3:3558 +11829:0:4365 +11830:2:1451 +11831:0:4365 +11832:3:3559 +11833:0:4365 +11834:2:1652 +11835:0:4365 +11836:2:1653 +11837:0:4365 +11838:2:1657 +11839:0:4365 +11840:2:1180 +11841:0:4365 +11842:3:3558 +11843:0:4365 +11844:2:1181 +11845:2:1185 +11846:2:1186 +11847:2:1194 +11848:2:1195 +11849:2:1199 +11850:2:1200 +11851:2:1194 +11852:2:1195 +11853:2:1196 +11854:2:1208 +11855:2:1213 +11856:2:1217 +11857:2:1218 +11858:2:1225 +11859:2:1226 +11860:2:1237 +11861:2:1238 +11862:2:1239 +11863:2:1237 +11864:2:1238 +11865:2:1239 +11866:2:1250 +11867:2:1255 +11868:2:1256 +11869:0:4365 +11870:3:3559 +11871:0:4365 +11872:2:1268 +11873:0:4365 +11874:3:3558 +11875:0:4365 +11876:2:1270 +11877:0:4365 +11878:3:3559 +11879:0:4365 +11880:2:1271 +11881:2:1275 +11882:2:1276 +11883:2:1284 +11884:2:1285 +11885:2:1289 +11886:2:1290 +11887:2:1284 +11888:2:1285 +11889:2:1289 +11890:2:1290 +11891:2:1298 +11892:2:1303 +11893:2:1307 +11894:2:1308 +11895:2:1315 +11896:2:1316 +11897:2:1327 +11898:2:1328 +11899:2:1329 +11900:2:1327 +11901:2:1328 +11902:2:1329 +11903:2:1340 +11904:2:1345 +11905:2:1346 +11906:0:4365 +11907:2:1358 +11908:0:4365 +11909:2:1454 +11910:0:4365 +11911:3:3558 +11912:0:4365 +11913:2:1455 +11914:0:4365 +11915:3:3559 +11916:0:4365 +11917:2:1652 +11918:0:4365 +11919:2:1653 +11920:0:4365 +11921:2:1657 +11922:0:4365 +11923:2:1660 +11924:0:4365 +11925:3:3558 +11926:0:4365 +11927:2:1665 +11928:2:1669 +11929:2:1670 +11930:2:1678 +11931:2:1679 +11932:2:1683 +11933:2:1684 +11934:2:1678 +11935:2:1679 +11936:2:1680 +11937:2:1692 +11938:2:1697 +11939:2:1701 +11940:2:1702 +11941:2:1709 +11942:2:1710 +11943:2:1721 +11944:2:1722 +11945:2:1723 +11946:2:1721 +11947:2:1722 +11948:2:1723 +11949:2:1734 +11950:2:1739 +11951:2:1740 +11952:0:4365 +11953:3:3559 +11954:0:4365 +11955:2:1752 +11956:0:4365 +11957:3:3558 +11958:0:4365 +11959:2:1754 +11960:0:4365 +11961:3:3559 +11962:0:4365 +11963:2:1755 +11964:2:1759 +11965:2:1760 +11966:2:1768 +11967:2:1769 +11968:2:1773 +11969:2:1774 +11970:2:1768 +11971:2:1769 +11972:2:1773 +11973:2:1774 +11974:2:1782 +11975:2:1787 +11976:2:1791 +11977:2:1792 +11978:2:1799 +11979:2:1800 +11980:2:1811 +11981:2:1812 +11982:2:1813 +11983:2:1811 +11984:2:1812 +11985:2:1813 +11986:2:1824 +11987:2:1829 +11988:2:1830 +11989:0:4365 +11990:2:1842 +11991:0:4365 +11992:3:3558 +11993:0:4365 +11994:2:1844 +11995:0:4365 +11996:3:3559 +11997:0:4365 +11998:2:1845 +11999:2:1849 +12000:2:1850 +12001:2:1858 +12002:2:1859 +12003:2:1863 +12004:2:1864 +12005:2:1858 +12006:2:1859 +12007:2:1863 +12008:2:1864 +12009:2:1872 +12010:2:1877 +12011:2:1881 +12012:2:1882 +12013:2:1889 +12014:2:1890 +12015:2:1901 +12016:2:1902 +12017:2:1903 +12018:2:1901 +12019:2:1902 +12020:2:1903 +12021:2:1914 +12022:2:1919 +12023:2:1920 +12024:0:4365 +12025:2:1932 +12026:0:4365 +12027:3:3558 +12028:0:4365 +12029:2:1934 +12030:0:4365 +12031:3:3559 +12032:0:4365 +12033:2:1935 +12034:0:4365 +12035:2:1936 +12036:0:4365 +12037:2:2129 +12038:0:4365 +12039:2:2130 +12040:0:4365 +12041:2:2134 +12042:0:4365 +12043:3:3558 +12044:0:4365 +12045:2:2136 +12046:0:4365 +12047:3:3559 +12048:0:4365 +12049:2:2137 +12050:2:2141 +12051:2:2142 +12052:2:2150 +12053:2:2151 +12054:2:2155 +12055:2:2156 +12056:2:2150 +12057:2:2151 +12058:2:2155 +12059:2:2156 +12060:2:2164 +12061:2:2169 +12062:2:2173 +12063:2:2174 +12064:2:2181 +12065:2:2182 +12066:2:2193 +12067:2:2194 +12068:2:2195 +12069:2:2193 +12070:2:2194 +12071:2:2195 +12072:2:2206 +12073:2:2211 +12074:2:2212 +12075:0:4365 +12076:2:2224 +12077:0:4365 +12078:3:3558 +12079:0:4365 +12080:2:2226 +12081:0:4365 +12082:3:3559 +12083:0:4365 +12084:2:1936 +12085:0:4365 +12086:2:2129 +12087:0:4365 +12088:2:2130 +12089:0:4365 +12090:2:2134 +12091:0:4365 +12092:3:3558 +12093:0:4365 +12094:2:2136 +12095:0:4365 +12096:3:3559 +12097:0:4365 +12098:2:2137 +12099:2:2141 +12100:2:2142 +12101:2:2150 +12102:2:2151 +12103:2:2155 +12104:2:2156 +12105:2:2150 +12106:2:2151 +12107:2:2152 +12108:2:2164 +12109:2:2169 +12110:2:2173 +12111:2:2174 +12112:2:2181 +12113:2:2182 +12114:2:2193 +12115:2:2194 +12116:2:2195 +12117:2:2193 +12118:2:2194 +12119:2:2195 +12120:2:2206 +12121:2:2211 +12122:2:2212 +12123:0:4365 +12124:2:2224 +12125:0:4365 +12126:3:3558 +12127:0:4365 +12128:2:2226 +12129:0:4365 +12130:3:3559 +12131:0:4365 +12132:2:2230 +12133:0:4365 +12134:3:3558 +12135:0:4365 +12136:2:2235 +12137:2:2239 +12138:2:2240 +12139:2:2248 +12140:2:2249 +12141:2:2253 +12142:2:2254 +12143:2:2248 +12144:2:2249 +12145:2:2250 +12146:2:2262 +12147:2:2267 +12148:2:2271 +12149:2:2272 +12150:2:2279 +12151:2:2280 +12152:2:2291 +12153:2:2292 +12154:2:2293 +12155:2:2291 +12156:2:2292 +12157:2:2293 +12158:2:2304 +12159:2:2309 +12160:2:2310 +12161:0:4365 +12162:3:3559 +12163:0:4365 +12164:2:2322 +12165:0:4365 +12166:2:1169 +12167:0:4365 +12168:3:3558 +12169:0:4365 +12170:2:1170 +12171:0:4365 +12172:3:3559 +12173:0:4365 +12174:3:3560 +12175:0:4365 +12176:3:3566 +12177:0:4365 +12178:3:3569 +12179:3:3570 +12180:3:3582 +12181:3:3583 +12182:3:3587 +12183:3:3588 +12184:3:3582 +12185:3:3583 +12186:3:3587 +12187:3:3588 +12188:3:3596 +12189:3:3601 +12190:3:3605 +12191:3:3606 +12192:3:3613 +12193:3:3614 +12194:3:3625 +12195:3:3626 +12196:3:3627 +12197:3:3625 +12198:3:3626 +12199:3:3627 +12200:3:3638 +12201:3:3643 +12202:3:3644 +12203:0:4365 +12204:3:3656 +12205:0:4365 +12206:3:3657 +12207:0:4365 +12208:2:1173 +12209:0:4365 +12210:3:3658 +12211:0:4365 +12212:2:1179 +12213:0:4365 +12214:2:1180 +12215:0:4365 +12216:3:3657 +12217:0:4365 +12218:2:1181 +12219:2:1185 +12220:2:1186 +12221:2:1194 +12222:2:1195 +12223:2:1199 +12224:2:1200 +12225:2:1194 +12226:2:1195 +12227:2:1199 +12228:2:1200 +12229:2:1208 +12230:2:1213 +12231:2:1217 +12232:2:1218 +12233:2:1225 +12234:2:1226 +12235:2:1237 +12236:2:1238 +12237:2:1239 +12238:2:1237 +12239:2:1238 +12240:2:1239 +12241:2:1250 +12242:2:1255 +12243:2:1256 +12244:0:4365 +12245:3:3658 +12246:0:4365 +12247:2:1268 +12248:0:4365 +12249:3:3657 +12250:0:4365 +12251:2:1270 +12252:0:4365 +12253:3:3658 +12254:0:4365 +12255:2:1271 +12256:2:1275 +12257:2:1276 +12258:2:1284 +12259:2:1285 +12260:2:1289 +12261:2:1290 +12262:2:1284 +12263:2:1285 +12264:2:1289 +12265:2:1290 +12266:2:1298 +12267:2:1303 +12268:2:1307 +12269:2:1308 +12270:2:1315 +12271:2:1316 +12272:2:1327 +12273:2:1328 +12274:2:1329 +12275:2:1327 +12276:2:1328 +12277:2:1329 +12278:2:1340 +12279:2:1345 +12280:2:1346 +12281:0:4365 +12282:2:1358 +12283:0:4365 +12284:2:1360 +12285:0:4365 +12286:3:3657 +12287:0:4365 +12288:2:1361 +12289:0:4365 +12290:3:3658 +12291:0:4365 +12292:2:1362 +12293:2:1366 +12294:2:1367 +12295:2:1375 +12296:2:1376 +12297:2:1380 +12298:2:1381 +12299:2:1375 +12300:2:1376 +12301:2:1380 +12302:2:1381 +12303:2:1389 +12304:2:1394 +12305:2:1398 +12306:2:1399 +12307:2:1406 +12308:2:1407 +12309:2:1418 +12310:2:1419 +12311:2:1420 +12312:2:1418 +12313:2:1419 +12314:2:1420 +12315:2:1431 +12316:2:1436 +12317:2:1437 +12318:0:4365 +12319:2:1449 +12320:0:4365 +12321:3:3657 +12322:0:4365 +12323:2:1451 +12324:0:4365 +12325:3:3658 +12326:0:4365 +12327:2:1652 +12328:0:4365 +12329:2:1653 +12330:0:4365 +12331:2:1657 +12332:0:4365 +12333:2:1180 +12334:0:4365 +12335:3:3657 +12336:0:4365 +12337:2:1181 +12338:2:1185 +12339:2:1186 +12340:2:1194 +12341:2:1195 +12342:2:1199 +12343:2:1200 +12344:2:1194 +12345:2:1195 +12346:2:1196 +12347:2:1208 +12348:2:1213 +12349:2:1217 +12350:2:1218 +12351:2:1225 +12352:2:1226 +12353:2:1237 +12354:2:1238 +12355:2:1239 +12356:2:1237 +12357:2:1238 +12358:2:1239 +12359:2:1250 +12360:2:1255 +12361:2:1256 +12362:0:4365 +12363:3:3658 +12364:0:4365 +12365:2:1268 +12366:0:4365 +12367:3:3657 +12368:0:4365 +12369:2:1270 +12370:0:4365 +12371:3:3658 +12372:0:4365 +12373:2:1271 +12374:2:1275 +12375:2:1276 +12376:2:1284 +12377:2:1285 +12378:2:1289 +12379:2:1290 +12380:2:1284 +12381:2:1285 +12382:2:1289 +12383:2:1290 +12384:2:1298 +12385:2:1303 +12386:2:1307 +12387:2:1308 +12388:2:1315 +12389:2:1316 +12390:2:1327 +12391:2:1328 +12392:2:1329 +12393:2:1327 +12394:2:1328 +12395:2:1329 +12396:2:1340 +12397:2:1345 +12398:2:1346 +12399:0:4365 +12400:2:1358 +12401:0:4365 +12402:2:1454 +12403:0:4365 +12404:3:3657 +12405:0:4365 +12406:2:1455 +12407:0:4365 +12408:3:3658 +12409:0:4365 +12410:2:1652 +12411:0:4365 +12412:2:1653 +12413:0:4365 +12414:2:1657 +12415:0:4365 +12416:2:1660 +12417:0:4365 +12418:3:3657 +12419:0:4365 +12420:2:1665 +12421:2:1669 +12422:2:1670 +12423:2:1678 +12424:2:1679 +12425:2:1683 +12426:2:1684 +12427:2:1678 +12428:2:1679 +12429:2:1680 +12430:2:1692 +12431:2:1697 +12432:2:1701 +12433:2:1702 +12434:2:1709 +12435:2:1710 +12436:2:1721 +12437:2:1722 +12438:2:1723 +12439:2:1721 +12440:2:1722 +12441:2:1723 +12442:2:1734 +12443:2:1739 +12444:2:1740 +12445:0:4365 +12446:3:3658 +12447:0:4365 +12448:2:1752 +12449:0:4365 +12450:3:3657 +12451:0:4365 +12452:2:1754 +12453:0:4365 +12454:3:3658 +12455:0:4365 +12456:2:1755 +12457:2:1759 +12458:2:1760 +12459:2:1768 +12460:2:1769 +12461:2:1773 +12462:2:1774 +12463:2:1768 +12464:2:1769 +12465:2:1773 +12466:2:1774 +12467:2:1782 +12468:2:1787 +12469:2:1791 +12470:2:1792 +12471:2:1799 +12472:2:1800 +12473:2:1811 +12474:2:1812 +12475:2:1813 +12476:2:1811 +12477:2:1812 +12478:2:1813 +12479:2:1824 +12480:2:1829 +12481:2:1830 +12482:0:4365 +12483:2:1842 +12484:0:4365 +12485:3:3657 +12486:0:4365 +12487:2:1844 +12488:0:4365 +12489:3:3658 +12490:0:4365 +12491:2:1845 +12492:2:1849 +12493:2:1850 +12494:2:1858 +12495:2:1859 +12496:2:1863 +12497:2:1864 +12498:2:1858 +12499:2:1859 +12500:2:1863 +12501:2:1864 +12502:2:1872 +12503:2:1877 +12504:2:1881 +12505:2:1882 +12506:2:1889 +12507:2:1890 +12508:2:1901 +12509:2:1902 +12510:2:1903 +12511:2:1901 +12512:2:1902 +12513:2:1903 +12514:2:1914 +12515:2:1919 +12516:2:1920 +12517:0:4365 +12518:2:1932 +12519:0:4365 +12520:3:3657 +12521:0:4365 +12522:2:1934 +12523:0:4365 +12524:3:3658 +12525:0:4365 +12526:2:1935 +12527:0:4365 +12528:2:1936 +12529:0:4365 +12530:2:2129 +12531:0:4365 +12532:2:2130 +12533:0:4365 +12534:2:2134 +12535:0:4365 +12536:3:3657 +12537:0:4365 +12538:2:2136 +12539:0:4365 +12540:3:3658 +12541:0:4365 +12542:2:2137 +12543:2:2141 +12544:2:2142 +12545:2:2150 +12546:2:2151 +12547:2:2155 +12548:2:2156 +12549:2:2150 +12550:2:2151 +12551:2:2155 +12552:2:2156 +12553:2:2164 +12554:2:2169 +12555:2:2173 +12556:2:2174 +12557:2:2181 +12558:2:2182 +12559:2:2193 +12560:2:2194 +12561:2:2195 +12562:2:2193 +12563:2:2194 +12564:2:2195 +12565:2:2206 +12566:2:2211 +12567:2:2212 +12568:0:4365 +12569:2:2224 +12570:0:4365 +12571:3:3657 +12572:0:4365 +12573:2:2226 +12574:0:4365 +12575:3:3658 +12576:0:4365 +12577:2:1936 +12578:0:4365 +12579:2:2129 +12580:0:4365 +12581:2:2130 +12582:0:4365 +12583:2:2134 +12584:0:4365 +12585:3:3657 +12586:0:4365 +12587:2:2136 +12588:0:4365 +12589:3:3658 +12590:0:4365 +12591:2:2137 +12592:2:2141 +12593:2:2142 +12594:2:2150 +12595:2:2151 +12596:2:2155 +12597:2:2156 +12598:2:2150 +12599:2:2151 +12600:2:2152 +12601:2:2164 +12602:2:2169 +12603:2:2173 +12604:2:2174 +12605:2:2181 +12606:2:2182 +12607:2:2193 +12608:2:2194 +12609:2:2195 +12610:2:2193 +12611:2:2194 +12612:2:2195 +12613:2:2206 +12614:2:2211 +12615:2:2212 +12616:0:4365 +12617:2:2224 +12618:0:4365 +12619:3:3657 +12620:0:4365 +12621:2:2226 +12622:0:4365 +12623:3:3658 +12624:0:4365 +12625:2:2230 +12626:0:4365 +12627:3:3657 +12628:0:4365 +12629:2:2235 +12630:2:2239 +12631:2:2240 +12632:2:2248 +12633:2:2249 +12634:2:2253 +12635:2:2254 +12636:2:2248 +12637:2:2249 +12638:2:2250 +12639:2:2262 +12640:2:2267 +12641:2:2271 +12642:2:2272 +12643:2:2279 +12644:2:2280 +12645:2:2291 +12646:2:2292 +12647:2:2293 +12648:2:2291 +12649:2:2292 +12650:2:2293 +12651:2:2304 +12652:2:2309 +12653:2:2310 +12654:0:4365 +12655:3:3658 +12656:0:4365 +12657:2:2322 +12658:0:4365 +12659:2:1169 +12660:0:4365 +12661:3:3657 +12662:0:4365 +12663:2:1170 +12664:0:4365 +12665:3:3658 +12666:0:4365 +12667:3:3659 +12668:0:4365 +12669:3:3665 +12670:0:4365 +12671:3:3666 +12672:0:4365 +12673:3:3667 +12674:0:4365 +12675:3:3668 +12676:0:4365 +12677:3:3669 +12678:3:3673 +12679:3:3674 +12680:3:3682 +12681:3:3683 +12682:3:3687 +12683:3:3688 +12684:3:3682 +12685:3:3683 +12686:3:3687 +12687:3:3688 +12688:3:3696 +12689:3:3701 +12690:3:3705 +12691:3:3706 +12692:3:3713 +12693:3:3714 +12694:3:3725 +12695:3:3726 +12696:3:3727 +12697:3:3725 +12698:3:3726 +12699:3:3727 +12700:3:3738 +12701:3:3743 +12702:3:3744 +12703:0:4365 +12704:3:3756 +12705:0:4365 +12706:3:3757 +12707:0:4365 +12708:2:1173 +12709:0:4365 +12710:3:3758 +12711:0:4365 +12712:2:1179 +12713:0:4365 +12714:2:1180 +12715:0:4365 +12716:3:3757 +12717:0:4365 +12718:2:1181 +12719:2:1185 +12720:2:1186 +12721:2:1194 +12722:2:1195 +12723:2:1199 +12724:2:1200 +12725:2:1194 +12726:2:1195 +12727:2:1199 +12728:2:1200 +12729:2:1208 +12730:2:1213 +12731:2:1217 +12732:2:1218 +12733:2:1225 +12734:2:1226 +12735:2:1237 +12736:2:1238 +12737:2:1239 +12738:2:1237 +12739:2:1238 +12740:2:1239 +12741:2:1250 +12742:2:1255 +12743:2:1256 +12744:0:4365 +12745:3:3758 +12746:0:4365 +12747:2:1268 +12748:0:4365 +12749:3:3757 +12750:0:4365 +12751:2:1270 +12752:0:4365 +12753:3:3758 +12754:0:4365 +12755:2:1271 +12756:2:1275 +12757:2:1276 +12758:2:1284 +12759:2:1285 +12760:2:1289 +12761:2:1290 +12762:2:1284 +12763:2:1285 +12764:2:1289 +12765:2:1290 +12766:2:1298 +12767:2:1303 +12768:2:1307 +12769:2:1308 +12770:2:1315 +12771:2:1316 +12772:2:1327 +12773:2:1328 +12774:2:1329 +12775:2:1327 +12776:2:1328 +12777:2:1329 +12778:2:1340 +12779:2:1345 +12780:2:1346 +12781:0:4365 +12782:2:1358 +12783:0:4365 +12784:2:1360 +12785:0:4365 +12786:3:3757 +12787:0:4365 +12788:2:1361 +12789:0:4365 +12790:3:3758 +12791:0:4365 +12792:2:1362 +12793:2:1366 +12794:2:1367 +12795:2:1375 +12796:2:1376 +12797:2:1380 +12798:2:1381 +12799:2:1375 +12800:2:1376 +12801:2:1380 +12802:2:1381 +12803:2:1389 +12804:2:1394 +12805:2:1398 +12806:2:1399 +12807:2:1406 +12808:2:1407 +12809:2:1418 +12810:2:1419 +12811:2:1420 +12812:2:1418 +12813:2:1419 +12814:2:1420 +12815:2:1431 +12816:2:1436 +12817:2:1437 +12818:0:4365 +12819:2:1449 +12820:0:4365 +12821:3:3757 +12822:0:4365 +12823:2:1451 +12824:0:4365 +12825:3:3758 +12826:0:4365 +12827:2:1652 +12828:0:4365 +12829:2:1653 +12830:0:4365 +12831:2:1657 +12832:0:4365 +12833:2:1180 +12834:0:4365 +12835:3:3757 +12836:0:4365 +12837:2:1181 +12838:2:1185 +12839:2:1186 +12840:2:1194 +12841:2:1195 +12842:2:1199 +12843:2:1200 +12844:2:1194 +12845:2:1195 +12846:2:1196 +12847:2:1208 +12848:2:1213 +12849:2:1217 +12850:2:1218 +12851:2:1225 +12852:2:1226 +12853:2:1237 +12854:2:1238 +12855:2:1239 +12856:2:1237 +12857:2:1238 +12858:2:1239 +12859:2:1250 +12860:2:1255 +12861:2:1256 +12862:0:4365 +12863:3:3758 +12864:0:4365 +12865:2:1268 +12866:0:4365 +12867:3:3757 +12868:0:4365 +12869:2:1270 +12870:0:4365 +12871:3:3758 +12872:0:4365 +12873:2:1271 +12874:2:1275 +12875:2:1276 +12876:2:1284 +12877:2:1285 +12878:2:1289 +12879:2:1290 +12880:2:1284 +12881:2:1285 +12882:2:1289 +12883:2:1290 +12884:2:1298 +12885:2:1303 +12886:2:1307 +12887:2:1308 +12888:2:1315 +12889:2:1316 +12890:2:1327 +12891:2:1328 +12892:2:1329 +12893:2:1327 +12894:2:1328 +12895:2:1329 +12896:2:1340 +12897:2:1345 +12898:2:1346 +12899:0:4365 +12900:2:1358 +12901:0:4365 +12902:2:1454 +12903:0:4365 +12904:3:3757 +12905:0:4365 +12906:2:1455 +12907:0:4365 +12908:3:3758 +12909:0:4365 +12910:2:1652 +12911:0:4365 +12912:2:1653 +12913:0:4365 +12914:2:1657 +12915:0:4365 +12916:2:1660 +12917:0:4365 +12918:3:3757 +12919:0:4365 +12920:2:1665 +12921:2:1669 +12922:2:1670 +12923:2:1678 +12924:2:1679 +12925:2:1683 +12926:2:1684 +12927:2:1678 +12928:2:1679 +12929:2:1680 +12930:2:1692 +12931:2:1697 +12932:2:1701 +12933:2:1702 +12934:2:1709 +12935:2:1710 +12936:2:1721 +12937:2:1722 +12938:2:1723 +12939:2:1721 +12940:2:1722 +12941:2:1723 +12942:2:1734 +12943:2:1739 +12944:2:1740 +12945:0:4365 +12946:3:3758 +12947:0:4365 +12948:2:1752 +12949:0:4365 +12950:3:3757 +12951:0:4365 +12952:2:1754 +12953:0:4365 +12954:3:3758 +12955:0:4365 +12956:2:1755 +12957:2:1759 +12958:2:1760 +12959:2:1768 +12960:2:1769 +12961:2:1773 +12962:2:1774 +12963:2:1768 +12964:2:1769 +12965:2:1773 +12966:2:1774 +12967:2:1782 +12968:2:1787 +12969:2:1791 +12970:2:1792 +12971:2:1799 +12972:2:1800 +12973:2:1811 +12974:2:1812 +12975:2:1813 +12976:2:1811 +12977:2:1812 +12978:2:1813 +12979:2:1824 +12980:2:1829 +12981:2:1830 +12982:0:4365 +12983:2:1842 +12984:0:4365 +12985:3:3757 +12986:0:4365 +12987:2:1844 +12988:0:4365 +12989:3:3758 +12990:0:4365 +12991:2:1845 +12992:2:1849 +12993:2:1850 +12994:2:1858 +12995:2:1859 +12996:2:1863 +12997:2:1864 +12998:2:1858 +12999:2:1859 +13000:2:1863 +13001:2:1864 +13002:2:1872 +13003:2:1877 +13004:2:1881 +13005:2:1882 +13006:2:1889 +13007:2:1890 +13008:2:1901 +13009:2:1902 +13010:2:1903 +13011:2:1901 +13012:2:1902 +13013:2:1903 +13014:2:1914 +13015:2:1919 +13016:2:1920 +13017:0:4365 +13018:2:1932 +13019:0:4365 +13020:3:3757 +13021:0:4365 +13022:2:1934 +13023:0:4365 +13024:3:3758 +13025:0:4365 +13026:2:1935 +13027:0:4365 +13028:2:1936 +13029:0:4365 +13030:2:2129 +13031:0:4365 +13032:2:2130 +13033:0:4365 +13034:2:2134 +13035:0:4365 +13036:3:3757 +13037:0:4365 +13038:2:2136 +13039:0:4365 +13040:3:3758 +13041:0:4365 +13042:2:2137 +13043:2:2141 +13044:2:2142 +13045:2:2150 +13046:2:2151 +13047:2:2155 +13048:2:2156 +13049:2:2150 +13050:2:2151 +13051:2:2155 +13052:2:2156 +13053:2:2164 +13054:2:2169 +13055:2:2173 +13056:2:2174 +13057:2:2181 +13058:2:2182 +13059:2:2193 +13060:2:2194 +13061:2:2195 +13062:2:2193 +13063:2:2194 +13064:2:2195 +13065:2:2206 +13066:2:2211 +13067:2:2212 +13068:0:4365 +13069:2:2224 +13070:0:4365 +13071:3:3757 +13072:0:4365 +13073:2:2226 +13074:0:4365 +13075:3:3758 +13076:0:4365 +13077:2:1936 +13078:0:4365 +13079:2:2129 +13080:0:4365 +13081:2:2130 +13082:0:4365 +13083:2:2134 +13084:0:4365 +13085:3:3757 +13086:0:4365 +13087:2:2136 +13088:0:4365 +13089:3:3758 +13090:0:4365 +13091:2:2137 +13092:2:2141 +13093:2:2142 +13094:2:2150 +13095:2:2151 +13096:2:2155 +13097:2:2156 +13098:2:2150 +13099:2:2151 +13100:2:2152 +13101:2:2164 +13102:2:2169 +13103:2:2173 +13104:2:2174 +13105:2:2181 +13106:2:2182 +13107:2:2193 +13108:2:2194 +13109:2:2195 +13110:2:2193 +13111:2:2194 +13112:2:2195 +13113:2:2206 +13114:2:2211 +13115:2:2212 +13116:0:4365 +13117:2:2224 +13118:0:4365 +13119:3:3757 +13120:0:4365 +13121:2:2226 +13122:0:4365 +13123:3:3758 +13124:0:4365 +13125:2:2230 +13126:0:4365 +13127:3:3757 +13128:0:4365 +13129:2:2235 +13130:2:2239 +13131:2:2240 +13132:2:2248 +13133:2:2249 +13134:2:2253 +13135:2:2254 +13136:2:2248 +13137:2:2249 +13138:2:2250 +13139:2:2262 +13140:2:2267 +13141:2:2271 +13142:2:2272 +13143:2:2279 +13144:2:2280 +13145:2:2291 +13146:2:2292 +13147:2:2293 +13148:2:2291 +13149:2:2292 +13150:2:2293 +13151:2:2304 +13152:2:2309 +13153:2:2310 +13154:0:4365 +13155:3:3758 +13156:0:4365 +13157:2:2322 +13158:0:4365 +13159:2:1169 +13160:0:4365 +13161:3:3757 +13162:0:4365 +13163:2:1170 +13164:0:4365 +13165:3:3758 +13166:0:4365 +13167:3:3759 +13168:0:4365 +13169:3:3972 +13170:0:4365 +13171:3:3980 +13172:0:4365 +13173:3:3981 +13174:3:3985 +13175:3:3986 +13176:3:3994 +13177:3:3995 +13178:3:3999 +13179:3:4000 +13180:3:3994 +13181:3:3995 +13182:3:3999 +13183:3:4000 +13184:3:4008 +13185:3:4013 +13186:3:4017 +13187:3:4018 +13188:3:4025 +13189:3:4026 +13190:3:4037 +13191:3:4038 +13192:3:4039 +13193:3:4037 +13194:3:4038 +13195:3:4039 +13196:3:4050 +13197:3:4055 +13198:3:4056 +13199:0:4365 +13200:3:4068 +13201:0:4365 +13202:3:4069 +13203:0:4365 +13204:2:1173 +13205:0:4365 +13206:3:4070 +13207:0:4365 +13208:2:1179 +13209:0:4365 +13210:2:1180 +13211:0:4365 +13212:3:4069 +13213:0:4365 +13214:2:1181 +13215:2:1185 +13216:2:1186 +13217:2:1194 +13218:2:1195 +13219:2:1199 +13220:2:1200 +13221:2:1194 +13222:2:1195 +13223:2:1199 +13224:2:1200 +13225:2:1208 +13226:2:1213 +13227:2:1217 +13228:2:1218 +13229:2:1225 +13230:2:1226 +13231:2:1237 +13232:2:1238 +13233:2:1239 +13234:2:1237 +13235:2:1238 +13236:2:1239 +13237:2:1250 +13238:2:1255 +13239:2:1256 +13240:0:4365 +13241:3:4070 +13242:0:4365 +13243:2:1268 +13244:0:4365 +13245:3:4069 +13246:0:4365 +13247:2:1270 +13248:0:4365 +13249:3:4070 +13250:0:4365 +13251:2:1271 +13252:2:1275 +13253:2:1276 +13254:2:1284 +13255:2:1285 +13256:2:1289 +13257:2:1290 +13258:2:1284 +13259:2:1285 +13260:2:1289 +13261:2:1290 +13262:2:1298 +13263:2:1303 +13264:2:1307 +13265:2:1308 +13266:2:1315 +13267:2:1316 +13268:2:1327 +13269:2:1328 +13270:2:1329 +13271:2:1327 +13272:2:1328 +13273:2:1329 +13274:2:1340 +13275:2:1345 +13276:2:1346 +13277:0:4365 +13278:2:1358 +13279:0:4365 +13280:2:1360 +13281:0:4365 +13282:3:4069 +13283:0:4365 +13284:2:1361 +13285:0:4365 +13286:3:4070 +13287:0:4365 +13288:2:1362 +13289:2:1366 +13290:2:1367 +13291:2:1375 +13292:2:1376 +13293:2:1380 +13294:2:1381 +13295:2:1375 +13296:2:1376 +13297:2:1380 +13298:2:1381 +13299:2:1389 +13300:2:1394 +13301:2:1398 +13302:2:1399 +13303:2:1406 +13304:2:1407 +13305:2:1418 +13306:2:1419 +13307:2:1420 +13308:2:1418 +13309:2:1419 +13310:2:1420 +13311:2:1431 +13312:2:1436 +13313:2:1437 +13314:0:4365 +13315:2:1449 +13316:0:4365 +13317:3:4069 +13318:0:4365 +13319:2:1451 +13320:0:4365 +13321:3:4070 +13322:0:4365 +13323:2:1652 +13324:0:4365 +13325:2:1653 +13326:0:4365 +13327:2:1657 +13328:0:4365 +13329:2:1180 +13330:0:4365 +13331:3:4069 +13332:0:4365 +13333:2:1181 +13334:2:1185 +13335:2:1186 +13336:2:1194 +13337:2:1195 +13338:2:1199 +13339:2:1200 +13340:2:1194 +13341:2:1195 +13342:2:1196 +13343:2:1208 +13344:2:1213 +13345:2:1217 +13346:2:1218 +13347:2:1225 +13348:2:1226 +13349:2:1237 +13350:2:1238 +13351:2:1239 +13352:2:1237 +13353:2:1238 +13354:2:1239 +13355:2:1250 +13356:2:1255 +13357:2:1256 +13358:0:4365 +13359:3:4070 +13360:0:4365 +13361:2:1268 +13362:0:4365 +13363:3:4069 +13364:0:4365 +13365:2:1270 +13366:0:4365 +13367:3:4070 +13368:0:4365 +13369:2:1271 +13370:2:1275 +13371:2:1276 +13372:2:1284 +13373:2:1285 +13374:2:1289 +13375:2:1290 +13376:2:1284 +13377:2:1285 +13378:2:1289 +13379:2:1290 +13380:2:1298 +13381:2:1303 +13382:2:1307 +13383:2:1308 +13384:2:1315 +13385:2:1316 +13386:2:1327 +13387:2:1328 +13388:2:1329 +13389:2:1327 +13390:2:1328 +13391:2:1329 +13392:2:1340 +13393:2:1345 +13394:2:1346 +13395:0:4365 +13396:2:1358 +13397:0:4365 +13398:2:1454 +13399:0:4365 +13400:3:4069 +13401:0:4365 +13402:2:1455 +13403:0:4365 +13404:3:4070 +13405:0:4365 +13406:2:1652 +13407:0:4365 +13408:2:1653 +13409:0:4365 +13410:2:1657 +13411:0:4365 +13412:2:1660 +13413:0:4365 +13414:3:4069 +13415:0:4365 +13416:2:1665 +13417:2:1669 +13418:2:1670 +13419:2:1678 +13420:2:1679 +13421:2:1683 +13422:2:1684 +13423:2:1678 +13424:2:1679 +13425:2:1680 +13426:2:1692 +13427:2:1697 +13428:2:1701 +13429:2:1702 +13430:2:1709 +13431:2:1710 +13432:2:1721 +13433:2:1722 +13434:2:1723 +13435:2:1721 +13436:2:1722 +13437:2:1723 +13438:2:1734 +13439:2:1739 +13440:2:1740 +13441:0:4365 +13442:3:4070 +13443:0:4365 +13444:2:1752 +13445:0:4365 +13446:3:4069 +13447:0:4365 +13448:2:1754 +13449:0:4365 +13450:3:4070 +13451:0:4365 +13452:2:1755 +13453:2:1759 +13454:2:1760 +13455:2:1768 +13456:2:1769 +13457:2:1773 +13458:2:1774 +13459:2:1768 +13460:2:1769 +13461:2:1773 +13462:2:1774 +13463:2:1782 +13464:2:1787 +13465:2:1791 +13466:2:1792 +13467:2:1799 +13468:2:1800 +13469:2:1811 +13470:2:1812 +13471:2:1813 +13472:2:1811 +13473:2:1812 +13474:2:1813 +13475:2:1824 +13476:2:1829 +13477:2:1830 +13478:0:4365 +13479:2:1842 +13480:0:4365 +13481:3:4069 +13482:0:4365 +13483:2:1844 +13484:0:4365 +13485:3:4070 +13486:0:4365 +13487:2:1845 +13488:2:1849 +13489:2:1850 +13490:2:1858 +13491:2:1859 +13492:2:1863 +13493:2:1864 +13494:2:1858 +13495:2:1859 +13496:2:1863 +13497:2:1864 +13498:2:1872 +13499:2:1877 +13500:2:1881 +13501:2:1882 +13502:2:1889 +13503:2:1890 +13504:2:1901 +13505:2:1902 +13506:2:1903 +13507:2:1901 +13508:2:1902 +13509:2:1903 +13510:2:1914 +13511:2:1919 +13512:2:1920 +13513:0:4365 +13514:2:1932 +13515:0:4365 +13516:3:4069 +13517:0:4365 +13518:2:1934 +13519:0:4365 +13520:3:4070 +13521:0:4365 +13522:2:1935 +13523:0:4365 +13524:2:1936 +13525:0:4365 +13526:2:2129 +13527:0:4365 +13528:2:2130 +13529:0:4365 +13530:2:2134 +13531:0:4365 +13532:3:4069 +13533:0:4365 +13534:2:2136 +13535:0:4365 +13536:3:4070 +13537:0:4365 +13538:2:2137 +13539:2:2141 +13540:2:2142 +13541:2:2150 +13542:2:2151 +13543:2:2155 +13544:2:2156 +13545:2:2150 +13546:2:2151 +13547:2:2155 +13548:2:2156 +13549:2:2164 +13550:2:2169 +13551:2:2173 +13552:2:2174 +13553:2:2181 +13554:2:2182 +13555:2:2193 +13556:2:2194 +13557:2:2195 +13558:2:2193 +13559:2:2194 +13560:2:2195 +13561:2:2206 +13562:2:2211 +13563:2:2212 +13564:0:4365 +13565:2:2224 +13566:0:4365 +13567:3:4069 +13568:0:4365 +13569:2:2226 +13570:0:4365 +13571:3:4070 +13572:0:4365 +13573:2:1936 +13574:0:4365 +13575:2:2129 +13576:0:4365 +13577:2:2130 +13578:0:4365 +13579:2:2134 +13580:0:4365 +13581:3:4069 +13582:0:4365 +13583:2:2136 +13584:0:4365 +13585:3:4070 +13586:0:4365 +13587:2:2137 +13588:2:2141 +13589:2:2142 +13590:2:2150 +13591:2:2151 +13592:2:2155 +13593:2:2156 +13594:2:2150 +13595:2:2151 +13596:2:2152 +13597:2:2164 +13598:2:2169 +13599:2:2173 +13600:2:2174 +13601:2:2181 +13602:2:2182 +13603:2:2193 +13604:2:2194 +13605:2:2195 +13606:2:2193 +13607:2:2194 +13608:2:2195 +13609:2:2206 +13610:2:2211 +13611:2:2212 +13612:0:4365 +13613:2:2224 +13614:0:4365 +13615:3:4069 +13616:0:4365 +13617:2:2226 +13618:0:4365 +13619:3:4070 +13620:0:4365 +13621:2:2230 +13622:0:4365 +13623:3:4069 +13624:0:4365 +13625:2:2235 +13626:2:2239 +13627:2:2240 +13628:2:2248 +13629:2:2249 +13630:2:2253 +13631:2:2254 +13632:2:2248 +13633:2:2249 +13634:2:2250 +13635:2:2262 +13636:2:2267 +13637:2:2271 +13638:2:2272 +13639:2:2279 +13640:2:2280 +13641:2:2291 +13642:2:2292 +13643:2:2293 +13644:2:2291 +13645:2:2292 +13646:2:2293 +13647:2:2304 +13648:2:2309 +13649:2:2310 +13650:0:4365 +13651:3:4070 +13652:0:4365 +13653:2:2322 +13654:0:4365 +13655:2:1169 +13656:0:4365 +13657:3:4069 +13658:0:4365 +13659:2:1170 +13660:0:4365 +13661:3:4070 +13662:0:4365 +13663:3:4071 +13664:0:4365 +13665:3:4081 +13666:0:4365 +13667:3:3666 +13668:0:4365 +13669:3:3667 +13670:0:4365 +13671:3:3668 +13672:0:4365 +13673:3:3669 +13674:3:3673 +13675:3:3674 +13676:3:3682 +13677:3:3683 +13678:3:3687 +13679:3:3688 +13680:3:3682 +13681:3:3683 +13682:3:3687 +13683:3:3688 +13684:3:3696 +13685:3:3701 +13686:3:3705 +13687:3:3706 +13688:3:3713 +13689:3:3714 +13690:3:3725 +13691:3:3726 +13692:3:3727 +13693:3:3725 +13694:3:3726 +13695:3:3727 +13696:3:3738 +13697:3:3743 +13698:3:3744 +13699:0:4365 +13700:3:3756 +13701:0:4365 +13702:3:3757 +13703:0:4365 +13704:2:1173 +13705:0:4365 +13706:3:3758 +13707:0:4365 +13708:2:1179 +13709:0:4365 +13710:2:1180 +13711:0:4365 +13712:3:3757 +13713:0:4365 +13714:2:1181 +13715:2:1185 +13716:2:1186 +13717:2:1194 +13718:2:1195 +13719:2:1199 +13720:2:1200 +13721:2:1194 +13722:2:1195 +13723:2:1199 +13724:2:1200 +13725:2:1208 +13726:2:1213 +13727:2:1217 +13728:2:1218 +13729:2:1225 +13730:2:1226 +13731:2:1237 +13732:2:1238 +13733:2:1239 +13734:2:1237 +13735:2:1238 +13736:2:1239 +13737:2:1250 +13738:2:1255 +13739:2:1256 +13740:0:4365 +13741:3:3758 +13742:0:4365 +13743:2:1268 +13744:0:4365 +13745:3:3757 +13746:0:4365 +13747:2:1270 +13748:0:4365 +13749:3:3758 +13750:0:4365 +13751:2:1271 +13752:2:1275 +13753:2:1276 +13754:2:1284 +13755:2:1285 +13756:2:1289 +13757:2:1290 +13758:2:1284 +13759:2:1285 +13760:2:1289 +13761:2:1290 +13762:2:1298 +13763:2:1303 +13764:2:1307 +13765:2:1308 +13766:2:1315 +13767:2:1316 +13768:2:1327 +13769:2:1328 +13770:2:1329 +13771:2:1327 +13772:2:1328 +13773:2:1329 +13774:2:1340 +13775:2:1345 +13776:2:1346 +13777:0:4365 +13778:2:1358 +13779:0:4365 +13780:2:1360 +13781:0:4365 +13782:3:3757 +13783:0:4365 +13784:2:1361 +13785:0:4365 +13786:3:3758 +13787:0:4365 +13788:2:1362 +13789:2:1366 +13790:2:1367 +13791:2:1375 +13792:2:1376 +13793:2:1380 +13794:2:1381 +13795:2:1375 +13796:2:1376 +13797:2:1380 +13798:2:1381 +13799:2:1389 +13800:2:1394 +13801:2:1398 +13802:2:1399 +13803:2:1406 +13804:2:1407 +13805:2:1418 +13806:2:1419 +13807:2:1420 +13808:2:1418 +13809:2:1419 +13810:2:1420 +13811:2:1431 +13812:2:1436 +13813:2:1437 +13814:0:4365 +13815:2:1449 +13816:0:4365 +13817:3:3757 +13818:0:4365 +13819:2:1451 +13820:0:4365 +13821:3:3758 +13822:0:4365 +13823:2:1652 +13824:0:4365 +13825:2:1653 +13826:0:4365 +13827:2:1657 +13828:0:4365 +13829:2:1180 +13830:0:4365 +13831:3:3757 +13832:0:4365 +13833:2:1181 +13834:2:1185 +13835:2:1186 +13836:2:1194 +13837:2:1195 +13838:2:1199 +13839:2:1200 +13840:2:1194 +13841:2:1195 +13842:2:1196 +13843:2:1208 +13844:2:1213 +13845:2:1217 +13846:2:1218 +13847:2:1225 +13848:2:1226 +13849:2:1237 +13850:2:1238 +13851:2:1239 +13852:2:1237 +13853:2:1238 +13854:2:1239 +13855:2:1250 +13856:2:1255 +13857:2:1256 +13858:0:4365 +13859:3:3758 +13860:0:4365 +13861:2:1268 +13862:0:4365 +13863:3:3757 +13864:0:4365 +13865:2:1270 +13866:0:4365 +13867:3:3758 +13868:0:4365 +13869:2:1271 +13870:2:1275 +13871:2:1276 +13872:2:1284 +13873:2:1285 +13874:2:1289 +13875:2:1290 +13876:2:1284 +13877:2:1285 +13878:2:1289 +13879:2:1290 +13880:2:1298 +13881:2:1303 +13882:2:1307 +13883:2:1308 +13884:2:1315 +13885:2:1316 +13886:2:1327 +13887:2:1328 +13888:2:1329 +13889:2:1327 +13890:2:1328 +13891:2:1329 +13892:2:1340 +13893:2:1345 +13894:2:1346 +13895:0:4365 +13896:2:1358 +13897:0:4365 +13898:2:1454 +13899:0:4365 +13900:3:3757 +13901:0:4365 +13902:2:1455 +13903:0:4365 +13904:3:3758 +13905:0:4365 +13906:2:1652 +13907:0:4365 +13908:2:1653 +13909:0:4365 +13910:2:1657 +13911:0:4365 +13912:2:1660 +13913:0:4365 +13914:3:3757 +13915:0:4365 +13916:2:1665 +13917:2:1669 +13918:2:1670 +13919:2:1678 +13920:2:1679 +13921:2:1683 +13922:2:1684 +13923:2:1678 +13924:2:1679 +13925:2:1680 +13926:2:1692 +13927:2:1697 +13928:2:1701 +13929:2:1702 +13930:2:1709 +13931:2:1710 +13932:2:1721 +13933:2:1722 +13934:2:1723 +13935:2:1721 +13936:2:1722 +13937:2:1723 +13938:2:1734 +13939:2:1739 +13940:2:1740 +13941:0:4365 +13942:3:3758 +13943:0:4365 +13944:2:1752 +13945:0:4365 +13946:3:3757 +13947:0:4365 +13948:2:1754 +13949:0:4365 +13950:3:3758 +13951:0:4365 +13952:2:1755 +13953:2:1759 +13954:2:1760 +13955:2:1768 +13956:2:1769 +13957:2:1773 +13958:2:1774 +13959:2:1768 +13960:2:1769 +13961:2:1773 +13962:2:1774 +13963:2:1782 +13964:2:1787 +13965:2:1791 +13966:2:1792 +13967:2:1799 +13968:2:1800 +13969:2:1811 +13970:2:1812 +13971:2:1813 +13972:2:1811 +13973:2:1812 +13974:2:1813 +13975:2:1824 +13976:2:1829 +13977:2:1830 +13978:0:4365 +13979:2:1842 +13980:0:4365 +13981:3:3757 +13982:0:4365 +13983:2:1844 +13984:0:4365 +13985:3:3758 +13986:0:4365 +13987:2:1845 +13988:2:1849 +13989:2:1850 +13990:2:1858 +13991:2:1859 +13992:2:1863 +13993:2:1864 +13994:2:1858 +13995:2:1859 +13996:2:1863 +13997:2:1864 +13998:2:1872 +13999:2:1877 +14000:2:1881 +14001:2:1882 +14002:2:1889 +14003:2:1890 +14004:2:1901 +14005:2:1902 +14006:2:1903 +14007:2:1901 +14008:2:1902 +14009:2:1903 +14010:2:1914 +14011:2:1919 +14012:2:1920 +14013:0:4365 +14014:2:1932 +14015:0:4365 +14016:3:3757 +14017:0:4365 +14018:2:1934 +14019:0:4365 +14020:3:3758 +14021:0:4365 +14022:2:1935 +14023:0:4365 +14024:2:1936 +14025:0:4365 +14026:2:2129 +14027:0:4365 +14028:2:2130 +14029:0:4365 +14030:2:2134 +14031:0:4365 +14032:3:3757 +14033:0:4365 +14034:2:2136 +14035:0:4365 +14036:3:3758 +14037:0:4365 +14038:2:2137 +14039:2:2141 +14040:2:2142 +14041:2:2150 +14042:2:2151 +14043:2:2155 +14044:2:2156 +14045:2:2150 +14046:2:2151 +14047:2:2155 +14048:2:2156 +14049:2:2164 +14050:2:2169 +14051:2:2173 +14052:2:2174 +14053:2:2181 +14054:2:2182 +14055:2:2193 +14056:2:2194 +14057:2:2195 +14058:2:2193 +14059:2:2194 +14060:2:2195 +14061:2:2206 +14062:2:2211 +14063:2:2212 +14064:0:4365 +14065:2:2224 +14066:0:4365 +14067:3:3757 +14068:0:4365 +14069:2:2226 +14070:0:4365 +14071:3:3758 +14072:0:4365 +14073:2:1936 +14074:0:4365 +14075:2:2129 +14076:0:4365 +14077:2:2130 +14078:0:4365 +14079:2:2134 +14080:0:4365 +14081:3:3757 +14082:0:4365 +14083:2:2136 +14084:0:4365 +14085:3:3758 +14086:0:4365 +14087:2:2137 +14088:2:2141 +14089:2:2142 +14090:2:2150 +14091:2:2151 +14092:2:2155 +14093:2:2156 +14094:2:2150 +14095:2:2151 +14096:2:2152 +14097:2:2164 +14098:2:2169 +14099:2:2173 +14100:2:2174 +14101:2:2181 +14102:2:2182 +14103:2:2193 +14104:2:2194 +14105:2:2195 +14106:2:2193 +14107:2:2194 +14108:2:2195 +14109:2:2206 +14110:2:2211 +14111:2:2212 +14112:0:4365 +14113:2:2224 +14114:0:4365 +14115:3:3757 +14116:0:4365 +14117:2:2226 +14118:0:4365 +14119:3:3758 +14120:0:4365 +14121:2:2230 +14122:0:4365 +14123:3:3757 +14124:0:4365 +14125:2:2235 +14126:2:2239 +14127:2:2240 +14128:2:2248 +14129:2:2249 +14130:2:2253 +14131:2:2254 +14132:2:2248 +14133:2:2249 +14134:2:2250 +14135:2:2262 +14136:2:2267 +14137:2:2271 +14138:2:2272 +14139:2:2279 +14140:2:2280 +14141:2:2291 +14142:2:2292 +14143:2:2293 +14144:2:2291 +14145:2:2292 +14146:2:2293 +14147:2:2304 +14148:2:2309 +14149:2:2310 +14150:0:4365 +14151:3:3758 +14152:0:4365 +14153:2:2322 +14154:0:4365 +14155:2:1169 +14156:0:4365 +14157:3:3757 +14158:0:4365 +14159:2:1170 +14160:0:4365 +14161:3:3758 +14162:0:4365 +14163:3:3759 +14164:0:4365 +14165:3:3972 +14166:0:4365 +14167:3:4077 +14168:0:4365 +14169:3:4078 +14170:0:4365 +14171:3:4082 +14172:0:4365 +14173:3:4088 +14174:0:4365 +14175:3:4092 +14176:3:4093 +14177:3:4097 +14178:3:4101 +14179:3:4102 +14180:3:4097 +14181:3:4101 +14182:3:4102 +14183:3:4106 +14184:3:4114 +14185:3:4115 +14186:3:4120 +14187:3:4127 +14188:3:4128 +14189:3:4127 +14190:3:4128 +14191:3:4135 +14192:3:4140 +14193:0:4365 +14194:3:4151 +14195:0:4365 +14196:3:4155 +14197:3:4156 +14198:3:4160 +14199:3:4164 +14200:3:4165 +14201:3:4160 +14202:3:4164 +14203:3:4165 +14204:3:4169 +14205:3:4177 +14206:3:4178 +14207:3:4183 +14208:3:4190 +14209:3:4191 +14210:3:4190 +14211:3:4191 +14212:3:4198 +14213:3:4203 +14214:0:4365 +14215:3:4151 +14216:0:4365 +14217:3:4155 +14218:3:4156 +14219:3:4160 +14220:3:4164 +14221:3:4165 +14222:3:4160 +14223:3:4164 +14224:3:4165 +14225:3:4169 +14226:3:4177 +14227:3:4178 +14228:3:4183 +14229:3:4190 +14230:3:4191 +14231:3:4190 +14232:3:4191 +14233:3:4198 +14234:3:4203 +14235:0:4365 +14236:3:4214 +14237:0:4365 +14238:3:4222 +14239:3:4223 +14240:3:4227 +14241:3:4231 +14242:3:4232 +14243:3:4227 +14244:3:4231 +14245:3:4232 +14246:3:4236 +14247:3:4244 +14248:3:4245 +14249:3:4250 +14250:3:4257 +14251:3:4258 +14252:3:4257 +14253:3:4258 +14254:3:4265 +14255:3:4270 +14256:0:4365 +14257:3:4285 +14258:0:4365 +14259:3:4286 +14260:0:4365 +14261:2:1173 +14262:0:4365 +14263:3:4287 +14264:0:4365 +14265:2:1179 +14266:0:4365 +14267:2:1180 +14268:0:4365 +14269:3:4286 +14270:0:4365 +14271:2:1181 +14272:2:1185 +14273:2:1186 +14274:2:1194 +14275:2:1195 +14276:2:1199 +14277:2:1200 +14278:2:1194 +14279:2:1195 +14280:2:1199 +14281:2:1200 +14282:2:1208 +14283:2:1213 +14284:2:1217 +14285:2:1218 +14286:2:1225 +14287:2:1226 +14288:2:1237 +14289:2:1238 +14290:2:1239 +14291:2:1237 +14292:2:1238 +14293:2:1239 +14294:2:1250 +14295:2:1255 +14296:2:1256 +14297:0:4365 +14298:3:4287 +14299:0:4365 +14300:2:1268 +14301:0:4365 +14302:3:4286 +14303:0:4365 +14304:2:1270 +14305:0:4365 +14306:3:4287 +14307:0:4365 +14308:2:1271 +14309:2:1275 +14310:2:1276 +14311:2:1284 +14312:2:1285 +14313:2:1289 +14314:2:1290 +14315:2:1284 +14316:2:1285 +14317:2:1289 +14318:2:1290 +14319:2:1298 +14320:2:1303 +14321:2:1307 +14322:2:1308 +14323:2:1315 +14324:2:1316 +14325:2:1327 +14326:2:1328 +14327:2:1329 +14328:2:1327 +14329:2:1328 +14330:2:1329 +14331:2:1340 +14332:2:1345 +14333:2:1346 +14334:0:4365 +14335:2:1358 +14336:0:4365 +14337:2:1360 +14338:0:4365 +14339:3:4286 +14340:0:4365 +14341:2:1361 +14342:0:4365 +14343:3:4287 +14344:0:4365 +14345:2:1362 +14346:2:1366 +14347:2:1367 +14348:2:1375 +14349:2:1376 +14350:2:1380 +14351:2:1381 +14352:2:1375 +14353:2:1376 +14354:2:1380 +14355:2:1381 +14356:2:1389 +14357:2:1394 +14358:2:1398 +14359:2:1399 +14360:2:1406 +14361:2:1407 +14362:2:1418 +14363:2:1419 +14364:2:1420 +14365:2:1418 +14366:2:1419 +14367:2:1420 +14368:2:1431 +14369:2:1436 +14370:2:1437 +14371:0:4365 +14372:2:1449 +14373:0:4365 +14374:3:4286 +14375:0:4365 +14376:2:1451 +14377:0:4365 +14378:3:4287 +14379:0:4365 +14380:2:1652 +14381:0:4365 +14382:2:1653 +14383:0:4365 +14384:2:1657 +14385:0:4365 +14386:2:1180 +14387:0:4365 +14388:3:4286 +14389:0:4365 +14390:2:1181 +14391:2:1185 +14392:2:1186 +14393:2:1194 +14394:2:1195 +14395:2:1199 +14396:2:1200 +14397:2:1194 +14398:2:1195 +14399:2:1196 +14400:2:1208 +14401:2:1213 +14402:2:1217 +14403:2:1218 +14404:2:1225 +14405:2:1226 +14406:2:1237 +14407:2:1238 +14408:2:1239 +14409:2:1237 +14410:2:1238 +14411:2:1239 +14412:2:1250 +14413:2:1255 +14414:2:1256 +14415:0:4365 +14416:3:4287 +14417:0:4365 +14418:2:1268 +14419:0:4365 +14420:3:4286 +14421:0:4365 +14422:2:1270 +14423:0:4365 +14424:3:4287 +14425:0:4365 +14426:2:1271 +14427:2:1275 +14428:2:1276 +14429:2:1284 +14430:2:1285 +14431:2:1289 +14432:2:1290 +14433:2:1284 +14434:2:1285 +14435:2:1289 +14436:2:1290 +14437:2:1298 +14438:2:1303 +14439:2:1307 +14440:2:1308 +14441:2:1315 +14442:2:1316 +14443:2:1327 +14444:2:1328 +14445:2:1329 +14446:2:1327 +14447:2:1328 +14448:2:1329 +14449:2:1340 +14450:2:1345 +14451:2:1346 +14452:0:4365 +14453:2:1358 +14454:0:4365 +14455:2:1454 +14456:0:4365 +14457:3:4286 +14458:0:4365 +14459:2:1455 +14460:0:4365 +14461:3:4287 +14462:0:4365 +14463:2:1652 +14464:0:4365 +14465:2:1653 +14466:0:4365 +14467:2:1657 +14468:0:4365 +14469:2:1660 +14470:0:4365 +14471:3:4286 +14472:0:4365 +14473:2:1665 +14474:2:1669 +14475:2:1670 +14476:2:1678 +14477:2:1679 +14478:2:1683 +14479:2:1684 +14480:2:1678 +14481:2:1679 +14482:2:1680 +14483:2:1692 +14484:2:1697 +14485:2:1701 +14486:2:1702 +14487:2:1709 +14488:2:1710 +14489:2:1721 +14490:2:1722 +14491:2:1723 +14492:2:1721 +14493:2:1722 +14494:2:1723 +14495:2:1734 +14496:2:1739 +14497:2:1740 +14498:0:4365 +14499:3:4287 +14500:0:4365 +14501:2:1752 +14502:0:4365 +14503:3:4286 +14504:0:4365 +14505:2:1754 +14506:0:4365 +14507:3:4287 +14508:0:4365 +14509:2:1755 +14510:2:1759 +14511:2:1760 +14512:2:1768 +14513:2:1769 +14514:2:1773 +14515:2:1774 +14516:2:1768 +14517:2:1769 +14518:2:1773 +14519:2:1774 +14520:2:1782 +14521:2:1787 +14522:2:1791 +14523:2:1792 +14524:2:1799 +14525:2:1800 +14526:2:1811 +14527:2:1812 +14528:2:1813 +14529:2:1811 +14530:2:1812 +14531:2:1813 +14532:2:1824 +14533:2:1829 +14534:2:1830 +14535:0:4365 +14536:2:1842 +14537:0:4365 +14538:3:4286 +14539:0:4365 +14540:2:1844 +14541:0:4365 +14542:3:4287 +14543:0:4365 +14544:2:1845 +14545:2:1849 +14546:2:1850 +14547:2:1858 +14548:2:1859 +14549:2:1863 +14550:2:1864 +14551:2:1858 +14552:2:1859 +14553:2:1863 +14554:2:1864 +14555:2:1872 +14556:2:1877 +14557:2:1881 +14558:2:1882 +14559:2:1889 +14560:2:1890 +14561:2:1901 +14562:2:1902 +14563:2:1903 +14564:2:1901 +14565:2:1902 +14566:2:1903 +14567:2:1914 +14568:2:1919 +14569:2:1920 +14570:0:4365 +14571:2:1932 +14572:0:4365 +14573:3:4286 +14574:0:4365 +14575:2:1934 +14576:0:4365 +14577:3:4287 +14578:0:4365 +14579:2:1935 +14580:0:4365 +14581:2:1936 +14582:0:4365 +14583:2:2129 +14584:0:4365 +14585:2:2130 +14586:0:4365 +14587:2:2134 +14588:0:4365 +14589:3:4286 +14590:0:4365 +14591:2:2136 +14592:0:4365 +14593:3:4287 +14594:0:4365 +14595:2:2137 +14596:2:2141 +14597:2:2142 +14598:2:2150 +14599:2:2151 +14600:2:2155 +14601:2:2156 +14602:2:2150 +14603:2:2151 +14604:2:2155 +14605:2:2156 +14606:2:2164 +14607:2:2169 +14608:2:2173 +14609:2:2174 +14610:2:2181 +14611:2:2182 +14612:2:2193 +14613:2:2194 +14614:2:2195 +14615:2:2193 +14616:2:2194 +14617:2:2195 +14618:2:2206 +14619:2:2211 +14620:2:2212 +14621:0:4365 +14622:2:2224 +14623:0:4365 +14624:3:4286 +14625:0:4365 +14626:2:2226 +14627:0:4365 +14628:3:4287 +14629:0:4365 +14630:2:1936 +14631:0:4365 +14632:2:2129 +14633:0:4365 +14634:2:2130 +14635:0:4365 +14636:2:2134 +14637:0:4365 +14638:3:4286 +14639:0:4365 +14640:2:2136 +14641:0:4365 +14642:3:4287 +14643:0:4365 +14644:2:2137 +14645:2:2141 +14646:2:2142 +14647:2:2150 +14648:2:2151 +14649:2:2155 +14650:2:2156 +14651:2:2150 +14652:2:2151 +14653:2:2152 +14654:2:2164 +14655:2:2169 +14656:2:2173 +14657:2:2174 +14658:2:2181 +14659:2:2182 +14660:2:2193 +14661:2:2194 +14662:2:2195 +14663:2:2193 +14664:2:2194 +14665:2:2195 +14666:2:2206 +14667:2:2211 +14668:2:2212 +14669:0:4365 +14670:2:2224 +14671:0:4365 +14672:3:4286 +14673:0:4365 +14674:2:2226 +14675:0:4365 +14676:3:4287 +14677:0:4365 +14678:2:2230 +14679:0:4365 +14680:3:4286 +14681:0:4365 +14682:2:2235 +14683:2:2239 +14684:2:2240 +14685:2:2248 +14686:2:2249 +14687:2:2253 +14688:2:2254 +14689:2:2248 +14690:2:2249 +14691:2:2250 +14692:2:2262 +14693:2:2267 +14694:2:2271 +14695:2:2272 +14696:2:2279 +14697:2:2280 +14698:2:2291 +14699:2:2292 +14700:2:2293 +14701:2:2291 +14702:2:2292 +14703:2:2293 +14704:2:2304 +14705:2:2309 +14706:2:2310 +14707:0:4365 +14708:3:4287 +14709:0:4365 +14710:2:2322 +14711:0:4365 +14712:2:1169 +14713:0:4365 +14714:3:4286 +14715:0:4365 +14716:2:1170 +14717:0:4365 +14718:3:4287 +14719:0:4365 +14720:3:4288 +14721:0:4365 +14722:3:4294 +14723:0:4365 +14724:3:4295 +14725:0:4365 +14726:3:2338 +14727:0:4365 +14728:3:2339 +14729:3:2343 +14730:3:2344 +14731:3:2352 +14732:3:2353 +14733:3:2357 +14734:3:2358 +14735:3:2352 +14736:3:2353 +14737:3:2357 +14738:3:2358 +14739:3:2366 +14740:3:2371 +14741:3:2375 +14742:3:2376 +14743:3:2383 +14744:3:2384 +14745:3:2395 +14746:3:2396 +14747:3:2397 +14748:3:2395 +14749:3:2396 +14750:3:2397 +14751:3:2408 +14752:3:2413 +14753:3:2414 +14754:0:4365 +14755:3:2426 +14756:0:4365 +14757:3:2427 +14758:0:4365 +14759:2:1173 +14760:0:4365 +14761:3:2428 +14762:0:4365 +14763:2:1179 +14764:0:4365 +14765:2:1180 +14766:0:4365 +14767:3:2427 +14768:0:4365 +14769:2:1181 +14770:2:1185 +14771:2:1186 +14772:2:1194 +14773:2:1195 +14774:2:1199 +14775:2:1200 +14776:2:1194 +14777:2:1195 +14778:2:1199 +14779:2:1200 +14780:2:1208 +14781:2:1213 +14782:2:1217 +14783:2:1218 +14784:2:1225 +14785:2:1226 +14786:2:1237 +14787:2:1238 +14788:2:1239 +14789:2:1237 +14790:2:1238 +14791:2:1239 +14792:2:1250 +14793:2:1255 +14794:2:1256 +14795:0:4365 +14796:3:2428 +14797:0:4365 +14798:2:1268 +14799:0:4365 +14800:3:2427 +14801:0:4365 +14802:2:1270 +14803:0:4365 +14804:3:2428 +14805:0:4365 +14806:2:1271 +14807:2:1275 +14808:2:1276 +14809:2:1284 +14810:2:1285 +14811:2:1289 +14812:2:1290 +14813:2:1284 +14814:2:1285 +14815:2:1289 +14816:2:1290 +14817:2:1298 +14818:2:1303 +14819:2:1307 +14820:2:1308 +14821:2:1315 +14822:2:1316 +14823:2:1327 +14824:2:1328 +14825:2:1329 +14826:2:1327 +14827:2:1328 +14828:2:1329 +14829:2:1340 +14830:2:1345 +14831:2:1346 +14832:0:4365 +14833:2:1358 +14834:0:4365 +14835:2:1360 +14836:0:4365 +14837:3:2427 +14838:0:4365 +14839:2:1361 +14840:0:4365 +14841:3:2428 +14842:0:4365 +14843:2:1362 +14844:2:1366 +14845:2:1367 +14846:2:1375 +14847:2:1376 +14848:2:1380 +14849:2:1381 +14850:2:1375 +14851:2:1376 +14852:2:1380 +14853:2:1381 +14854:2:1389 +14855:2:1394 +14856:2:1398 +14857:2:1399 +14858:2:1406 +14859:2:1407 +14860:2:1418 +14861:2:1419 +14862:2:1420 +14863:2:1418 +14864:2:1419 +14865:2:1420 +14866:2:1431 +14867:2:1436 +14868:2:1437 +14869:0:4365 +14870:2:1449 +14871:0:4365 +14872:3:2427 +14873:0:4365 +14874:2:1451 +14875:0:4365 +14876:3:2428 +14877:0:4365 +14878:2:1652 +14879:0:4365 +14880:2:1653 +14881:0:4365 +14882:2:1657 +14883:0:4365 +14884:2:1180 +14885:0:4365 +14886:3:2427 +14887:0:4365 +14888:2:1181 +14889:2:1185 +14890:2:1186 +14891:2:1194 +14892:2:1195 +14893:2:1199 +14894:2:1200 +14895:2:1194 +14896:2:1195 +14897:2:1196 +14898:2:1208 +14899:2:1213 +14900:2:1217 +14901:2:1218 +14902:2:1225 +14903:2:1226 +14904:2:1237 +14905:2:1238 +14906:2:1239 +14907:2:1237 +14908:2:1238 +14909:2:1239 +14910:2:1250 +14911:2:1255 +14912:2:1256 +14913:0:4365 +14914:3:2428 +14915:0:4365 +14916:2:1268 +14917:0:4365 +14918:3:2427 +14919:0:4365 +14920:2:1270 +14921:0:4365 +14922:3:2428 +14923:0:4365 +14924:2:1271 +14925:2:1275 +14926:2:1276 +14927:2:1284 +14928:2:1285 +14929:2:1289 +14930:2:1290 +14931:2:1284 +14932:2:1285 +14933:2:1289 +14934:2:1290 +14935:2:1298 +14936:2:1303 +14937:2:1307 +14938:2:1308 +14939:2:1315 +14940:2:1316 +14941:2:1327 +14942:2:1328 +14943:2:1329 +14944:2:1327 +14945:2:1328 +14946:2:1329 +14947:2:1340 +14948:2:1345 +14949:2:1346 +14950:0:4365 +14951:2:1358 +14952:0:4365 +14953:2:1454 +14954:0:4365 +14955:3:2427 +14956:0:4365 +14957:2:1455 +14958:0:4365 +14959:3:2428 +14960:0:4365 +14961:2:1652 +14962:0:4365 +14963:2:1653 +14964:0:4365 +14965:2:1657 +14966:0:4365 +14967:2:1660 +14968:0:4365 +14969:3:2427 +14970:0:4365 +14971:2:1665 +14972:2:1669 +14973:2:1670 +14974:2:1678 +14975:2:1679 +14976:2:1683 +14977:2:1684 +14978:2:1678 +14979:2:1679 +14980:2:1680 +14981:2:1692 +14982:2:1697 +14983:2:1701 +14984:2:1702 +14985:2:1709 +14986:2:1710 +14987:2:1721 +14988:2:1722 +14989:2:1723 +14990:2:1721 +14991:2:1722 +14992:2:1723 +14993:2:1734 +14994:2:1739 +14995:2:1740 +14996:0:4365 +14997:3:2428 +14998:0:4365 +14999:2:1752 +15000:0:4365 +15001:3:2427 +15002:0:4365 +15003:2:1754 +15004:0:4365 +15005:3:2428 +15006:0:4365 +15007:2:1755 +15008:2:1759 +15009:2:1760 +15010:2:1768 +15011:2:1769 +15012:2:1773 +15013:2:1774 +15014:2:1768 +15015:2:1769 +15016:2:1773 +15017:2:1774 +15018:2:1782 +15019:2:1787 +15020:2:1791 +15021:2:1792 +15022:2:1799 +15023:2:1800 +15024:2:1811 +15025:2:1812 +15026:2:1813 +15027:2:1811 +15028:2:1812 +15029:2:1813 +15030:2:1824 +15031:2:1829 +15032:2:1830 +15033:0:4365 +15034:2:1842 +15035:0:4365 +15036:3:2427 +15037:0:4365 +15038:2:1844 +15039:0:4363 +15040:3:2428 +15041:0:4369 diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.define b/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.define new file mode 100644 index 0000000..136ef67 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.define @@ -0,0 +1,2 @@ +#define NO_RMB +#define NO_WMB diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.log b/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.log new file mode 100644 index 0000000..4cee7dc --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.log @@ -0,0 +1,382 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_free_no_mb.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 743) + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 72 byte, depth reached 10856, errors: 0 + 161519 states, stored + 1724866 states, matched + 1886385 transitions (= stored+matched) + 6692565 atomic steps +hash conflicts: 84009 (resolved) + +Stats on memory usage (in Megabytes): + 15.404 equivalent memory usage for states (stored*(State-vector + overhead)) + 10.421 actual memory usage for states (compression: 67.65%) + state-vector as stored = 40 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 476.115 total actual memory usage + +unreached in proctype urcu_reader_sig + line 403, "pan.___", state 330, "(1)" + line 614, "pan.___", state 411, "-end-" + (2 of 411 states) +unreached in proctype urcu_writer + line 652, "pan.___", state 213, "(1)" + line 403, "pan.___", state 239, "(1)" + line 403, "pan.___", state 525, "(1)" + line 399, "pan.___", state 610, "(1)" + line 403, "pan.___", state 624, "(1)" + line 403, "pan.___", state 724, "(1)" + line 399, "pan.___", state 805, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 399, "pan.___", state 807, "(1)" + line 399, "pan.___", state 808, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 399, "pan.___", state 808, "else" + line 399, "pan.___", state 811, "(1)" + line 403, "pan.___", state 819, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 403, "pan.___", state 821, "(1)" + line 403, "pan.___", state 822, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 403, "pan.___", state 822, "else" + line 403, "pan.___", state 825, "(1)" + line 403, "pan.___", state 826, "(1)" + line 403, "pan.___", state 826, "(1)" + line 401, "pan.___", state 831, "((j<1))" + line 401, "pan.___", state 831, "((j>=1))" + line 408, "pan.___", state 837, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 409, "pan.___", state 850, "(1)" + line 409, "pan.___", state 851, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 409, "pan.___", state 851, "else" + line 409, "pan.___", state 854, "(1)" + line 409, "pan.___", state 855, "(1)" + line 409, "pan.___", state 855, "(1)" + line 413, "pan.___", state 863, "(1)" + line 413, "pan.___", state 864, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 413, "pan.___", state 864, "else" + line 413, "pan.___", state 867, "(1)" + line 413, "pan.___", state 868, "(1)" + line 413, "pan.___", state 868, "(1)" + line 411, "pan.___", state 873, "((j<1))" + line 411, "pan.___", state 873, "((j>=1))" + line 418, "pan.___", state 880, "(1)" + line 418, "pan.___", state 881, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 418, "pan.___", state 881, "else" + line 418, "pan.___", state 884, "(1)" + line 418, "pan.___", state 885, "(1)" + line 418, "pan.___", state 885, "(1)" + line 399, "pan.___", state 896, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 399, "pan.___", state 898, "(1)" + line 399, "pan.___", state 899, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 399, "pan.___", state 899, "else" + line 399, "pan.___", state 902, "(1)" + line 403, "pan.___", state 910, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 403, "pan.___", state 912, "(1)" + line 403, "pan.___", state 913, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 403, "pan.___", state 913, "else" + line 403, "pan.___", state 916, "(1)" + line 403, "pan.___", state 917, "(1)" + line 403, "pan.___", state 917, "(1)" + line 401, "pan.___", state 922, "((j<1))" + line 401, "pan.___", state 922, "((j>=1))" + line 408, "pan.___", state 928, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 409, "pan.___", state 941, "(1)" + line 409, "pan.___", state 942, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 409, "pan.___", state 942, "else" + line 409, "pan.___", state 945, "(1)" + line 409, "pan.___", state 946, "(1)" + line 409, "pan.___", state 946, "(1)" + line 413, "pan.___", state 954, "(1)" + line 413, "pan.___", state 955, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 413, "pan.___", state 955, "else" + line 413, "pan.___", state 958, "(1)" + line 413, "pan.___", state 959, "(1)" + line 413, "pan.___", state 959, "(1)" + line 411, "pan.___", state 964, "((j<1))" + line 411, "pan.___", state 964, "((j>=1))" + line 418, "pan.___", state 971, "(1)" + line 418, "pan.___", state 972, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 418, "pan.___", state 972, "else" + line 418, "pan.___", state 975, "(1)" + line 418, "pan.___", state 976, "(1)" + line 418, "pan.___", state 976, "(1)" + line 194, "pan.___", state 981, "(1)" + line 194, "pan.___", state 981, "(1)" + line 214, "pan.___", state 985, "((i<1))" + line 214, "pan.___", state 985, "((i>=1))" + line 399, "pan.___", state 991, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 399, "pan.___", state 993, "(1)" + line 399, "pan.___", state 994, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 399, "pan.___", state 994, "else" + line 399, "pan.___", state 997, "(1)" + line 403, "pan.___", state 1005, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 403, "pan.___", state 1007, "(1)" + line 403, "pan.___", state 1008, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 403, "pan.___", state 1008, "else" + line 403, "pan.___", state 1011, "(1)" + line 403, "pan.___", state 1012, "(1)" + line 403, "pan.___", state 1012, "(1)" + line 401, "pan.___", state 1017, "((j<1))" + line 401, "pan.___", state 1017, "((j>=1))" + line 408, "pan.___", state 1023, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 409, "pan.___", state 1036, "(1)" + line 409, "pan.___", state 1037, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 409, "pan.___", state 1037, "else" + line 409, "pan.___", state 1040, "(1)" + line 409, "pan.___", state 1041, "(1)" + line 409, "pan.___", state 1041, "(1)" + line 413, "pan.___", state 1049, "(1)" + line 413, "pan.___", state 1050, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 413, "pan.___", state 1050, "else" + line 413, "pan.___", state 1053, "(1)" + line 413, "pan.___", state 1054, "(1)" + line 413, "pan.___", state 1054, "(1)" + line 411, "pan.___", state 1059, "((j<1))" + line 411, "pan.___", state 1059, "((j>=1))" + line 418, "pan.___", state 1066, "(1)" + line 418, "pan.___", state 1067, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 418, "pan.___", state 1067, "else" + line 418, "pan.___", state 1070, "(1)" + line 418, "pan.___", state 1071, "(1)" + line 418, "pan.___", state 1071, "(1)" + line 194, "pan.___", state 1076, "(1)" + line 194, "pan.___", state 1076, "(1)" + line 221, "pan.___", state 1077, "(1)" + line 221, "pan.___", state 1077, "(1)" + line 356, "pan.___", state 1083, "((sighand_exec==1))" + line 356, "pan.___", state 1083, "else" + line 362, "pan.___", state 1086, "sighand_exec = 1" + line 399, "pan.___", state 1099, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 399, "pan.___", state 1101, "(1)" + line 399, "pan.___", state 1102, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 399, "pan.___", state 1102, "else" + line 399, "pan.___", state 1105, "(1)" + line 403, "pan.___", state 1113, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 403, "pan.___", state 1115, "(1)" + line 403, "pan.___", state 1116, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 403, "pan.___", state 1116, "else" + line 403, "pan.___", state 1119, "(1)" + line 403, "pan.___", state 1120, "(1)" + line 403, "pan.___", state 1120, "(1)" + line 401, "pan.___", state 1125, "((i<1))" + line 401, "pan.___", state 1125, "((i>=1))" + line 408, "pan.___", state 1131, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 409, "pan.___", state 1144, "(1)" + line 409, "pan.___", state 1145, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 409, "pan.___", state 1145, "else" + line 409, "pan.___", state 1148, "(1)" + line 409, "pan.___", state 1149, "(1)" + line 409, "pan.___", state 1149, "(1)" + line 413, "pan.___", state 1157, "(1)" + line 413, "pan.___", state 1158, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 413, "pan.___", state 1158, "else" + line 413, "pan.___", state 1161, "(1)" + line 413, "pan.___", state 1162, "(1)" + line 413, "pan.___", state 1162, "(1)" + line 411, "pan.___", state 1167, "((i<1))" + line 411, "pan.___", state 1167, "((i>=1))" + line 418, "pan.___", state 1174, "(1)" + line 418, "pan.___", state 1175, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 418, "pan.___", state 1175, "else" + line 418, "pan.___", state 1178, "(1)" + line 418, "pan.___", state 1179, "(1)" + line 418, "pan.___", state 1179, "(1)" + line 420, "pan.___", state 1182, "(1)" + line 420, "pan.___", state 1182, "(1)" + line 362, "pan.___", state 1191, "sighand_exec = 1" + line 403, "pan.___", state 1222, "(1)" + line 403, "pan.___", state 1319, "(1)" + line 399, "pan.___", state 1404, "(1)" + line 403, "pan.___", state 1418, "(1)" + line 403, "pan.___", state 1518, "(1)" + line 399, "pan.___", state 1599, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 399, "pan.___", state 1601, "(1)" + line 399, "pan.___", state 1602, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 399, "pan.___", state 1602, "else" + line 399, "pan.___", state 1605, "(1)" + line 403, "pan.___", state 1613, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 403, "pan.___", state 1615, "(1)" + line 403, "pan.___", state 1616, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 403, "pan.___", state 1616, "else" + line 403, "pan.___", state 1619, "(1)" + line 403, "pan.___", state 1620, "(1)" + line 403, "pan.___", state 1620, "(1)" + line 401, "pan.___", state 1625, "((j<1))" + line 401, "pan.___", state 1625, "((j>=1))" + line 408, "pan.___", state 1631, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 409, "pan.___", state 1644, "(1)" + line 409, "pan.___", state 1645, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 409, "pan.___", state 1645, "else" + line 409, "pan.___", state 1648, "(1)" + line 409, "pan.___", state 1649, "(1)" + line 409, "pan.___", state 1649, "(1)" + line 413, "pan.___", state 1657, "(1)" + line 413, "pan.___", state 1658, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 413, "pan.___", state 1658, "else" + line 413, "pan.___", state 1661, "(1)" + line 413, "pan.___", state 1662, "(1)" + line 413, "pan.___", state 1662, "(1)" + line 411, "pan.___", state 1667, "((j<1))" + line 411, "pan.___", state 1667, "((j>=1))" + line 418, "pan.___", state 1674, "(1)" + line 418, "pan.___", state 1675, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 418, "pan.___", state 1675, "else" + line 418, "pan.___", state 1678, "(1)" + line 418, "pan.___", state 1679, "(1)" + line 418, "pan.___", state 1679, "(1)" + line 399, "pan.___", state 1690, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 399, "pan.___", state 1692, "(1)" + line 399, "pan.___", state 1693, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 399, "pan.___", state 1693, "else" + line 399, "pan.___", state 1696, "(1)" + line 403, "pan.___", state 1704, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 403, "pan.___", state 1706, "(1)" + line 403, "pan.___", state 1707, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 403, "pan.___", state 1707, "else" + line 403, "pan.___", state 1710, "(1)" + line 403, "pan.___", state 1711, "(1)" + line 403, "pan.___", state 1711, "(1)" + line 401, "pan.___", state 1716, "((j<1))" + line 401, "pan.___", state 1716, "((j>=1))" + line 408, "pan.___", state 1722, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 409, "pan.___", state 1735, "(1)" + line 409, "pan.___", state 1736, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 409, "pan.___", state 1736, "else" + line 409, "pan.___", state 1739, "(1)" + line 409, "pan.___", state 1740, "(1)" + line 409, "pan.___", state 1740, "(1)" + line 413, "pan.___", state 1748, "(1)" + line 413, "pan.___", state 1749, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 413, "pan.___", state 1749, "else" + line 413, "pan.___", state 1752, "(1)" + line 413, "pan.___", state 1753, "(1)" + line 413, "pan.___", state 1753, "(1)" + line 411, "pan.___", state 1758, "((j<1))" + line 411, "pan.___", state 1758, "((j>=1))" + line 418, "pan.___", state 1765, "(1)" + line 418, "pan.___", state 1766, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 418, "pan.___", state 1766, "else" + line 418, "pan.___", state 1769, "(1)" + line 418, "pan.___", state 1770, "(1)" + line 418, "pan.___", state 1770, "(1)" + line 194, "pan.___", state 1775, "(1)" + line 194, "pan.___", state 1775, "(1)" + line 214, "pan.___", state 1779, "((i<1))" + line 214, "pan.___", state 1779, "((i>=1))" + line 399, "pan.___", state 1785, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 399, "pan.___", state 1787, "(1)" + line 399, "pan.___", state 1788, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 399, "pan.___", state 1788, "else" + line 399, "pan.___", state 1791, "(1)" + line 403, "pan.___", state 1799, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 403, "pan.___", state 1801, "(1)" + line 403, "pan.___", state 1802, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 403, "pan.___", state 1802, "else" + line 403, "pan.___", state 1805, "(1)" + line 403, "pan.___", state 1806, "(1)" + line 403, "pan.___", state 1806, "(1)" + line 401, "pan.___", state 1811, "((j<1))" + line 401, "pan.___", state 1811, "((j>=1))" + line 408, "pan.___", state 1817, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 409, "pan.___", state 1830, "(1)" + line 409, "pan.___", state 1831, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 409, "pan.___", state 1831, "else" + line 409, "pan.___", state 1834, "(1)" + line 409, "pan.___", state 1835, "(1)" + line 409, "pan.___", state 1835, "(1)" + line 413, "pan.___", state 1843, "(1)" + line 413, "pan.___", state 1844, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 413, "pan.___", state 1844, "else" + line 413, "pan.___", state 1847, "(1)" + line 413, "pan.___", state 1848, "(1)" + line 413, "pan.___", state 1848, "(1)" + line 411, "pan.___", state 1853, "((j<1))" + line 411, "pan.___", state 1853, "((j>=1))" + line 418, "pan.___", state 1860, "(1)" + line 418, "pan.___", state 1861, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 418, "pan.___", state 1861, "else" + line 418, "pan.___", state 1864, "(1)" + line 418, "pan.___", state 1865, "(1)" + line 418, "pan.___", state 1865, "(1)" + line 194, "pan.___", state 1870, "(1)" + line 194, "pan.___", state 1870, "(1)" + line 221, "pan.___", state 1871, "(1)" + line 221, "pan.___", state 1871, "(1)" + line 356, "pan.___", state 1877, "((sighand_exec==1))" + line 356, "pan.___", state 1877, "else" + line 362, "pan.___", state 1880, "sighand_exec = 1" + line 399, "pan.___", state 1893, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 399, "pan.___", state 1895, "(1)" + line 399, "pan.___", state 1896, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 399, "pan.___", state 1896, "else" + line 399, "pan.___", state 1899, "(1)" + line 403, "pan.___", state 1907, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 403, "pan.___", state 1909, "(1)" + line 403, "pan.___", state 1910, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 403, "pan.___", state 1910, "else" + line 403, "pan.___", state 1913, "(1)" + line 403, "pan.___", state 1914, "(1)" + line 403, "pan.___", state 1914, "(1)" + line 401, "pan.___", state 1919, "((i<1))" + line 401, "pan.___", state 1919, "((i>=1))" + line 408, "pan.___", state 1925, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 409, "pan.___", state 1938, "(1)" + line 409, "pan.___", state 1939, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 409, "pan.___", state 1939, "else" + line 409, "pan.___", state 1942, "(1)" + line 409, "pan.___", state 1943, "(1)" + line 409, "pan.___", state 1943, "(1)" + line 413, "pan.___", state 1951, "(1)" + line 413, "pan.___", state 1952, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 413, "pan.___", state 1952, "else" + line 413, "pan.___", state 1955, "(1)" + line 413, "pan.___", state 1956, "(1)" + line 413, "pan.___", state 1956, "(1)" + line 411, "pan.___", state 1961, "((i<1))" + line 411, "pan.___", state 1961, "((i>=1))" + line 418, "pan.___", state 1968, "(1)" + line 418, "pan.___", state 1969, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 418, "pan.___", state 1969, "else" + line 418, "pan.___", state 1972, "(1)" + line 418, "pan.___", state 1973, "(1)" + line 418, "pan.___", state 1973, "(1)" + line 420, "pan.___", state 1976, "(1)" + line 420, "pan.___", state 1976, "(1)" + line 362, "pan.___", state 1985, "sighand_exec = 1" + line 403, "pan.___", state 2016, "(1)" + line 702, "pan.___", state 2304, "-end-" + (221 of 2304 states) +unreached in proctype :init: + (0 of 46 states) +unreached in proctype :never: + line 748, "pan.___", state 8, "-end-" + (1 of 8 states) + +pan: elapsed time 1.47 seconds +pan: rate 109876.87 states/second +pan: avg transition delay 7.7927e-07 usec +cp .input.spin urcu_free_no_mb.spin.input +cp .input.spin.trail urcu_free_no_mb.spin.input.trail +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.spin.input b/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.spin.input new file mode 100644 index 0000000..48411ec --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.spin.input @@ -0,0 +1,723 @@ +#define NO_RMB +#define NO_WMB + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#define TEST_SIGNAL +//#define TEST_SIGNAL_ON_READ +#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 1 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.spin.input.trail b/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.spin.input.trail new file mode 100644 index 0000000..00fba51 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.spin.input.trail @@ -0,0 +1,2172 @@ +-2:4:-2 +-4:-4:-4 +1:0:4249 +2:4:4201 +3:4:4204 +4:4:4204 +5:4:4207 +6:4:4215 +7:4:4215 +8:4:4218 +9:4:4224 +10:4:4228 +11:4:4228 +12:4:4231 +13:4:4239 +14:4:4243 +15:4:4244 +16:0:4249 +17:4:4246 +18:0:4249 +19:3:1991 +20:0:4249 +21:3:1997 +22:0:4249 +23:3:1998 +24:0:4249 +25:3:1999 +26:3:2003 +27:3:2004 +28:3:2012 +29:3:2013 +30:3:2017 +31:3:2018 +32:3:2026 +33:3:2031 +34:3:2035 +35:3:2036 +36:3:2043 +37:3:2044 +38:3:2055 +39:3:2056 +40:3:2057 +41:3:2068 +42:3:2073 +43:3:2074 +44:0:4249 +45:3:2086 +46:0:4249 +47:3:2088 +48:3:2089 +49:0:4249 +50:3:2093 +51:3:2097 +52:3:2098 +53:3:2106 +54:3:2107 +55:3:2111 +56:3:2112 +57:3:2120 +58:3:2125 +59:3:2126 +60:3:2137 +61:3:2138 +62:3:2149 +63:3:2150 +64:3:2151 +65:3:2162 +66:3:2167 +67:3:2168 +68:0:4249 +69:3:2180 +70:0:4249 +71:3:2182 +72:0:4249 +73:3:2183 +74:0:4249 +75:3:2193 +76:0:4249 +77:3:2194 +78:0:4249 +79:3:2195 +80:3:2199 +81:3:2200 +82:3:2208 +83:3:2209 +84:3:2213 +85:3:2214 +86:3:2222 +87:3:2227 +88:3:2231 +89:3:2232 +90:3:2239 +91:3:2240 +92:3:2251 +93:3:2252 +94:3:2253 +95:3:2264 +96:3:2269 +97:3:2270 +98:0:4249 +99:3:2285 +100:0:4249 +101:3:2286 +102:3:2290 +103:3:2291 +104:3:2299 +105:3:2300 +106:3:2304 +107:3:2305 +108:3:2313 +109:3:2318 +110:3:2322 +111:3:2323 +112:3:2330 +113:3:2331 +114:3:2342 +115:3:2343 +116:3:2344 +117:3:2355 +118:3:2360 +119:3:2361 +120:0:4249 +121:3:2376 +122:0:4249 +123:3:2381 +124:3:2385 +125:3:2386 +126:3:2394 +127:3:2395 +128:3:2399 +129:3:2400 +130:3:2408 +131:3:2413 +132:3:2417 +133:3:2418 +134:3:2425 +135:3:2426 +136:3:2437 +137:3:2438 +138:3:2439 +139:3:2450 +140:3:2455 +141:3:2456 +142:0:4249 +143:3:2475 +144:0:4249 +145:3:2477 +146:0:4249 +147:3:2478 +148:3:2482 +149:3:2483 +150:3:2491 +151:3:2492 +152:3:2496 +153:3:2497 +154:3:2505 +155:3:2510 +156:3:2514 +157:3:2515 +158:3:2522 +159:3:2523 +160:3:2534 +161:3:2535 +162:3:2536 +163:3:2547 +164:3:2552 +165:3:2553 +166:0:4249 +167:3:2565 +168:0:4249 +169:3:2567 +170:0:4249 +171:3:2570 +172:3:2571 +173:3:2583 +174:3:2584 +175:3:2588 +176:3:2589 +177:3:2597 +178:3:2602 +179:3:2606 +180:3:2607 +181:3:2614 +182:3:2615 +183:3:2626 +184:3:2627 +185:3:2628 +186:3:2639 +187:3:2644 +188:3:2645 +189:0:4249 +190:3:2657 +191:0:4249 +192:3:2659 +193:0:4249 +194:3:2660 +195:0:4249 +196:3:2661 +197:0:4249 +198:3:2662 +199:0:4249 +200:3:2663 +201:3:2667 +202:3:2668 +203:3:2676 +204:3:2677 +205:3:2681 +206:3:2682 +207:3:2690 +208:3:2695 +209:3:2699 +210:3:2700 +211:3:2707 +212:3:2708 +213:3:2719 +214:3:2720 +215:3:2721 +216:3:2732 +217:3:2737 +218:3:2738 +219:0:4249 +220:3:2750 +221:0:4249 +222:3:3036 +223:0:4249 +224:3:3134 +225:0:4249 +226:3:3135 +227:0:4249 +228:3:3139 +229:0:4249 +230:3:3145 +231:3:3149 +232:3:3150 +233:3:3158 +234:3:3159 +235:3:3163 +236:3:3164 +237:3:3172 +238:3:3177 +239:3:3181 +240:3:3182 +241:3:3189 +242:3:3190 +243:3:3201 +244:3:3202 +245:3:3203 +246:3:3214 +247:3:3219 +248:3:3220 +249:0:4249 +250:3:3232 +251:0:4249 +252:3:3234 +253:0:4249 +254:3:3235 +255:3:3239 +256:3:3240 +257:3:3248 +258:3:3249 +259:3:3253 +260:3:3254 +261:3:3262 +262:3:3267 +263:3:3271 +264:3:3272 +265:3:3279 +266:3:3280 +267:3:3291 +268:3:3292 +269:3:3293 +270:3:3304 +271:3:3309 +272:3:3310 +273:0:4249 +274:3:3322 +275:0:4249 +276:3:3324 +277:0:4249 +278:3:3327 +279:3:3328 +280:3:3340 +281:3:3341 +282:3:3345 +283:3:3346 +284:3:3354 +285:3:3359 +286:3:3363 +287:3:3364 +288:3:3371 +289:3:3372 +290:3:3383 +291:3:3384 +292:3:3385 +293:3:3396 +294:3:3401 +295:3:3402 +296:0:4249 +297:3:3414 +298:0:4249 +299:3:3416 +300:0:4249 +301:3:3417 +302:0:4249 +303:3:3418 +304:0:4249 +305:3:3419 +306:0:4249 +307:3:3420 +308:3:3424 +309:3:3425 +310:3:3433 +311:3:3434 +312:3:3438 +313:3:3439 +314:3:3447 +315:3:3452 +316:3:3456 +317:3:3457 +318:3:3464 +319:3:3465 +320:3:3476 +321:3:3477 +322:3:3478 +323:3:3489 +324:3:3494 +325:3:3495 +326:0:4249 +327:3:3507 +328:0:4249 +329:3:3793 +330:0:4249 +331:3:3891 +332:0:4249 +333:3:3892 +334:0:4249 +335:3:3896 +336:0:4249 +337:3:3902 +338:0:4249 +339:3:3903 +340:3:3907 +341:3:3908 +342:3:3916 +343:3:3917 +344:3:3921 +345:3:3922 +346:3:3930 +347:3:3935 +348:3:3939 +349:3:3940 +350:3:3947 +351:3:3948 +352:3:3959 +353:3:3960 +354:3:3961 +355:3:3972 +356:3:3977 +357:3:3978 +358:0:4249 +359:3:3993 +360:0:4249 +361:3:3994 +362:3:3998 +363:3:3999 +364:3:4007 +365:3:4008 +366:3:4012 +367:3:4013 +368:3:4021 +369:3:4026 +370:3:4030 +371:3:4031 +372:3:4038 +373:3:4039 +374:3:4050 +375:3:4051 +376:3:4052 +377:3:4063 +378:3:4068 +379:3:4069 +380:0:4249 +381:3:4084 +382:0:4249 +383:3:4089 +384:3:4093 +385:3:4094 +386:3:4102 +387:3:4103 +388:3:4107 +389:3:4108 +390:3:4116 +391:3:4121 +392:3:4125 +393:3:4126 +394:3:4133 +395:3:4134 +396:3:4145 +397:3:4146 +398:3:4147 +399:3:4158 +400:3:4163 +401:3:4164 +402:0:4249 +403:3:4183 +404:0:4249 +405:3:4185 +406:0:4249 +407:3:4186 +408:0:4249 +409:3:1998 +410:0:4249 +411:3:1999 +412:3:2003 +413:3:2004 +414:3:2012 +415:3:2013 +416:3:2017 +417:3:2018 +418:3:2026 +419:3:2031 +420:3:2035 +421:3:2036 +422:3:2043 +423:3:2044 +424:3:2055 +425:3:2056 +426:3:2057 +427:3:2068 +428:3:2073 +429:3:2074 +430:0:4249 +431:3:2086 +432:0:4249 +433:3:2088 +434:3:2089 +435:0:4249 +436:3:2093 +437:3:2097 +438:3:2098 +439:3:2106 +440:3:2107 +441:3:2111 +442:3:2112 +443:3:2120 +444:3:2125 +445:3:2126 +446:3:2137 +447:3:2138 +448:3:2149 +449:3:2150 +450:3:2151 +451:3:2162 +452:3:2167 +453:3:2168 +454:0:4249 +455:3:2180 +456:0:4249 +457:3:2182 +458:0:4249 +459:3:2183 +460:0:4249 +461:3:2193 +462:0:4249 +463:3:2194 +464:0:4249 +465:3:2195 +466:3:2199 +467:3:2200 +468:3:2208 +469:3:2209 +470:3:2213 +471:3:2214 +472:3:2222 +473:3:2227 +474:3:2231 +475:3:2232 +476:3:2239 +477:3:2240 +478:3:2251 +479:3:2252 +480:3:2253 +481:3:2264 +482:3:2269 +483:3:2270 +484:0:4249 +485:3:2285 +486:0:4249 +487:3:2286 +488:3:2290 +489:3:2291 +490:3:2299 +491:3:2300 +492:3:2304 +493:3:2305 +494:3:2313 +495:3:2318 +496:3:2322 +497:3:2323 +498:3:2330 +499:3:2331 +500:3:2342 +501:3:2343 +502:3:2344 +503:3:2355 +504:3:2360 +505:3:2361 +506:0:4249 +507:3:2376 +508:0:4249 +509:3:2381 +510:3:2385 +511:3:2386 +512:3:2394 +513:3:2395 +514:3:2399 +515:3:2400 +516:3:2408 +517:3:2413 +518:3:2417 +519:3:2418 +520:3:2425 +521:3:2426 +522:3:2437 +523:3:2438 +524:3:2439 +525:3:2450 +526:3:2455 +527:3:2456 +528:0:4249 +529:3:2475 +530:0:4249 +531:3:2477 +532:0:4249 +533:3:2478 +534:3:2482 +535:3:2483 +536:3:2491 +537:3:2492 +538:3:2496 +539:3:2497 +540:3:2505 +541:3:2510 +542:3:2514 +543:3:2515 +544:3:2522 +545:3:2523 +546:3:2534 +547:3:2535 +548:3:2536 +549:3:2547 +550:3:2552 +551:3:2553 +552:0:4249 +553:3:2565 +554:0:4249 +555:3:2567 +556:0:4249 +557:3:2570 +558:3:2571 +559:3:2583 +560:3:2584 +561:3:2588 +562:3:2589 +563:3:2597 +564:3:2602 +565:3:2606 +566:3:2607 +567:3:2614 +568:3:2615 +569:3:2626 +570:3:2627 +571:3:2628 +572:3:2639 +573:3:2644 +574:3:2645 +575:0:4249 +576:3:2657 +577:0:4249 +578:3:2659 +579:0:4249 +580:3:2660 +581:0:4249 +582:3:2661 +583:0:4249 +584:3:2662 +585:0:4249 +586:3:2663 +587:3:2667 +588:3:2668 +589:3:2676 +590:3:2677 +591:3:2681 +592:3:2682 +593:3:2690 +594:3:2695 +595:3:2699 +596:3:2700 +597:3:2707 +598:3:2708 +599:3:2719 +600:3:2720 +601:3:2721 +602:3:2732 +603:3:2737 +604:3:2738 +605:0:4249 +606:3:2750 +607:0:4249 +608:3:3036 +609:0:4249 +610:3:3134 +611:0:4249 +612:3:3135 +613:0:4249 +614:3:3139 +615:0:4249 +616:3:3145 +617:3:3149 +618:3:3150 +619:3:3158 +620:3:3159 +621:3:3163 +622:3:3164 +623:3:3172 +624:3:3177 +625:3:3181 +626:3:3182 +627:3:3189 +628:3:3190 +629:3:3201 +630:3:3202 +631:3:3203 +632:3:3214 +633:3:3219 +634:3:3220 +635:0:4249 +636:3:3232 +637:0:4249 +638:3:3234 +639:0:4249 +640:3:3235 +641:3:3239 +642:3:3240 +643:3:3248 +644:3:3249 +645:3:3253 +646:3:3254 +647:3:3262 +648:3:3267 +649:3:3271 +650:3:3272 +651:3:3279 +652:3:3280 +653:3:3291 +654:3:3292 +655:3:3293 +656:3:3304 +657:3:3309 +658:3:3310 +659:0:4249 +660:3:3322 +661:0:4249 +662:3:3324 +663:0:4249 +664:3:3327 +665:3:3328 +666:3:3340 +667:3:3341 +668:3:3345 +669:3:3346 +670:3:3354 +671:3:3359 +672:3:3363 +673:3:3364 +674:3:3371 +675:3:3372 +676:3:3383 +677:3:3384 +678:3:3385 +679:3:3396 +680:3:3401 +681:3:3402 +682:0:4249 +683:3:3414 +684:0:4249 +685:3:3416 +686:0:4249 +687:3:3417 +688:0:4249 +689:3:3418 +690:0:4249 +691:3:3419 +692:0:4249 +693:3:3420 +694:3:3424 +695:3:3425 +696:3:3433 +697:3:3434 +698:3:3438 +699:3:3439 +700:3:3447 +701:3:3452 +702:3:3456 +703:3:3457 +704:3:3464 +705:3:3465 +706:3:3476 +707:3:3477 +708:3:3478 +709:3:3489 +710:3:3494 +711:3:3495 +712:0:4249 +713:3:3507 +714:0:4249 +715:3:3793 +716:0:4249 +717:3:3891 +718:0:4249 +719:3:3892 +720:0:4249 +721:3:3896 +722:0:4249 +723:3:3902 +724:0:4249 +725:3:3903 +726:3:3907 +727:3:3908 +728:3:3916 +729:3:3917 +730:3:3921 +731:3:3922 +732:3:3930 +733:3:3935 +734:3:3939 +735:3:3940 +736:3:3947 +737:3:3948 +738:3:3959 +739:3:3960 +740:3:3961 +741:3:3972 +742:3:3977 +743:3:3978 +744:0:4249 +745:3:3993 +746:0:4249 +747:3:3994 +748:3:3998 +749:3:3999 +750:3:4007 +751:3:4008 +752:3:4012 +753:3:4013 +754:3:4021 +755:3:4026 +756:3:4030 +757:3:4031 +758:3:4038 +759:3:4039 +760:3:4050 +761:3:4051 +762:3:4052 +763:3:4063 +764:3:4068 +765:3:4069 +766:0:4249 +767:3:4084 +768:0:4249 +769:3:4089 +770:3:4093 +771:3:4094 +772:3:4102 +773:3:4103 +774:3:4107 +775:3:4108 +776:3:4116 +777:3:4121 +778:3:4125 +779:3:4126 +780:3:4133 +781:3:4134 +782:3:4145 +783:3:4146 +784:3:4147 +785:3:4158 +786:3:4163 +787:3:4164 +788:0:4249 +789:3:4183 +790:0:4249 +791:3:4185 +792:0:4249 +793:3:4186 +794:0:4249 +795:3:1998 +796:0:4249 +797:3:1999 +798:3:2003 +799:3:2004 +800:3:2012 +801:3:2013 +802:3:2017 +803:3:2018 +804:3:2026 +805:3:2031 +806:3:2035 +807:3:2036 +808:3:2043 +809:3:2044 +810:3:2055 +811:3:2056 +812:3:2057 +813:3:2068 +814:3:2073 +815:3:2074 +816:0:4249 +817:3:2086 +818:0:4249 +819:3:2088 +820:3:2089 +821:0:4249 +822:3:2093 +823:3:2097 +824:3:2098 +825:3:2106 +826:3:2107 +827:3:2111 +828:3:2112 +829:3:2120 +830:3:2125 +831:3:2126 +832:3:2137 +833:3:2138 +834:3:2149 +835:3:2150 +836:3:2151 +837:3:2162 +838:3:2167 +839:3:2168 +840:0:4249 +841:3:2180 +842:0:4249 +843:3:2182 +844:0:4249 +845:3:2183 +846:0:4249 +847:3:2193 +848:0:4249 +849:3:2194 +850:0:4249 +851:3:2195 +852:3:2199 +853:3:2200 +854:3:2208 +855:3:2209 +856:3:2213 +857:3:2214 +858:3:2222 +859:3:2227 +860:3:2231 +861:3:2232 +862:3:2239 +863:3:2240 +864:3:2251 +865:3:2252 +866:3:2253 +867:3:2264 +868:3:2269 +869:3:2270 +870:0:4249 +871:3:2285 +872:0:4249 +873:3:2286 +874:3:2290 +875:3:2291 +876:3:2299 +877:3:2300 +878:3:2304 +879:3:2305 +880:3:2313 +881:3:2318 +882:3:2322 +883:3:2323 +884:3:2330 +885:3:2331 +886:3:2342 +887:3:2343 +888:3:2344 +889:3:2355 +890:3:2360 +891:3:2361 +892:0:4249 +893:3:2376 +894:0:4249 +895:3:2381 +896:3:2385 +897:3:2386 +898:3:2394 +899:3:2395 +900:3:2399 +901:3:2400 +902:3:2408 +903:3:2413 +904:3:2417 +905:3:2418 +906:3:2425 +907:3:2426 +908:3:2437 +909:3:2438 +910:3:2439 +911:3:2450 +912:3:2455 +913:3:2456 +914:0:4249 +915:3:2475 +916:0:4249 +917:3:2477 +918:0:4249 +919:3:2478 +920:3:2482 +921:3:2483 +922:3:2491 +923:3:2492 +924:3:2496 +925:3:2497 +926:3:2505 +927:3:2510 +928:3:2514 +929:3:2515 +930:3:2522 +931:3:2523 +932:3:2534 +933:3:2535 +934:3:2536 +935:3:2547 +936:3:2552 +937:3:2553 +938:0:4249 +939:3:2565 +940:0:4249 +941:3:2567 +942:0:4249 +943:3:2570 +944:3:2571 +945:3:2583 +946:3:2584 +947:3:2588 +948:3:2589 +949:3:2597 +950:3:2602 +951:3:2606 +952:3:2607 +953:3:2614 +954:3:2615 +955:3:2626 +956:3:2627 +957:3:2628 +958:3:2639 +959:3:2644 +960:3:2645 +961:0:4249 +962:3:2657 +963:0:4249 +964:3:2659 +965:0:4249 +966:3:2660 +967:0:4249 +968:3:2661 +969:0:4249 +970:3:2662 +971:0:4249 +972:3:2663 +973:3:2667 +974:3:2668 +975:3:2676 +976:3:2677 +977:3:2681 +978:3:2682 +979:3:2690 +980:3:2695 +981:3:2699 +982:3:2700 +983:3:2707 +984:3:2708 +985:3:2719 +986:3:2720 +987:3:2721 +988:3:2732 +989:3:2737 +990:3:2738 +991:0:4249 +992:3:2750 +993:0:4249 +994:3:3036 +995:0:4249 +996:3:3134 +997:0:4249 +998:3:3135 +999:0:4249 +1000:3:3139 +1001:0:4249 +1002:3:3145 +1003:3:3149 +1004:3:3150 +1005:3:3158 +1006:3:3159 +1007:3:3163 +1008:3:3164 +1009:3:3172 +1010:3:3177 +1011:3:3181 +1012:3:3182 +1013:3:3189 +1014:3:3190 +1015:3:3201 +1016:3:3202 +1017:3:3203 +1018:3:3214 +1019:3:3219 +1020:3:3220 +1021:0:4249 +1022:3:3232 +1023:0:4249 +1024:3:3234 +1025:0:4249 +1026:3:3235 +1027:3:3239 +1028:3:3240 +1029:3:3248 +1030:3:3249 +1031:3:3253 +1032:3:3254 +1033:3:3262 +1034:3:3267 +1035:3:3271 +1036:3:3272 +1037:3:3279 +1038:3:3280 +1039:3:3291 +1040:3:3292 +1041:3:3293 +1042:3:3304 +1043:3:3309 +1044:3:3310 +1045:0:4249 +1046:3:3322 +1047:0:4249 +1048:3:3324 +1049:0:4249 +1050:3:3327 +1051:3:3328 +1052:3:3340 +1053:3:3341 +1054:3:3345 +1055:3:3346 +1056:3:3354 +1057:3:3359 +1058:3:3363 +1059:3:3364 +1060:3:3371 +1061:3:3372 +1062:3:3383 +1063:3:3384 +1064:3:3385 +1065:3:3396 +1066:3:3401 +1067:3:3402 +1068:0:4249 +1069:3:3414 +1070:0:4249 +1071:3:3416 +1072:0:4249 +1073:3:3417 +1074:0:4249 +1075:3:3418 +1076:0:4249 +1077:3:3419 +1078:0:4249 +1079:3:3420 +1080:3:3424 +1081:3:3425 +1082:3:3433 +1083:3:3434 +1084:3:3438 +1085:3:3439 +1086:3:3447 +1087:3:3452 +1088:3:3456 +1089:3:3457 +1090:3:3464 +1091:3:3465 +1092:3:3476 +1093:3:3477 +1094:3:3478 +1095:3:3489 +1096:3:3494 +1097:3:3495 +1098:0:4249 +1099:3:3507 +1100:0:4249 +1101:3:3793 +1102:0:4249 +1103:3:3891 +1104:0:4249 +1105:3:3892 +1106:0:4249 +1107:3:3896 +1108:0:4249 +1109:3:3902 +1110:0:4249 +1111:3:3903 +1112:3:3907 +1113:3:3908 +1114:3:3916 +1115:3:3917 +1116:3:3921 +1117:3:3922 +1118:3:3930 +1119:3:3935 +1120:3:3939 +1121:3:3940 +1122:3:3947 +1123:3:3948 +1124:3:3959 +1125:3:3960 +1126:3:3961 +1127:3:3972 +1128:3:3977 +1129:3:3978 +1130:0:4249 +1131:3:3993 +1132:0:4249 +1133:3:3994 +1134:3:3998 +1135:3:3999 +1136:3:4007 +1137:3:4008 +1138:3:4012 +1139:3:4013 +1140:3:4021 +1141:3:4026 +1142:3:4030 +1143:3:4031 +1144:3:4038 +1145:3:4039 +1146:3:4050 +1147:3:4051 +1148:3:4052 +1149:3:4063 +1150:3:4068 +1151:3:4069 +1152:0:4249 +1153:3:4084 +1154:0:4249 +1155:3:4089 +1156:3:4093 +1157:3:4094 +1158:3:4102 +1159:3:4103 +1160:3:4107 +1161:3:4108 +1162:3:4116 +1163:3:4121 +1164:3:4125 +1165:3:4126 +1166:3:4133 +1167:3:4134 +1168:3:4145 +1169:3:4146 +1170:3:4147 +1171:3:4158 +1172:3:4163 +1173:3:4164 +1174:0:4249 +1175:3:4183 +1176:0:4249 +1177:3:4185 +1178:0:4249 +1179:3:4186 +1180:0:4249 +1181:3:1998 +1182:0:4249 +1183:3:1999 +1184:3:2003 +1185:3:2004 +1186:3:2012 +1187:3:2013 +1188:3:2017 +1189:3:2018 +1190:3:2026 +1191:3:2031 +1192:3:2035 +1193:3:2036 +1194:3:2043 +1195:3:2044 +1196:3:2055 +1197:3:2056 +1198:3:2057 +1199:3:2068 +1200:3:2073 +1201:3:2074 +1202:0:4249 +1203:3:2086 +1204:0:4249 +1205:3:2088 +1206:3:2089 +1207:0:4249 +1208:3:2093 +1209:3:2097 +1210:3:2098 +1211:3:2106 +1212:3:2107 +1213:3:2111 +1214:3:2112 +1215:3:2120 +1216:3:2125 +1217:3:2126 +1218:3:2137 +1219:3:2138 +1220:3:2149 +1221:3:2150 +1222:3:2151 +1223:3:2162 +1224:3:2167 +1225:3:2168 +1226:0:4249 +1227:3:2180 +1228:0:4249 +1229:3:2182 +1230:0:4249 +1231:3:2183 +1232:0:4249 +1233:3:2193 +1234:0:4249 +1235:3:2194 +1236:0:4249 +1237:3:2195 +1238:3:2199 +1239:3:2200 +1240:3:2208 +1241:3:2209 +1242:3:2213 +1243:3:2214 +1244:3:2222 +1245:3:2227 +1246:3:2231 +1247:3:2232 +1248:3:2239 +1249:3:2240 +1250:3:2251 +1251:3:2252 +1252:3:2253 +1253:3:2264 +1254:3:2269 +1255:3:2270 +1256:0:4249 +1257:3:2285 +1258:0:4249 +1259:3:2286 +1260:3:2290 +1261:3:2291 +1262:3:2299 +1263:3:2300 +1264:3:2304 +1265:3:2305 +1266:3:2313 +1267:3:2318 +1268:3:2322 +1269:3:2323 +1270:3:2330 +1271:3:2331 +1272:3:2342 +1273:3:2343 +1274:3:2344 +1275:3:2355 +1276:3:2360 +1277:3:2361 +1278:0:4249 +1279:3:2376 +1280:0:4249 +1281:3:2381 +1282:3:2385 +1283:3:2386 +1284:3:2394 +1285:3:2395 +1286:3:2399 +1287:3:2400 +1288:3:2408 +1289:3:2413 +1290:3:2417 +1291:3:2418 +1292:3:2425 +1293:3:2426 +1294:3:2437 +1295:3:2438 +1296:3:2439 +1297:3:2450 +1298:3:2455 +1299:3:2456 +1300:0:4249 +1301:3:2475 +1302:0:4249 +1303:3:2477 +1304:0:4249 +1305:3:2478 +1306:3:2482 +1307:3:2483 +1308:3:2491 +1309:3:2492 +1310:3:2496 +1311:3:2497 +1312:3:2505 +1313:3:2510 +1314:3:2514 +1315:3:2515 +1316:3:2522 +1317:3:2523 +1318:3:2534 +1319:3:2535 +1320:3:2536 +1321:3:2547 +1322:3:2552 +1323:3:2553 +1324:0:4249 +1325:3:2565 +1326:0:4249 +1327:3:2567 +1328:0:4249 +1329:3:2570 +1330:3:2571 +1331:3:2583 +1332:3:2584 +1333:3:2588 +1334:3:2589 +1335:3:2597 +1336:3:2602 +1337:3:2606 +1338:3:2607 +1339:3:2614 +1340:3:2615 +1341:3:2626 +1342:3:2627 +1343:3:2628 +1344:3:2639 +1345:3:2644 +1346:3:2645 +1347:0:4249 +1348:3:2657 +1349:0:4249 +1350:3:2659 +1351:0:4249 +1352:3:2660 +1353:0:4249 +1354:3:2661 +1355:0:4249 +1356:3:2662 +1357:0:4249 +1358:3:2663 +1359:3:2667 +1360:3:2668 +1361:3:2676 +1362:3:2677 +1363:3:2681 +1364:3:2682 +1365:3:2690 +1366:3:2695 +1367:3:2699 +1368:3:2700 +1369:3:2707 +1370:3:2708 +1371:3:2719 +1372:3:2720 +1373:3:2721 +1374:3:2732 +1375:3:2737 +1376:3:2738 +1377:0:4249 +1378:3:2750 +1379:0:4249 +1380:3:3036 +1381:0:4249 +1382:3:3134 +1383:0:4249 +1384:3:3135 +1385:0:4249 +1386:3:3139 +1387:0:4249 +1388:3:3145 +1389:3:3149 +1390:3:3150 +1391:3:3158 +1392:3:3159 +1393:3:3163 +1394:3:3164 +1395:3:3172 +1396:3:3177 +1397:3:3181 +1398:3:3182 +1399:3:3189 +1400:3:3190 +1401:3:3201 +1402:3:3202 +1403:3:3203 +1404:3:3214 +1405:3:3219 +1406:3:3220 +1407:0:4249 +1408:3:3232 +1409:0:4249 +1410:3:3234 +1411:0:4249 +1412:3:3235 +1413:3:3239 +1414:3:3240 +1415:3:3248 +1416:3:3249 +1417:3:3253 +1418:3:3254 +1419:3:3262 +1420:3:3267 +1421:3:3271 +1422:3:3272 +1423:3:3279 +1424:3:3280 +1425:3:3291 +1426:3:3292 +1427:3:3293 +1428:3:3304 +1429:3:3309 +1430:3:3310 +1431:0:4249 +1432:3:3322 +1433:0:4249 +1434:3:3324 +1435:0:4249 +1436:3:3327 +1437:3:3328 +1438:3:3340 +1439:3:3341 +1440:3:3345 +1441:3:3346 +1442:3:3354 +1443:3:3359 +1444:3:3363 +1445:3:3364 +1446:3:3371 +1447:3:3372 +1448:3:3383 +1449:3:3384 +1450:3:3385 +1451:3:3396 +1452:3:3401 +1453:3:3402 +1454:0:4249 +1455:3:3414 +1456:0:4249 +1457:3:3416 +1458:0:4249 +1459:3:3417 +1460:0:4249 +1461:3:3418 +1462:0:4249 +1463:3:3419 +1464:0:4249 +1465:3:3420 +1466:3:3424 +1467:3:3425 +1468:3:3433 +1469:3:3434 +1470:3:3438 +1471:3:3439 +1472:3:3447 +1473:3:3452 +1474:3:3456 +1475:3:3457 +1476:3:3464 +1477:3:3465 +1478:3:3476 +1479:3:3477 +1480:3:3478 +1481:3:3489 +1482:3:3494 +1483:3:3495 +1484:0:4249 +1485:3:3507 +1486:0:4249 +1487:3:3793 +1488:0:4249 +1489:3:3891 +1490:0:4249 +1491:3:3892 +1492:0:4249 +1493:3:3896 +1494:0:4249 +1495:3:3902 +1496:0:4249 +1497:3:3903 +1498:3:3907 +1499:3:3908 +1500:3:3916 +1501:3:3917 +1502:3:3921 +1503:3:3922 +1504:3:3930 +1505:3:3935 +1506:3:3939 +1507:3:3940 +1508:3:3947 +1509:3:3948 +1510:3:3959 +1511:3:3960 +1512:3:3961 +1513:3:3972 +1514:3:3977 +1515:3:3978 +1516:0:4249 +1517:3:3993 +1518:0:4249 +1519:3:3994 +1520:3:3998 +1521:3:3999 +1522:3:4007 +1523:3:4008 +1524:3:4012 +1525:3:4013 +1526:3:4021 +1527:3:4026 +1528:3:4030 +1529:3:4031 +1530:3:4038 +1531:3:4039 +1532:3:4050 +1533:3:4051 +1534:3:4052 +1535:3:4063 +1536:3:4068 +1537:3:4069 +1538:0:4249 +1539:3:4084 +1540:0:4249 +1541:3:4089 +1542:3:4093 +1543:3:4094 +1544:3:4102 +1545:3:4103 +1546:3:4107 +1547:3:4108 +1548:3:4116 +1549:3:4121 +1550:3:4125 +1551:3:4126 +1552:3:4133 +1553:3:4134 +1554:3:4145 +1555:3:4146 +1556:3:4147 +1557:3:4158 +1558:3:4163 +1559:3:4164 +1560:0:4249 +1561:3:4183 +1562:0:4249 +1563:3:4185 +1564:0:4249 +1565:3:4186 +1566:0:4249 +1567:3:1998 +1568:0:4249 +1569:3:1999 +1570:3:2003 +1571:3:2004 +1572:3:2012 +1573:3:2013 +1574:3:2017 +1575:3:2018 +1576:3:2026 +1577:3:2031 +1578:3:2035 +1579:3:2036 +1580:3:2043 +1581:3:2044 +1582:3:2055 +1583:3:2056 +1584:3:2057 +1585:3:2068 +1586:3:2073 +1587:3:2074 +1588:0:4249 +1589:3:2086 +1590:0:4249 +1591:3:2088 +1592:3:2089 +1593:0:4249 +1594:3:2093 +1595:3:2097 +1596:3:2098 +1597:3:2106 +1598:3:2107 +1599:3:2111 +1600:3:2112 +1601:3:2120 +1602:3:2133 +1603:3:2134 +1604:3:2137 +1605:3:2138 +1606:3:2149 +1607:3:2150 +1608:3:2151 +1609:3:2162 +1610:3:2167 +1611:3:2170 +1612:3:2171 +1613:0:4249 +1614:3:2180 +1615:0:4249 +1616:3:2182 +1617:0:4249 +1618:3:2183 +1619:0:4249 +1620:3:2193 +1621:0:4249 +1622:3:2194 +1623:0:4249 +1624:3:2195 +1625:3:2199 +1626:3:2200 +1627:3:2208 +1628:3:2209 +1629:3:2213 +1630:3:2214 +1631:3:2222 +1632:3:2235 +1633:3:2236 +1634:3:2239 +1635:3:2240 +1636:3:2251 +1637:3:2252 +1638:3:2253 +1639:3:2264 +1640:3:2269 +1641:3:2272 +1642:3:2273 +1643:0:4249 +1644:3:2285 +1645:0:4249 +1646:3:2286 +1647:3:2290 +1648:3:2291 +1649:3:2299 +1650:3:2300 +1651:3:2304 +1652:3:2305 +1653:3:2313 +1654:3:2326 +1655:3:2327 +1656:3:2330 +1657:3:2331 +1658:3:2342 +1659:3:2343 +1660:3:2344 +1661:3:2355 +1662:3:2360 +1663:3:2363 +1664:3:2364 +1665:0:4249 +1666:3:2376 +1667:0:4249 +1668:3:2381 +1669:3:2385 +1670:3:2386 +1671:3:2394 +1672:3:2395 +1673:3:2399 +1674:3:2400 +1675:3:2408 +1676:3:2421 +1677:3:2422 +1678:3:2425 +1679:3:2426 +1680:3:2437 +1681:3:2438 +1682:3:2439 +1683:3:2450 +1684:3:2455 +1685:3:2458 +1686:3:2459 +1687:0:4249 +1688:3:2475 +1689:0:4249 +1690:3:2477 +1691:0:4249 +1692:3:2478 +1693:3:2482 +1694:3:2483 +1695:3:2491 +1696:3:2492 +1697:3:2496 +1698:3:2497 +1699:3:2505 +1700:3:2518 +1701:3:2519 +1702:3:2522 +1703:3:2523 +1704:3:2534 +1705:3:2535 +1706:3:2536 +1707:3:2547 +1708:3:2552 +1709:3:2555 +1710:3:2556 +1711:0:4249 +1712:3:2565 +1713:0:4249 +1714:3:2567 +1715:0:4249 +1716:3:2570 +1717:3:2571 +1718:3:2583 +1719:3:2584 +1720:3:2588 +1721:3:2589 +1722:3:2597 +1723:3:2610 +1724:3:2611 +1725:3:2614 +1726:3:2615 +1727:3:2626 +1728:3:2627 +1729:3:2628 +1730:3:2639 +1731:3:2644 +1732:3:2647 +1733:3:2648 +1734:0:4249 +1735:3:2657 +1736:0:4249 +1737:3:2659 +1738:0:4249 +1739:3:2660 +1740:0:4249 +1741:3:2661 +1742:0:4249 +1743:3:2662 +1744:0:4249 +1745:3:2663 +1746:3:2667 +1747:3:2668 +1748:3:2676 +1749:3:2677 +1750:3:2681 +1751:3:2682 +1752:3:2690 +1753:3:2703 +1754:3:2704 +1755:3:2707 +1756:3:2708 +1757:3:2719 +1758:3:2720 +1759:3:2721 +1760:3:2732 +1761:3:2737 +1762:3:2740 +1763:3:2741 +1764:0:4249 +1765:3:2750 +1766:0:4249 +1767:3:3036 +1768:0:4249 +1769:3:3134 +1770:0:4249 +1771:3:3135 +1772:0:4249 +1773:3:3139 +1774:0:4249 +1775:3:3145 +1776:3:3149 +1777:3:3150 +1778:3:3158 +1779:3:3159 +1780:3:3163 +1781:3:3164 +1782:3:3172 +1783:3:3185 +1784:3:3186 +1785:3:3189 +1786:3:3190 +1787:3:3201 +1788:3:3202 +1789:3:3203 +1790:3:3214 +1791:3:3219 +1792:3:3222 +1793:3:3223 +1794:0:4249 +1795:3:3232 +1796:0:4249 +1797:3:3234 +1798:0:4249 +1799:3:3235 +1800:3:3239 +1801:3:3240 +1802:3:3248 +1803:3:3249 +1804:3:3253 +1805:3:3254 +1806:3:3262 +1807:3:3275 +1808:3:3276 +1809:3:3279 +1810:3:3280 +1811:3:3291 +1812:3:3292 +1813:3:3293 +1814:3:3304 +1815:3:3309 +1816:3:3312 +1817:3:3313 +1818:0:4249 +1819:3:3322 +1820:0:4249 +1821:3:3324 +1822:0:4249 +1823:3:3327 +1824:3:3328 +1825:3:3340 +1826:3:3341 +1827:3:3345 +1828:3:3346 +1829:3:3354 +1830:3:3367 +1831:3:3368 +1832:3:3371 +1833:3:3372 +1834:3:3383 +1835:3:3384 +1836:3:3385 +1837:3:3396 +1838:3:3401 +1839:3:3404 +1840:3:3405 +1841:0:4249 +1842:3:3414 +1843:0:4249 +1844:3:3416 +1845:0:4249 +1846:3:3417 +1847:0:4249 +1848:3:3418 +1849:0:4249 +1850:3:3419 +1851:0:4249 +1852:3:3420 +1853:3:3424 +1854:3:3425 +1855:3:3433 +1856:3:3434 +1857:3:3438 +1858:3:3439 +1859:3:3447 +1860:3:3460 +1861:3:3461 +1862:3:3464 +1863:3:3465 +1864:3:3476 +1865:3:3477 +1866:3:3478 +1867:3:3489 +1868:3:3494 +1869:3:3497 +1870:3:3498 +1871:0:4249 +1872:3:3507 +1873:0:4249 +1874:3:3793 +1875:0:4249 +1876:3:3891 +1877:0:4249 +1878:3:3892 +1879:0:4249 +1880:3:3896 +1881:0:4249 +1882:3:3902 +1883:0:4249 +1884:3:3903 +1885:3:3907 +1886:3:3908 +1887:3:3916 +1888:3:3917 +1889:3:3921 +1890:3:3922 +1891:3:3930 +1892:3:3943 +1893:3:3944 +1894:3:3947 +1895:3:3948 +1896:3:3959 +1897:3:3960 +1898:3:3961 +1899:3:3972 +1900:3:3977 +1901:3:3980 +1902:3:3981 +1903:0:4249 +1904:3:3993 +1905:0:4249 +1906:3:3994 +1907:3:3998 +1908:3:3999 +1909:3:4007 +1910:3:4008 +1911:3:4012 +1912:3:4013 +1913:3:4021 +1914:3:4034 +1915:3:4035 +1916:3:4038 +1917:3:4039 +1918:3:4050 +1919:3:4051 +1920:3:4052 +1921:3:4063 +1922:3:4068 +1923:3:4071 +1924:3:4072 +1925:0:4249 +1926:3:4084 +1927:0:4249 +1928:3:4089 +1929:3:4093 +1930:3:4094 +1931:3:4102 +1932:3:4103 +1933:3:4107 +1934:3:4108 +1935:3:4116 +1936:3:4129 +1937:3:4130 +1938:3:4133 +1939:3:4134 +1940:3:4145 +1941:3:4146 +1942:3:4147 +1943:3:4158 +1944:3:4163 +1945:3:4166 +1946:3:4167 +1947:0:4249 +1948:3:4183 +1949:0:4249 +1950:3:4185 +1951:0:4249 +1952:3:4186 +1953:0:4249 +1954:3:4189 +1955:0:4249 +1956:3:4194 +1957:0:4249 +1958:2:1016 +1959:0:4249 +1960:3:4195 +1961:0:4249 +1962:2:1022 +1963:0:4249 +1964:3:4194 +1965:0:4249 +1966:2:1023 +1967:0:4249 +1968:3:4195 +1969:0:4249 +1970:2:1024 +1971:0:4249 +1972:3:4194 +1973:0:4249 +1974:2:1025 +1975:0:4249 +1976:3:4195 +1977:0:4249 +1978:1:2 +1979:0:4249 +1980:3:4194 +1981:0:4249 +1982:2:1026 +1983:0:4249 +1984:3:4195 +1985:0:4249 +1986:1:8 +1987:0:4249 +1988:3:4194 +1989:0:4249 +1990:2:1025 +1991:0:4249 +1992:3:4195 +1993:0:4249 +1994:1:9 +1995:0:4249 +1996:3:4194 +1997:0:4249 +1998:2:1026 +1999:0:4249 +2000:3:4195 +2001:0:4249 +2002:1:10 +2003:0:4249 +2004:3:4194 +2005:0:4249 +2006:2:1025 +2007:0:4249 +2008:3:4195 +2009:0:4249 +2010:1:11 +2011:0:4249 +2012:3:4194 +2013:0:4249 +2014:2:1026 +2015:0:4249 +2016:3:4195 +2017:0:4249 +2018:1:12 +2019:1:16 +2020:1:17 +2021:1:25 +2022:1:26 +2023:1:30 +2024:1:31 +2025:1:39 +2026:1:44 +2027:1:48 +2028:1:49 +2029:1:56 +2030:1:57 +2031:1:68 +2032:1:69 +2033:1:70 +2034:1:81 +2035:1:86 +2036:1:87 +2037:0:4249 +2038:3:4194 +2039:0:4249 +2040:2:1025 +2041:0:4249 +2042:3:4195 +2043:0:4249 +2044:1:99 +2045:0:4249 +2046:3:4194 +2047:0:4249 +2048:2:1026 +2049:0:4249 +2050:3:4195 +2051:0:4249 +2052:2:1027 +2053:0:4249 +2054:3:4194 +2055:0:4249 +2056:2:1028 +2057:0:4249 +2058:3:4195 +2059:0:4249 +2060:2:1039 +2061:0:4249 +2062:3:4194 +2063:0:4249 +2064:2:1040 +2065:0:4249 +2066:3:4195 +2067:0:4249 +2068:2:1041 +2069:2:1045 +2070:2:1046 +2071:2:1054 +2072:2:1055 +2073:2:1059 +2074:2:1060 +2075:2:1068 +2076:2:1073 +2077:2:1077 +2078:2:1078 +2079:2:1085 +2080:2:1086 +2081:2:1097 +2082:2:1098 +2083:2:1099 +2084:2:1110 +2085:2:1115 +2086:2:1116 +2087:0:4249 +2088:3:4194 +2089:0:4249 +2090:2:1128 +2091:0:4249 +2092:3:4195 +2093:0:4249 +2094:2:1129 +2095:2:1133 +2096:2:1134 +2097:2:1142 +2098:2:1143 +2099:2:1147 +2100:2:1148 +2101:2:1156 +2102:2:1161 +2103:2:1165 +2104:2:1166 +2105:2:1173 +2106:2:1174 +2107:2:1185 +2108:2:1186 +2109:2:1187 +2110:2:1198 +2111:2:1203 +2112:2:1204 +2113:0:4249 +2114:3:4194 +2115:0:4249 +2116:2:1216 +2117:0:4249 +2118:3:4195 +2119:0:4249 +2120:2:1217 +2121:0:4249 +2122:3:4194 +2123:0:4249 +2124:2:1218 +2125:2:1222 +2126:2:1223 +2127:2:1231 +2128:2:1232 +2129:2:1236 +2130:2:1237 +2131:2:1245 +2132:2:1250 +2133:2:1254 +2134:2:1255 +2135:2:1262 +2136:2:1263 +2137:2:1274 +2138:2:1275 +2139:2:1276 +2140:2:1287 +2141:2:1292 +2142:2:1293 +2143:0:4249 +2144:3:4195 +2145:0:4249 +2146:2:1305 +2147:0:4249 +2148:3:4194 +2149:0:4249 +2150:2:1590 +2151:0:4249 +2152:3:4195 +2153:0:4249 +2154:2:1591 +2155:0:4249 +2156:3:4194 +2157:0:4249 +2158:2:1596 +2159:0:4249 +2160:3:4195 +2161:0:4249 +2162:2:1601 +2163:0:4249 +2164:3:4194 +2165:0:4249 +2166:2:1602 +2167:0:4247 +2168:3:4195 +2169:0:4253 +2170:2:1211 diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_no_rmb.define b/formal-model/urcu/result-signal-over-writer/urcu_free_no_rmb.define new file mode 100644 index 0000000..73e61a4 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_free_no_rmb.define @@ -0,0 +1 @@ +#define NO_RMB diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_no_rmb.log b/formal-model/urcu/result-signal-over-writer/urcu_free_no_rmb.log new file mode 100644 index 0000000..5eb694e --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_free_no_rmb.log @@ -0,0 +1,280 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_free_no_rmb.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 742) + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 10519, errors: 0 + 20146 states, stored + 191615 states, matched + 211761 transitions (= stored+matched) + 711676 atomic steps +hash conflicts: 1222 (resolved) + +Stats on memory usage (in Megabytes): + 1.614 equivalent memory usage for states (stored*(State-vector + overhead)) + 1.509 actual memory usage for states (compression: 93.51%) + state-vector as stored = 51 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 467.229 total actual memory usage + +unreached in proctype urcu_reader_sig + line 402, "pan.___", state 330, "(1)" + line 613, "pan.___", state 411, "-end-" + (2 of 411 states) +unreached in proctype urcu_writer + line 398, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 407, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 408, "pan.___", state 59, "(1)" + line 417, "pan.___", state 89, "(1)" + line 398, "pan.___", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 408, "pan.___", state 160, "(1)" + line 651, "pan.___", state 213, "(1)" + line 174, "pan.___", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 178, "pan.___", state 233, "(1)" + line 174, "pan.___", state 257, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 182, "pan.___", state 658, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 182, "pan.___", state 660, "(1)" + line 182, "pan.___", state 661, "((cache_dirty_generation_ptr.bitfield&(1<<0)))" + line 182, "pan.___", state 661, "else" + line 174, "pan.___", state 671, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 182, "pan.___", state 693, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 174, "pan.___", state 710, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 174, "pan.___", state 712, "(1)" + line 178, "pan.___", state 719, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 178, "pan.___", state 721, "(1)" + line 178, "pan.___", state 722, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 178, "pan.___", state 722, "else" + line 176, "pan.___", state 727, "((j<1))" + line 176, "pan.___", state 727, "((j>=1))" + line 182, "pan.___", state 732, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 182, "pan.___", state 734, "(1)" + line 182, "pan.___", state 735, "((cache_dirty_generation_ptr.bitfield&(1<<0)))" + line 182, "pan.___", state 735, "else" + line 192, "pan.___", state 740, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 192, "pan.___", state 740, "else" + line 220, "pan.___", state 741, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 220, "pan.___", state 741, "else" + line 355, "pan.___", state 747, "((sighand_exec==1))" + line 355, "pan.___", state 747, "else" + line 361, "pan.___", state 750, "sighand_exec = 1" + line 398, "pan.___", state 763, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 398, "pan.___", state 765, "(1)" + line 398, "pan.___", state 766, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 398, "pan.___", state 766, "else" + line 398, "pan.___", state 769, "(1)" + line 402, "pan.___", state 777, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 402, "pan.___", state 779, "(1)" + line 402, "pan.___", state 780, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 402, "pan.___", state 780, "else" + line 402, "pan.___", state 783, "(1)" + line 402, "pan.___", state 784, "(1)" + line 402, "pan.___", state 784, "(1)" + line 400, "pan.___", state 789, "((i<1))" + line 400, "pan.___", state 789, "((i>=1))" + line 407, "pan.___", state 795, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 408, "pan.___", state 808, "(1)" + line 408, "pan.___", state 809, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 408, "pan.___", state 809, "else" + line 408, "pan.___", state 812, "(1)" + line 408, "pan.___", state 813, "(1)" + line 408, "pan.___", state 813, "(1)" + line 412, "pan.___", state 821, "(1)" + line 412, "pan.___", state 822, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 412, "pan.___", state 822, "else" + line 412, "pan.___", state 825, "(1)" + line 412, "pan.___", state 826, "(1)" + line 412, "pan.___", state 826, "(1)" + line 410, "pan.___", state 831, "((i<1))" + line 410, "pan.___", state 831, "((i>=1))" + line 417, "pan.___", state 838, "(1)" + line 417, "pan.___", state 839, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 417, "pan.___", state 839, "else" + line 417, "pan.___", state 842, "(1)" + line 417, "pan.___", state 843, "(1)" + line 417, "pan.___", state 843, "(1)" + line 419, "pan.___", state 846, "(1)" + line 419, "pan.___", state 846, "(1)" + line 361, "pan.___", state 855, "sighand_exec = 1" + line 402, "pan.___", state 886, "(1)" + line 407, "pan.___", state 902, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 417, "pan.___", state 945, "(1)" + line 402, "pan.___", state 983, "(1)" + line 407, "pan.___", state 999, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 417, "pan.___", state 1042, "(1)" + line 398, "pan.___", state 1068, "(1)" + line 402, "pan.___", state 1082, "(1)" + line 407, "pan.___", state 1098, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 417, "pan.___", state 1141, "(1)" + line 402, "pan.___", state 1182, "(1)" + line 407, "pan.___", state 1198, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 417, "pan.___", state 1241, "(1)" + line 174, "pan.___", state 1262, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 174, "pan.___", state 1264, "(1)" + line 178, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 178, "pan.___", state 1273, "(1)" + line 178, "pan.___", state 1274, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 178, "pan.___", state 1274, "else" + line 176, "pan.___", state 1279, "((j<1))" + line 176, "pan.___", state 1279, "((j>=1))" + line 182, "pan.___", state 1284, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 182, "pan.___", state 1286, "(1)" + line 182, "pan.___", state 1287, "((cache_dirty_generation_ptr.bitfield&(1<<0)))" + line 182, "pan.___", state 1287, "else" + line 174, "pan.___", state 1297, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 182, "pan.___", state 1319, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 174, "pan.___", state 1336, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 174, "pan.___", state 1338, "(1)" + line 178, "pan.___", state 1345, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 178, "pan.___", state 1347, "(1)" + line 178, "pan.___", state 1348, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 178, "pan.___", state 1348, "else" + line 176, "pan.___", state 1353, "((j<1))" + line 176, "pan.___", state 1353, "((j>=1))" + line 182, "pan.___", state 1358, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 182, "pan.___", state 1360, "(1)" + line 182, "pan.___", state 1361, "((cache_dirty_generation_ptr.bitfield&(1<<0)))" + line 182, "pan.___", state 1361, "else" + line 192, "pan.___", state 1366, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 192, "pan.___", state 1366, "else" + line 220, "pan.___", state 1367, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 220, "pan.___", state 1367, "else" + line 355, "pan.___", state 1373, "((sighand_exec==1))" + line 355, "pan.___", state 1373, "else" + line 361, "pan.___", state 1376, "sighand_exec = 1" + line 398, "pan.___", state 1389, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 398, "pan.___", state 1391, "(1)" + line 398, "pan.___", state 1392, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 398, "pan.___", state 1392, "else" + line 398, "pan.___", state 1395, "(1)" + line 402, "pan.___", state 1403, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 402, "pan.___", state 1405, "(1)" + line 402, "pan.___", state 1406, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 402, "pan.___", state 1406, "else" + line 402, "pan.___", state 1409, "(1)" + line 402, "pan.___", state 1410, "(1)" + line 402, "pan.___", state 1410, "(1)" + line 400, "pan.___", state 1415, "((i<1))" + line 400, "pan.___", state 1415, "((i>=1))" + line 407, "pan.___", state 1421, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 408, "pan.___", state 1434, "(1)" + line 408, "pan.___", state 1435, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 408, "pan.___", state 1435, "else" + line 408, "pan.___", state 1438, "(1)" + line 408, "pan.___", state 1439, "(1)" + line 408, "pan.___", state 1439, "(1)" + line 412, "pan.___", state 1447, "(1)" + line 412, "pan.___", state 1448, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 412, "pan.___", state 1448, "else" + line 412, "pan.___", state 1451, "(1)" + line 412, "pan.___", state 1452, "(1)" + line 412, "pan.___", state 1452, "(1)" + line 410, "pan.___", state 1457, "((i<1))" + line 410, "pan.___", state 1457, "((i>=1))" + line 417, "pan.___", state 1464, "(1)" + line 417, "pan.___", state 1465, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 417, "pan.___", state 1465, "else" + line 417, "pan.___", state 1468, "(1)" + line 417, "pan.___", state 1469, "(1)" + line 417, "pan.___", state 1469, "(1)" + line 419, "pan.___", state 1472, "(1)" + line 419, "pan.___", state 1472, "(1)" + line 361, "pan.___", state 1481, "sighand_exec = 1" + line 178, "pan.___", state 1506, "(1)" + line 182, "pan.___", state 1517, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 174, "pan.___", state 1530, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_no_rmb.spin.input.trail b/formal-model/urcu/result-signal-over-writer/urcu_free_no_rmb.spin.input.trail new file mode 100644 index 0000000..8219815 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_free_no_rmb.spin.input.trail @@ -0,0 +1,1805 @@ +-2:4:-2 +-4:-4:-4 +1:0:2905 +2:4:2857 +3:4:2860 +4:4:2860 +5:4:2863 +6:4:2871 +7:4:2871 +8:4:2874 +9:4:2880 +10:4:2884 +11:4:2884 +12:4:2887 +13:4:2895 +14:4:2899 +15:4:2900 +16:0:2905 +17:4:2902 +18:0:2905 +19:3:1319 +20:0:2905 +21:3:1325 +22:0:2905 +23:3:1326 +24:0:2905 +25:3:1327 +26:3:1331 +27:3:1332 +28:3:1340 +29:3:1341 +30:3:1345 +31:3:1346 +32:3:1354 +33:3:1359 +34:3:1363 +35:3:1364 +36:3:1371 +37:3:1372 +38:3:1383 +39:3:1384 +40:3:1385 +41:3:1396 +42:3:1401 +43:3:1402 +44:0:2905 +45:3:1414 +46:0:2905 +47:3:1416 +48:3:1417 +49:0:2905 +50:3:1421 +51:3:1425 +52:3:1426 +53:3:1434 +54:3:1435 +55:3:1439 +56:3:1440 +57:3:1448 +58:3:1453 +59:3:1454 +60:3:1465 +61:3:1466 +62:3:1477 +63:3:1478 +64:3:1479 +65:3:1490 +66:3:1495 +67:3:1496 +68:0:2905 +69:3:1508 +70:0:2905 +71:3:1510 +72:0:2905 +73:3:1511 +74:0:2905 +75:3:1521 +76:0:2905 +77:3:1522 +78:0:2905 +79:3:1526 +80:3:1527 +81:3:1531 +82:3:1535 +83:3:1536 +84:3:1540 +85:3:1548 +86:3:1549 +87:0:2905 +88:3:1557 +89:0:2905 +90:3:1561 +91:3:1562 +92:3:1566 +93:3:1570 +94:3:1571 +95:3:1575 +96:3:1583 +97:3:1584 +98:0:2905 +99:3:1592 +100:0:2905 +101:3:1600 +102:3:1601 +103:3:1605 +104:3:1609 +105:3:1610 +106:3:1614 +107:3:1622 +108:3:1623 +109:0:2905 +110:3:1635 +111:0:2905 +112:3:1637 +113:0:2905 +114:3:1638 +115:3:1642 +116:3:1643 +117:3:1651 +118:3:1652 +119:3:1656 +120:3:1657 +121:3:1665 +122:3:1670 +123:3:1674 +124:3:1675 +125:3:1682 +126:3:1683 +127:3:1694 +128:3:1695 +129:3:1696 +130:3:1707 +131:3:1712 +132:3:1713 +133:0:2905 +134:3:1725 +135:0:2905 +136:3:1727 +137:0:2905 +138:3:1730 +139:3:1731 +140:3:1743 +141:3:1744 +142:3:1748 +143:3:1749 +144:3:1757 +145:3:1762 +146:3:1766 +147:3:1767 +148:3:1774 +149:3:1775 +150:3:1786 +151:3:1787 +152:3:1788 +153:3:1799 +154:3:1804 +155:3:1805 +156:0:2905 +157:3:1817 +158:0:2905 +159:3:1819 +160:0:2905 +161:3:1820 +162:0:2905 +163:3:1821 +164:0:2905 +165:3:1822 +166:0:2905 +167:3:1823 +168:3:1827 +169:3:1828 +170:3:1836 +171:3:1837 +172:3:1841 +173:3:1842 +174:3:1850 +175:3:1855 +176:3:1859 +177:3:1860 +178:3:1867 +179:3:1868 +180:3:1879 +181:3:1880 +182:3:1881 +183:3:1892 +184:3:1897 +185:3:1898 +186:0:2905 +187:3:1910 +188:0:2905 +189:3:2028 +190:0:2905 +191:3:2126 +192:0:2905 +193:3:2127 +194:0:2905 +195:3:2131 +196:0:2905 +197:3:2137 +198:3:2141 +199:3:2142 +200:3:2150 +201:3:2151 +202:3:2155 +203:3:2156 +204:3:2164 +205:3:2169 +206:3:2173 +207:3:2174 +208:3:2181 +209:3:2182 +210:3:2193 +211:3:2194 +212:3:2195 +213:3:2206 +214:3:2211 +215:3:2212 +216:0:2905 +217:3:2224 +218:0:2905 +219:3:2226 +220:0:2905 +221:3:2227 +222:3:2231 +223:3:2232 +224:3:2240 +225:3:2241 +226:3:2245 +227:3:2246 +228:3:2254 +229:3:2259 +230:3:2263 +231:3:2264 +232:3:2271 +233:3:2272 +234:3:2283 +235:3:2284 +236:3:2285 +237:3:2296 +238:3:2301 +239:3:2302 +240:0:2905 +241:3:2314 +242:0:2905 +243:3:2316 +244:0:2905 +245:3:2319 +246:3:2320 +247:3:2332 +248:3:2333 +249:3:2337 +250:3:2338 +251:3:2346 +252:3:2351 +253:3:2355 +254:3:2356 +255:3:2363 +256:3:2364 +257:3:2375 +258:3:2376 +259:3:2377 +260:3:2388 +261:3:2393 +262:3:2394 +263:0:2905 +264:3:2406 +265:0:2905 +266:3:2408 +267:0:2905 +268:3:2409 +269:0:2905 +270:3:2410 +271:0:2905 +272:3:2411 +273:0:2905 +274:3:2412 +275:3:2416 +276:3:2417 +277:3:2425 +278:3:2426 +279:3:2430 +280:3:2431 +281:3:2439 +282:3:2444 +283:3:2448 +284:3:2449 +285:3:2456 +286:3:2457 +287:3:2468 +288:3:2469 +289:3:2470 +290:3:2481 +291:3:2486 +292:3:2487 +293:0:2905 +294:3:2499 +295:0:2905 +296:3:2617 +297:0:2905 +298:3:2715 +299:0:2905 +300:3:2716 +301:0:2905 +302:3:2720 +303:0:2905 +304:3:2726 +305:0:2905 +306:3:2730 +307:3:2731 +308:3:2735 +309:3:2739 +310:3:2740 +311:3:2744 +312:3:2752 +313:3:2753 +314:0:2905 +315:3:2761 +316:0:2905 +317:3:2765 +318:3:2766 +319:3:2770 +320:3:2774 +321:3:2775 +322:3:2779 +323:3:2787 +324:3:2788 +325:0:2905 +326:3:2796 +327:0:2905 +328:3:2804 +329:3:2805 +330:3:2809 +331:3:2813 +332:3:2814 +333:3:2818 +334:3:2826 +335:3:2827 +336:0:2905 +337:3:2839 +338:0:2905 +339:3:2841 +340:0:2905 +341:3:2842 +342:0:2905 +343:3:1326 +344:0:2905 +345:3:1327 +346:3:1331 +347:3:1332 +348:3:1340 +349:3:1341 +350:3:1345 +351:3:1346 +352:3:1354 +353:3:1359 +354:3:1363 +355:3:1364 +356:3:1371 +357:3:1372 +358:3:1383 +359:3:1384 +360:3:1385 +361:3:1396 +362:3:1401 +363:3:1402 +364:0:2905 +365:3:1414 +366:0:2905 +367:3:1416 +368:3:1417 +369:0:2905 +370:3:1421 +371:3:1425 +372:3:1426 +373:3:1434 +374:3:1435 +375:3:1439 +376:3:1440 +377:3:1448 +378:3:1453 +379:3:1454 +380:3:1465 +381:3:1466 +382:3:1477 +383:3:1478 +384:3:1479 +385:3:1490 +386:3:1495 +387:3:1496 +388:0:2905 +389:3:1508 +390:0:2905 +391:3:1510 +392:0:2905 +393:3:1511 +394:0:2905 +395:3:1521 +396:0:2905 +397:3:1522 +398:0:2905 +399:3:1526 +400:3:1527 +401:3:1531 +402:3:1535 +403:3:1536 +404:3:1540 +405:3:1548 +406:3:1549 +407:0:2905 +408:3:1557 +409:0:2905 +410:3:1561 +411:3:1562 +412:3:1566 +413:3:1570 +414:3:1571 +415:3:1575 +416:3:1583 +417:3:1584 +418:0:2905 +419:3:1592 +420:0:2905 +421:3:1600 +422:3:1601 +423:3:1605 +424:3:1609 +425:3:1610 +426:3:1614 +427:3:1622 +428:3:1623 +429:0:2905 +430:3:1635 +431:0:2905 +432:3:1637 +433:0:2905 +434:3:1638 +435:3:1642 +436:3:1643 +437:3:1651 +438:3:1652 +439:3:1656 +440:3:1657 +441:3:1665 +442:3:1670 +443:3:1674 +444:3:1675 +445:3:1682 +446:3:1683 +447:3:1694 +448:3:1695 +449:3:1696 +450:3:1707 +451:3:1712 +452:3:1713 +453:0:2905 +454:3:1725 +455:0:2905 +456:3:1727 +457:0:2905 +458:3:1730 +459:3:1731 +460:3:1743 +461:3:1744 +462:3:1748 +463:3:1749 +464:3:1757 +465:3:1762 +466:3:1766 +467:3:1767 +468:3:1774 +469:3:1775 +470:3:1786 +471:3:1787 +472:3:1788 +473:3:1799 +474:3:1804 +475:3:1805 +476:0:2905 +477:3:1817 +478:0:2905 +479:3:1819 +480:0:2905 +481:3:1820 +482:0:2905 +483:3:1821 +484:0:2905 +485:3:1822 +486:0:2905 +487:3:1823 +488:3:1827 +489:3:1828 +490:3:1836 +491:3:1837 +492:3:1841 +493:3:1842 +494:3:1850 +495:3:1855 +496:3:1859 +497:3:1860 +498:3:1867 +499:3:1868 +500:3:1879 +501:3:1880 +502:3:1881 +503:3:1892 +504:3:1897 +505:3:1898 +506:0:2905 +507:3:1910 +508:0:2905 +509:3:2028 +510:0:2905 +511:3:2126 +512:0:2905 +513:3:2127 +514:0:2905 +515:3:2131 +516:0:2905 +517:3:2137 +518:3:2141 +519:3:2142 +520:3:2150 +521:3:2151 +522:3:2155 +523:3:2156 +524:3:2164 +525:3:2169 +526:3:2173 +527:3:2174 +528:3:2181 +529:3:2182 +530:3:2193 +531:3:2194 +532:3:2195 +533:3:2206 +534:3:2211 +535:3:2212 +536:0:2905 +537:3:2224 +538:0:2905 +539:3:2226 +540:0:2905 +541:3:2227 +542:3:2231 +543:3:2232 +544:3:2240 +545:3:2241 +546:3:2245 +547:3:2246 +548:3:2254 +549:3:2259 +550:3:2263 +551:3:2264 +552:3:2271 +553:3:2272 +554:3:2283 +555:3:2284 +556:3:2285 +557:3:2296 +558:3:2301 +559:3:2302 +560:0:2905 +561:3:2314 +562:0:2905 +563:3:2316 +564:0:2905 +565:3:2319 +566:3:2320 +567:3:2332 +568:3:2333 +569:3:2337 +570:3:2338 +571:3:2346 +572:3:2351 +573:3:2355 +574:3:2356 +575:3:2363 +576:3:2364 +577:3:2375 +578:3:2376 +579:3:2377 +580:3:2388 +581:3:2393 +582:3:2394 +583:0:2905 +584:3:2406 +585:0:2905 +586:3:2408 +587:0:2905 +588:3:2409 +589:0:2905 +590:3:2410 +591:0:2905 +592:3:2411 +593:0:2905 +594:3:2412 +595:3:2416 +596:3:2417 +597:3:2425 +598:3:2426 +599:3:2430 +600:3:2431 +601:3:2439 +602:3:2444 +603:3:2448 +604:3:2449 +605:3:2456 +606:3:2457 +607:3:2468 +608:3:2469 +609:3:2470 +610:3:2481 +611:3:2486 +612:3:2487 +613:0:2905 +614:3:2499 +615:0:2905 +616:3:2617 +617:0:2905 +618:3:2715 +619:0:2905 +620:3:2716 +621:0:2905 +622:3:2720 +623:0:2905 +624:3:2726 +625:0:2905 +626:3:2730 +627:3:2731 +628:3:2735 +629:3:2739 +630:3:2740 +631:3:2744 +632:3:2752 +633:3:2753 +634:0:2905 +635:3:2761 +636:0:2905 +637:3:2765 +638:3:2766 +639:3:2770 +640:3:2774 +641:3:2775 +642:3:2779 +643:3:2787 +644:3:2788 +645:0:2905 +646:3:2796 +647:0:2905 +648:3:2804 +649:3:2805 +650:3:2809 +651:3:2813 +652:3:2814 +653:3:2818 +654:3:2826 +655:3:2827 +656:0:2905 +657:3:2839 +658:0:2905 +659:3:2841 +660:0:2905 +661:3:2842 +662:0:2905 +663:3:1326 +664:0:2905 +665:3:1327 +666:3:1331 +667:3:1332 +668:3:1340 +669:3:1341 +670:3:1345 +671:3:1346 +672:3:1354 +673:3:1359 +674:3:1363 +675:3:1364 +676:3:1371 +677:3:1372 +678:3:1383 +679:3:1384 +680:3:1385 +681:3:1396 +682:3:1401 +683:3:1402 +684:0:2905 +685:3:1414 +686:0:2905 +687:3:1416 +688:3:1417 +689:0:2905 +690:3:1421 +691:3:1425 +692:3:1426 +693:3:1434 +694:3:1435 +695:3:1439 +696:3:1440 +697:3:1448 +698:3:1453 +699:3:1454 +700:3:1465 +701:3:1466 +702:3:1477 +703:3:1478 +704:3:1479 +705:3:1490 +706:3:1495 +707:3:1496 +708:0:2905 +709:3:1508 +710:0:2905 +711:3:1510 +712:0:2905 +713:3:1511 +714:0:2905 +715:3:1521 +716:0:2905 +717:3:1522 +718:0:2905 +719:3:1526 +720:3:1527 +721:3:1531 +722:3:1535 +723:3:1536 +724:3:1540 +725:3:1548 +726:3:1549 +727:0:2905 +728:3:1557 +729:0:2905 +730:3:1561 +731:3:1562 +732:3:1566 +733:3:1570 +734:3:1571 +735:3:1575 +736:3:1583 +737:3:1584 +738:0:2905 +739:3:1592 +740:0:2905 +741:3:1600 +742:3:1601 +743:3:1605 +744:3:1609 +745:3:1610 +746:3:1614 +747:3:1622 +748:3:1623 +749:0:2905 +750:3:1635 +751:0:2905 +752:3:1637 +753:0:2905 +754:3:1638 +755:3:1642 +756:3:1643 +757:3:1651 +758:3:1652 +759:3:1656 +760:3:1657 +761:3:1665 +762:3:1670 +763:3:1674 +764:3:1675 +765:3:1682 +766:3:1683 +767:3:1694 +768:3:1695 +769:3:1696 +770:3:1707 +771:3:1712 +772:3:1713 +773:0:2905 +774:3:1725 +775:0:2905 +776:3:1727 +777:0:2905 +778:3:1730 +779:3:1731 +780:3:1743 +781:3:1744 +782:3:1748 +783:3:1749 +784:3:1757 +785:3:1762 +786:3:1766 +787:3:1767 +788:3:1774 +789:3:1775 +790:3:1786 +791:3:1787 +792:3:1788 +793:3:1799 +794:3:1804 +795:3:1805 +796:0:2905 +797:3:1817 +798:0:2905 +799:3:1819 +800:0:2905 +801:3:1820 +802:0:2905 +803:3:1821 +804:0:2905 +805:3:1822 +806:0:2905 +807:3:1823 +808:3:1827 +809:3:1828 +810:3:1836 +811:3:1837 +812:3:1841 +813:3:1842 +814:3:1850 +815:3:1855 +816:3:1859 +817:3:1860 +818:3:1867 +819:3:1868 +820:3:1879 +821:3:1880 +822:3:1881 +823:3:1892 +824:3:1897 +825:3:1898 +826:0:2905 +827:3:1910 +828:0:2905 +829:3:2028 +830:0:2905 +831:3:2126 +832:0:2905 +833:3:2127 +834:0:2905 +835:3:2131 +836:0:2905 +837:3:2137 +838:3:2141 +839:3:2142 +840:3:2150 +841:3:2151 +842:3:2155 +843:3:2156 +844:3:2164 +845:3:2169 +846:3:2173 +847:3:2174 +848:3:2181 +849:3:2182 +850:3:2193 +851:3:2194 +852:3:2195 +853:3:2206 +854:3:2211 +855:3:2212 +856:0:2905 +857:3:2224 +858:0:2905 +859:3:2226 +860:0:2905 +861:3:2227 +862:3:2231 +863:3:2232 +864:3:2240 +865:3:2241 +866:3:2245 +867:3:2246 +868:3:2254 +869:3:2259 +870:3:2263 +871:3:2264 +872:3:2271 +873:3:2272 +874:3:2283 +875:3:2284 +876:3:2285 +877:3:2296 +878:3:2301 +879:3:2302 +880:0:2905 +881:3:2314 +882:0:2905 +883:3:2316 +884:0:2905 +885:3:2319 +886:3:2320 +887:3:2332 +888:3:2333 +889:3:2337 +890:3:2338 +891:3:2346 +892:3:2351 +893:3:2355 +894:3:2356 +895:3:2363 +896:3:2364 +897:3:2375 +898:3:2376 +899:3:2377 +900:3:2388 +901:3:2393 +902:3:2394 +903:0:2905 +904:3:2406 +905:0:2905 +906:3:2408 +907:0:2905 +908:3:2409 +909:0:2905 +910:3:2410 +911:0:2905 +912:3:2411 +913:0:2905 +914:3:2412 +915:3:2416 +916:3:2417 +917:3:2425 +918:3:2426 +919:3:2430 +920:3:2431 +921:3:2439 +922:3:2444 +923:3:2448 +924:3:2449 +925:3:2456 +926:3:2457 +927:3:2468 +928:3:2469 +929:3:2470 +930:3:2481 +931:3:2486 +932:3:2487 +933:0:2905 +934:3:2499 +935:0:2905 +936:3:2617 +937:0:2905 +938:3:2715 +939:0:2905 +940:3:2716 +941:0:2905 +942:3:2720 +943:0:2905 +944:3:2726 +945:0:2905 +946:3:2730 +947:3:2731 +948:3:2735 +949:3:2739 +950:3:2740 +951:3:2744 +952:3:2752 +953:3:2753 +954:0:2905 +955:3:2761 +956:0:2905 +957:3:2765 +958:3:2766 +959:3:2770 +960:3:2774 +961:3:2775 +962:3:2779 +963:3:2787 +964:3:2788 +965:0:2905 +966:3:2796 +967:0:2905 +968:3:2804 +969:3:2805 +970:3:2809 +971:3:2813 +972:3:2814 +973:3:2818 +974:3:2826 +975:3:2827 +976:0:2905 +977:3:2839 +978:0:2905 +979:3:2841 +980:0:2905 +981:3:2842 +982:0:2905 +983:3:1326 +984:0:2905 +985:3:1327 +986:3:1331 +987:3:1332 +988:3:1340 +989:3:1341 +990:3:1345 +991:3:1346 +992:3:1354 +993:3:1359 +994:3:1363 +995:3:1364 +996:3:1371 +997:3:1372 +998:3:1383 +999:3:1384 +1000:3:1385 +1001:3:1396 +1002:3:1401 +1003:3:1402 +1004:0:2905 +1005:3:1414 +1006:0:2905 +1007:3:1416 +1008:3:1417 +1009:0:2905 +1010:3:1421 +1011:3:1425 +1012:3:1426 +1013:3:1434 +1014:3:1435 +1015:3:1439 +1016:3:1440 +1017:3:1448 +1018:3:1453 +1019:3:1454 +1020:3:1465 +1021:3:1466 +1022:3:1477 +1023:3:1478 +1024:3:1479 +1025:3:1490 +1026:3:1495 +1027:3:1496 +1028:0:2905 +1029:3:1508 +1030:0:2905 +1031:3:1510 +1032:0:2905 +1033:3:1511 +1034:0:2905 +1035:3:1521 +1036:0:2905 +1037:3:1522 +1038:0:2905 +1039:3:1526 +1040:3:1527 +1041:3:1531 +1042:3:1535 +1043:3:1536 +1044:3:1540 +1045:3:1548 +1046:3:1549 +1047:0:2905 +1048:3:1557 +1049:0:2905 +1050:3:1561 +1051:3:1562 +1052:3:1566 +1053:3:1570 +1054:3:1571 +1055:3:1575 +1056:3:1583 +1057:3:1584 +1058:0:2905 +1059:3:1592 +1060:0:2905 +1061:3:1600 +1062:3:1601 +1063:3:1605 +1064:3:1609 +1065:3:1610 +1066:3:1614 +1067:3:1622 +1068:3:1623 +1069:0:2905 +1070:3:1635 +1071:0:2905 +1072:3:1637 +1073:0:2905 +1074:3:1638 +1075:3:1642 +1076:3:1643 +1077:3:1651 +1078:3:1652 +1079:3:1656 +1080:3:1657 +1081:3:1665 +1082:3:1670 +1083:3:1674 +1084:3:1675 +1085:3:1682 +1086:3:1683 +1087:3:1694 +1088:3:1695 +1089:3:1696 +1090:3:1707 +1091:3:1712 +1092:3:1713 +1093:0:2905 +1094:3:1725 +1095:0:2905 +1096:3:1727 +1097:0:2905 +1098:3:1730 +1099:3:1731 +1100:3:1743 +1101:3:1744 +1102:3:1748 +1103:3:1749 +1104:3:1757 +1105:3:1762 +1106:3:1766 +1107:3:1767 +1108:3:1774 +1109:3:1775 +1110:3:1786 +1111:3:1787 +1112:3:1788 +1113:3:1799 +1114:3:1804 +1115:3:1805 +1116:0:2905 +1117:3:1817 +1118:0:2905 +1119:3:1819 +1120:0:2905 +1121:3:1820 +1122:0:2905 +1123:3:1821 +1124:0:2905 +1125:3:1822 +1126:0:2905 +1127:3:1823 +1128:3:1827 +1129:3:1828 +1130:3:1836 +1131:3:1837 +1132:3:1841 +1133:3:1842 +1134:3:1850 +1135:3:1855 +1136:3:1859 +1137:3:1860 +1138:3:1867 +1139:3:1868 +1140:3:1879 +1141:3:1880 +1142:3:1881 +1143:3:1892 +1144:3:1897 +1145:3:1898 +1146:0:2905 +1147:3:1910 +1148:0:2905 +1149:3:2028 +1150:0:2905 +1151:3:2126 +1152:0:2905 +1153:3:2127 +1154:0:2905 +1155:3:2131 +1156:0:2905 +1157:3:2137 +1158:3:2141 +1159:3:2142 +1160:3:2150 +1161:3:2151 +1162:3:2155 +1163:3:2156 +1164:3:2164 +1165:3:2169 +1166:3:2173 +1167:3:2174 +1168:3:2181 +1169:3:2182 +1170:3:2193 +1171:3:2194 +1172:3:2195 +1173:3:2206 +1174:3:2211 +1175:3:2212 +1176:0:2905 +1177:3:2224 +1178:0:2905 +1179:3:2226 +1180:0:2905 +1181:3:2227 +1182:3:2231 +1183:3:2232 +1184:3:2240 +1185:3:2241 +1186:3:2245 +1187:3:2246 +1188:3:2254 +1189:3:2259 +1190:3:2263 +1191:3:2264 +1192:3:2271 +1193:3:2272 +1194:3:2283 +1195:3:2284 +1196:3:2285 +1197:3:2296 +1198:3:2301 +1199:3:2302 +1200:0:2905 +1201:3:2314 +1202:0:2905 +1203:3:2316 +1204:0:2905 +1205:3:2319 +1206:3:2320 +1207:3:2332 +1208:3:2333 +1209:3:2337 +1210:3:2338 +1211:3:2346 +1212:3:2351 +1213:3:2355 +1214:3:2356 +1215:3:2363 +1216:3:2364 +1217:3:2375 +1218:3:2376 +1219:3:2377 +1220:3:2388 +1221:3:2393 +1222:3:2394 +1223:0:2905 +1224:3:2406 +1225:0:2905 +1226:3:2408 +1227:0:2905 +1228:3:2409 +1229:0:2905 +1230:3:2410 +1231:0:2905 +1232:3:2411 +1233:0:2905 +1234:3:2412 +1235:3:2416 +1236:3:2417 +1237:3:2425 +1238:3:2426 +1239:3:2430 +1240:3:2431 +1241:3:2439 +1242:3:2444 +1243:3:2448 +1244:3:2449 +1245:3:2456 +1246:3:2457 +1247:3:2468 +1248:3:2469 +1249:3:2470 +1250:3:2481 +1251:3:2486 +1252:3:2487 +1253:0:2905 +1254:3:2499 +1255:0:2905 +1256:3:2617 +1257:0:2905 +1258:3:2715 +1259:0:2905 +1260:3:2716 +1261:0:2905 +1262:3:2720 +1263:0:2905 +1264:3:2726 +1265:0:2905 +1266:3:2730 +1267:3:2731 +1268:3:2735 +1269:3:2739 +1270:3:2740 +1271:3:2744 +1272:3:2752 +1273:3:2753 +1274:0:2905 +1275:3:2761 +1276:0:2905 +1277:3:2765 +1278:3:2766 +1279:3:2770 +1280:3:2774 +1281:3:2775 +1282:3:2779 +1283:3:2787 +1284:3:2788 +1285:0:2905 +1286:3:2796 +1287:0:2905 +1288:3:2804 +1289:3:2805 +1290:3:2809 +1291:3:2813 +1292:3:2814 +1293:3:2818 +1294:3:2826 +1295:3:2827 +1296:0:2905 +1297:3:2839 +1298:0:2905 +1299:3:2841 +1300:0:2905 +1301:3:2842 +1302:0:2905 +1303:3:1326 +1304:0:2905 +1305:3:1327 +1306:3:1331 +1307:3:1332 +1308:3:1340 +1309:3:1341 +1310:3:1345 +1311:3:1346 +1312:3:1354 +1313:3:1359 +1314:3:1363 +1315:3:1364 +1316:3:1371 +1317:3:1372 +1318:3:1383 +1319:3:1384 +1320:3:1385 +1321:3:1396 +1322:3:1401 +1323:3:1402 +1324:0:2905 +1325:3:1414 +1326:0:2905 +1327:3:1416 +1328:3:1417 +1329:0:2905 +1330:3:1421 +1331:3:1425 +1332:3:1426 +1333:3:1434 +1334:3:1435 +1335:3:1439 +1336:3:1440 +1337:3:1448 +1338:3:1461 +1339:3:1462 +1340:3:1465 +1341:3:1466 +1342:3:1477 +1343:3:1478 +1344:3:1479 +1345:3:1490 +1346:3:1495 +1347:3:1498 +1348:3:1499 +1349:0:2905 +1350:3:1508 +1351:0:2905 +1352:3:1510 +1353:0:2905 +1354:3:1511 +1355:0:2905 +1356:3:1521 +1357:0:2905 +1358:3:1522 +1359:0:2905 +1360:2:680 +1361:0:2905 +1362:2:686 +1363:0:2905 +1364:2:687 +1365:0:2905 +1366:2:688 +1367:0:2905 +1368:2:689 +1369:0:2905 +1370:1:2 +1371:0:2905 +1372:2:690 +1373:0:2905 +1374:1:8 +1375:0:2905 +1376:1:9 +1377:0:2905 +1378:1:10 +1379:0:2905 +1380:1:11 +1381:0:2905 +1382:2:689 +1383:0:2905 +1384:1:12 +1385:1:16 +1386:1:17 +1387:1:25 +1388:1:26 +1389:1:30 +1390:1:31 +1391:1:39 +1392:1:44 +1393:1:48 +1394:1:49 +1395:1:56 +1396:1:57 +1397:1:68 +1398:1:69 +1399:1:70 +1400:1:81 +1401:1:86 +1402:1:87 +1403:0:2905 +1404:2:690 +1405:0:2905 +1406:3:1526 +1407:3:1527 +1408:3:1531 +1409:3:1535 +1410:3:1536 +1411:3:1540 +1412:3:1545 +1413:0:2905 +1414:3:1557 +1415:0:2905 +1416:3:1561 +1417:3:1562 +1418:3:1566 +1419:3:1570 +1420:3:1571 +1421:3:1575 +1422:3:1583 +1423:3:1584 +1424:0:2905 +1425:3:1592 +1426:0:2905 +1427:3:1600 +1428:3:1601 +1429:3:1605 +1430:3:1609 +1431:3:1610 +1432:3:1614 +1433:3:1622 +1434:3:1623 +1435:0:2905 +1436:3:1635 +1437:0:2905 +1438:3:1637 +1439:0:2905 +1440:3:1638 +1441:3:1642 +1442:3:1643 +1443:3:1651 +1444:3:1652 +1445:3:1656 +1446:3:1657 +1447:3:1665 +1448:3:1670 +1449:3:1674 +1450:3:1675 +1451:3:1682 +1452:3:1683 +1453:3:1694 +1454:3:1695 +1455:3:1696 +1456:3:1707 +1457:3:1712 +1458:3:1713 +1459:0:2905 +1460:3:1725 +1461:0:2905 +1462:3:1727 +1463:0:2905 +1464:3:1730 +1465:3:1731 +1466:3:1743 +1467:3:1744 +1468:3:1748 +1469:3:1749 +1470:3:1757 +1471:3:1762 +1472:3:1766 +1473:3:1767 +1474:3:1774 +1475:3:1775 +1476:3:1786 +1477:3:1787 +1478:3:1788 +1479:3:1799 +1480:3:1804 +1481:3:1805 +1482:0:2905 +1483:3:1817 +1484:0:2905 +1485:3:1819 +1486:0:2905 +1487:3:1820 +1488:0:2905 +1489:3:1821 +1490:0:2905 +1491:3:1822 +1492:0:2905 +1493:3:1823 +1494:3:1827 +1495:3:1828 +1496:3:1836 +1497:3:1837 +1498:3:1841 +1499:3:1842 +1500:3:1850 +1501:3:1855 +1502:3:1859 +1503:3:1860 +1504:3:1867 +1505:3:1868 +1506:3:1879 +1507:3:1880 +1508:3:1881 +1509:3:1892 +1510:3:1897 +1511:3:1898 +1512:0:2905 +1513:3:1910 +1514:0:2905 +1515:3:2028 +1516:0:2905 +1517:3:2126 +1518:0:2905 +1519:3:2127 +1520:0:2905 +1521:3:2131 +1522:0:2905 +1523:3:2137 +1524:3:2141 +1525:3:2142 +1526:3:2150 +1527:3:2151 +1528:3:2155 +1529:3:2156 +1530:3:2164 +1531:3:2169 +1532:3:2173 +1533:3:2174 +1534:3:2181 +1535:3:2182 +1536:3:2193 +1537:3:2194 +1538:3:2195 +1539:3:2206 +1540:3:2211 +1541:3:2212 +1542:0:2905 +1543:3:2224 +1544:0:2905 +1545:3:2226 +1546:0:2905 +1547:3:2227 +1548:3:2231 +1549:3:2232 +1550:3:2240 +1551:3:2241 +1552:3:2245 +1553:3:2246 +1554:3:2254 +1555:3:2259 +1556:3:2263 +1557:3:2264 +1558:3:2271 +1559:3:2272 +1560:3:2283 +1561:3:2284 +1562:3:2285 +1563:3:2296 +1564:3:2301 +1565:3:2302 +1566:0:2905 +1567:3:2314 +1568:0:2905 +1569:3:2316 +1570:0:2905 +1571:3:2319 +1572:3:2320 +1573:3:2332 +1574:3:2333 +1575:3:2337 +1576:3:2338 +1577:3:2346 +1578:3:2351 +1579:3:2355 +1580:3:2356 +1581:3:2363 +1582:3:2364 +1583:3:2375 +1584:3:2376 +1585:3:2377 +1586:3:2388 +1587:3:2393 +1588:3:2394 +1589:0:2905 +1590:3:2406 +1591:0:2905 +1592:3:2408 +1593:0:2905 +1594:3:2409 +1595:0:2905 +1596:3:2410 +1597:0:2905 +1598:3:2411 +1599:0:2905 +1600:3:2412 +1601:3:2416 +1602:3:2417 +1603:3:2425 +1604:3:2426 +1605:3:2430 +1606:3:2431 +1607:3:2439 +1608:3:2444 +1609:3:2448 +1610:3:2449 +1611:3:2456 +1612:3:2457 +1613:3:2468 +1614:3:2469 +1615:3:2470 +1616:3:2481 +1617:3:2486 +1618:3:2487 +1619:0:2905 +1620:3:2499 +1621:0:2905 +1622:3:2617 +1623:0:2905 +1624:3:2715 +1625:0:2905 +1626:3:2716 +1627:0:2905 +1628:3:2720 +1629:0:2905 +1630:3:2726 +1631:0:2905 +1632:3:2730 +1633:3:2731 +1634:3:2735 +1635:3:2739 +1636:3:2740 +1637:3:2744 +1638:3:2752 +1639:3:2753 +1640:0:2905 +1641:3:2761 +1642:0:2905 +1643:3:2765 +1644:3:2766 +1645:3:2770 +1646:3:2774 +1647:3:2775 +1648:3:2779 +1649:3:2787 +1650:3:2788 +1651:0:2905 +1652:3:2796 +1653:0:2905 +1654:3:2804 +1655:3:2805 +1656:3:2809 +1657:3:2813 +1658:3:2814 +1659:3:2818 +1660:3:2826 +1661:3:2827 +1662:0:2905 +1663:3:2839 +1664:0:2905 +1665:3:2841 +1666:0:2905 +1667:3:2842 +1668:0:2905 +1669:3:2845 +1670:0:2905 +1671:3:2850 +1672:0:2905 +1673:2:689 +1674:0:2905 +1675:3:2851 +1676:0:2905 +1677:1:99 +1678:0:2905 +1679:3:2850 +1680:0:2905 +1681:2:690 +1682:0:2905 +1683:3:2851 +1684:0:2905 +1685:2:691 +1686:0:2905 +1687:3:2850 +1688:0:2905 +1689:2:692 +1690:0:2905 +1691:3:2851 +1692:0:2905 +1693:2:703 +1694:0:2905 +1695:3:2850 +1696:0:2905 +1697:2:704 +1698:0:2905 +1699:3:2851 +1700:0:2905 +1701:2:705 +1702:2:709 +1703:2:710 +1704:2:718 +1705:2:719 +1706:2:723 +1707:2:724 +1708:2:732 +1709:2:737 +1710:2:741 +1711:2:742 +1712:2:749 +1713:2:750 +1714:2:761 +1715:2:762 +1716:2:763 +1717:2:774 +1718:2:786 +1719:2:787 +1720:0:2905 +1721:3:2850 +1722:0:2905 +1723:2:792 +1724:0:2905 +1725:3:2851 +1726:0:2905 +1727:2:793 +1728:2:797 +1729:2:798 +1730:2:806 +1731:2:807 +1732:2:811 +1733:2:812 +1734:2:820 +1735:2:825 +1736:2:829 +1737:2:830 +1738:2:837 +1739:2:838 +1740:2:849 +1741:2:850 +1742:2:851 +1743:2:862 +1744:2:874 +1745:2:875 +1746:0:2905 +1747:3:2850 +1748:0:2905 +1749:2:880 +1750:0:2905 +1751:3:2851 +1752:0:2905 +1753:2:881 +1754:0:2905 +1755:3:2850 +1756:0:2905 +1757:2:882 +1758:2:886 +1759:2:887 +1760:2:895 +1761:2:896 +1762:2:900 +1763:2:901 +1764:2:909 +1765:2:914 +1766:2:918 +1767:2:919 +1768:2:926 +1769:2:927 +1770:2:938 +1771:2:939 +1772:2:940 +1773:2:951 +1774:2:963 +1775:2:964 +1776:0:2905 +1777:3:2851 +1778:0:2905 +1779:2:969 +1780:0:2905 +1781:3:2850 +1782:0:2905 +1783:2:1086 +1784:0:2905 +1785:3:2851 +1786:0:2905 +1787:2:1087 +1788:0:2905 +1789:3:2850 +1790:0:2905 +1791:2:1092 +1792:0:2905 +1793:3:2851 +1794:0:2905 +1795:2:1097 +1796:0:2905 +1797:3:2850 +1798:0:2905 +1799:2:1098 +1800:0:2903 +1801:3:2851 +1802:0:2909 +1803:3:1630 diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.define b/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.define new file mode 100644 index 0000000..710f29d --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.define @@ -0,0 +1 @@ +#define NO_WMB diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.log b/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.log new file mode 100644 index 0000000..a346ed9 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.log @@ -0,0 +1,224 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_free_no_wmb.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 742) + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 10499, errors: 0 + 159431 states, stored + 1505398 states, matched + 1664829 transitions (= stored+matched) + 5794809 atomic steps +hash conflicts: 62144 (resolved) + +Stats on memory usage (in Megabytes): + 12.772 equivalent memory usage for states (stored*(State-vector + overhead)) + 8.936 actual memory usage for states (compression: 69.96%) + state-vector as stored = 31 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 474.651 total actual memory usage + +unreached in proctype urcu_reader_sig + line 402, "pan.___", state 330, "(1)" + line 613, "pan.___", state 411, "-end-" + (2 of 411 states) +unreached in proctype urcu_writer + line 651, "pan.___", state 213, "(1)" + line 402, "pan.___", state 348, "(1)" + line 398, "pan.___", state 433, "(1)" + line 402, "pan.___", state 447, "(1)" + line 402, "pan.___", state 547, "(1)" + line 159, "pan.___", state 628, "(1)" + line 163, "pan.___", state 636, "(1)" + line 163, "pan.___", state 637, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 163, "pan.___", state 637, "else" + line 161, "pan.___", state 642, "((j<1))" + line 161, "pan.___", state 642, "((j>=1))" + line 167, "pan.___", state 648, "(1)" + line 167, "pan.___", state 649, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 167, "pan.___", state 649, "else" + line 159, "pan.___", state 660, "(1)" + line 163, "pan.___", state 668, "(1)" + line 163, "pan.___", state 669, "(!((cache_dirty_urcu_active_readers.bitfield&(1<=1))" + line 167, "pan.___", state 680, "(1)" + line 167, "pan.___", state 681, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 159, "pan.___", state 696, "(1)" + line 163, "pan.___", state 704, "(1)" + line 163, "pan.___", state 705, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 163, "pan.___", state 705, "else" + line 161, "pan.___", state 710, "((j<1))" + line 161, "pan.___", state 710, "((j>=1))" + line 167, "pan.___", state 716, "(1)" + line 167, "pan.___", state 717, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 167, "pan.___", state 717, "else" + line 201, "pan.___", state 722, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 201, "pan.___", state 722, "else" + line 220, "pan.___", state 723, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 220, "pan.___", state 723, "else" + line 355, "pan.___", state 729, "((sighand_exec==1))" + line 355, "pan.___", state 729, "else" + line 361, "pan.___", state 732, "sighand_exec = 1" + line 398, "pan.___", state 745, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 398, "pan.___", state 747, "(1)" + line 398, "pan.___", state 748, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 398, "pan.___", state 748, "else" + line 398, "pan.___", state 751, "(1)" + line 402, "pan.___", state 759, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 402, "pan.___", state 761, "(1)" + line 402, "pan.___", state 762, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 402, "pan.___", state 762, "else" + line 402, "pan.___", state 765, "(1)" + line 402, "pan.___", state 766, "(1)" + line 402, "pan.___", state 766, "(1)" + line 400, "pan.___", state 771, "((i<1))" + line 400, "pan.___", state 771, "((i>=1))" + line 407, "pan.___", state 777, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 408, "pan.___", state 790, "(1)" + line 408, "pan.___", state 791, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 408, "pan.___", state 791, "else" + line 408, "pan.___", state 794, "(1)" + line 408, "pan.___", state 795, "(1)" + line 408, "pan.___", state 795, "(1)" + line 412, "pan.___", state 803, "(1)" + line 412, "pan.___", state 804, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 412, "pan.___", state 804, "else" + line 412, "pan.___", state 807, "(1)" + line 412, "pan.___", state 808, "(1)" + line 412, "pan.___", state 808, "(1)" + line 410, "pan.___", state 813, "((i<1))" + line 410, "pan.___", state 813, "((i>=1))" + line 417, "pan.___", state 820, "(1)" + line 417, "pan.___", state 821, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 417, "pan.___", state 821, "else" + line 417, "pan.___", state 824, "(1)" + line 417, "pan.___", state 825, "(1)" + line 417, "pan.___", state 825, "(1)" + line 419, "pan.___", state 828, "(1)" + line 419, "pan.___", state 828, "(1)" + line 361, "pan.___", state 837, "sighand_exec = 1" + line 402, "pan.___", state 868, "(1)" + line 402, "pan.___", state 965, "(1)" + line 398, "pan.___", state 1050, "(1)" + line 402, "pan.___", state 1064, "(1)" + line 402, "pan.___", state 1164, "(1)" + line 159, "pan.___", state 1245, "(1)" + line 163, "pan.___", state 1253, "(1)" + line 163, "pan.___", state 1254, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 163, "pan.___", state 1254, "else" + line 161, "pan.___", state 1259, "((j<1))" + line 161, "pan.___", state 1259, "((j>=1))" + line 167, "pan.___", state 1265, "(1)" + line 167, "pan.___", state 1266, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 167, "pan.___", state 1266, "else" + line 159, "pan.___", state 1277, "(1)" + line 163, "pan.___", state 1285, "(1)" + line 163, "pan.___", state 1286, "(!((cache_dirty_urcu_active_readers.bitfield&(1<=1))" + line 167, "pan.___", state 1297, "(1)" + line 167, "pan.___", state 1298, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 159, "pan.___", state 1313, "(1)" + line 163, "pan.___", state 1321, "(1)" + line 163, "pan.___", state 1322, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 163, "pan.___", state 1322, "else" + line 161, "pan.___", state 1327, "((j<1))" + line 161, "pan.___", state 1327, "((j>=1))" + line 167, "pan.___", state 1333, "(1)" + line 167, "pan.___", state 1334, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 167, "pan.___", state 1334, "else" + line 201, "pan.___", state 1339, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 201, "pan.___", state 1339, "else" + line 220, "pan.___", state 1340, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 220, "pan.___", state 1340, "else" + line 355, "pan.___", state 1346, "((sighand_exec==1))" + line 355, "pan.___", state 1346, "else" + line 361, "pan.___", state 1349, "sighand_exec = 1" + line 398, "pan.___", state 1362, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 398, "pan.___", state 1364, "(1)" + line 398, "pan.___", state 1365, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 398, "pan.___", state 1365, "else" + line 398, "pan.___", state 1368, "(1)" + line 402, "pan.___", state 1376, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 402, "pan.___", state 1378, "(1)" + line 402, "pan.___", state 1379, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 402, "pan.___", state 1379, "else" + line 402, "pan.___", state 1382, "(1)" + line 402, "pan.___", state 1383, "(1)" + line 402, "pan.___", state 1383, "(1)" + line 400, "pan.___", state 1388, "((i<1))" + line 400, "pan.___", state 1388, "((i>=1))" + line 407, "pan.___", state 1394, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 408, "pan.___", state 1407, "(1)" + line 408, "pan.___", state 1408, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 408, "pan.___", state 1408, "else" + line 408, "pan.___", state 1411, "(1)" + line 408, "pan.___", state 1412, "(1)" + line 408, "pan.___", state 1412, "(1)" + line 412, "pan.___", state 1420, "(1)" + line 412, "pan.___", state 1421, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 412, "pan.___", state 1421, "else" + line 412, "pan.___", state 1424, "(1)" + line 412, "pan.___", state 1425, "(1)" + line 412, "pan.___", state 1425, "(1)" + line 410, "pan.___", state 1430, "((i<1))" + line 410, "pan.___", state 1430, "((i>=1))" + line 417, "pan.___", state 1437, "(1)" + line 417, "pan.___", state 1438, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 417, "pan.___", state 1438, "else" + line 417, "pan.___", state 1441, "(1)" + line 417, "pan.___", state 1442, "(1)" + line 417, "pan.___", state 1442, "(1)" + line 419, "pan.___", state 1445, "(1)" + line 419, "pan.___", state 1445, "(1)" + line 361, "pan.___", state 1454, "sighand_exec = 1" + line 701, "pan.___", state 1596, "-end-" + (111 of 1596 states) +unreached in proctype :init: + (0 of 46 states) +unreached in proctype :never: + line 747, "pan.___", state 8, "-end-" + (1 of 8 states) + +pan: elapsed time 1.23 seconds +pan: rate 129618.7 states/second +pan: avg transition delay 7.3881e-07 usec +cp .input.spin urcu_free_no_wmb.spin.input +cp .input.spin.trail urcu_free_no_wmb.spin.input.trail +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.spin.input b/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.spin.input new file mode 100644 index 0000000..808154e --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.spin.input @@ -0,0 +1,722 @@ +#define NO_WMB + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#define TEST_SIGNAL +//#define TEST_SIGNAL_ON_READ +#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 1 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.spin.input.trail b/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.spin.input.trail new file mode 100644 index 0000000..522df0a --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.spin.input.trail @@ -0,0 +1,1677 @@ +-2:4:-2 +-4:-4:-4 +1:0:2833 +2:4:2785 +3:4:2788 +4:4:2788 +5:4:2791 +6:4:2799 +7:4:2799 +8:4:2802 +9:4:2808 +10:4:2812 +11:4:2812 +12:4:2815 +13:4:2823 +14:4:2827 +15:4:2828 +16:0:2833 +17:4:2830 +18:0:2833 +19:3:1283 +20:0:2833 +21:3:1289 +22:0:2833 +23:3:1290 +24:0:2833 +25:3:1291 +26:3:1295 +27:3:1296 +28:3:1304 +29:3:1305 +30:3:1309 +31:3:1310 +32:3:1318 +33:3:1323 +34:3:1327 +35:3:1328 +36:3:1335 +37:3:1336 +38:3:1347 +39:3:1348 +40:3:1349 +41:3:1360 +42:3:1365 +43:3:1366 +44:0:2833 +45:3:1378 +46:0:2833 +47:3:1380 +48:3:1381 +49:0:2833 +50:3:1385 +51:3:1389 +52:3:1390 +53:3:1398 +54:3:1399 +55:3:1403 +56:3:1404 +57:3:1412 +58:3:1417 +59:3:1418 +60:3:1429 +61:3:1430 +62:3:1441 +63:3:1442 +64:3:1443 +65:3:1454 +66:3:1459 +67:3:1460 +68:0:2833 +69:3:1472 +70:0:2833 +71:3:1474 +72:0:2833 +73:3:1475 +74:0:2833 +75:3:1485 +76:0:2833 +77:3:1486 +78:0:2833 +79:3:1487 +80:3:1494 +81:3:1495 +82:3:1502 +83:3:1507 +84:0:2833 +85:3:1518 +86:0:2833 +87:3:1519 +88:3:1526 +89:3:1527 +90:3:1534 +91:3:1539 +92:0:2833 +93:3:1550 +94:0:2833 +95:3:1555 +96:3:1562 +97:3:1563 +98:3:1570 +99:3:1575 +100:0:2833 +101:3:1590 +102:0:2833 +103:3:1592 +104:0:2833 +105:3:1593 +106:3:1597 +107:3:1598 +108:3:1606 +109:3:1607 +110:3:1611 +111:3:1612 +112:3:1620 +113:3:1625 +114:3:1629 +115:3:1630 +116:3:1637 +117:3:1638 +118:3:1649 +119:3:1650 +120:3:1651 +121:3:1662 +122:3:1667 +123:3:1668 +124:0:2833 +125:3:1680 +126:0:2833 +127:3:1682 +128:0:2833 +129:3:1685 +130:3:1686 +131:3:1698 +132:3:1699 +133:3:1703 +134:3:1704 +135:3:1712 +136:3:1717 +137:3:1721 +138:3:1722 +139:3:1729 +140:3:1730 +141:3:1741 +142:3:1742 +143:3:1743 +144:3:1754 +145:3:1759 +146:3:1760 +147:0:2833 +148:3:1772 +149:0:2833 +150:3:1774 +151:0:2833 +152:3:1775 +153:0:2833 +154:3:1776 +155:0:2833 +156:3:1777 +157:0:2833 +158:3:1778 +159:3:1782 +160:3:1783 +161:3:1791 +162:3:1792 +163:3:1796 +164:3:1797 +165:3:1805 +166:3:1810 +167:3:1814 +168:3:1815 +169:3:1822 +170:3:1823 +171:3:1834 +172:3:1835 +173:3:1836 +174:3:1847 +175:3:1852 +176:3:1853 +177:0:2833 +178:3:1865 +179:0:2833 +180:3:1974 +181:0:2833 +182:3:2072 +183:0:2833 +184:3:2073 +185:0:2833 +186:3:2077 +187:0:2833 +188:3:2083 +189:3:2087 +190:3:2088 +191:3:2096 +192:3:2097 +193:3:2101 +194:3:2102 +195:3:2110 +196:3:2115 +197:3:2119 +198:3:2120 +199:3:2127 +200:3:2128 +201:3:2139 +202:3:2140 +203:3:2141 +204:3:2152 +205:3:2157 +206:3:2158 +207:0:2833 +208:3:2170 +209:0:2833 +210:3:2172 +211:0:2833 +212:3:2173 +213:3:2177 +214:3:2178 +215:3:2186 +216:3:2187 +217:3:2191 +218:3:2192 +219:3:2200 +220:3:2205 +221:3:2209 +222:3:2210 +223:3:2217 +224:3:2218 +225:3:2229 +226:3:2230 +227:3:2231 +228:3:2242 +229:3:2247 +230:3:2248 +231:0:2833 +232:3:2260 +233:0:2833 +234:3:2262 +235:0:2833 +236:3:2265 +237:3:2266 +238:3:2278 +239:3:2279 +240:3:2283 +241:3:2284 +242:3:2292 +243:3:2297 +244:3:2301 +245:3:2302 +246:3:2309 +247:3:2310 +248:3:2321 +249:3:2322 +250:3:2323 +251:3:2334 +252:3:2339 +253:3:2340 +254:0:2833 +255:3:2352 +256:0:2833 +257:3:2354 +258:0:2833 +259:3:2355 +260:0:2833 +261:3:2356 +262:0:2833 +263:3:2357 +264:0:2833 +265:3:2358 +266:3:2362 +267:3:2363 +268:3:2371 +269:3:2372 +270:3:2376 +271:3:2377 +272:3:2385 +273:3:2390 +274:3:2394 +275:3:2395 +276:3:2402 +277:3:2403 +278:3:2414 +279:3:2415 +280:3:2416 +281:3:2427 +282:3:2432 +283:3:2433 +284:0:2833 +285:3:2445 +286:0:2833 +287:3:2554 +288:0:2833 +289:3:2652 +290:0:2833 +291:3:2653 +292:0:2833 +293:3:2657 +294:0:2833 +295:3:2663 +296:0:2833 +297:3:2664 +298:3:2671 +299:3:2672 +300:3:2679 +301:3:2684 +302:0:2833 +303:3:2695 +304:0:2833 +305:3:2696 +306:3:2703 +307:3:2704 +308:3:2711 +309:3:2716 +310:0:2833 +311:3:2727 +312:0:2833 +313:3:2732 +314:3:2739 +315:3:2740 +316:3:2747 +317:3:2752 +318:0:2833 +319:3:2767 +320:0:2833 +321:3:2769 +322:0:2833 +323:3:2770 +324:0:2833 +325:3:1290 +326:0:2833 +327:3:1291 +328:3:1295 +329:3:1296 +330:3:1304 +331:3:1305 +332:3:1309 +333:3:1310 +334:3:1318 +335:3:1323 +336:3:1327 +337:3:1328 +338:3:1335 +339:3:1336 +340:3:1347 +341:3:1348 +342:3:1349 +343:3:1360 +344:3:1365 +345:3:1366 +346:0:2833 +347:3:1378 +348:0:2833 +349:3:1380 +350:3:1381 +351:0:2833 +352:3:1385 +353:3:1389 +354:3:1390 +355:3:1398 +356:3:1399 +357:3:1403 +358:3:1404 +359:3:1412 +360:3:1417 +361:3:1418 +362:3:1429 +363:3:1430 +364:3:1441 +365:3:1442 +366:3:1443 +367:3:1454 +368:3:1459 +369:3:1460 +370:0:2833 +371:3:1472 +372:0:2833 +373:3:1474 +374:0:2833 +375:3:1475 +376:0:2833 +377:3:1485 +378:0:2833 +379:3:1486 +380:0:2833 +381:3:1487 +382:3:1494 +383:3:1495 +384:3:1502 +385:3:1507 +386:0:2833 +387:3:1518 +388:0:2833 +389:3:1519 +390:3:1526 +391:3:1527 +392:3:1534 +393:3:1539 +394:0:2833 +395:3:1550 +396:0:2833 +397:3:1555 +398:3:1562 +399:3:1563 +400:3:1570 +401:3:1575 +402:0:2833 +403:3:1590 +404:0:2833 +405:3:1592 +406:0:2833 +407:3:1593 +408:3:1597 +409:3:1598 +410:3:1606 +411:3:1607 +412:3:1611 +413:3:1612 +414:3:1620 +415:3:1625 +416:3:1629 +417:3:1630 +418:3:1637 +419:3:1638 +420:3:1649 +421:3:1650 +422:3:1651 +423:3:1662 +424:3:1667 +425:3:1668 +426:0:2833 +427:3:1680 +428:0:2833 +429:3:1682 +430:0:2833 +431:3:1685 +432:3:1686 +433:3:1698 +434:3:1699 +435:3:1703 +436:3:1704 +437:3:1712 +438:3:1717 +439:3:1721 +440:3:1722 +441:3:1729 +442:3:1730 +443:3:1741 +444:3:1742 +445:3:1743 +446:3:1754 +447:3:1759 +448:3:1760 +449:0:2833 +450:3:1772 +451:0:2833 +452:3:1774 +453:0:2833 +454:3:1775 +455:0:2833 +456:3:1776 +457:0:2833 +458:3:1777 +459:0:2833 +460:3:1778 +461:3:1782 +462:3:1783 +463:3:1791 +464:3:1792 +465:3:1796 +466:3:1797 +467:3:1805 +468:3:1810 +469:3:1814 +470:3:1815 +471:3:1822 +472:3:1823 +473:3:1834 +474:3:1835 +475:3:1836 +476:3:1847 +477:3:1852 +478:3:1853 +479:0:2833 +480:3:1865 +481:0:2833 +482:3:1974 +483:0:2833 +484:3:2072 +485:0:2833 +486:3:2073 +487:0:2833 +488:3:2077 +489:0:2833 +490:3:2083 +491:3:2087 +492:3:2088 +493:3:2096 +494:3:2097 +495:3:2101 +496:3:2102 +497:3:2110 +498:3:2115 +499:3:2119 +500:3:2120 +501:3:2127 +502:3:2128 +503:3:2139 +504:3:2140 +505:3:2141 +506:3:2152 +507:3:2157 +508:3:2158 +509:0:2833 +510:3:2170 +511:0:2833 +512:3:2172 +513:0:2833 +514:3:2173 +515:3:2177 +516:3:2178 +517:3:2186 +518:3:2187 +519:3:2191 +520:3:2192 +521:3:2200 +522:3:2205 +523:3:2209 +524:3:2210 +525:3:2217 +526:3:2218 +527:3:2229 +528:3:2230 +529:3:2231 +530:3:2242 +531:3:2247 +532:3:2248 +533:0:2833 +534:3:2260 +535:0:2833 +536:3:2262 +537:0:2833 +538:3:2265 +539:3:2266 +540:3:2278 +541:3:2279 +542:3:2283 +543:3:2284 +544:3:2292 +545:3:2297 +546:3:2301 +547:3:2302 +548:3:2309 +549:3:2310 +550:3:2321 +551:3:2322 +552:3:2323 +553:3:2334 +554:3:2339 +555:3:2340 +556:0:2833 +557:3:2352 +558:0:2833 +559:3:2354 +560:0:2833 +561:3:2355 +562:0:2833 +563:3:2356 +564:0:2833 +565:3:2357 +566:0:2833 +567:3:2358 +568:3:2362 +569:3:2363 +570:3:2371 +571:3:2372 +572:3:2376 +573:3:2377 +574:3:2385 +575:3:2390 +576:3:2394 +577:3:2395 +578:3:2402 +579:3:2403 +580:3:2414 +581:3:2415 +582:3:2416 +583:3:2427 +584:3:2432 +585:3:2433 +586:0:2833 +587:3:2445 +588:0:2833 +589:3:2554 +590:0:2833 +591:3:2652 +592:0:2833 +593:3:2653 +594:0:2833 +595:3:2657 +596:0:2833 +597:3:2663 +598:0:2833 +599:3:2664 +600:3:2671 +601:3:2672 +602:3:2679 +603:3:2684 +604:0:2833 +605:3:2695 +606:0:2833 +607:3:2696 +608:3:2703 +609:3:2704 +610:3:2711 +611:3:2716 +612:0:2833 +613:3:2727 +614:0:2833 +615:3:2732 +616:3:2739 +617:3:2740 +618:3:2747 +619:3:2752 +620:0:2833 +621:3:2767 +622:0:2833 +623:3:2769 +624:0:2833 +625:3:2770 +626:0:2833 +627:3:1290 +628:0:2833 +629:3:1291 +630:3:1295 +631:3:1296 +632:3:1304 +633:3:1305 +634:3:1309 +635:3:1310 +636:3:1318 +637:3:1323 +638:3:1327 +639:3:1328 +640:3:1335 +641:3:1336 +642:3:1347 +643:3:1348 +644:3:1349 +645:3:1360 +646:3:1365 +647:3:1366 +648:0:2833 +649:3:1378 +650:0:2833 +651:3:1380 +652:3:1381 +653:0:2833 +654:3:1385 +655:3:1389 +656:3:1390 +657:3:1398 +658:3:1399 +659:3:1403 +660:3:1404 +661:3:1412 +662:3:1417 +663:3:1418 +664:3:1429 +665:3:1430 +666:3:1441 +667:3:1442 +668:3:1443 +669:3:1454 +670:3:1459 +671:3:1460 +672:0:2833 +673:3:1472 +674:0:2833 +675:3:1474 +676:0:2833 +677:3:1475 +678:0:2833 +679:3:1485 +680:0:2833 +681:3:1486 +682:0:2833 +683:3:1487 +684:3:1494 +685:3:1495 +686:3:1502 +687:3:1507 +688:0:2833 +689:3:1518 +690:0:2833 +691:3:1519 +692:3:1526 +693:3:1527 +694:3:1534 +695:3:1539 +696:0:2833 +697:3:1550 +698:0:2833 +699:3:1555 +700:3:1562 +701:3:1563 +702:3:1570 +703:3:1575 +704:0:2833 +705:3:1590 +706:0:2833 +707:3:1592 +708:0:2833 +709:3:1593 +710:3:1597 +711:3:1598 +712:3:1606 +713:3:1607 +714:3:1611 +715:3:1612 +716:3:1620 +717:3:1625 +718:3:1629 +719:3:1630 +720:3:1637 +721:3:1638 +722:3:1649 +723:3:1650 +724:3:1651 +725:3:1662 +726:3:1667 +727:3:1668 +728:0:2833 +729:3:1680 +730:0:2833 +731:3:1682 +732:0:2833 +733:3:1685 +734:3:1686 +735:3:1698 +736:3:1699 +737:3:1703 +738:3:1704 +739:3:1712 +740:3:1717 +741:3:1721 +742:3:1722 +743:3:1729 +744:3:1730 +745:3:1741 +746:3:1742 +747:3:1743 +748:3:1754 +749:3:1759 +750:3:1760 +751:0:2833 +752:3:1772 +753:0:2833 +754:3:1774 +755:0:2833 +756:3:1775 +757:0:2833 +758:3:1776 +759:0:2833 +760:3:1777 +761:0:2833 +762:3:1778 +763:3:1782 +764:3:1783 +765:3:1791 +766:3:1792 +767:3:1796 +768:3:1797 +769:3:1805 +770:3:1810 +771:3:1814 +772:3:1815 +773:3:1822 +774:3:1823 +775:3:1834 +776:3:1835 +777:3:1836 +778:3:1847 +779:3:1852 +780:3:1853 +781:0:2833 +782:3:1865 +783:0:2833 +784:3:1974 +785:0:2833 +786:3:2072 +787:0:2833 +788:3:2073 +789:0:2833 +790:3:2077 +791:0:2833 +792:3:2083 +793:3:2087 +794:3:2088 +795:3:2096 +796:3:2097 +797:3:2101 +798:3:2102 +799:3:2110 +800:3:2115 +801:3:2119 +802:3:2120 +803:3:2127 +804:3:2128 +805:3:2139 +806:3:2140 +807:3:2141 +808:3:2152 +809:3:2157 +810:3:2158 +811:0:2833 +812:3:2170 +813:0:2833 +814:3:2172 +815:0:2833 +816:3:2173 +817:3:2177 +818:3:2178 +819:3:2186 +820:3:2187 +821:3:2191 +822:3:2192 +823:3:2200 +824:3:2205 +825:3:2209 +826:3:2210 +827:3:2217 +828:3:2218 +829:3:2229 +830:3:2230 +831:3:2231 +832:3:2242 +833:3:2247 +834:3:2248 +835:0:2833 +836:3:2260 +837:0:2833 +838:3:2262 +839:0:2833 +840:3:2265 +841:3:2266 +842:3:2278 +843:3:2279 +844:3:2283 +845:3:2284 +846:3:2292 +847:3:2297 +848:3:2301 +849:3:2302 +850:3:2309 +851:3:2310 +852:3:2321 +853:3:2322 +854:3:2323 +855:3:2334 +856:3:2339 +857:3:2340 +858:0:2833 +859:3:2352 +860:0:2833 +861:3:2354 +862:0:2833 +863:3:2355 +864:0:2833 +865:3:2356 +866:0:2833 +867:3:2357 +868:0:2833 +869:3:2358 +870:3:2362 +871:3:2363 +872:3:2371 +873:3:2372 +874:3:2376 +875:3:2377 +876:3:2385 +877:3:2390 +878:3:2394 +879:3:2395 +880:3:2402 +881:3:2403 +882:3:2414 +883:3:2415 +884:3:2416 +885:3:2427 +886:3:2432 +887:3:2433 +888:0:2833 +889:3:2445 +890:0:2833 +891:3:2554 +892:0:2833 +893:3:2652 +894:0:2833 +895:3:2653 +896:0:2833 +897:3:2657 +898:0:2833 +899:3:2663 +900:0:2833 +901:3:2664 +902:3:2671 +903:3:2672 +904:3:2679 +905:3:2684 +906:0:2833 +907:3:2695 +908:0:2833 +909:3:2696 +910:3:2703 +911:3:2704 +912:3:2711 +913:3:2716 +914:0:2833 +915:3:2727 +916:0:2833 +917:3:2732 +918:3:2739 +919:3:2740 +920:3:2747 +921:3:2752 +922:0:2833 +923:3:2767 +924:0:2833 +925:3:2769 +926:0:2833 +927:3:2770 +928:0:2833 +929:3:1290 +930:0:2833 +931:3:1291 +932:3:1295 +933:3:1296 +934:3:1304 +935:3:1305 +936:3:1309 +937:3:1310 +938:3:1318 +939:3:1323 +940:3:1327 +941:3:1328 +942:3:1335 +943:3:1336 +944:3:1347 +945:3:1348 +946:3:1349 +947:3:1360 +948:3:1365 +949:3:1366 +950:0:2833 +951:3:1378 +952:0:2833 +953:3:1380 +954:3:1381 +955:0:2833 +956:3:1385 +957:3:1389 +958:3:1390 +959:3:1398 +960:3:1399 +961:3:1403 +962:3:1404 +963:3:1412 +964:3:1417 +965:3:1418 +966:3:1429 +967:3:1430 +968:3:1441 +969:3:1442 +970:3:1443 +971:3:1454 +972:3:1459 +973:3:1460 +974:0:2833 +975:3:1472 +976:0:2833 +977:3:1474 +978:0:2833 +979:3:1475 +980:0:2833 +981:3:1485 +982:0:2833 +983:3:1486 +984:0:2833 +985:3:1487 +986:3:1494 +987:3:1495 +988:3:1502 +989:3:1507 +990:0:2833 +991:3:1518 +992:0:2833 +993:3:1519 +994:3:1526 +995:3:1527 +996:3:1534 +997:3:1539 +998:0:2833 +999:3:1550 +1000:0:2833 +1001:3:1555 +1002:3:1562 +1003:3:1563 +1004:3:1570 +1005:3:1575 +1006:0:2833 +1007:3:1590 +1008:0:2833 +1009:3:1592 +1010:0:2833 +1011:3:1593 +1012:3:1597 +1013:3:1598 +1014:3:1606 +1015:3:1607 +1016:3:1611 +1017:3:1612 +1018:3:1620 +1019:3:1625 +1020:3:1629 +1021:3:1630 +1022:3:1637 +1023:3:1638 +1024:3:1649 +1025:3:1650 +1026:3:1651 +1027:3:1662 +1028:3:1667 +1029:3:1668 +1030:0:2833 +1031:3:1680 +1032:0:2833 +1033:3:1682 +1034:0:2833 +1035:3:1685 +1036:3:1686 +1037:3:1698 +1038:3:1699 +1039:3:1703 +1040:3:1704 +1041:3:1712 +1042:3:1717 +1043:3:1721 +1044:3:1722 +1045:3:1729 +1046:3:1730 +1047:3:1741 +1048:3:1742 +1049:3:1743 +1050:3:1754 +1051:3:1759 +1052:3:1760 +1053:0:2833 +1054:3:1772 +1055:0:2833 +1056:3:1774 +1057:0:2833 +1058:3:1775 +1059:0:2833 +1060:3:1776 +1061:0:2833 +1062:3:1777 +1063:0:2833 +1064:3:1778 +1065:3:1782 +1066:3:1783 +1067:3:1791 +1068:3:1792 +1069:3:1796 +1070:3:1797 +1071:3:1805 +1072:3:1810 +1073:3:1814 +1074:3:1815 +1075:3:1822 +1076:3:1823 +1077:3:1834 +1078:3:1835 +1079:3:1836 +1080:3:1847 +1081:3:1852 +1082:3:1853 +1083:0:2833 +1084:3:1865 +1085:0:2833 +1086:3:1974 +1087:0:2833 +1088:3:2072 +1089:0:2833 +1090:3:2073 +1091:0:2833 +1092:3:2077 +1093:0:2833 +1094:3:2083 +1095:3:2087 +1096:3:2088 +1097:3:2096 +1098:3:2097 +1099:3:2101 +1100:3:2102 +1101:3:2110 +1102:3:2115 +1103:3:2119 +1104:3:2120 +1105:3:2127 +1106:3:2128 +1107:3:2139 +1108:3:2140 +1109:3:2141 +1110:3:2152 +1111:3:2157 +1112:3:2158 +1113:0:2833 +1114:3:2170 +1115:0:2833 +1116:3:2172 +1117:0:2833 +1118:3:2173 +1119:3:2177 +1120:3:2178 +1121:3:2186 +1122:3:2187 +1123:3:2191 +1124:3:2192 +1125:3:2200 +1126:3:2205 +1127:3:2209 +1128:3:2210 +1129:3:2217 +1130:3:2218 +1131:3:2229 +1132:3:2230 +1133:3:2231 +1134:3:2242 +1135:3:2247 +1136:3:2248 +1137:0:2833 +1138:3:2260 +1139:0:2833 +1140:3:2262 +1141:0:2833 +1142:3:2265 +1143:3:2266 +1144:3:2278 +1145:3:2279 +1146:3:2283 +1147:3:2284 +1148:3:2292 +1149:3:2297 +1150:3:2301 +1151:3:2302 +1152:3:2309 +1153:3:2310 +1154:3:2321 +1155:3:2322 +1156:3:2323 +1157:3:2334 +1158:3:2339 +1159:3:2340 +1160:0:2833 +1161:3:2352 +1162:0:2833 +1163:3:2354 +1164:0:2833 +1165:3:2355 +1166:0:2833 +1167:3:2356 +1168:0:2833 +1169:3:2357 +1170:0:2833 +1171:3:2358 +1172:3:2362 +1173:3:2363 +1174:3:2371 +1175:3:2372 +1176:3:2376 +1177:3:2377 +1178:3:2385 +1179:3:2390 +1180:3:2394 +1181:3:2395 +1182:3:2402 +1183:3:2403 +1184:3:2414 +1185:3:2415 +1186:3:2416 +1187:3:2427 +1188:3:2432 +1189:3:2433 +1190:0:2833 +1191:3:2445 +1192:0:2833 +1193:3:2554 +1194:0:2833 +1195:3:2652 +1196:0:2833 +1197:3:2653 +1198:0:2833 +1199:3:2657 +1200:0:2833 +1201:3:2663 +1202:0:2833 +1203:3:2664 +1204:3:2671 +1205:3:2672 +1206:3:2679 +1207:3:2684 +1208:0:2833 +1209:3:2695 +1210:0:2833 +1211:3:2696 +1212:3:2703 +1213:3:2704 +1214:3:2711 +1215:3:2716 +1216:0:2833 +1217:3:2727 +1218:0:2833 +1219:3:2732 +1220:3:2739 +1221:3:2740 +1222:3:2747 +1223:3:2752 +1224:0:2833 +1225:3:2767 +1226:0:2833 +1227:3:2769 +1228:0:2833 +1229:3:2770 +1230:0:2833 +1231:3:1290 +1232:0:2833 +1233:3:1291 +1234:3:1295 +1235:3:1296 +1236:3:1304 +1237:3:1305 +1238:3:1309 +1239:3:1310 +1240:3:1318 +1241:3:1323 +1242:3:1327 +1243:3:1328 +1244:3:1335 +1245:3:1336 +1246:3:1347 +1247:3:1348 +1248:3:1349 +1249:3:1360 +1250:3:1365 +1251:3:1366 +1252:0:2833 +1253:3:1378 +1254:0:2833 +1255:3:1380 +1256:3:1381 +1257:0:2833 +1258:3:1385 +1259:3:1389 +1260:3:1390 +1261:3:1398 +1262:3:1399 +1263:3:1403 +1264:3:1404 +1265:3:1412 +1266:3:1417 +1267:3:1418 +1268:3:1429 +1269:3:1430 +1270:3:1441 +1271:3:1442 +1272:3:1443 +1273:3:1454 +1274:3:1459 +1275:3:1460 +1276:0:2833 +1277:3:1472 +1278:0:2833 +1279:3:1474 +1280:0:2833 +1281:3:1475 +1282:0:2833 +1283:3:1485 +1284:0:2833 +1285:3:1486 +1286:0:2833 +1287:3:1487 +1288:3:1494 +1289:3:1495 +1290:3:1502 +1291:3:1507 +1292:0:2833 +1293:3:1518 +1294:0:2833 +1295:2:662 +1296:0:2833 +1297:2:668 +1298:0:2833 +1299:2:669 +1300:0:2833 +1301:2:670 +1302:0:2833 +1303:2:671 +1304:0:2833 +1305:1:2 +1306:0:2833 +1307:2:672 +1308:0:2833 +1309:1:8 +1310:0:2833 +1311:1:9 +1312:0:2833 +1313:1:10 +1314:0:2833 +1315:1:11 +1316:0:2833 +1317:2:671 +1318:0:2833 +1319:1:12 +1320:1:16 +1321:1:17 +1322:1:25 +1323:1:26 +1324:1:30 +1325:1:31 +1326:1:39 +1327:1:44 +1328:1:48 +1329:1:49 +1330:1:56 +1331:1:57 +1332:1:68 +1333:1:69 +1334:1:70 +1335:1:81 +1336:1:93 +1337:1:94 +1338:0:2833 +1339:2:672 +1340:0:2833 +1341:1:99 +1342:0:2833 +1343:2:673 +1344:0:2833 +1345:2:674 +1346:0:2833 +1347:2:685 +1348:0:2833 +1349:2:686 +1350:0:2833 +1351:2:687 +1352:2:691 +1353:2:692 +1354:2:700 +1355:2:701 +1356:2:705 +1357:2:706 +1358:2:714 +1359:2:719 +1360:2:723 +1361:2:724 +1362:2:731 +1363:2:732 +1364:2:743 +1365:2:744 +1366:2:745 +1367:2:756 +1368:2:768 +1369:2:769 +1370:0:2833 +1371:2:774 +1372:0:2833 +1373:2:775 +1374:2:779 +1375:2:780 +1376:2:788 +1377:2:789 +1378:2:793 +1379:2:794 +1380:2:802 +1381:2:807 +1382:2:811 +1383:2:812 +1384:2:819 +1385:2:820 +1386:2:831 +1387:2:832 +1388:2:833 +1389:2:844 +1390:2:856 +1391:2:857 +1392:0:2833 +1393:2:862 +1394:0:2833 +1395:2:863 +1396:0:2833 +1397:2:864 +1398:2:868 +1399:2:869 +1400:2:877 +1401:2:878 +1402:2:882 +1403:2:883 +1404:2:891 +1405:2:896 +1406:2:900 +1407:2:901 +1408:2:908 +1409:2:909 +1410:2:920 +1411:2:921 +1412:2:922 +1413:2:933 +1414:2:945 +1415:2:946 +1416:0:2833 +1417:2:951 +1418:0:2833 +1419:2:1059 +1420:0:2833 +1421:2:1060 +1422:0:2833 +1423:2:1065 +1424:0:2833 +1425:2:1070 +1426:0:2833 +1427:3:1519 +1428:3:1526 +1429:3:1529 +1430:3:1530 +1431:3:1534 +1432:3:1539 +1433:0:2833 +1434:3:1550 +1435:0:2833 +1436:3:1555 +1437:3:1562 +1438:3:1563 +1439:3:1570 +1440:3:1575 +1441:0:2833 +1442:3:1590 +1443:0:2833 +1444:3:1592 +1445:0:2833 +1446:3:1593 +1447:3:1597 +1448:3:1598 +1449:3:1606 +1450:3:1607 +1451:3:1611 +1452:3:1612 +1453:3:1620 +1454:3:1625 +1455:3:1629 +1456:3:1630 +1457:3:1637 +1458:3:1638 +1459:3:1649 +1460:3:1650 +1461:3:1651 +1462:3:1662 +1463:3:1667 +1464:3:1668 +1465:0:2833 +1466:3:1680 +1467:0:2833 +1468:3:1682 +1469:0:2833 +1470:3:1685 +1471:3:1686 +1472:3:1698 +1473:3:1699 +1474:3:1703 +1475:3:1704 +1476:3:1712 +1477:3:1717 +1478:3:1721 +1479:3:1722 +1480:3:1729 +1481:3:1730 +1482:3:1741 +1483:3:1742 +1484:3:1743 +1485:3:1754 +1486:3:1759 +1487:3:1760 +1488:0:2833 +1489:3:1772 +1490:0:2833 +1491:3:1774 +1492:0:2833 +1493:3:1775 +1494:0:2833 +1495:3:1776 +1496:0:2833 +1497:3:1777 +1498:0:2833 +1499:3:1778 +1500:3:1782 +1501:3:1783 +1502:3:1791 +1503:3:1792 +1504:3:1796 +1505:3:1797 +1506:3:1805 +1507:3:1810 +1508:3:1814 +1509:3:1815 +1510:3:1822 +1511:3:1823 +1512:3:1834 +1513:3:1835 +1514:3:1836 +1515:3:1847 +1516:3:1852 +1517:3:1853 +1518:0:2833 +1519:3:1865 +1520:0:2833 +1521:3:1974 +1522:0:2833 +1523:3:2072 +1524:0:2833 +1525:3:2073 +1526:0:2833 +1527:3:2077 +1528:0:2833 +1529:3:2083 +1530:3:2087 +1531:3:2088 +1532:3:2096 +1533:3:2097 +1534:3:2101 +1535:3:2102 +1536:3:2110 +1537:3:2115 +1538:3:2119 +1539:3:2120 +1540:3:2127 +1541:3:2128 +1542:3:2139 +1543:3:2140 +1544:3:2141 +1545:3:2152 +1546:3:2157 +1547:3:2158 +1548:0:2833 +1549:3:2170 +1550:0:2833 +1551:3:2172 +1552:0:2833 +1553:3:2173 +1554:3:2177 +1555:3:2178 +1556:3:2186 +1557:3:2187 +1558:3:2191 +1559:3:2192 +1560:3:2200 +1561:3:2205 +1562:3:2209 +1563:3:2210 +1564:3:2217 +1565:3:2218 +1566:3:2229 +1567:3:2230 +1568:3:2231 +1569:3:2242 +1570:3:2247 +1571:3:2248 +1572:0:2833 +1573:3:2260 +1574:0:2833 +1575:3:2262 +1576:0:2833 +1577:3:2265 +1578:3:2266 +1579:3:2278 +1580:3:2279 +1581:3:2283 +1582:3:2284 +1583:3:2292 +1584:3:2297 +1585:3:2301 +1586:3:2302 +1587:3:2309 +1588:3:2310 +1589:3:2321 +1590:3:2322 +1591:3:2323 +1592:3:2334 +1593:3:2339 +1594:3:2340 +1595:0:2833 +1596:3:2352 +1597:0:2833 +1598:3:2354 +1599:0:2833 +1600:3:2355 +1601:0:2833 +1602:3:2356 +1603:0:2833 +1604:3:2357 +1605:0:2833 +1606:3:2358 +1607:3:2362 +1608:3:2363 +1609:3:2371 +1610:3:2372 +1611:3:2376 +1612:3:2377 +1613:3:2385 +1614:3:2390 +1615:3:2394 +1616:3:2395 +1617:3:2402 +1618:3:2403 +1619:3:2414 +1620:3:2415 +1621:3:2416 +1622:3:2427 +1623:3:2432 +1624:3:2433 +1625:0:2833 +1626:3:2445 +1627:0:2833 +1628:3:2554 +1629:0:2833 +1630:3:2652 +1631:0:2833 +1632:3:2653 +1633:0:2833 +1634:3:2657 +1635:0:2833 +1636:3:2663 +1637:0:2833 +1638:3:2664 +1639:3:2671 +1640:3:2672 +1641:3:2679 +1642:3:2684 +1643:0:2833 +1644:3:2695 +1645:0:2833 +1646:3:2696 +1647:3:2703 +1648:3:2706 +1649:3:2707 +1650:3:2711 +1651:3:2716 +1652:0:2833 +1653:3:2727 +1654:0:2833 +1655:3:2732 +1656:3:2739 +1657:3:2740 +1658:3:2747 +1659:3:2752 +1660:0:2833 +1661:3:2767 +1662:0:2833 +1663:3:2769 +1664:0:2833 +1665:3:2770 +1666:0:2833 +1667:3:2773 +1668:0:2833 +1669:3:2778 +1670:0:2833 +1671:2:1071 +1672:0:2831 +1673:3:2779 +1674:0:2837 +1675:1:288 diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_single_flip.define b/formal-model/urcu/result-signal-over-writer/urcu_free_single_flip.define new file mode 100644 index 0000000..5e642ef --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_free_single_flip.define @@ -0,0 +1 @@ +#define SINGLE_FLIP diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_single_flip.log b/formal-model/urcu/result-signal-over-writer/urcu_free_single_flip.log new file mode 100644 index 0000000..f854175 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_free_single_flip.log @@ -0,0 +1,224 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_free_single_flip.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 742) + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 6934, errors: 0 + 7626 states, stored + 67235 states, matched + 74861 transitions (= stored+matched) + 248896 atomic steps +hash conflicts: 113 (resolved) + +Stats on memory usage (in Megabytes): + 0.611 equivalent memory usage for states (stored*(State-vector + overhead)) + 0.867 actual memory usage for states (unsuccessful compression: 141.88%) + state-vector as stored = 91 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 466.545 total actual memory usage + +unreached in proctype urcu_reader_sig + line 402, "pan.___", state 330, "(1)" + line 613, "pan.___", state 411, "-end-" + (2 of 411 states) +unreached in proctype urcu_writer + line 398, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 407, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 408, "pan.___", state 59, "(1)" + line 417, "pan.___", state 89, "(1)" + line 398, "pan.___", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 408, "pan.___", state 160, "(1)" + line 651, "pan.___", state 213, "(1)" + line 174, "pan.___", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 178, "pan.___", state 233, "(1)" + line 159, "pan.___", state 254, "(1)" + line 163, "pan.___", state 262, "(1)" + line 167, "pan.___", state 274, "(1)" + line 174, "pan.___", state 285, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 182, "pan.___", state 742, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 159, "pan.___", state 752, "(1)" + line 163, "pan.___", state 760, "(1)" + line 163, "pan.___", state 761, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 163, "pan.___", state 761, "else" + line 161, "pan.___", state 766, "((j<1))" + line 161, "pan.___", state 766, "((j>=1))" + line 167, "pan.___", state 772, "(1)" + line 167, "pan.___", state 773, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 167, "pan.___", state 773, "else" + line 169, "pan.___", state 776, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 169, "pan.___", state 776, "else" + line 174, "pan.___", state 783, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 182, "pan.___", state 805, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 167, "pan.___", state 835, "(1)" + line 167, "pan.___", state 836, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 174, "pan.___", state 850, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 174, "pan.___", state 852, "(1)" + line 178, "pan.___", state 859, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 178, "pan.___", state 861, "(1)" + line 178, "pan.___", state 862, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 178, "pan.___", state 862, "else" + line 176, "pan.___", state 867, "((j<1))" + line 176, "pan.___", state 867, "((j>=1))" + line 182, "pan.___", state 872, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 159, "pan.___", state 882, "(1)" + line 163, "pan.___", state 890, "(1)" + line 163, "pan.___", state 891, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 163, "pan.___", state 891, "else" + line 161, "pan.___", state 896, "((j<1))" + line 161, "pan.___", state 896, "((j>=1))" + line 167, "pan.___", state 902, "(1)" + line 167, "pan.___", state 903, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 167, "pan.___", state 903, "else" + line 169, "pan.___", state 906, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 169, "pan.___", state 906, "else" + line 201, "pan.___", state 908, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 201, "pan.___", state 908, "else" + line 220, "pan.___", state 909, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 220, "pan.___", state 909, "else" + line 355, "pan.___", state 915, "((sighand_exec==1))" + line 355, "pan.___", state 915, "else" + line 361, "pan.___", state 918, "sighand_exec = 1" + line 398, "pan.___", state 931, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 398, "pan.___", state 933, "(1)" + line 398, "pan.___", state 934, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 398, "pan.___", state 934, "else" + line 398, "pan.___", state 937, "(1)" + line 402, "pan.___", state 945, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 402, "pan.___", state 947, "(1)" + line 402, "pan.___", state 948, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 402, "pan.___", state 948, "else" + line 402, "pan.___", state 951, "(1)" + line 402, "pan.___", state 952, "(1)" + line 402, "pan.___", state 952, "(1)" + line 400, "pan.___", state 957, "((i<1))" + line 400, "pan.___", state 957, "((i>=1))" + line 407, "pan.___", state 963, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 408, "pan.___", state 976, "(1)" + line 408, "pan.___", state 977, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 408, "pan.___", state 977, "else" + line 408, "pan.___", state 980, "(1)" + line 408, "pan.___", state 981, "(1)" + line 408, "pan.___", state 981, "(1)" + line 412, "pan.___", state 989, "(1)" + line 412, "pan.___", state 990, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 412, "pan.___", state 990, "else" + line 412, "pan.___", state 993, "(1)" + line 412, "pan.___", state 994, "(1)" + line 412, "pan.___", state 994, "(1)" + line 410, "pan.___", state 999, "((i<1))" + line 410, "pan.___", state 999, "((i>=1))" + line 417, "pan.___", state 1006, "(1)" + line 417, "pan.___", state 1007, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 417, "pan.___", state 1007, "else" + line 417, "pan.___", state 1010, "(1)" + line 417, "pan.___", state 1011, "(1)" + line 417, "pan.___", state 1011, "(1)" + line 419, "pan.___", state 1014, "(1)" + line 419, "pan.___", state 1014, "(1)" + line 361, "pan.___", state 1023, "sighand_exec = 1" + line 178, "pan.___", state 1048, "(1)" + line 182, "pan.___", state 1059, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 159, "pan.___", state 1069, "(1)" + line 163, "pan.___", state 1077, "(1)" + line 167, "pan.___", state 1089, "(1)" + line 174, "pan.___", state 1100, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_single_flip.spin.input.trail b/formal-model/urcu/result-signal-over-writer/urcu_free_single_flip.spin.input.trail new file mode 100644 index 0000000..84cf653 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_free_single_flip.spin.input.trail @@ -0,0 +1,1379 @@ +-2:4:-2 +-4:-4:-4 +1:0:2904 +2:4:2856 +3:4:2859 +4:4:2859 +5:4:2862 +6:4:2870 +7:4:2870 +8:4:2873 +9:4:2879 +10:4:2883 +11:4:2883 +12:4:2886 +13:4:2894 +14:4:2898 +15:4:2899 +16:0:2904 +17:4:2901 +18:0:2904 +19:3:1655 +20:0:2904 +21:3:1661 +22:0:2904 +23:3:1662 +24:0:2904 +25:3:1663 +26:3:1667 +27:3:1668 +28:3:1676 +29:3:1677 +30:3:1681 +31:3:1682 +32:3:1690 +33:3:1695 +34:3:1699 +35:3:1700 +36:3:1707 +37:3:1708 +38:3:1719 +39:3:1720 +40:3:1721 +41:3:1732 +42:3:1737 +43:3:1738 +44:0:2904 +45:3:1750 +46:0:2904 +47:3:1752 +48:3:1753 +49:0:2904 +50:3:1757 +51:3:1761 +52:3:1762 +53:3:1770 +54:3:1771 +55:3:1775 +56:3:1776 +57:3:1784 +58:3:1789 +59:3:1790 +60:3:1801 +61:3:1802 +62:3:1813 +63:3:1814 +64:3:1815 +65:3:1826 +66:3:1831 +67:3:1832 +68:0:2904 +69:3:1844 +70:0:2904 +71:3:1846 +72:0:2904 +73:3:1847 +74:0:2904 +75:3:1857 +76:0:2904 +77:3:1858 +78:0:2904 +79:3:1862 +80:3:1863 +81:3:1867 +82:3:1871 +83:3:1872 +84:3:1876 +85:3:1884 +86:3:1885 +87:3:1890 +88:3:1897 +89:3:1898 +90:3:1905 +91:3:1910 +92:0:2904 +93:3:1921 +94:0:2904 +95:3:1925 +96:3:1926 +97:3:1930 +98:3:1934 +99:3:1935 +100:3:1939 +101:3:1947 +102:3:1948 +103:3:1953 +104:3:1960 +105:3:1961 +106:3:1968 +107:3:1973 +108:0:2904 +109:3:1984 +110:0:2904 +111:3:1992 +112:3:1993 +113:3:1997 +114:3:2001 +115:3:2002 +116:3:2006 +117:3:2014 +118:3:2015 +119:3:2020 +120:3:2027 +121:3:2028 +122:3:2035 +123:3:2040 +124:0:2904 +125:3:2055 +126:0:2904 +127:3:2057 +128:0:2904 +129:3:2058 +130:3:2062 +131:3:2063 +132:3:2071 +133:3:2072 +134:3:2076 +135:3:2077 +136:3:2085 +137:3:2090 +138:3:2094 +139:3:2095 +140:3:2102 +141:3:2103 +142:3:2114 +143:3:2115 +144:3:2116 +145:3:2127 +146:3:2132 +147:3:2133 +148:0:2904 +149:3:2145 +150:0:2904 +151:3:2147 +152:0:2904 +153:3:2150 +154:3:2151 +155:3:2163 +156:3:2164 +157:3:2168 +158:3:2169 +159:3:2177 +160:3:2182 +161:3:2186 +162:3:2187 +163:3:2194 +164:3:2195 +165:3:2206 +166:3:2207 +167:3:2208 +168:3:2219 +169:3:2224 +170:3:2225 +171:0:2904 +172:3:2237 +173:0:2904 +174:3:2239 +175:0:2904 +176:3:2240 +177:0:2904 +178:3:2241 +179:0:2904 +180:3:2242 +181:0:2904 +182:3:2243 +183:3:2247 +184:3:2248 +185:3:2256 +186:3:2257 +187:3:2261 +188:3:2262 +189:3:2270 +190:3:2275 +191:3:2279 +192:3:2280 +193:3:2287 +194:3:2288 +195:3:2299 +196:3:2300 +197:3:2301 +198:3:2312 +199:3:2317 +200:3:2318 +201:0:2904 +202:3:2330 +203:0:2904 +204:3:2532 +205:0:2904 +206:3:2630 +207:0:2904 +208:3:2631 +209:0:2904 +210:3:2635 +211:0:2904 +212:3:2641 +213:0:2904 +214:3:2645 +215:3:2646 +216:3:2650 +217:3:2654 +218:3:2655 +219:3:2659 +220:3:2667 +221:3:2668 +222:3:2673 +223:3:2680 +224:3:2681 +225:3:2688 +226:3:2693 +227:0:2904 +228:3:2704 +229:0:2904 +230:3:2708 +231:3:2709 +232:3:2713 +233:3:2717 +234:3:2718 +235:3:2722 +236:3:2730 +237:3:2731 +238:3:2736 +239:3:2743 +240:3:2744 +241:3:2751 +242:3:2756 +243:0:2904 +244:3:2767 +245:0:2904 +246:3:2775 +247:3:2776 +248:3:2780 +249:3:2784 +250:3:2785 +251:3:2789 +252:3:2797 +253:3:2798 +254:3:2803 +255:3:2810 +256:3:2811 +257:3:2818 +258:3:2823 +259:0:2904 +260:3:2838 +261:0:2904 +262:3:2840 +263:0:2904 +264:3:2841 +265:0:2904 +266:3:1662 +267:0:2904 +268:3:1663 +269:3:1667 +270:3:1668 +271:3:1676 +272:3:1677 +273:3:1681 +274:3:1682 +275:3:1690 +276:3:1695 +277:3:1699 +278:3:1700 +279:3:1707 +280:3:1708 +281:3:1719 +282:3:1720 +283:3:1721 +284:3:1732 +285:3:1737 +286:3:1738 +287:0:2904 +288:3:1750 +289:0:2904 +290:3:1752 +291:3:1753 +292:0:2904 +293:3:1757 +294:3:1761 +295:3:1762 +296:3:1770 +297:3:1771 +298:3:1775 +299:3:1776 +300:3:1784 +301:3:1789 +302:3:1790 +303:3:1801 +304:3:1802 +305:3:1813 +306:3:1814 +307:3:1815 +308:3:1826 +309:3:1831 +310:3:1832 +311:0:2904 +312:3:1844 +313:0:2904 +314:3:1846 +315:0:2904 +316:3:1847 +317:0:2904 +318:3:1857 +319:0:2904 +320:3:1858 +321:0:2904 +322:3:1862 +323:3:1863 +324:3:1867 +325:3:1871 +326:3:1872 +327:3:1876 +328:3:1884 +329:3:1885 +330:3:1890 +331:3:1897 +332:3:1898 +333:3:1905 +334:3:1910 +335:0:2904 +336:3:1921 +337:0:2904 +338:3:1925 +339:3:1926 +340:3:1930 +341:3:1934 +342:3:1935 +343:3:1939 +344:3:1947 +345:3:1948 +346:3:1953 +347:3:1960 +348:3:1961 +349:3:1968 +350:3:1973 +351:0:2904 +352:3:1984 +353:0:2904 +354:3:1992 +355:3:1993 +356:3:1997 +357:3:2001 +358:3:2002 +359:3:2006 +360:3:2014 +361:3:2015 +362:3:2020 +363:3:2027 +364:3:2028 +365:3:2035 +366:3:2040 +367:0:2904 +368:3:2055 +369:0:2904 +370:3:2057 +371:0:2904 +372:3:2058 +373:3:2062 +374:3:2063 +375:3:2071 +376:3:2072 +377:3:2076 +378:3:2077 +379:3:2085 +380:3:2090 +381:3:2094 +382:3:2095 +383:3:2102 +384:3:2103 +385:3:2114 +386:3:2115 +387:3:2116 +388:3:2127 +389:3:2132 +390:3:2133 +391:0:2904 +392:3:2145 +393:0:2904 +394:3:2147 +395:0:2904 +396:3:2150 +397:3:2151 +398:3:2163 +399:3:2164 +400:3:2168 +401:3:2169 +402:3:2177 +403:3:2182 +404:3:2186 +405:3:2187 +406:3:2194 +407:3:2195 +408:3:2206 +409:3:2207 +410:3:2208 +411:3:2219 +412:3:2224 +413:3:2225 +414:0:2904 +415:3:2237 +416:0:2904 +417:3:2239 +418:0:2904 +419:3:2240 +420:0:2904 +421:3:2241 +422:0:2904 +423:3:2242 +424:0:2904 +425:3:2243 +426:3:2247 +427:3:2248 +428:3:2256 +429:3:2257 +430:3:2261 +431:3:2262 +432:3:2270 +433:3:2275 +434:3:2279 +435:3:2280 +436:3:2287 +437:3:2288 +438:3:2299 +439:3:2300 +440:3:2301 +441:3:2312 +442:3:2317 +443:3:2318 +444:0:2904 +445:3:2330 +446:0:2904 +447:3:2532 +448:0:2904 +449:3:2630 +450:0:2904 +451:3:2631 +452:0:2904 +453:3:2635 +454:0:2904 +455:3:2641 +456:0:2904 +457:3:2645 +458:3:2646 +459:3:2650 +460:3:2654 +461:3:2655 +462:3:2659 +463:3:2667 +464:3:2668 +465:3:2673 +466:3:2680 +467:3:2681 +468:3:2688 +469:3:2693 +470:0:2904 +471:3:2704 +472:0:2904 +473:3:2708 +474:3:2709 +475:3:2713 +476:3:2717 +477:3:2718 +478:3:2722 +479:3:2730 +480:3:2731 +481:3:2736 +482:3:2743 +483:3:2744 +484:3:2751 +485:3:2756 +486:0:2904 +487:3:2767 +488:0:2904 +489:3:2775 +490:3:2776 +491:3:2780 +492:3:2784 +493:3:2785 +494:3:2789 +495:3:2797 +496:3:2798 +497:3:2803 +498:3:2810 +499:3:2811 +500:3:2818 +501:3:2823 +502:0:2904 +503:3:2838 +504:0:2904 +505:3:2840 +506:0:2904 +507:3:2841 +508:0:2904 +509:3:1662 +510:0:2904 +511:3:1663 +512:3:1667 +513:3:1668 +514:3:1676 +515:3:1677 +516:3:1681 +517:3:1682 +518:3:1690 +519:3:1695 +520:3:1699 +521:3:1700 +522:3:1707 +523:3:1708 +524:3:1719 +525:3:1720 +526:3:1721 +527:3:1732 +528:3:1737 +529:3:1738 +530:0:2904 +531:3:1750 +532:0:2904 +533:3:1752 +534:3:1753 +535:0:2904 +536:3:1757 +537:3:1761 +538:3:1762 +539:3:1770 +540:3:1771 +541:3:1775 +542:3:1776 +543:3:1784 +544:3:1789 +545:3:1790 +546:3:1801 +547:3:1802 +548:3:1813 +549:3:1814 +550:3:1815 +551:3:1826 +552:3:1831 +553:3:1832 +554:0:2904 +555:3:1844 +556:0:2904 +557:3:1846 +558:0:2904 +559:3:1847 +560:0:2904 +561:3:1857 +562:0:2904 +563:3:1858 +564:0:2904 +565:3:1862 +566:3:1863 +567:3:1867 +568:3:1871 +569:3:1872 +570:3:1876 +571:3:1884 +572:3:1885 +573:3:1890 +574:3:1897 +575:3:1898 +576:3:1905 +577:3:1910 +578:0:2904 +579:3:1921 +580:0:2904 +581:3:1925 +582:3:1926 +583:3:1930 +584:3:1934 +585:3:1935 +586:3:1939 +587:3:1947 +588:3:1948 +589:3:1953 +590:3:1960 +591:3:1961 +592:3:1968 +593:3:1973 +594:0:2904 +595:3:1984 +596:0:2904 +597:3:1992 +598:3:1993 +599:3:1997 +600:3:2001 +601:3:2002 +602:3:2006 +603:3:2014 +604:3:2015 +605:3:2020 +606:3:2027 +607:3:2028 +608:3:2035 +609:3:2040 +610:0:2904 +611:3:2055 +612:0:2904 +613:3:2057 +614:0:2904 +615:3:2058 +616:3:2062 +617:3:2063 +618:3:2071 +619:3:2072 +620:3:2076 +621:3:2077 +622:3:2085 +623:3:2090 +624:3:2094 +625:3:2095 +626:3:2102 +627:3:2103 +628:3:2114 +629:3:2115 +630:3:2116 +631:3:2127 +632:3:2132 +633:3:2133 +634:0:2904 +635:3:2145 +636:0:2904 +637:3:2147 +638:0:2904 +639:3:2150 +640:3:2151 +641:3:2163 +642:3:2164 +643:3:2168 +644:3:2169 +645:3:2177 +646:3:2182 +647:3:2186 +648:3:2187 +649:3:2194 +650:3:2195 +651:3:2206 +652:3:2207 +653:3:2208 +654:3:2219 +655:3:2224 +656:3:2225 +657:0:2904 +658:3:2237 +659:0:2904 +660:3:2239 +661:0:2904 +662:3:2240 +663:0:2904 +664:3:2241 +665:0:2904 +666:3:2242 +667:0:2904 +668:3:2243 +669:3:2247 +670:3:2248 +671:3:2256 +672:3:2257 +673:3:2261 +674:3:2262 +675:3:2270 +676:3:2275 +677:3:2279 +678:3:2280 +679:3:2287 +680:3:2288 +681:3:2299 +682:3:2300 +683:3:2301 +684:3:2312 +685:3:2317 +686:3:2318 +687:0:2904 +688:3:2330 +689:0:2904 +690:3:2532 +691:0:2904 +692:3:2630 +693:0:2904 +694:3:2631 +695:0:2904 +696:3:2635 +697:0:2904 +698:3:2641 +699:0:2904 +700:3:2645 +701:3:2646 +702:3:2650 +703:3:2654 +704:3:2655 +705:3:2659 +706:3:2667 +707:3:2668 +708:3:2673 +709:3:2680 +710:3:2681 +711:3:2688 +712:3:2693 +713:0:2904 +714:3:2704 +715:0:2904 +716:3:2708 +717:3:2709 +718:3:2713 +719:3:2717 +720:3:2718 +721:3:2722 +722:3:2730 +723:3:2731 +724:3:2736 +725:3:2743 +726:3:2744 +727:3:2751 +728:3:2756 +729:0:2904 +730:3:2767 +731:0:2904 +732:3:2775 +733:3:2776 +734:3:2780 +735:3:2784 +736:3:2785 +737:3:2789 +738:3:2797 +739:3:2798 +740:3:2803 +741:3:2810 +742:3:2811 +743:3:2818 +744:3:2823 +745:0:2904 +746:3:2838 +747:0:2904 +748:3:2840 +749:0:2904 +750:3:2841 +751:0:2904 +752:3:1662 +753:0:2904 +754:3:1663 +755:3:1667 +756:3:1668 +757:3:1676 +758:3:1677 +759:3:1681 +760:3:1682 +761:3:1690 +762:3:1695 +763:3:1699 +764:3:1700 +765:3:1707 +766:3:1708 +767:3:1719 +768:3:1720 +769:3:1721 +770:3:1732 +771:3:1737 +772:3:1738 +773:0:2904 +774:3:1750 +775:0:2904 +776:3:1752 +777:3:1753 +778:0:2904 +779:3:1757 +780:3:1761 +781:3:1762 +782:3:1770 +783:3:1771 +784:3:1775 +785:3:1776 +786:3:1784 +787:3:1789 +788:3:1790 +789:3:1801 +790:3:1802 +791:3:1813 +792:3:1814 +793:3:1815 +794:3:1826 +795:3:1831 +796:3:1832 +797:0:2904 +798:3:1844 +799:0:2904 +800:3:1846 +801:0:2904 +802:3:1847 +803:0:2904 +804:3:1857 +805:0:2904 +806:3:1858 +807:0:2904 +808:3:1862 +809:3:1863 +810:3:1867 +811:3:1871 +812:3:1872 +813:3:1876 +814:3:1884 +815:3:1885 +816:3:1890 +817:3:1897 +818:3:1898 +819:3:1905 +820:3:1910 +821:0:2904 +822:3:1921 +823:0:2904 +824:3:1925 +825:3:1926 +826:3:1930 +827:3:1934 +828:3:1935 +829:3:1939 +830:3:1947 +831:3:1948 +832:3:1953 +833:3:1960 +834:3:1961 +835:3:1968 +836:3:1973 +837:0:2904 +838:3:1984 +839:0:2904 +840:3:1992 +841:3:1993 +842:3:1997 +843:3:2001 +844:3:2002 +845:3:2006 +846:3:2014 +847:3:2015 +848:3:2020 +849:3:2027 +850:3:2028 +851:3:2035 +852:3:2040 +853:0:2904 +854:3:2055 +855:0:2904 +856:3:2057 +857:0:2904 +858:3:2058 +859:3:2062 +860:3:2063 +861:3:2071 +862:3:2072 +863:3:2076 +864:3:2077 +865:3:2085 +866:3:2090 +867:3:2094 +868:3:2095 +869:3:2102 +870:3:2103 +871:3:2114 +872:3:2115 +873:3:2116 +874:3:2127 +875:3:2132 +876:3:2133 +877:0:2904 +878:3:2145 +879:0:2904 +880:3:2147 +881:0:2904 +882:3:2150 +883:3:2151 +884:3:2163 +885:3:2164 +886:3:2168 +887:3:2169 +888:3:2177 +889:3:2182 +890:3:2186 +891:3:2187 +892:3:2194 +893:3:2195 +894:3:2206 +895:3:2207 +896:3:2208 +897:3:2219 +898:3:2224 +899:3:2225 +900:0:2904 +901:3:2237 +902:0:2904 +903:3:2239 +904:0:2904 +905:3:2240 +906:0:2904 +907:3:2241 +908:0:2904 +909:3:2242 +910:0:2904 +911:3:2243 +912:3:2247 +913:3:2248 +914:3:2256 +915:3:2257 +916:3:2261 +917:3:2262 +918:3:2270 +919:3:2275 +920:3:2279 +921:3:2280 +922:3:2287 +923:3:2288 +924:3:2299 +925:3:2300 +926:3:2301 +927:3:2312 +928:3:2317 +929:3:2318 +930:0:2904 +931:3:2330 +932:0:2904 +933:3:2532 +934:0:2904 +935:3:2630 +936:0:2904 +937:3:2631 +938:0:2904 +939:3:2635 +940:0:2904 +941:3:2641 +942:0:2904 +943:3:2645 +944:3:2646 +945:3:2650 +946:3:2654 +947:3:2655 +948:3:2659 +949:3:2667 +950:3:2668 +951:3:2673 +952:3:2680 +953:3:2681 +954:3:2688 +955:3:2693 +956:0:2904 +957:3:2704 +958:0:2904 +959:2:848 +960:0:2904 +961:2:854 +962:0:2904 +963:2:855 +964:0:2904 +965:2:856 +966:0:2904 +967:2:857 +968:0:2904 +969:1:2 +970:0:2904 +971:2:858 +972:0:2904 +973:1:8 +974:0:2904 +975:1:9 +976:0:2904 +977:1:10 +978:0:2904 +979:1:11 +980:0:2904 +981:2:857 +982:0:2904 +983:1:12 +984:1:16 +985:1:17 +986:1:25 +987:1:26 +988:1:30 +989:1:31 +990:1:39 +991:1:44 +992:1:48 +993:1:49 +994:1:63 +995:1:64 +996:1:68 +997:1:69 +998:1:70 +999:1:81 +1000:1:86 +1001:1:87 +1002:0:2904 +1003:2:858 +1004:0:2904 +1005:1:99 +1006:0:2904 +1007:2:859 +1008:0:2904 +1009:2:860 +1010:0:2904 +1011:2:871 +1012:0:2904 +1013:2:872 +1014:0:2904 +1015:2:873 +1016:2:877 +1017:2:878 +1018:2:886 +1019:2:887 +1020:2:891 +1021:2:892 +1022:2:900 +1023:2:905 +1024:2:909 +1025:2:910 +1026:2:924 +1027:2:925 +1028:2:929 +1029:2:930 +1030:2:931 +1031:2:942 +1032:2:947 +1033:2:948 +1034:0:2904 +1035:2:960 +1036:0:2904 +1037:2:961 +1038:2:965 +1039:2:966 +1040:2:974 +1041:2:975 +1042:2:979 +1043:2:980 +1044:2:988 +1045:2:993 +1046:2:997 +1047:2:998 +1048:2:1012 +1049:2:1013 +1050:2:1017 +1051:2:1018 +1052:2:1019 +1053:2:1030 +1054:2:1035 +1055:2:1036 +1056:0:2904 +1057:2:1048 +1058:0:2904 +1059:2:1049 +1060:0:2904 +1061:3:2708 +1062:3:2709 +1063:3:2713 +1064:3:2717 +1065:3:2718 +1066:3:2722 +1067:3:2730 +1068:3:2731 +1069:3:2736 +1070:3:2743 +1071:3:2744 +1072:3:2751 +1073:3:2756 +1074:0:2904 +1075:3:2767 +1076:0:2904 +1077:3:2775 +1078:3:2776 +1079:3:2780 +1080:3:2784 +1081:3:2785 +1082:3:2789 +1083:3:2797 +1084:3:2798 +1085:3:2803 +1086:3:2810 +1087:3:2811 +1088:3:2818 +1089:3:2823 +1090:0:2904 +1091:3:2838 +1092:0:2904 +1093:3:2840 +1094:0:2904 +1095:3:2841 +1096:0:2904 +1097:3:1662 +1098:0:2904 +1099:3:1663 +1100:3:1667 +1101:3:1668 +1102:3:1676 +1103:3:1677 +1104:3:1681 +1105:3:1682 +1106:3:1690 +1107:3:1695 +1108:3:1699 +1109:3:1700 +1110:3:1707 +1111:3:1708 +1112:3:1719 +1113:3:1720 +1114:3:1721 +1115:3:1732 +1116:3:1737 +1117:3:1738 +1118:0:2904 +1119:3:1750 +1120:0:2904 +1121:3:1752 +1122:3:1753 +1123:0:2904 +1124:3:1757 +1125:3:1761 +1126:3:1762 +1127:3:1770 +1128:3:1771 +1129:3:1775 +1130:3:1776 +1131:3:1784 +1132:3:1789 +1133:3:1790 +1134:3:1801 +1135:3:1802 +1136:3:1813 +1137:3:1814 +1138:3:1815 +1139:3:1826 +1140:3:1831 +1141:3:1832 +1142:0:2904 +1143:3:1844 +1144:0:2904 +1145:3:1846 +1146:0:2904 +1147:3:1847 +1148:0:2904 +1149:3:1857 +1150:0:2904 +1151:3:1858 +1152:0:2904 +1153:3:1862 +1154:3:1863 +1155:3:1867 +1156:3:1871 +1157:3:1872 +1158:3:1876 +1159:3:1884 +1160:3:1885 +1161:3:1890 +1162:3:1897 +1163:3:1898 +1164:3:1905 +1165:3:1910 +1166:0:2904 +1167:3:1921 +1168:0:2904 +1169:2:1050 +1170:2:1054 +1171:2:1055 +1172:2:1063 +1173:2:1064 +1174:2:1068 +1175:2:1069 +1176:2:1077 +1177:2:1082 +1178:2:1086 +1179:2:1087 +1180:2:1094 +1181:2:1095 +1182:2:1106 +1183:2:1107 +1184:2:1108 +1185:2:1119 +1186:2:1131 +1187:2:1132 +1188:0:2904 +1189:2:1137 +1190:0:2904 +1191:2:1338 +1192:0:2904 +1193:2:1339 +1194:0:2904 +1195:2:1344 +1196:0:2904 +1197:2:1349 +1198:0:2904 +1199:3:1925 +1200:3:1926 +1201:3:1930 +1202:3:1931 +1203:3:1939 +1204:3:1947 +1205:3:1948 +1206:3:1953 +1207:3:1960 +1208:3:1961 +1209:3:1968 +1210:3:1973 +1211:0:2904 +1212:3:1984 +1213:0:2904 +1214:3:1992 +1215:3:1993 +1216:3:1997 +1217:3:2001 +1218:3:2002 +1219:3:2006 +1220:3:2014 +1221:3:2015 +1222:3:2020 +1223:3:2027 +1224:3:2028 +1225:3:2035 +1226:3:2040 +1227:0:2904 +1228:3:2055 +1229:0:2904 +1230:3:2057 +1231:0:2904 +1232:3:2058 +1233:3:2062 +1234:3:2063 +1235:3:2071 +1236:3:2072 +1237:3:2076 +1238:3:2077 +1239:3:2085 +1240:3:2090 +1241:3:2094 +1242:3:2095 +1243:3:2102 +1244:3:2103 +1245:3:2114 +1246:3:2115 +1247:3:2116 +1248:3:2127 +1249:3:2132 +1250:3:2133 +1251:0:2904 +1252:3:2145 +1253:0:2904 +1254:3:2147 +1255:0:2904 +1256:3:2150 +1257:3:2151 +1258:3:2163 +1259:3:2164 +1260:3:2168 +1261:3:2169 +1262:3:2177 +1263:3:2182 +1264:3:2186 +1265:3:2187 +1266:3:2194 +1267:3:2195 +1268:3:2206 +1269:3:2207 +1270:3:2208 +1271:3:2219 +1272:3:2224 +1273:3:2225 +1274:0:2904 +1275:3:2237 +1276:0:2904 +1277:3:2239 +1278:0:2904 +1279:3:2240 +1280:0:2904 +1281:3:2241 +1282:0:2904 +1283:3:2242 +1284:0:2904 +1285:3:2243 +1286:3:2247 +1287:3:2248 +1288:3:2256 +1289:3:2257 +1290:3:2261 +1291:3:2262 +1292:3:2270 +1293:3:2275 +1294:3:2279 +1295:3:2280 +1296:3:2287 +1297:3:2288 +1298:3:2299 +1299:3:2300 +1300:3:2301 +1301:3:2312 +1302:3:2317 +1303:3:2318 +1304:0:2904 +1305:3:2330 +1306:0:2904 +1307:3:2532 +1308:0:2904 +1309:3:2630 +1310:0:2904 +1311:3:2631 +1312:0:2904 +1313:3:2635 +1314:0:2904 +1315:3:2641 +1316:0:2904 +1317:3:2645 +1318:3:2646 +1319:3:2650 +1320:3:2654 +1321:3:2655 +1322:3:2659 +1323:3:2667 +1324:3:2668 +1325:3:2673 +1326:3:2680 +1327:3:2681 +1328:3:2688 +1329:3:2693 +1330:0:2904 +1331:3:2704 +1332:0:2904 +1333:3:2708 +1334:3:2709 +1335:3:2713 +1336:3:2717 +1337:3:2718 +1338:3:2722 +1339:3:2730 +1340:3:2731 +1341:3:2736 +1342:3:2743 +1343:3:2744 +1344:3:2751 +1345:3:2756 +1346:0:2904 +1347:3:2767 +1348:0:2904 +1349:3:2775 +1350:3:2776 +1351:3:2780 +1352:3:2784 +1353:3:2785 +1354:3:2789 +1355:3:2797 +1356:3:2798 +1357:3:2803 +1358:3:2810 +1359:3:2811 +1360:3:2818 +1361:3:2823 +1362:0:2904 +1363:3:2838 +1364:0:2904 +1365:3:2840 +1366:0:2904 +1367:3:2841 +1368:0:2904 +1369:3:2844 +1370:0:2904 +1371:3:2849 +1372:0:2904 +1373:2:1350 +1374:0:2902 +1375:3:2850 +1376:0:2908 +1377:1:296 diff --git a/formal-model/urcu/result-signal-over-writer/urcu_progress.ltl b/formal-model/urcu/result-signal-over-writer/urcu_progress.ltl new file mode 100644 index 0000000..8718641 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_progress.ltl @@ -0,0 +1 @@ +([] <> !np_) diff --git a/formal-model/urcu/result-signal-over-writer/urcu_progress_reader.define b/formal-model/urcu/result-signal-over-writer/urcu_progress_reader.define new file mode 100644 index 0000000..ff3f783 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_progress_reader.define @@ -0,0 +1 @@ +#define READER_PROGRESS diff --git a/formal-model/urcu/result-signal-over-writer/urcu_progress_reader.log b/formal-model/urcu/result-signal-over-writer/urcu_progress_reader.log new file mode 100644 index 0000000..a1a6122 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_progress_reader.log @@ -0,0 +1,348 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define > pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_progress_reader.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -f -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 742) +depth 12: Claim reached state 9 (line 747) +depth 86: Claim reached state 9 (line 746) + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness enabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 10679, errors: 0 + 38182 states, stored (88898 visited) + 997091 states, matched + 1085989 transitions (= visited+matched) + 3694897 atomic steps +hash conflicts: 9602 (resolved) + +Stats on memory usage (in Megabytes): + 3.059 equivalent memory usage for states (stored*(State-vector + overhead)) + 2.930 actual memory usage for states (compression: 95.79%) + state-vector as stored = 52 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 468.596 total actual memory usage + +unreached in proctype urcu_reader_sig + line 402, "pan.___", state 330, "(1)" + line 613, "pan.___", state 411, "-end-" + (2 of 411 states) +unreached in proctype urcu_writer + line 398, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 407, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 408, "pan.___", state 59, "(1)" + line 417, "pan.___", state 89, "(1)" + line 398, "pan.___", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 408, "pan.___", state 160, "(1)" + line 651, "pan.___", state 213, "(1)" + line 174, "pan.___", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 178, "pan.___", state 233, "(1)" + line 159, "pan.___", state 254, "(1)" + line 163, "pan.___", state 262, "(1)" + line 167, "pan.___", state 274, "(1)" + line 174, "pan.___", state 285, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 182, "pan.___", state 742, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 159, "pan.___", state 752, "(1)" + line 163, "pan.___", state 760, "(1)" + line 163, "pan.___", state 761, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 163, "pan.___", state 761, "else" + line 161, "pan.___", state 766, "((j<1))" + line 161, "pan.___", state 766, "((j>=1))" + line 167, "pan.___", state 772, "(1)" + line 167, "pan.___", state 773, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 167, "pan.___", state 773, "else" + line 169, "pan.___", state 776, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 169, "pan.___", state 776, "else" + line 174, "pan.___", state 783, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 182, "pan.___", state 805, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 167, "pan.___", state 835, "(1)" + line 167, "pan.___", state 836, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 174, "pan.___", state 850, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 174, "pan.___", state 852, "(1)" + line 178, "pan.___", state 859, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 178, "pan.___", state 861, "(1)" + line 178, "pan.___", state 862, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 178, "pan.___", state 862, "else" + line 176, "pan.___", state 867, "((j<1))" + line 176, "pan.___", state 867, "((j>=1))" + line 182, "pan.___", state 872, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 159, "pan.___", state 882, "(1)" + line 163, "pan.___", state 890, "(1)" + line 163, "pan.___", state 891, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 163, "pan.___", state 891, "else" + line 161, "pan.___", state 896, "((j<1))" + line 161, "pan.___", state 896, "((j>=1))" + line 167, "pan.___", state 902, "(1)" + line 167, "pan.___", state 903, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 167, "pan.___", state 903, "else" + line 169, "pan.___", state 906, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 169, "pan.___", state 906, "else" + line 201, "pan.___", state 908, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 201, "pan.___", state 908, "else" + line 220, "pan.___", state 909, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 220, "pan.___", state 909, "else" + line 355, "pan.___", state 915, "((sighand_exec==1))" + line 355, "pan.___", state 915, "else" + line 361, "pan.___", state 918, "sighand_exec = 1" + line 398, "pan.___", state 931, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 398, "pan.___", state 933, "(1)" + line 398, "pan.___", state 934, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 398, "pan.___", state 934, "else" + line 398, "pan.___", state 937, "(1)" + line 402, "pan.___", state 945, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 402, "pan.___", state 947, "(1)" + line 402, "pan.___", state 948, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 402, "pan.___", state 948, "else" + line 402, "pan.___", state 951, "(1)" + line 402, "pan.___", state 952, "(1)" + line 402, "pan.___", state 952, "(1)" + line 400, "pan.___", state 957, "((i<1))" + line 400, "pan.___", state 957, "((i>=1))" + line 407, "pan.___", state 963, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 408, "pan.___", state 976, "(1)" + line 408, "pan.___", state 977, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 408, "pan.___", state 977, "else" + line 408, "pan.___", state 980, "(1)" + line 408, "pan.___", state 981, "(1)" + line 408, "pan.___", state 981, "(1)" + line 412, "pan.___", state 989, "(1)" + line 412, "pan.___", state 990, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 412, "pan.___", state 990, "else" + line 412, "pan.___", state 993, "(1)" + line 412, "pan.___", state 994, "(1)" + line 412, "pan.___", state 994, "(1)" + line 410, "pan.___", state 999, "((i<1))" + line 410, "pan.___", state 999, "((i>=1))" + line 417, "pan.___", state 1006, "(1)" + line 417, "pan.___", state 1007, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 417, "pan.___", state 1007, "else" + line 417, "pan.___", state 1010, "(1)" + line 417, "pan.___", state 1011, "(1)" + line 417, "pan.___", state 1011, "(1)" + line 419, "pan.___", state 1014, "(1)" + line 419, "pan.___", state 1014, "(1)" + line 361, "pan.___", state 1023, "sighand_exec = 1" + line 402, "pan.___", state 1054, "(1)" + line 407, "pan.___", state 1070, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 417, "pan.___", state 1113, "(1)" + line 402, "pan.___", state 1151, "(1)" + line 407, "pan.___", state 1167, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 417, "pan.___", state 1210, "(1)" + line 398, "pan.___", state 1236, "(1)" + line 402, "pan.___", state 1250, "(1)" + line 407, "pan.___", state 1266, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 417, "pan.___", state 1309, "(1)" + line 402, "pan.___", state 1350, "(1)" + line 407, "pan.___", state 1366, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 417, "pan.___", state 1409, "(1)" + line 174, "pan.___", state 1430, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 174, "pan.___", state 1432, "(1)" + line 178, "pan.___", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 178, "pan.___", state 1441, "(1)" + line 178, "pan.___", state 1442, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 178, "pan.___", state 1442, "else" + line 176, "pan.___", state 1447, "((j<1))" + line 176, "pan.___", state 1447, "((j>=1))" + line 182, "pan.___", state 1452, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 159, "pan.___", state 1462, "(1)" + line 163, "pan.___", state 1470, "(1)" + line 163, "pan.___", state 1471, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 163, "pan.___", state 1471, "else" + line 161, "pan.___", state 1476, "((j<1))" + line 161, "pan.___", state 1476, "((j>=1))" + line 167, "pan.___", state 1482, "(1)" + line 167, "pan.___", state 1483, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 167, "pan.___", state 1483, "else" + line 169, "pan.___", state 1486, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 169, "pan.___", state 1486, "else" + line 174, "pan.___", state 1493, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 182, "pan.___", state 1515, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 167, "pan.___", state 1545, "(1)" + line 167, "pan.___", state 1546, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 174, "pan.___", state 1560, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 174, "pan.___", state 1562, "(1)" + line 178, "pan.___", state 1569, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 178, "pan.___", state 1571, "(1)" + line 178, "pan.___", state 1572, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 178, "pan.___", state 1572, "else" + line 176, "pan.___", state 1577, "((j<1))" + line 176, "pan.___", state 1577, "((j>=1))" + line 182, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 159, "pan.___", state 1592, "(1)" + line 163, "pan.___", state 1600, "(1)" + line 163, "pan.___", state 1601, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 163, "pan.___", state 1601, "else" + line 161, "pan.___", state 1606, "((j<1))" + line 161, "pan.___", state 1606, "((j>=1))" + line 167, "pan.___", state 1612, "(1)" + line 167, "pan.___", state 1613, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 167, "pan.___", state 1613, "else" + line 169, "pan.___", state 1616, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 169, "pan.___", state 1616, "else" + line 201, "pan.___", state 1618, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 201, "pan.___", state 1618, "else" + line 220, "pan.___", state 1619, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 220, "pan.___", state 1619, "else" + line 355, "pan.___", state 1625, "((sighand_exec==1))" + line 355, "pan.___", state 1625, "else" + line 361, "pan.___", state 1628, "sighand_exec = 1" + line 398, "pan.___", state 1641, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 398, "pan.___", state 1643, "(1)" + line 398, "pan.___", state 1644, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 398, "pan.___", state 1644, "else" + line 398, "pan.___", state 1647, "(1)" + line 402, "pan.___", state 1655, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 402, "pan.___", state 1657, "(1)" + line 402, "pan.___", state 1658, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 402, "pan.___", state 1658, "else" + line 402, "pan.___", state 1661, "(1)" + line 402, "pan.___", state 1662, "(1)" + line 402, "pan.___", state 1662, "(1)" + line 400, "pan.___", state 1667, "((i<1))" + line 400, "pan.___", state 1667, "((i>=1))" + line 407, "pan.___", state 1673, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 408, "pan.___", state 1686, "(1)" + line 408, "pan.___", state 1687, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 408, "pan.___", state 1687, "else" + line 408, "pan.___", state 1690, "(1)" + line 408, "pan.___", state 1691, "(1)" + line 408, "pan.___", state 1691, "(1)" + line 412, "pan.___", state 1699, "(1)" + line 412, "pan.___", state 1700, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 412, "pan.___", state 1700, "else" + line 412, "pan.___", state 1703, "(1)" + line 412, "pan.___", state 1704, "(1)" + line 412, "pan.___", state 1704, "(1)" + line 410, "pan.___", state 1709, "((i<1))" + line 410, "pan.___", state 1709, "((i>=1))" + line 417, "pan.___", state 1716, "(1)" + line 417, "pan.___", state 1717, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 417, "pan.___", state 1717, "else" + line 417, "pan.___", state 1720, "(1)" + line 417, "pan.___", state 1721, "(1)" + line 417, "pan.___", state 1721, "(1)" + line 419, "pan.___", state 1724, "(1)" + line 419, "pan.___", state 1724, "(1)" + line 361, "pan.___", state 1733, "sighand_exec = 1" + line 178, "pan.___", state 1758, "(1)" + line 182, "pan.___", state 1769, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 159, "pan.___", state 1779, "(1)" + line 163, "pan.___", state 1787, "(1)" + line 167, "pan.___", state 1799, "(1)" + line 174, "pan.___", state 1810, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-writer/urcu_progress_reader.spin.input.trail b/formal-model/urcu/result-signal-over-writer/urcu_progress_reader.spin.input.trail new file mode 100644 index 0000000..7c42af1 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_progress_reader.spin.input.trail @@ -0,0 +1,1270 @@ +-2:4:-2 +-4:-4:-4 +1:0:4401 +2:4:4353 +3:4:4356 +4:4:4356 +5:4:4359 +6:4:4367 +7:4:4367 +8:4:4370 +9:4:4376 +10:4:4380 +11:4:4380 +12:4:4383 +13:4:4391 +14:4:4395 +15:4:4396 +16:0:4401 +17:4:4398 +18:0:4401 +19:3:2479 +20:0:4401 +21:3:2485 +22:0:4401 +23:3:2486 +24:0:4401 +25:3:2487 +26:3:2491 +27:3:2492 +28:3:2500 +29:3:2501 +30:3:2505 +31:3:2506 +32:3:2514 +33:3:2519 +34:3:2523 +35:3:2524 +36:3:2531 +37:3:2532 +38:3:2543 +39:3:2544 +40:3:2545 +41:3:2556 +42:3:2561 +43:3:2562 +44:0:4401 +45:3:2574 +46:0:4401 +47:3:2576 +48:3:2577 +49:0:4401 +50:3:2581 +51:3:2585 +52:3:2586 +53:3:2594 +54:3:2595 +55:3:2599 +56:3:2600 +57:3:2608 +58:3:2613 +59:3:2614 +60:3:2625 +61:3:2626 +62:3:2637 +63:3:2638 +64:3:2639 +65:3:2650 +66:3:2655 +67:3:2656 +68:0:4401 +69:3:2668 +70:0:4401 +71:3:2670 +72:0:4401 +73:3:2671 +74:0:4401 +75:3:2681 +76:0:4401 +77:3:2682 +78:0:4401 +79:3:2686 +80:3:2687 +81:3:2691 +82:3:2695 +83:3:2696 +84:3:2700 +85:3:2708 +86:3:2709 +87:3:2714 +88:3:2721 +89:3:2722 +90:3:2729 +91:3:2734 +92:0:4401 +93:3:2745 +94:0:4401 +95:3:2749 +96:3:2750 +97:3:2754 +98:3:2758 +99:3:2759 +100:3:2763 +101:3:2771 +102:3:2772 +103:3:2777 +104:3:2784 +105:3:2785 +106:3:2792 +107:3:2797 +108:0:4401 +109:3:2808 +110:0:4401 +111:3:2816 +112:3:2817 +113:3:2821 +114:3:2825 +115:3:2826 +116:3:2830 +117:3:2838 +118:3:2839 +119:3:2844 +120:3:2851 +121:3:2852 +122:3:2859 +123:3:2864 +124:0:4401 +125:3:2879 +126:0:4401 +127:3:2881 +128:0:4401 +129:3:2882 +130:3:2886 +131:3:2887 +132:3:2895 +133:3:2896 +134:3:2900 +135:3:2901 +136:3:2909 +137:3:2914 +138:3:2918 +139:3:2919 +140:3:2926 +141:3:2927 +142:3:2938 +143:3:2939 +144:3:2940 +145:3:2951 +146:3:2956 +147:3:2957 +148:0:4401 +149:3:2969 +150:0:4401 +151:3:2971 +152:0:4401 +153:3:2974 +154:3:2975 +155:3:2987 +156:3:2988 +157:3:2992 +158:3:2993 +159:3:3001 +160:3:3006 +161:3:3010 +162:3:3011 +163:3:3018 +164:3:3019 +165:3:3030 +166:3:3031 +167:3:3032 +168:3:3043 +169:3:3048 +170:3:3049 +171:0:4401 +172:3:3061 +173:0:4401 +174:3:3063 +175:0:4401 +176:3:3064 +177:0:4401 +178:3:3065 +179:0:4401 +180:3:3066 +181:0:4401 +182:3:3067 +183:3:3071 +184:3:3072 +185:3:3080 +186:3:3081 +187:3:3085 +188:3:3086 +189:3:3094 +190:3:3099 +191:3:3103 +192:3:3104 +193:3:3111 +194:3:3112 +195:3:3123 +196:3:3124 +197:3:3125 +198:3:3136 +199:3:3141 +200:3:3142 +201:0:4401 +202:3:3154 +203:0:4401 +204:3:3356 +205:0:4401 +206:3:3454 +207:0:4401 +208:3:3455 +209:0:4401 +210:3:3459 +211:0:4401 +212:3:3465 +213:3:3469 +214:3:3470 +215:3:3478 +216:3:3479 +217:3:3483 +218:3:3484 +219:3:3492 +220:3:3497 +221:3:3501 +222:3:3502 +223:3:3509 +224:3:3510 +225:3:3521 +226:3:3522 +227:3:3523 +228:3:3534 +229:3:3539 +230:3:3540 +231:0:4401 +232:3:3552 +233:0:4401 +234:3:3554 +235:0:4401 +236:3:3555 +237:3:3559 +238:3:3560 +239:3:3568 +240:3:3569 +241:3:3573 +242:3:3574 +243:3:3582 +244:3:3587 +245:3:3591 +246:3:3592 +247:3:3599 +248:3:3600 +249:3:3611 +250:3:3612 +251:3:3613 +252:3:3624 +253:3:3629 +254:3:3630 +255:0:4401 +256:3:3642 +257:0:4401 +258:3:3644 +259:0:4401 +260:3:3647 +261:3:3648 +262:3:3660 +263:3:3661 +264:3:3665 +265:3:3666 +266:3:3674 +267:3:3679 +268:3:3683 +269:3:3684 +270:3:3691 +271:3:3692 +272:3:3703 +273:3:3704 +274:3:3705 +275:3:3716 +276:3:3721 +277:3:3722 +278:0:4401 +279:3:3734 +280:0:4401 +281:3:3736 +282:0:4401 +283:3:3737 +284:0:4401 +285:3:3738 +286:0:4401 +287:3:3739 +288:0:4401 +289:3:3740 +290:3:3744 +291:3:3745 +292:3:3753 +293:3:3754 +294:3:3758 +295:3:3759 +296:3:3767 +297:3:3772 +298:3:3776 +299:3:3777 +300:3:3784 +301:3:3785 +302:3:3796 +303:3:3797 +304:3:3798 +305:3:3809 +306:3:3814 +307:3:3815 +308:0:4401 +309:3:3827 +310:0:4401 +311:3:4029 +312:0:4401 +313:3:4127 +314:0:4401 +315:3:4128 +316:0:4401 +317:3:4132 +318:0:4401 +319:3:4138 +320:0:4401 +321:3:4142 +322:3:4143 +323:3:4147 +324:3:4151 +325:3:4152 +326:3:4156 +327:3:4164 +328:3:4165 +329:3:4170 +330:3:4177 +331:3:4178 +332:3:4185 +333:3:4190 +334:0:4401 +335:3:4201 +336:0:4401 +337:3:4205 +338:3:4206 +339:3:4210 +340:3:4214 +341:3:4215 +342:3:4219 +343:3:4227 +344:3:4228 +345:3:4233 +346:3:4240 +347:3:4241 +348:3:4248 +349:3:4253 +350:0:4401 +351:3:4264 +352:0:4401 +353:3:4272 +354:3:4273 +355:3:4277 +356:3:4281 +357:3:4282 +358:3:4286 +359:3:4294 +360:3:4295 +361:3:4300 +362:3:4307 +363:3:4308 +364:3:4315 +365:3:4320 +366:0:4401 +367:3:4335 +368:0:4401 +369:3:4337 +370:0:4401 +371:3:4338 +372:0:4401 +373:3:2486 +374:0:4401 +375:3:2487 +376:3:2491 +377:3:2492 +378:3:2500 +379:3:2501 +380:3:2505 +381:3:2506 +382:3:2514 +383:3:2519 +384:3:2523 +385:3:2524 +386:3:2531 +387:3:2532 +388:3:2543 +389:3:2544 +390:3:2545 +391:3:2556 +392:3:2561 +393:3:2562 +394:0:4401 +395:3:2574 +396:0:4401 +397:3:2576 +398:3:2577 +399:0:4401 +400:3:2581 +401:3:2585 +402:3:2586 +403:3:2594 +404:3:2595 +405:3:2599 +406:3:2600 +407:3:2608 +408:3:2613 +409:3:2614 +410:3:2625 +411:3:2626 +412:3:2637 +413:3:2638 +414:3:2639 +415:3:2650 +416:3:2655 +417:3:2656 +418:0:4401 +419:3:2668 +420:0:4401 +421:3:2670 +422:0:4401 +423:3:2671 +424:0:4401 +425:3:2681 +426:0:4401 +427:3:2682 +428:0:4401 +429:3:2686 +430:3:2687 +431:3:2691 +432:3:2695 +433:3:2696 +434:3:2700 +435:3:2708 +436:3:2709 +437:3:2714 +438:3:2721 +439:3:2722 +440:3:2729 +441:3:2734 +442:0:4401 +443:3:2745 +444:0:4401 +445:3:2749 +446:3:2750 +447:3:2754 +448:3:2758 +449:3:2759 +450:3:2763 +451:3:2771 +452:3:2772 +453:3:2777 +454:3:2784 +455:3:2785 +456:3:2792 +457:3:2797 +458:0:4401 +459:3:2808 +460:0:4401 +461:3:2816 +462:3:2817 +463:3:2821 +464:3:2825 +465:3:2826 +466:3:2830 +467:3:2838 +468:3:2839 +469:3:2844 +470:3:2851 +471:3:2852 +472:3:2859 +473:3:2864 +474:0:4401 +475:3:2879 +476:0:4401 +477:3:2881 +478:0:4401 +479:3:2882 +480:3:2886 +481:3:2887 +482:3:2895 +483:3:2896 +484:3:2900 +485:3:2901 +486:3:2909 +487:3:2914 +488:3:2918 +489:3:2919 +490:3:2926 +491:3:2927 +492:3:2938 +493:3:2939 +494:3:2940 +495:3:2951 +496:3:2956 +497:3:2957 +498:0:4401 +499:3:2969 +500:0:4401 +501:3:2971 +502:0:4401 +503:3:2974 +504:3:2975 +505:3:2987 +506:3:2988 +507:3:2992 +508:3:2993 +509:3:3001 +510:3:3006 +511:3:3010 +512:3:3011 +513:3:3018 +514:3:3019 +515:3:3030 +516:3:3031 +517:3:3032 +518:3:3043 +519:3:3048 +520:3:3049 +521:0:4401 +522:3:3061 +523:0:4401 +524:3:3063 +525:0:4401 +526:3:3064 +527:0:4401 +528:3:3065 +529:0:4401 +530:3:3066 +531:0:4401 +532:3:3067 +533:3:3071 +534:3:3072 +535:3:3080 +536:3:3081 +537:3:3085 +538:3:3086 +539:3:3094 +540:3:3099 +541:3:3103 +542:3:3104 +543:3:3111 +544:3:3112 +545:3:3123 +546:3:3124 +547:3:3125 +548:3:3136 +549:3:3141 +550:3:3142 +551:0:4401 +552:3:3154 +553:0:4401 +554:3:3356 +555:0:4401 +556:3:3454 +557:0:4401 +558:3:3455 +559:0:4401 +560:3:3459 +561:0:4401 +562:3:3465 +563:3:3469 +564:3:3470 +565:3:3478 +566:3:3479 +567:3:3483 +568:3:3484 +569:3:3492 +570:3:3497 +571:3:3501 +572:3:3502 +573:3:3509 +574:3:3510 +575:3:3521 +576:3:3522 +577:3:3523 +578:3:3534 +579:3:3539 +580:3:3540 +581:0:4401 +582:3:3552 +583:0:4401 +584:3:3554 +585:0:4401 +586:3:3555 +587:3:3559 +588:3:3560 +589:3:3568 +590:3:3569 +591:3:3573 +592:3:3574 +593:3:3582 +594:3:3587 +595:3:3591 +596:3:3592 +597:3:3599 +598:3:3600 +599:3:3611 +600:3:3612 +601:3:3613 +602:3:3624 +603:3:3629 +604:3:3630 +605:0:4401 +606:3:3642 +607:0:4401 +608:3:3644 +609:0:4401 +610:3:3647 +611:3:3648 +612:3:3660 +613:3:3661 +614:3:3665 +615:3:3666 +616:3:3674 +617:3:3679 +618:3:3683 +619:3:3684 +620:3:3691 +621:3:3692 +622:3:3703 +623:3:3704 +624:3:3705 +625:3:3716 +626:3:3721 +627:3:3722 +628:0:4401 +629:3:3734 +630:0:4401 +631:3:3736 +632:0:4401 +633:3:3737 +634:0:4401 +635:3:3738 +636:0:4401 +637:3:3739 +638:0:4401 +639:3:3740 +640:3:3744 +641:3:3745 +642:3:3753 +643:3:3754 +644:3:3758 +645:3:3759 +646:3:3767 +647:3:3772 +648:3:3776 +649:3:3777 +650:3:3784 +651:3:3785 +652:3:3796 +653:3:3797 +654:3:3798 +655:3:3809 +656:3:3814 +657:3:3815 +658:0:4401 +659:3:3827 +660:0:4401 +661:3:4029 +662:0:4401 +663:3:4127 +664:0:4401 +665:3:4128 +666:0:4401 +667:3:4132 +668:0:4401 +669:3:4138 +670:0:4401 +671:3:4142 +672:3:4143 +673:3:4147 +674:3:4151 +675:3:4152 +676:3:4156 +677:3:4164 +678:3:4165 +679:3:4170 +680:3:4177 +681:3:4178 +682:3:4185 +683:3:4190 +684:0:4401 +685:3:4201 +686:0:4401 +687:3:4205 +688:3:4206 +689:3:4210 +690:3:4214 +691:3:4215 +692:3:4219 +693:3:4227 +694:3:4228 +695:3:4233 +696:3:4240 +697:3:4241 +698:3:4248 +699:3:4253 +700:0:4401 +701:3:4264 +702:0:4401 +703:3:4272 +704:3:4273 +705:3:4277 +706:3:4281 +707:3:4282 +708:3:4286 +709:3:4294 +710:3:4295 +711:3:4300 +712:3:4307 +713:3:4308 +714:3:4315 +715:3:4320 +716:0:4401 +717:3:4335 +718:0:4401 +719:3:4337 +720:0:4401 +721:3:4338 +722:0:4401 +723:3:2486 +724:0:4401 +725:3:2487 +726:3:2491 +727:3:2492 +728:3:2500 +729:3:2501 +730:3:2505 +731:3:2506 +732:3:2514 +733:3:2519 +734:3:2523 +735:3:2524 +736:3:2531 +737:3:2532 +738:3:2543 +739:3:2544 +740:3:2545 +741:3:2556 +742:3:2561 +743:3:2562 +744:0:4401 +745:3:2574 +746:0:4401 +747:3:2576 +748:3:2577 +749:0:4401 +750:3:2581 +751:3:2585 +752:3:2586 +753:3:2594 +754:3:2595 +755:3:2599 +756:3:2600 +757:3:2608 +758:3:2613 +759:3:2614 +760:3:2625 +761:3:2626 +762:3:2637 +763:3:2638 +764:3:2639 +765:3:2650 +766:3:2655 +767:3:2656 +768:0:4401 +769:3:2668 +770:0:4401 +771:3:2670 +772:0:4401 +773:3:2671 +774:0:4401 +775:3:2681 +776:0:4401 +777:3:2682 +778:0:4401 +779:3:2686 +780:3:2687 +781:3:2691 +782:3:2695 +783:3:2696 +784:3:2700 +785:3:2708 +786:3:2709 +787:3:2714 +788:3:2721 +789:3:2722 +790:3:2729 +791:3:2734 +792:0:4401 +793:3:2745 +794:0:4401 +795:3:2749 +796:3:2750 +797:3:2754 +798:3:2758 +799:3:2759 +800:3:2763 +801:3:2771 +802:3:2772 +803:3:2777 +804:3:2784 +805:3:2785 +806:3:2792 +807:3:2797 +808:0:4401 +809:3:2808 +810:0:4401 +811:3:2816 +812:3:2817 +813:3:2821 +814:3:2825 +815:3:2826 +816:3:2830 +817:3:2838 +818:3:2839 +819:3:2844 +820:3:2851 +821:3:2852 +822:3:2859 +823:3:2864 +824:0:4401 +825:3:2879 +826:0:4401 +827:3:2881 +828:0:4401 +829:3:2882 +830:3:2886 +831:3:2887 +832:3:2895 +833:3:2896 +834:3:2900 +835:3:2901 +836:3:2909 +837:3:2914 +838:3:2918 +839:3:2919 +840:3:2926 +841:3:2927 +842:3:2938 +843:3:2939 +844:3:2940 +845:3:2951 +846:3:2956 +847:3:2957 +848:0:4401 +849:3:2969 +850:0:4401 +851:3:2971 +852:0:4401 +853:3:2974 +854:3:2975 +855:3:2987 +856:3:2988 +857:3:2992 +858:3:2993 +859:3:3001 +860:3:3006 +861:3:3010 +862:3:3011 +863:3:3018 +864:3:3019 +865:3:3030 +866:3:3031 +867:3:3032 +868:3:3043 +869:3:3048 +870:3:3049 +871:0:4401 +872:3:3061 +873:0:4401 +874:3:3063 +875:0:4401 +876:3:3064 +877:0:4401 +878:3:3065 +879:0:4401 +880:3:3066 +881:0:4401 +882:3:3067 +883:3:3071 +884:3:3072 +885:3:3080 +886:3:3081 +887:3:3085 +888:3:3086 +889:3:3094 +890:3:3099 +891:3:3103 +892:3:3104 +893:3:3111 +894:3:3112 +895:3:3123 +896:3:3124 +897:3:3125 +898:3:3136 +899:3:3141 +900:3:3142 +901:0:4401 +902:3:3154 +903:0:4401 +904:3:3356 +905:0:4401 +906:3:3454 +907:0:4401 +908:3:3455 +909:0:4401 +910:3:3459 +911:0:4401 +912:3:3465 +913:3:3469 +914:3:3470 +915:3:3478 +916:3:3479 +917:3:3483 +918:3:3484 +919:3:3492 +920:3:3497 +921:3:3501 +922:3:3502 +923:3:3509 +924:3:3510 +925:3:3521 +926:3:3522 +927:3:3523 +928:3:3534 +929:3:3539 +930:3:3540 +931:0:4401 +932:3:3552 +933:0:4401 +934:3:3554 +935:0:4401 +936:3:3555 +937:3:3559 +938:3:3560 +939:3:3568 +940:3:3569 +941:3:3573 +942:3:3574 +943:3:3582 +944:3:3587 +945:3:3591 +946:3:3592 +947:3:3599 +948:3:3600 +949:3:3611 +950:3:3612 +951:3:3613 +952:3:3624 +953:3:3629 +954:3:3630 +955:0:4401 +956:3:3642 +957:0:4401 +958:3:3644 +959:0:4401 +960:3:3647 +961:3:3648 +962:3:3660 +963:3:3661 +964:3:3665 +965:3:3666 +966:3:3674 +967:3:3679 +968:3:3683 +969:3:3684 +970:3:3691 +971:3:3692 +972:3:3703 +973:3:3704 +974:3:3705 +975:3:3716 +976:3:3721 +977:3:3722 +978:0:4401 +979:3:3734 +980:0:4401 +981:3:3736 +982:0:4401 +983:3:3737 +984:0:4401 +985:3:3738 +986:0:4401 +987:3:3739 +988:0:4401 +989:3:3740 +990:3:3744 +991:3:3745 +992:3:3753 +993:3:3754 +994:3:3758 +995:3:3759 +996:3:3767 +997:3:3772 +998:3:3776 +999:3:3777 +1000:3:3784 +1001:3:3785 +1002:3:3796 +1003:3:3797 +1004:3:3798 +1005:3:3809 +1006:3:3814 +1007:3:3815 +1008:0:4401 +1009:3:3827 +1010:0:4401 +1011:3:4029 +1012:0:4401 +1013:3:4127 +1014:0:4401 +1015:3:4128 +1016:0:4401 +1017:3:4132 +1018:0:4401 +1019:3:4138 +1020:0:4401 +1021:3:4142 +1022:3:4143 +1023:3:4147 +1024:3:4151 +1025:3:4152 +1026:3:4156 +1027:3:4164 +1028:3:4165 +1029:3:4170 +1030:3:4177 +1031:3:4178 +1032:3:4185 +1033:3:4190 +1034:0:4401 +1035:3:4201 +1036:0:4401 +1037:3:4205 +1038:3:4206 +1039:3:4210 +1040:3:4214 +1041:3:4215 +1042:3:4219 +1043:3:4227 +1044:3:4228 +1045:3:4233 +1046:3:4240 +1047:3:4241 +1048:3:4248 +1049:3:4253 +1050:0:4401 +1051:3:4264 +1052:0:4401 +1053:3:4272 +1054:3:4273 +1055:3:4277 +1056:3:4281 +1057:3:4282 +1058:3:4286 +1059:3:4294 +1060:3:4295 +1061:3:4300 +1062:3:4307 +1063:3:4308 +1064:3:4315 +1065:3:4320 +1066:0:4401 +1067:3:4335 +1068:0:4401 +1069:3:4337 +1070:0:4401 +1071:3:4338 +1072:0:4401 +1073:3:4341 +1074:0:4401 +1075:3:4346 +1076:0:4401 +1077:2:1236 +1078:0:4401 +1079:3:4347 +1080:0:4401 +1081:2:1242 +1082:0:4401 +1083:3:4346 +1084:0:4401 +1085:2:1243 +1086:0:4401 +1087:3:4347 +1088:0:4401 +1089:2:1244 +1090:0:4401 +1091:3:4346 +1092:0:4401 +1093:2:1245 +1094:0:4401 +1095:3:4347 +1096:0:4401 +1097:1:2 +1098:0:4401 +1099:3:4346 +1100:0:4401 +1101:2:1246 +1102:0:4401 +1103:3:4347 +1104:0:4401 +1105:1:8 +1106:0:4401 +1107:3:4346 +1108:0:4401 +1109:2:1245 +1110:0:4401 +1111:3:4347 +1112:0:4401 +1113:1:9 +1114:0:4401 +1115:3:4346 +1116:0:4401 +1117:2:1246 +1118:0:4401 +1119:3:4347 +1120:0:4401 +1121:1:10 +1122:0:4401 +1123:3:4346 +1124:0:4401 +1125:2:1245 +1126:0:4401 +1127:3:4347 +1128:0:4401 +1129:1:11 +1130:0:4401 +1131:3:4346 +1132:0:4401 +1133:2:1246 +1134:0:4401 +1135:3:4347 +1136:0:4401 +1137:1:14 +1138:0:4401 +1139:3:4346 +1140:0:4401 +1141:2:1245 +1142:0:4401 +1143:3:4347 +1144:0:4401 +1145:1:15 +1146:0:4401 +1147:3:4346 +1148:0:4401 +1149:2:1246 +1150:0:4401 +1151:3:4347 +1152:0:4401 +1153:1:16 +1154:1:20 +1155:1:21 +1156:1:29 +1157:1:30 +1158:1:34 +1159:1:35 +1160:1:43 +1161:1:48 +1162:1:52 +1163:1:53 +1164:1:60 +1165:1:61 +1166:1:72 +1167:1:73 +1168:1:74 +1169:1:85 +1170:1:90 +1171:1:91 +1172:0:4401 +1173:3:4346 +1174:0:4401 +1175:2:1245 +1176:0:4401 +1177:3:4347 +1178:0:4401 +1179:1:103 +1180:0:4401 +1181:3:4346 +1182:0:4401 +1183:2:1246 +1184:0:4401 +1185:3:4347 +1186:0:4401 +1187:2:1247 +1188:0:4401 +1189:3:4346 +1190:0:4401 +1191:2:1253 +1192:0:4401 +1193:3:4347 +1194:0:4401 +1195:2:1254 +1196:0:4399 +1197:3:4346 +1198:0:4405 +1199:3:4347 +1200:0:4405 +1201:2:1257 +1202:0:4405 +1203:3:4346 +1204:0:4405 +1205:2:1258 +1206:0:4405 +1207:3:4347 +1208:0:4405 +1209:2:1259 +1210:2:1263 +1211:2:1264 +1212:2:1272 +1213:2:1273 +1214:2:1277 +1215:2:1278 +1216:2:1286 +1217:2:1291 +1218:2:1295 +1219:2:1296 +1220:2:1303 +1221:2:1304 +1222:2:1315 +1223:2:1316 +1224:2:1317 +1225:2:1328 +1226:2:1333 +1227:2:1334 +1228:0:4405 +1229:3:4346 +1230:0:4405 +1231:2:1346 +1232:0:4405 +1233:3:4347 +1234:0:4405 +1235:2:1347 +1236:0:4405 +1237:3:4346 +1238:0:4405 +1239:1:104 +-1:-1:-1 +1240:0:4405 +1241:3:4347 +1242:0:4405 +1243:3:4346 +1244:0:4405 +1245:2:1348 +1246:0:4405 +1247:3:4347 +1248:0:4405 +1249:2:1347 +1250:0:4405 +1251:3:4346 +1252:0:4405 +1253:1:105 +1254:0:4405 +1255:3:4347 +1256:0:4405 +1257:3:4346 +1258:0:4405 +1259:2:1348 +1260:0:4405 +1261:3:4347 +1262:0:4405 +1263:2:1347 +1264:0:4405 +1265:3:4346 +1266:0:4405 +1267:1:104 diff --git a/formal-model/urcu/result-signal-over-writer/urcu_progress_writer.define b/formal-model/urcu/result-signal-over-writer/urcu_progress_writer.define new file mode 100644 index 0000000..1e4417f --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_progress_writer.define @@ -0,0 +1 @@ +#define WRITER_PROGRESS diff --git a/formal-model/urcu/result-signal-over-writer/urcu_progress_writer.log b/formal-model/urcu/result-signal-over-writer/urcu_progress_writer.log new file mode 100644 index 0000000..02c53cf --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_progress_writer.log @@ -0,0 +1,348 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define > pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_progress_writer.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -f -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 742) +depth 12: Claim reached state 9 (line 747) +depth 28: Claim reached state 9 (line 746) + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness enabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 10679, errors: 0 + 38555 states, stored (92500 visited) + 1044204 states, matched + 1136704 transitions (= visited+matched) + 3867169 atomic steps +hash conflicts: 8572 (resolved) + +Stats on memory usage (in Megabytes): + 3.089 equivalent memory usage for states (stored*(State-vector + overhead)) + 2.930 actual memory usage for states (compression: 94.87%) + state-vector as stored = 52 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 468.596 total actual memory usage + +unreached in proctype urcu_reader_sig + line 402, "pan.___", state 330, "(1)" + line 613, "pan.___", state 411, "-end-" + (2 of 411 states) +unreached in proctype urcu_writer + line 398, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 407, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 408, "pan.___", state 59, "(1)" + line 417, "pan.___", state 89, "(1)" + line 398, "pan.___", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 408, "pan.___", state 160, "(1)" + line 651, "pan.___", state 213, "(1)" + line 174, "pan.___", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 178, "pan.___", state 233, "(1)" + line 159, "pan.___", state 254, "(1)" + line 163, "pan.___", state 262, "(1)" + line 167, "pan.___", state 274, "(1)" + line 174, "pan.___", state 285, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 182, "pan.___", state 742, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 159, "pan.___", state 752, "(1)" + line 163, "pan.___", state 760, "(1)" + line 163, "pan.___", state 761, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 163, "pan.___", state 761, "else" + line 161, "pan.___", state 766, "((j<1))" + line 161, "pan.___", state 766, "((j>=1))" + line 167, "pan.___", state 772, "(1)" + line 167, "pan.___", state 773, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 167, "pan.___", state 773, "else" + line 169, "pan.___", state 776, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 169, "pan.___", state 776, "else" + line 174, "pan.___", state 783, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 182, "pan.___", state 805, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 167, "pan.___", state 835, "(1)" + line 167, "pan.___", state 836, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 174, "pan.___", state 850, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 174, "pan.___", state 852, "(1)" + line 178, "pan.___", state 859, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 178, "pan.___", state 861, "(1)" + line 178, "pan.___", state 862, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 178, "pan.___", state 862, "else" + line 176, "pan.___", state 867, "((j<1))" + line 176, "pan.___", state 867, "((j>=1))" + line 182, "pan.___", state 872, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 159, "pan.___", state 882, "(1)" + line 163, "pan.___", state 890, "(1)" + line 163, "pan.___", state 891, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 163, "pan.___", state 891, "else" + line 161, "pan.___", state 896, "((j<1))" + line 161, "pan.___", state 896, "((j>=1))" + line 167, "pan.___", state 902, "(1)" + line 167, "pan.___", state 903, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 167, "pan.___", state 903, "else" + line 169, "pan.___", state 906, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 169, "pan.___", state 906, "else" + line 201, "pan.___", state 908, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 201, "pan.___", state 908, "else" + line 220, "pan.___", state 909, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 220, "pan.___", state 909, "else" + line 355, "pan.___", state 915, "((sighand_exec==1))" + line 355, "pan.___", state 915, "else" + line 361, "pan.___", state 918, "sighand_exec = 1" + line 398, "pan.___", state 931, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 398, "pan.___", state 933, "(1)" + line 398, "pan.___", state 934, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 398, "pan.___", state 934, "else" + line 398, "pan.___", state 937, "(1)" + line 402, "pan.___", state 945, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 402, "pan.___", state 947, "(1)" + line 402, "pan.___", state 948, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 402, "pan.___", state 948, "else" + line 402, "pan.___", state 951, "(1)" + line 402, "pan.___", state 952, "(1)" + line 402, "pan.___", state 952, "(1)" + line 400, "pan.___", state 957, "((i<1))" + line 400, "pan.___", state 957, "((i>=1))" + line 407, "pan.___", state 963, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 408, "pan.___", state 976, "(1)" + line 408, "pan.___", state 977, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 408, "pan.___", state 977, "else" + line 408, "pan.___", state 980, "(1)" + line 408, "pan.___", state 981, "(1)" + line 408, "pan.___", state 981, "(1)" + line 412, "pan.___", state 989, "(1)" + line 412, "pan.___", state 990, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 412, "pan.___", state 990, "else" + line 412, "pan.___", state 993, "(1)" + line 412, "pan.___", state 994, "(1)" + line 412, "pan.___", state 994, "(1)" + line 410, "pan.___", state 999, "((i<1))" + line 410, "pan.___", state 999, "((i>=1))" + line 417, "pan.___", state 1006, "(1)" + line 417, "pan.___", state 1007, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 417, "pan.___", state 1007, "else" + line 417, "pan.___", state 1010, "(1)" + line 417, "pan.___", state 1011, "(1)" + line 417, "pan.___", state 1011, "(1)" + line 419, "pan.___", state 1014, "(1)" + line 419, "pan.___", state 1014, "(1)" + line 361, "pan.___", state 1023, "sighand_exec = 1" + line 402, "pan.___", state 1054, "(1)" + line 407, "pan.___", state 1070, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 417, "pan.___", state 1113, "(1)" + line 402, "pan.___", state 1151, "(1)" + line 407, "pan.___", state 1167, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 417, "pan.___", state 1210, "(1)" + line 398, "pan.___", state 1236, "(1)" + line 402, "pan.___", state 1250, "(1)" + line 407, "pan.___", state 1266, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 417, "pan.___", state 1309, "(1)" + line 402, "pan.___", state 1350, "(1)" + line 407, "pan.___", state 1366, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 417, "pan.___", state 1409, "(1)" + line 174, "pan.___", state 1430, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 174, "pan.___", state 1432, "(1)" + line 178, "pan.___", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 178, "pan.___", state 1441, "(1)" + line 178, "pan.___", state 1442, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 178, "pan.___", state 1442, "else" + line 176, "pan.___", state 1447, "((j<1))" + line 176, "pan.___", state 1447, "((j>=1))" + line 182, "pan.___", state 1452, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 159, "pan.___", state 1462, "(1)" + line 163, "pan.___", state 1470, "(1)" + line 163, "pan.___", state 1471, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 163, "pan.___", state 1471, "else" + line 161, "pan.___", state 1476, "((j<1))" + line 161, "pan.___", state 1476, "((j>=1))" + line 167, "pan.___", state 1482, "(1)" + line 167, "pan.___", state 1483, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 167, "pan.___", state 1483, "else" + line 169, "pan.___", state 1486, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 169, "pan.___", state 1486, "else" + line 174, "pan.___", state 1493, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 182, "pan.___", state 1515, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 167, "pan.___", state 1545, "(1)" + line 167, "pan.___", state 1546, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 174, "pan.___", state 1560, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 174, "pan.___", state 1562, "(1)" + line 178, "pan.___", state 1569, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 178, "pan.___", state 1571, "(1)" + line 178, "pan.___", state 1572, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 178, "pan.___", state 1572, "else" + line 176, "pan.___", state 1577, "((j<1))" + line 176, "pan.___", state 1577, "((j>=1))" + line 182, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 159, "pan.___", state 1592, "(1)" + line 163, "pan.___", state 1600, "(1)" + line 163, "pan.___", state 1601, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 163, "pan.___", state 1601, "else" + line 161, "pan.___", state 1606, "((j<1))" + line 161, "pan.___", state 1606, "((j>=1))" + line 167, "pan.___", state 1612, "(1)" + line 167, "pan.___", state 1613, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 167, "pan.___", state 1613, "else" + line 169, "pan.___", state 1616, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 169, "pan.___", state 1616, "else" + line 201, "pan.___", state 1618, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 201, "pan.___", state 1618, "else" + line 220, "pan.___", state 1619, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 220, "pan.___", state 1619, "else" + line 355, "pan.___", state 1625, "((sighand_exec==1))" + line 355, "pan.___", state 1625, "else" + line 361, "pan.___", state 1628, "sighand_exec = 1" + line 398, "pan.___", state 1641, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 398, "pan.___", state 1643, "(1)" + line 398, "pan.___", state 1644, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 398, "pan.___", state 1644, "else" + line 398, "pan.___", state 1647, "(1)" + line 402, "pan.___", state 1655, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 402, "pan.___", state 1657, "(1)" + line 402, "pan.___", state 1658, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 402, "pan.___", state 1658, "else" + line 402, "pan.___", state 1661, "(1)" + line 402, "pan.___", state 1662, "(1)" + line 402, "pan.___", state 1662, "(1)" + line 400, "pan.___", state 1667, "((i<1))" + line 400, "pan.___", state 1667, "((i>=1))" + line 407, "pan.___", state 1673, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 408, "pan.___", state 1686, "(1)" + line 408, "pan.___", state 1687, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 408, "pan.___", state 1687, "else" + line 408, "pan.___", state 1690, "(1)" + line 408, "pan.___", state 1691, "(1)" + line 408, "pan.___", state 1691, "(1)" + line 412, "pan.___", state 1699, "(1)" + line 412, "pan.___", state 1700, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 412, "pan.___", state 1700, "else" + line 412, "pan.___", state 1703, "(1)" + line 412, "pan.___", state 1704, "(1)" + line 412, "pan.___", state 1704, "(1)" + line 410, "pan.___", state 1709, "((i<1))" + line 410, "pan.___", state 1709, "((i>=1))" + line 417, "pan.___", state 1716, "(1)" + line 417, "pan.___", state 1717, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 417, "pan.___", state 1717, "else" + line 417, "pan.___", state 1720, "(1)" + line 417, "pan.___", state 1721, "(1)" + line 417, "pan.___", state 1721, "(1)" + line 419, "pan.___", state 1724, "(1)" + line 419, "pan.___", state 1724, "(1)" + line 361, "pan.___", state 1733, "sighand_exec = 1" + line 178, "pan.___", state 1758, "(1)" + line 182, "pan.___", state 1769, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 159, "pan.___", state 1779, "(1)" + line 163, "pan.___", state 1787, "(1)" + line 167, "pan.___", state 1799, "(1)" + line 174, "pan.___", state 1810, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-writer/urcu_progress_writer.spin.input.trail b/formal-model/urcu/result-signal-over-writer/urcu_progress_writer.spin.input.trail new file mode 100644 index 0000000..e65d663 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_progress_writer.spin.input.trail @@ -0,0 +1,9 @@ +-2:3:-2 +-4:-4:-4 +1:0:2679 +2:1:2673 +3:1:2674 +4:1:2675 +5:1:2676 +6:0:2685 +7:5:1129 diff --git a/formal-model/urcu/result-signal-over-writer/urcu_progress_writer_error.define b/formal-model/urcu/result-signal-over-writer/urcu_progress_writer_error.define new file mode 100644 index 0000000..8d304f5 --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_progress_writer_error.define @@ -0,0 +1,2 @@ +#define WRITER_PROGRESS +#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu/result-signal-over-writer/urcu_progress_writer_error.log b/formal-model/urcu/result-signal-over-writer/urcu_progress_writer_error.log new file mode 100644 index 0000000..cd4e32b --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_progress_writer_error.log @@ -0,0 +1,286 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define > pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_progress_writer_error.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -f -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 743) +depth 12: Claim reached state 9 (line 748) +depth 28: Claim reached state 9 (line 747) + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness enabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 10679, errors: 0 + 38555 states, stored (92500 visited) + 1044204 states, matched + 1136704 transitions (= visited+matched) + 3867169 atomic steps +hash conflicts: 6390 (resolved) + +Stats on memory usage (in Megabytes): + 3.089 equivalent memory usage for states (stored*(State-vector + overhead)) + 2.767 actual memory usage for states (compression: 89.58%) + state-vector as stored = 47 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 468.498 total actual memory usage + +unreached in proctype urcu_reader_sig + line 403, "pan.___", state 330, "(1)" + line 614, "pan.___", state 411, "-end-" + (2 of 411 states) +unreached in proctype urcu_writer + line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 409, "pan.___", state 59, "(1)" + line 418, "pan.___", state 89, "(1)" + line 399, "pan.___", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 409, "pan.___", state 160, "(1)" + line 652, "pan.___", state 213, "(1)" + line 175, "pan.___", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 179, "pan.___", state 233, "(1)" + line 160, "pan.___", state 254, "(1)" + line 164, "pan.___", state 262, "(1)" + line 168, "pan.___", state 274, "(1)" + line 175, "pan.___", state 285, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 408, "pan.___", state 753, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 409, "pan.___", state 766, "(1)" + line 409, "pan.___", state 767, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 409, "pan.___", state 767, "else" + line 409, "pan.___", state 770, "(1)" + line 409, "pan.___", state 771, "(1)" + line 409, "pan.___", state 771, "(1)" + line 413, "pan.___", state 779, "(1)" + line 413, "pan.___", state 780, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 413, "pan.___", state 780, "else" + line 413, "pan.___", state 783, "(1)" + line 413, "pan.___", state 784, "(1)" + line 413, "pan.___", state 784, "(1)" + line 411, "pan.___", state 789, "((i<1))" + line 411, "pan.___", state 789, "((i>=1))" + line 418, "pan.___", state 796, "(1)" + line 418, "pan.___", state 797, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 418, "pan.___", state 797, "else" + line 418, "pan.___", state 800, "(1)" + line 418, "pan.___", state 801, "(1)" + line 418, "pan.___", state 801, "(1)" + line 420, "pan.___", state 804, "(1)" + line 420, "pan.___", state 804, "(1)" + line 356, "pan.___", state 810, "((sighand_exec==1))" + line 356, "pan.___", state 810, "else" + line 362, "pan.___", state 813, "sighand_exec = 1" + line 399, "pan.___", state 826, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 399, "pan.___", state 828, "(1)" + line 399, "pan.___", state 829, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 399, "pan.___", state 829, "else" + line 399, "pan.___", state 832, "(1)" + line 403, "pan.___", state 840, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 403, "pan.___", state 842, "(1)" + line 403, "pan.___", state 843, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 403, "pan.___", state 843, "else" + line 403, "pan.___", state 846, "(1)" + line 403, "pan.___", state 847, "(1)" + line 403, "pan.___", state 847, "(1)" + line 401, "pan.___", state 852, "((i<1))" + line 401, "pan.___", state 852, "((i>=1))" + line 408, "pan.___", state 858, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 409, "pan.___", state 871, "(1)" + line 409, "pan.___", state 872, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 409, "pan.___", state 872, "else" + line 409, "pan.___", state 875, "(1)" + line 409, "pan.___", state 876, "(1)" + line 409, "pan.___", state 876, "(1)" + line 413, "pan.___", state 884, "(1)" + line 413, "pan.___", state 885, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 413, "pan.___", state 885, "else" + line 413, "pan.___", state 888, "(1)" + line 413, "pan.___", state 889, "(1)" + line 413, "pan.___", state 889, "(1)" + line 411, "pan.___", state 894, "((i<1))" + line 411, "pan.___", state 894, "((i>=1))" + line 418, "pan.___", state 901, "(1)" + line 418, "pan.___", state 902, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 418, "pan.___", state 902, "else" + line 418, "pan.___", state 905, "(1)" + line 418, "pan.___", state 906, "(1)" + line 418, "pan.___", state 906, "(1)" + line 420, "pan.___", state 909, "(1)" + line 420, "pan.___", state 909, "(1)" + line 362, "pan.___", state 918, "sighand_exec = 1" + line 403, "pan.___", state 949, "(1)" + line 408, "pan.___", state 965, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 418, "pan.___", state 1008, "(1)" + line 403, "pan.___", state 1046, "(1)" + line 408, "pan.___", state 1062, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 418, "pan.___", state 1105, "(1)" + line 399, "pan.___", state 1131, "(1)" + line 403, "pan.___", state 1145, "(1)" + line 408, "pan.___", state 1161, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 418, "pan.___", state 1204, "(1)" + line 403, "pan.___", state 1245, "(1)" + line 408, "pan.___", state 1261, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 418, "pan.___", state 1304, "(1)" + line 399, "pan.___", state 1326, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 399, "pan.___", state 1328, "(1)" + line 399, "pan.___", state 1329, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 399, "pan.___", state 1329, "else" + line 399, "pan.___", state 1332, "(1)" + line 403, "pan.___", state 1340, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 403, "pan.___", state 1342, "(1)" + line 403, "pan.___", state 1343, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 403, "pan.___", state 1343, "else" + line 403, "pan.___", state 1346, "(1)" + line 403, "pan.___", state 1347, "(1)" + line 403, "pan.___", state 1347, "(1)" + line 401, "pan.___", state 1352, "((i<1))" + line 401, "pan.___", state 1352, "((i>=1))" + line 408, "pan.___", state 1358, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 409, "pan.___", state 1371, "(1)" + line 409, "pan.___", state 1372, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 409, "pan.___", state 1372, "else" + line 409, "pan.___", state 1375, "(1)" + line 409, "pan.___", state 1376, "(1)" + line 409, "pan.___", state 1376, "(1)" + line 413, "pan.___", state 1384, "(1)" + line 413, "pan.___", state 1385, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 413, "pan.___", state 1385, "else" + line 413, "pan.___", state 1388, "(1)" + line 413, "pan.___", state 1389, "(1)" + line 413, "pan.___", state 1389, "(1)" + line 411, "pan.___", state 1394, "((i<1))" + line 411, "pan.___", state 1394, "((i>=1))" + line 418, "pan.___", state 1401, "(1)" + line 418, "pan.___", state 1402, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 418, "pan.___", state 1402, "else" + line 418, "pan.___", state 1405, "(1)" + line 418, "pan.___", state 1406, "(1)" + line 418, "pan.___", state 1406, "(1)" + line 420, "pan.___", state 1409, "(1)" + line 420, "pan.___", state 1409, "(1)" + line 356, "pan.___", state 1415, "((sighand_exec==1))" + line 356, "pan.___", state 1415, "else" + line 362, "pan.___", state 1418, "sighand_exec = 1" + line 399, "pan.___", state 1431, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" + line 399, "pan.___", state 1433, "(1)" + line 399, "pan.___", state 1434, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" + line 399, "pan.___", state 1434, "else" + line 399, "pan.___", state 1437, "(1)" + line 403, "pan.___", state 1445, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" + line 403, "pan.___", state 1447, "(1)" + line 403, "pan.___", state 1448, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" + line 403, "pan.___", state 1448, "else" + line 403, "pan.___", state 1451, "(1)" + line 403, "pan.___", state 1452, "(1)" + line 403, "pan.___", state 1452, "(1)" + line 401, "pan.___", state 1457, "((i<1))" + line 401, "pan.___", state 1457, "((i>=1))" + line 408, "pan.___", state 1463, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 409, "pan.___", state 1476, "(1)" + line 409, "pan.___", state 1477, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" + line 409, "pan.___", state 1477, "else" + line 409, "pan.___", state 1480, "(1)" + line 409, "pan.___", state 1481, "(1)" + line 409, "pan.___", state 1481, "(1)" + line 413, "pan.___", state 1489, "(1)" + line 413, "pan.___", state 1490, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" + line 413, "pan.___", state 1490, "else" + line 413, "pan.___", state 1493, "(1)" + line 413, "pan.___", state 1494, "(1)" + line 413, "pan.___", state 1494, "(1)" + line 411, "pan.___", state 1499, "((i<1))" + line 411, "pan.___", state 1499, "((i>=1))" + line 418, "pan.___", state 1506, "(1)" + line 418, "pan.___", state 1507, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" + line 418, "pan.___", state 1507, "else" + line 418, "pan.___", state 1510, "(1)" + line 418, "pan.___", state 1511, "(1)" + line 418, "pan.___", state 1511, "(1)" + line 420, "pan.___", state 1514, "(1)" + line 420, "pan.___", state 1514, "(1)" + line 362, "pan.___", state 1523, "sighand_exec = 1" + line 179, "pan.___", state 1548, "(1)" + line 183, "pan.___", state 1559, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" + line 160, "pan.___", state 1569, "(1)" + line 164, "pan.___", state 1577, "(1)" + line 168, "pan.___", state 1589, "(1)" + line 175, "pan.___", state 1600, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-signal-over-writer/urcu_progress_writer_error.spin.input.trail b/formal-model/urcu/result-signal-over-writer/urcu_progress_writer_error.spin.input.trail new file mode 100644 index 0000000..5b0eadd --- /dev/null +++ b/formal-model/urcu/result-signal-over-writer/urcu_progress_writer_error.spin.input.trail @@ -0,0 +1,4231 @@ +-2:3:-2 +-4:-4:-4 +1:0:2965 +2:3:2917 +3:3:2920 +4:3:2920 +5:3:2920 +6:3:2923 +7:3:2931 +8:3:2931 +9:3:2931 +10:3:2934 +11:3:2940 +12:3:2944 +13:3:2944 +14:3:2944 +15:3:2947 +16:3:2955 +17:3:2959 +18:3:2960 +19:0:2965 +20:3:2962 +21:0:2965 +22:2:1151 +23:0:2965 +24:2:1157 +25:0:2965 +26:2:1158 +27:0:2965 +28:2:1159 +29:2:1163 +30:2:1164 +31:2:1172 +32:2:1173 +33:2:1177 +34:2:1178 +35:2:1186 +36:2:1191 +37:2:1195 +38:2:1196 +39:2:1203 +40:2:1204 +41:2:1215 +42:2:1216 +43:2:1217 +44:2:1228 +45:2:1233 +46:2:1234 +47:0:2963 +48:2:1246 +49:0:2969 +50:2:1247 +51:0:2969 +52:1:2 +53:0:2969 +54:2:1248 +55:0:2969 +56:1:8 +57:0:2969 +58:1:9 +59:0:2969 +60:2:1247 +61:0:2969 +62:2:1248 +63:0:2969 +64:1:10 +65:0:2969 +66:2:1249 +67:0:2969 +68:2:1255 +69:2:1256 +70:0:2969 +71:2:1260 +72:2:1264 +73:2:1265 +74:2:1273 +75:2:1274 +76:2:1278 +77:2:1279 +78:2:1287 +79:2:1292 +80:2:1293 +81:2:1304 +82:2:1305 +83:2:1316 +84:2:1317 +85:2:1318 +86:2:1329 +87:2:1334 +88:2:1335 +89:0:2969 +90:2:1347 +91:0:2969 +92:2:1348 +93:0:2969 +94:1:13 +95:0:2969 +96:2:1349 +97:0:2969 +98:1:19 +99:0:2969 +100:1:20 +101:0:2969 +102:2:1348 +103:0:2969 +104:2:1349 +105:0:2969 +106:1:21 +107:1:25 +108:1:26 +109:1:34 +110:1:35 +111:1:39 +112:1:40 +113:1:48 +114:1:53 +115:1:57 +116:1:58 +117:1:65 +118:1:66 +119:1:77 +120:1:78 +121:1:79 +122:1:90 +123:1:95 +124:1:96 +125:0:2969 +126:2:1348 +127:0:2969 +128:2:1349 +129:0:2969 +130:1:108 +131:0:2969 +132:2:1348 +133:0:2969 +134:2:1349 +135:0:2969 +136:1:109 +137:1:113 +138:1:114 +139:1:122 +140:1:123 +141:1:127 +142:1:128 +143:1:136 +144:1:141 +145:1:145 +146:1:146 +147:1:153 +148:1:154 +149:1:165 +150:1:166 +151:1:167 +152:1:178 +153:1:183 +154:1:184 +155:0:2969 +156:1:196 +157:0:2969 +158:2:1348 +159:0:2969 +160:2:1349 +161:0:2969 +162:1:197 +163:0:2969 +164:2:1348 +165:0:2969 +166:2:1349 +167:0:2969 +168:1:198 +169:1:202 +170:1:203 +171:1:211 +172:1:212 +173:1:216 +174:1:217 +175:1:225 +176:1:230 +177:1:234 +178:1:235 +179:1:242 +180:1:243 +181:1:254 +182:1:255 +183:1:256 +184:1:267 +185:1:272 +186:1:273 +187:0:2969 +188:2:1348 +189:0:2969 +190:2:1349 +191:0:2969 +192:1:285 +193:0:2969 +194:1:486 +195:0:2969 +196:1:487 +197:0:2969 +198:1:20 +199:0:2969 +200:2:1348 +201:0:2969 +202:2:1349 +203:0:2969 +204:1:21 +205:1:25 +206:1:26 +207:1:34 +208:1:35 +209:1:36 +210:1:48 +211:1:53 +212:1:57 +213:1:58 +214:1:65 +215:1:66 +216:1:77 +217:1:78 +218:1:79 +219:1:90 +220:1:95 +221:1:96 +222:0:2969 +223:2:1348 +224:0:2969 +225:2:1349 +226:0:2969 +227:1:108 +228:0:2969 +229:2:1348 +230:0:2969 +231:2:1349 +232:0:2969 +233:1:109 +234:1:113 +235:1:114 +236:1:122 +237:1:123 +238:1:127 +239:1:128 +240:1:136 +241:1:141 +242:1:145 +243:1:146 +244:1:153 +245:1:154 +246:1:165 +247:1:166 +248:1:167 +249:1:178 +250:1:183 +251:1:184 +252:0:2969 +253:1:288 +254:0:2969 +255:2:1348 +256:0:2969 +257:2:1349 +258:0:2969 +259:1:289 +260:0:2969 +261:1:486 +262:0:2969 +263:1:487 +264:0:2969 +265:1:492 +266:0:2969 +267:2:1348 +268:0:2969 +269:2:1349 +270:0:2969 +271:1:497 +272:1:501 +273:1:502 +274:1:510 +275:1:511 +276:1:512 +277:1:524 +278:1:529 +279:1:533 +280:1:534 +281:1:541 +282:1:542 +283:1:553 +284:1:554 +285:1:555 +286:1:566 +287:1:571 +288:1:572 +289:0:2969 +290:2:1348 +291:0:2969 +292:2:1349 +293:0:2969 +294:1:584 +295:0:2969 +296:2:1348 +297:0:2969 +298:2:1349 +299:0:2969 +300:1:585 +301:1:589 +302:1:590 +303:1:598 +304:1:599 +305:1:603 +306:1:604 +307:1:612 +308:1:617 +309:1:621 +310:1:622 +311:1:629 +312:1:630 +313:1:641 +314:1:642 +315:1:643 +316:1:654 +317:1:659 +318:1:660 +319:0:2969 +320:2:1348 +321:0:2969 +322:2:1349 +323:0:2969 +324:1:672 +325:0:2969 +326:2:1348 +327:0:2969 +328:2:1349 +329:0:2969 +330:1:673 +331:1:677 +332:1:678 +333:1:686 +334:1:687 +335:1:691 +336:1:692 +337:1:700 +338:1:705 +339:1:709 +340:1:710 +341:1:717 +342:1:718 +343:1:729 +344:1:730 +345:1:731 +346:1:742 +347:1:747 +348:1:748 +349:0:2969 +350:2:1348 +351:0:2969 +352:2:1349 +353:0:2969 +354:1:760 +355:0:2969 +356:1:761 +357:0:2969 +358:1:762 +359:0:2969 +360:1:955 +361:0:2969 +362:1:956 +363:0:2969 +364:2:1348 +365:0:2969 +366:2:1349 +367:0:2969 +368:1:960 +369:0:2969 +370:2:1348 +371:0:2969 +372:2:1349 +373:0:2969 +374:1:961 +375:1:965 +376:1:966 +377:1:974 +378:1:975 +379:1:979 +380:1:980 +381:1:988 +382:1:993 +383:1:997 +384:1:998 +385:1:1005 +386:1:1006 +387:1:1017 +388:1:1018 +389:1:1019 +390:1:1030 +391:1:1035 +392:1:1036 +393:0:2969 +394:2:1348 +395:0:2969 +396:2:1349 +397:0:2969 +398:1:1048 +399:0:2969 +400:1:762 +401:0:2969 +402:1:955 +403:0:2969 +404:1:956 +405:0:2969 +406:2:1348 +407:0:2969 +408:2:1349 +409:0:2969 +410:1:960 +411:0:2969 +412:2:1348 +413:0:2969 +414:2:1349 +415:0:2969 +416:1:961 +417:1:965 +418:1:966 +419:1:974 +420:1:975 +421:1:976 +422:1:988 +423:1:993 +424:1:997 +425:1:998 +426:1:1005 +427:1:1006 +428:1:1017 +429:1:1018 +430:1:1019 +431:1:1030 +432:1:1035 +433:1:1036 +434:0:2969 +435:2:1348 +436:0:2969 +437:2:1349 +438:0:2969 +439:1:1048 +440:0:2969 +441:1:1052 +442:0:2969 +443:2:1348 +444:0:2969 +445:2:1349 +446:0:2969 +447:1:1057 +448:1:1061 +449:1:1062 +450:1:1070 +451:1:1071 +452:1:1072 +453:1:1084 +454:1:1089 +455:1:1093 +456:1:1094 +457:1:1101 +458:1:1102 +459:1:1113 +460:1:1114 +461:1:1115 +462:1:1126 +463:1:1131 +464:1:1132 +465:0:2969 +466:1:9 +467:0:2969 +468:2:1348 +469:0:2969 +470:2:1349 +471:0:2969 +472:1:10 +473:0:2969 +474:2:1350 +475:0:2969 +476:2:1356 +477:0:2969 +478:2:1357 +479:0:2969 +480:2:1367 +481:0:2969 +482:2:1368 +483:0:2969 +484:2:1372 +485:2:1373 +486:2:1377 +487:2:1381 +488:2:1382 +489:2:1386 +490:2:1394 +491:2:1395 +492:2:1400 +493:2:1407 +494:2:1408 +495:2:1415 +496:2:1420 +497:0:2969 +498:2:1431 +499:0:2969 +500:2:1435 +501:2:1436 +502:2:1440 +503:2:1444 +504:2:1445 +505:2:1449 +506:2:1457 +507:2:1458 +508:2:1463 +509:2:1470 +510:2:1471 +511:2:1478 +512:2:1483 +513:0:2969 +514:2:1494 +515:0:2969 +516:2:1502 +517:2:1503 +518:2:1507 +519:2:1511 +520:2:1512 +521:2:1516 +522:2:1524 +523:2:1525 +524:2:1530 +525:2:1537 +526:2:1538 +527:2:1545 +528:2:1550 +529:0:2969 +530:2:1565 +531:0:2969 +532:2:1566 +533:0:2969 +534:1:13 +535:0:2969 +536:2:1567 +537:0:2969 +538:1:19 +539:0:2969 +540:1:20 +541:0:2969 +542:2:1566 +543:0:2969 +544:2:1567 +545:0:2969 +546:1:21 +547:1:25 +548:1:26 +549:1:34 +550:1:35 +551:1:39 +552:1:40 +553:1:48 +554:1:53 +555:1:57 +556:1:58 +557:1:65 +558:1:66 +559:1:77 +560:1:78 +561:1:79 +562:1:90 +563:1:95 +564:1:96 +565:0:2969 +566:2:1566 +567:0:2969 +568:2:1567 +569:0:2969 +570:1:108 +571:0:2969 +572:2:1566 +573:0:2969 +574:2:1567 +575:0:2969 +576:1:109 +577:1:113 +578:1:114 +579:1:122 +580:1:123 +581:1:127 +582:1:128 +583:1:136 +584:1:141 +585:1:145 +586:1:146 +587:1:153 +588:1:154 +589:1:165 +590:1:166 +591:1:167 +592:1:178 +593:1:183 +594:1:184 +595:0:2969 +596:1:196 +597:0:2969 +598:2:1566 +599:0:2969 +600:2:1567 +601:0:2969 +602:1:197 +603:0:2969 +604:2:1566 +605:0:2969 +606:2:1567 +607:0:2969 +608:1:198 +609:1:202 +610:1:203 +611:1:211 +612:1:212 +613:1:216 +614:1:217 +615:1:225 +616:1:230 +617:1:234 +618:1:235 +619:1:242 +620:1:243 +621:1:254 +622:1:255 +623:1:256 +624:1:267 +625:1:272 +626:1:273 +627:0:2969 +628:2:1566 +629:0:2969 +630:2:1567 +631:0:2969 +632:1:285 +633:0:2969 +634:1:486 +635:0:2969 +636:1:487 +637:0:2969 +638:1:20 +639:0:2969 +640:2:1566 +641:0:2969 +642:2:1567 +643:0:2969 +644:1:21 +645:1:25 +646:1:26 +647:1:34 +648:1:35 +649:1:36 +650:1:48 +651:1:53 +652:1:57 +653:1:58 +654:1:65 +655:1:66 +656:1:77 +657:1:78 +658:1:79 +659:1:90 +660:1:95 +661:1:96 +662:0:2969 +663:2:1566 +664:0:2969 +665:2:1567 +666:0:2969 +667:1:108 +668:0:2969 +669:2:1566 +670:0:2969 +671:2:1567 +672:0:2969 +673:1:109 +674:1:113 +675:1:114 +676:1:122 +677:1:123 +678:1:127 +679:1:128 +680:1:136 +681:1:141 +682:1:145 +683:1:146 +684:1:153 +685:1:154 +686:1:165 +687:1:166 +688:1:167 +689:1:178 +690:1:183 +691:1:184 +692:0:2969 +693:1:288 +694:0:2969 +695:2:1566 +696:0:2969 +697:2:1567 +698:0:2969 +699:1:289 +700:0:2969 +701:1:486 +702:0:2969 +703:1:487 +704:0:2969 +705:1:492 +706:0:2969 +707:2:1566 +708:0:2969 +709:2:1567 +710:0:2969 +711:1:497 +712:1:501 +713:1:502 +714:1:510 +715:1:511 +716:1:512 +717:1:524 +718:1:529 +719:1:533 +720:1:534 +721:1:541 +722:1:542 +723:1:553 +724:1:554 +725:1:555 +726:1:566 +727:1:571 +728:1:572 +729:0:2969 +730:2:1566 +731:0:2969 +732:2:1567 +733:0:2969 +734:1:584 +735:0:2969 +736:2:1566 +737:0:2969 +738:2:1567 +739:0:2969 +740:1:585 +741:1:589 +742:1:590 +743:1:598 +744:1:599 +745:1:603 +746:1:604 +747:1:612 +748:1:617 +749:1:621 +750:1:622 +751:1:629 +752:1:630 +753:1:641 +754:1:642 +755:1:643 +756:1:654 +757:1:659 +758:1:660 +759:0:2969 +760:2:1566 +761:0:2969 +762:2:1567 +763:0:2969 +764:1:672 +765:0:2969 +766:2:1566 +767:0:2969 +768:2:1567 +769:0:2969 +770:1:673 +771:1:677 +772:1:678 +773:1:686 +774:1:687 +775:1:691 +776:1:692 +777:1:700 +778:1:705 +779:1:709 +780:1:710 +781:1:717 +782:1:718 +783:1:729 +784:1:730 +785:1:731 +786:1:742 +787:1:747 +788:1:748 +789:0:2969 +790:2:1566 +791:0:2969 +792:2:1567 +793:0:2969 +794:1:760 +795:0:2969 +796:1:761 +797:0:2969 +798:1:762 +799:0:2969 +800:1:955 +801:0:2969 +802:1:956 +803:0:2969 +804:2:1566 +805:0:2969 +806:2:1567 +807:0:2969 +808:1:960 +809:0:2969 +810:2:1566 +811:0:2969 +812:2:1567 +813:0:2969 +814:1:961 +815:1:965 +816:1:966 +817:1:974 +818:1:975 +819:1:979 +820:1:980 +821:1:988 +822:1:993 +823:1:997 +824:1:998 +825:1:1005 +826:1:1006 +827:1:1017 +828:1:1018 +829:1:1019 +830:1:1030 +831:1:1035 +832:1:1036 +833:0:2969 +834:2:1566 +835:0:2969 +836:2:1567 +837:0:2969 +838:1:1048 +839:0:2969 +840:1:762 +841:0:2969 +842:1:955 +843:0:2969 +844:1:956 +845:0:2969 +846:2:1566 +847:0:2969 +848:2:1567 +849:0:2969 +850:1:960 +851:0:2969 +852:2:1566 +853:0:2969 +854:2:1567 +855:0:2969 +856:1:961 +857:1:965 +858:1:966 +859:1:974 +860:1:975 +861:1:976 +862:1:988 +863:1:993 +864:1:997 +865:1:998 +866:1:1005 +867:1:1006 +868:1:1017 +869:1:1018 +870:1:1019 +871:1:1030 +872:1:1035 +873:1:1036 +874:0:2969 +875:2:1566 +876:0:2969 +877:2:1567 +878:0:2969 +879:1:1048 +880:0:2969 +881:1:1052 +882:0:2969 +883:2:1566 +884:0:2969 +885:2:1567 +886:0:2969 +887:1:1057 +888:1:1061 +889:1:1062 +890:1:1070 +891:1:1071 +892:1:1072 +893:1:1084 +894:1:1089 +895:1:1093 +896:1:1094 +897:1:1101 +898:1:1102 +899:1:1113 +900:1:1114 +901:1:1115 +902:1:1126 +903:1:1131 +904:1:1132 +905:0:2969 +906:1:9 +907:0:2969 +908:2:1566 +909:0:2969 +910:2:1567 +911:0:2969 +912:1:10 +913:0:2969 +914:2:1568 +915:0:2969 +916:2:1574 +917:0:2969 +918:2:1575 +919:2:1579 +920:2:1580 +921:2:1588 +922:2:1589 +923:2:1593 +924:2:1594 +925:2:1602 +926:2:1607 +927:2:1611 +928:2:1612 +929:2:1619 +930:2:1620 +931:2:1631 +932:2:1632 +933:2:1633 +934:2:1644 +935:2:1649 +936:2:1650 +937:0:2969 +938:2:1662 +939:0:2969 +940:2:1663 +941:0:2969 +942:1:13 +943:0:2969 +944:2:1664 +945:0:2969 +946:1:19 +947:0:2969 +948:1:20 +949:0:2969 +950:2:1663 +951:0:2969 +952:2:1664 +953:0:2969 +954:1:21 +955:1:25 +956:1:26 +957:1:34 +958:1:35 +959:1:39 +960:1:40 +961:1:48 +962:1:53 +963:1:57 +964:1:58 +965:1:65 +966:1:66 +967:1:77 +968:1:78 +969:1:79 +970:1:90 +971:1:95 +972:1:96 +973:0:2969 +974:2:1663 +975:0:2969 +976:2:1664 +977:0:2969 +978:1:108 +979:0:2969 +980:2:1663 +981:0:2969 +982:2:1664 +983:0:2969 +984:1:109 +985:1:113 +986:1:114 +987:1:122 +988:1:123 +989:1:127 +990:1:128 +991:1:136 +992:1:141 +993:1:145 +994:1:146 +995:1:153 +996:1:154 +997:1:165 +998:1:166 +999:1:167 +1000:1:178 +1001:1:183 +1002:1:184 +1003:0:2969 +1004:1:196 +1005:0:2969 +1006:2:1663 +1007:0:2969 +1008:2:1664 +1009:0:2969 +1010:1:197 +1011:0:2969 +1012:2:1663 +1013:0:2969 +1014:2:1664 +1015:0:2969 +1016:1:198 +1017:1:202 +1018:1:203 +1019:1:211 +1020:1:212 +1021:1:216 +1022:1:217 +1023:1:225 +1024:1:230 +1025:1:234 +1026:1:235 +1027:1:242 +1028:1:243 +1029:1:254 +1030:1:255 +1031:1:256 +1032:1:267 +1033:1:272 +1034:1:273 +1035:0:2969 +1036:2:1663 +1037:0:2969 +1038:2:1664 +1039:0:2969 +1040:1:285 +1041:0:2969 +1042:1:486 +1043:0:2969 +1044:1:487 +1045:0:2969 +1046:1:20 +1047:0:2969 +1048:2:1663 +1049:0:2969 +1050:2:1664 +1051:0:2969 +1052:1:21 +1053:1:25 +1054:1:26 +1055:1:34 +1056:1:35 +1057:1:36 +1058:1:48 +1059:1:53 +1060:1:57 +1061:1:58 +1062:1:65 +1063:1:66 +1064:1:77 +1065:1:78 +1066:1:79 +1067:1:90 +1068:1:95 +1069:1:96 +1070:0:2969 +1071:2:1663 +1072:0:2969 +1073:2:1664 +1074:0:2969 +1075:1:108 +1076:0:2969 +1077:2:1663 +1078:0:2969 +1079:2:1664 +1080:0:2969 +1081:1:109 +1082:1:113 +1083:1:114 +1084:1:122 +1085:1:123 +1086:1:127 +1087:1:128 +1088:1:136 +1089:1:141 +1090:1:145 +1091:1:146 +1092:1:153 +1093:1:154 +1094:1:165 +1095:1:166 +1096:1:167 +1097:1:178 +1098:1:183 +1099:1:184 +1100:0:2969 +1101:1:288 +1102:0:2969 +1103:2:1663 +1104:0:2969 +1105:2:1664 +1106:0:2969 +1107:1:289 +1108:0:2969 +1109:1:486 +1110:0:2969 +1111:1:487 +1112:0:2969 +1113:1:492 +1114:0:2969 +1115:2:1663 +1116:0:2969 +1117:2:1664 +1118:0:2969 +1119:1:497 +1120:1:501 +1121:1:502 +1122:1:510 +1123:1:511 +1124:1:512 +1125:1:524 +1126:1:529 +1127:1:533 +1128:1:534 +1129:1:541 +1130:1:542 +1131:1:553 +1132:1:554 +1133:1:555 +1134:1:566 +1135:1:571 +1136:1:572 +1137:0:2969 +1138:2:1663 +1139:0:2969 +1140:2:1664 +1141:0:2969 +1142:1:584 +1143:0:2969 +1144:2:1663 +1145:0:2969 +1146:2:1664 +1147:0:2969 +1148:1:585 +1149:1:589 +1150:1:590 +1151:1:598 +1152:1:599 +1153:1:603 +1154:1:604 +1155:1:612 +1156:1:617 +1157:1:621 +1158:1:622 +1159:1:629 +1160:1:630 +1161:1:641 +1162:1:642 +1163:1:643 +1164:1:654 +1165:1:659 +1166:1:660 +1167:0:2969 +1168:2:1663 +1169:0:2969 +1170:2:1664 +1171:0:2969 +1172:1:672 +1173:0:2969 +1174:2:1663 +1175:0:2969 +1176:2:1664 +1177:0:2969 +1178:1:673 +1179:1:677 +1180:1:678 +1181:1:686 +1182:1:687 +1183:1:691 +1184:1:692 +1185:1:700 +1186:1:705 +1187:1:709 +1188:1:710 +1189:1:717 +1190:1:718 +1191:1:729 +1192:1:730 +1193:1:731 +1194:1:742 +1195:1:747 +1196:1:748 +1197:0:2969 +1198:2:1663 +1199:0:2969 +1200:2:1664 +1201:0:2969 +1202:1:760 +1203:0:2969 +1204:1:761 +1205:0:2969 +1206:1:762 +1207:0:2969 +1208:1:955 +1209:0:2969 +1210:1:956 +1211:0:2969 +1212:2:1663 +1213:0:2969 +1214:2:1664 +1215:0:2969 +1216:1:960 +1217:0:2969 +1218:2:1663 +1219:0:2969 +1220:2:1664 +1221:0:2969 +1222:1:961 +1223:1:965 +1224:1:966 +1225:1:974 +1226:1:975 +1227:1:979 +1228:1:980 +1229:1:988 +1230:1:993 +1231:1:997 +1232:1:998 +1233:1:1005 +1234:1:1006 +1235:1:1017 +1236:1:1018 +1237:1:1019 +1238:1:1030 +1239:1:1035 +1240:1:1036 +1241:0:2969 +1242:2:1663 +1243:0:2969 +1244:2:1664 +1245:0:2969 +1246:1:1048 +1247:0:2969 +1248:1:762 +1249:0:2969 +1250:1:955 +1251:0:2969 +1252:1:956 +1253:0:2969 +1254:2:1663 +1255:0:2969 +1256:2:1664 +1257:0:2969 +1258:1:960 +1259:0:2969 +1260:2:1663 +1261:0:2969 +1262:2:1664 +1263:0:2969 +1264:1:961 +1265:1:965 +1266:1:966 +1267:1:974 +1268:1:975 +1269:1:976 +1270:1:988 +1271:1:993 +1272:1:997 +1273:1:998 +1274:1:1005 +1275:1:1006 +1276:1:1017 +1277:1:1018 +1278:1:1019 +1279:1:1030 +1280:1:1035 +1281:1:1036 +1282:0:2969 +1283:2:1663 +1284:0:2969 +1285:2:1664 +1286:0:2969 +1287:1:1048 +1288:0:2969 +1289:1:1052 +1290:0:2969 +1291:2:1663 +1292:0:2969 +1293:2:1664 +1294:0:2969 +1295:1:1057 +1296:1:1061 +1297:1:1062 +1298:1:1070 +1299:1:1071 +1300:1:1072 +1301:1:1084 +1302:1:1089 +1303:1:1093 +1304:1:1094 +1305:1:1101 +1306:1:1102 +1307:1:1113 +1308:1:1114 +1309:1:1115 +1310:1:1126 +1311:1:1131 +1312:1:1132 +1313:0:2969 +1314:1:9 +1315:0:2969 +1316:2:1663 +1317:0:2969 +1318:2:1664 +1319:0:2969 +1320:1:10 +1321:0:2969 +1322:2:1665 +1323:0:2969 +1324:2:1671 +1325:0:2969 +1326:2:1674 +1327:2:1675 +1328:2:1687 +1329:2:1688 +1330:2:1692 +1331:2:1693 +1332:2:1701 +1333:2:1706 +1334:2:1710 +1335:2:1711 +1336:2:1718 +1337:2:1719 +1338:2:1730 +1339:2:1731 +1340:2:1732 +1341:2:1743 +1342:2:1748 +1343:2:1749 +1344:0:2969 +1345:2:1761 +1346:0:2969 +1347:2:1762 +1348:0:2969 +1349:1:13 +1350:0:2969 +1351:2:1763 +1352:0:2969 +1353:1:19 +1354:0:2969 +1355:1:20 +1356:0:2969 +1357:2:1762 +1358:0:2969 +1359:2:1763 +1360:0:2969 +1361:1:21 +1362:1:25 +1363:1:26 +1364:1:34 +1365:1:35 +1366:1:39 +1367:1:40 +1368:1:48 +1369:1:53 +1370:1:57 +1371:1:58 +1372:1:65 +1373:1:66 +1374:1:77 +1375:1:78 +1376:1:79 +1377:1:90 +1378:1:95 +1379:1:96 +1380:0:2969 +1381:2:1762 +1382:0:2969 +1383:2:1763 +1384:0:2969 +1385:1:108 +1386:0:2969 +1387:2:1762 +1388:0:2969 +1389:2:1763 +1390:0:2969 +1391:1:109 +1392:1:113 +1393:1:114 +1394:1:122 +1395:1:123 +1396:1:127 +1397:1:128 +1398:1:136 +1399:1:141 +1400:1:145 +1401:1:146 +1402:1:153 +1403:1:154 +1404:1:165 +1405:1:166 +1406:1:167 +1407:1:178 +1408:1:183 +1409:1:184 +1410:0:2969 +1411:1:196 +1412:0:2969 +1413:2:1762 +1414:0:2969 +1415:2:1763 +1416:0:2969 +1417:1:197 +1418:0:2969 +1419:2:1762 +1420:0:2969 +1421:2:1763 +1422:0:2969 +1423:1:198 +1424:1:202 +1425:1:203 +1426:1:211 +1427:1:212 +1428:1:216 +1429:1:217 +1430:1:225 +1431:1:230 +1432:1:234 +1433:1:235 +1434:1:242 +1435:1:243 +1436:1:254 +1437:1:255 +1438:1:256 +1439:1:267 +1440:1:272 +1441:1:273 +1442:0:2969 +1443:2:1762 +1444:0:2969 +1445:2:1763 +1446:0:2969 +1447:1:285 +1448:0:2969 +1449:1:486 +1450:0:2969 +1451:1:487 +1452:0:2969 +1453:1:20 +1454:0:2969 +1455:2:1762 +1456:0:2969 +1457:2:1763 +1458:0:2969 +1459:1:21 +1460:1:25 +1461:1:26 +1462:1:34 +1463:1:35 +1464:1:36 +1465:1:48 +1466:1:53 +1467:1:57 +1468:1:58 +1469:1:65 +1470:1:66 +1471:1:77 +1472:1:78 +1473:1:79 +1474:1:90 +1475:1:95 +1476:1:96 +1477:0:2969 +1478:2:1762 +1479:0:2969 +1480:2:1763 +1481:0:2969 +1482:1:108 +1483:0:2969 +1484:2:1762 +1485:0:2969 +1486:2:1763 +1487:0:2969 +1488:1:109 +1489:1:113 +1490:1:114 +1491:1:122 +1492:1:123 +1493:1:127 +1494:1:128 +1495:1:136 +1496:1:141 +1497:1:145 +1498:1:146 +1499:1:153 +1500:1:154 +1501:1:165 +1502:1:166 +1503:1:167 +1504:1:178 +1505:1:183 +1506:1:184 +1507:0:2969 +1508:1:288 +1509:0:2969 +1510:2:1762 +1511:0:2969 +1512:2:1763 +1513:0:2969 +1514:1:289 +1515:0:2969 +1516:1:486 +1517:0:2969 +1518:1:487 +1519:0:2969 +1520:1:492 +1521:0:2969 +1522:2:1762 +1523:0:2969 +1524:2:1763 +1525:0:2969 +1526:1:497 +1527:1:501 +1528:1:502 +1529:1:510 +1530:1:511 +1531:1:512 +1532:1:524 +1533:1:529 +1534:1:533 +1535:1:534 +1536:1:541 +1537:1:542 +1538:1:553 +1539:1:554 +1540:1:555 +1541:1:566 +1542:1:571 +1543:1:572 +1544:0:2969 +1545:2:1762 +1546:0:2969 +1547:2:1763 +1548:0:2969 +1549:1:584 +1550:0:2969 +1551:2:1762 +1552:0:2969 +1553:2:1763 +1554:0:2969 +1555:1:585 +1556:1:589 +1557:1:590 +1558:1:598 +1559:1:599 +1560:1:603 +1561:1:604 +1562:1:612 +1563:1:617 +1564:1:621 +1565:1:622 +1566:1:629 +1567:1:630 +1568:1:641 +1569:1:642 +1570:1:643 +1571:1:654 +1572:1:659 +1573:1:660 +1574:0:2969 +1575:2:1762 +1576:0:2969 +1577:2:1763 +1578:0:2969 +1579:1:672 +1580:0:2969 +1581:2:1762 +1582:0:2969 +1583:2:1763 +1584:0:2969 +1585:1:673 +1586:1:677 +1587:1:678 +1588:1:686 +1589:1:687 +1590:1:691 +1591:1:692 +1592:1:700 +1593:1:705 +1594:1:709 +1595:1:710 +1596:1:717 +1597:1:718 +1598:1:729 +1599:1:730 +1600:1:731 +1601:1:742 +1602:1:747 +1603:1:748 +1604:0:2969 +1605:2:1762 +1606:0:2969 +1607:2:1763 +1608:0:2969 +1609:1:760 +1610:0:2969 +1611:1:761 +1612:0:2969 +1613:1:762 +1614:0:2969 +1615:1:955 +1616:0:2969 +1617:1:956 +1618:0:2969 +1619:2:1762 +1620:0:2969 +1621:2:1763 +1622:0:2969 +1623:1:960 +1624:0:2969 +1625:2:1762 +1626:0:2969 +1627:2:1763 +1628:0:2969 +1629:1:961 +1630:1:965 +1631:1:966 +1632:1:974 +1633:1:975 +1634:1:979 +1635:1:980 +1636:1:988 +1637:1:993 +1638:1:997 +1639:1:998 +1640:1:1005 +1641:1:1006 +1642:1:1017 +1643:1:1018 +1644:1:1019 +1645:1:1030 +1646:1:1035 +1647:1:1036 +1648:0:2969 +1649:2:1762 +1650:0:2969 +1651:2:1763 +1652:0:2969 +1653:1:1048 +1654:0:2969 +1655:1:762 +1656:0:2969 +1657:1:955 +1658:0:2969 +1659:1:956 +1660:0:2969 +1661:2:1762 +1662:0:2969 +1663:2:1763 +1664:0:2969 +1665:1:960 +1666:0:2969 +1667:2:1762 +1668:0:2969 +1669:2:1763 +1670:0:2969 +1671:1:961 +1672:1:965 +1673:1:966 +1674:1:974 +1675:1:975 +1676:1:976 +1677:1:988 +1678:1:993 +1679:1:997 +1680:1:998 +1681:1:1005 +1682:1:1006 +1683:1:1017 +1684:1:1018 +1685:1:1019 +1686:1:1030 +1687:1:1035 +1688:1:1036 +1689:0:2969 +1690:2:1762 +1691:0:2969 +1692:2:1763 +1693:0:2969 +1694:1:1048 +1695:0:2969 +1696:1:1052 +1697:0:2969 +1698:2:1762 +1699:0:2969 +1700:2:1763 +1701:0:2969 +1702:1:1057 +1703:1:1061 +1704:1:1062 +1705:1:1070 +1706:1:1071 +1707:1:1072 +1708:1:1084 +1709:1:1089 +1710:1:1093 +1711:1:1094 +1712:1:1101 +1713:1:1102 +1714:1:1113 +1715:1:1114 +1716:1:1115 +1717:1:1126 +1718:1:1131 +1719:1:1132 +1720:0:2969 +1721:1:9 +1722:0:2969 +1723:2:1762 +1724:0:2969 +1725:2:1763 +1726:0:2969 +1727:1:10 +1728:0:2969 +1729:2:1764 +1730:0:2969 +1731:2:1770 +1732:0:2969 +1733:2:1771 +1734:0:2969 +1735:2:1772 +1736:0:2969 +1737:2:1773 +1738:0:2969 +1739:2:1774 +1740:2:1778 +1741:2:1779 +1742:2:1787 +1743:2:1788 +1744:2:1792 +1745:2:1793 +1746:2:1801 +1747:2:1806 +1748:2:1810 +1749:2:1811 +1750:2:1818 +1751:2:1819 +1752:2:1830 +1753:2:1831 +1754:2:1832 +1755:2:1843 +1756:2:1848 +1757:2:1849 +1758:0:2969 +1759:2:1861 +1760:0:2969 +1761:2:1862 +1762:0:2969 +1763:1:13 +1764:0:2969 +1765:2:1863 +1766:0:2969 +1767:1:19 +1768:0:2969 +1769:1:20 +1770:0:2969 +1771:2:1862 +1772:0:2969 +1773:2:1863 +1774:0:2969 +1775:1:21 +1776:1:25 +1777:1:26 +1778:1:34 +1779:1:35 +1780:1:39 +1781:1:40 +1782:1:48 +1783:1:53 +1784:1:57 +1785:1:58 +1786:1:65 +1787:1:66 +1788:1:77 +1789:1:78 +1790:1:79 +1791:1:90 +1792:1:95 +1793:1:96 +1794:0:2969 +1795:2:1862 +1796:0:2969 +1797:2:1863 +1798:0:2969 +1799:1:108 +1800:0:2969 +1801:2:1862 +1802:0:2969 +1803:2:1863 +1804:0:2969 +1805:1:109 +1806:1:113 +1807:1:114 +1808:1:122 +1809:1:123 +1810:1:127 +1811:1:128 +1812:1:136 +1813:1:141 +1814:1:145 +1815:1:146 +1816:1:153 +1817:1:154 +1818:1:165 +1819:1:166 +1820:1:167 +1821:1:178 +1822:1:183 +1823:1:184 +1824:0:2969 +1825:1:196 +1826:0:2969 +1827:2:1862 +1828:0:2969 +1829:2:1863 +1830:0:2969 +1831:1:197 +1832:0:2969 +1833:2:1862 +1834:0:2969 +1835:2:1863 +1836:0:2969 +1837:1:198 +1838:1:202 +1839:1:203 +1840:1:211 +1841:1:212 +1842:1:216 +1843:1:217 +1844:1:225 +1845:1:230 +1846:1:234 +1847:1:235 +1848:1:242 +1849:1:243 +1850:1:254 +1851:1:255 +1852:1:256 +1853:1:267 +1854:1:272 +1855:1:273 +1856:0:2969 +1857:2:1862 +1858:0:2969 +1859:2:1863 +1860:0:2969 +1861:1:285 +1862:0:2969 +1863:1:486 +1864:0:2969 +1865:1:487 +1866:0:2969 +1867:1:20 +1868:0:2969 +1869:2:1862 +1870:0:2969 +1871:2:1863 +1872:0:2969 +1873:1:21 +1874:1:25 +1875:1:26 +1876:1:34 +1877:1:35 +1878:1:36 +1879:1:48 +1880:1:53 +1881:1:57 +1882:1:58 +1883:1:65 +1884:1:66 +1885:1:77 +1886:1:78 +1887:1:79 +1888:1:90 +1889:1:95 +1890:1:96 +1891:0:2969 +1892:2:1862 +1893:0:2969 +1894:2:1863 +1895:0:2969 +1896:1:108 +1897:0:2969 +1898:2:1862 +1899:0:2969 +1900:2:1863 +1901:0:2969 +1902:1:109 +1903:1:113 +1904:1:114 +1905:1:122 +1906:1:123 +1907:1:127 +1908:1:128 +1909:1:136 +1910:1:141 +1911:1:145 +1912:1:146 +1913:1:153 +1914:1:154 +1915:1:165 +1916:1:166 +1917:1:167 +1918:1:178 +1919:1:183 +1920:1:184 +1921:0:2969 +1922:1:288 +1923:0:2969 +1924:2:1862 +1925:0:2969 +1926:2:1863 +1927:0:2969 +1928:1:289 +1929:0:2969 +1930:1:486 +1931:0:2969 +1932:1:487 +1933:0:2969 +1934:1:492 +1935:0:2969 +1936:2:1862 +1937:0:2969 +1938:2:1863 +1939:0:2969 +1940:1:497 +1941:1:501 +1942:1:502 +1943:1:510 +1944:1:511 +1945:1:512 +1946:1:524 +1947:1:529 +1948:1:533 +1949:1:534 +1950:1:541 +1951:1:542 +1952:1:553 +1953:1:554 +1954:1:555 +1955:1:566 +1956:1:571 +1957:1:572 +1958:0:2969 +1959:2:1862 +1960:0:2969 +1961:2:1863 +1962:0:2969 +1963:1:584 +1964:0:2969 +1965:2:1862 +1966:0:2969 +1967:2:1863 +1968:0:2969 +1969:1:585 +1970:1:589 +1971:1:590 +1972:1:598 +1973:1:599 +1974:1:603 +1975:1:604 +1976:1:612 +1977:1:617 +1978:1:621 +1979:1:622 +1980:1:629 +1981:1:630 +1982:1:641 +1983:1:642 +1984:1:643 +1985:1:654 +1986:1:659 +1987:1:660 +1988:0:2969 +1989:2:1862 +1990:0:2969 +1991:2:1863 +1992:0:2969 +1993:1:672 +1994:0:2969 +1995:2:1862 +1996:0:2969 +1997:2:1863 +1998:0:2969 +1999:1:673 +2000:1:677 +2001:1:678 +2002:1:686 +2003:1:687 +2004:1:691 +2005:1:692 +2006:1:700 +2007:1:705 +2008:1:709 +2009:1:710 +2010:1:717 +2011:1:718 +2012:1:729 +2013:1:730 +2014:1:731 +2015:1:742 +2016:1:747 +2017:1:748 +2018:0:2969 +2019:2:1862 +2020:0:2969 +2021:2:1863 +2022:0:2969 +2023:1:760 +2024:0:2969 +2025:1:761 +2026:0:2969 +2027:1:762 +2028:0:2969 +2029:1:955 +2030:0:2969 +2031:1:956 +2032:0:2969 +2033:2:1862 +2034:0:2969 +2035:2:1863 +2036:0:2969 +2037:1:960 +2038:0:2969 +2039:2:1862 +2040:0:2969 +2041:2:1863 +2042:0:2969 +2043:1:961 +2044:1:965 +2045:1:966 +2046:1:974 +2047:1:975 +2048:1:979 +2049:1:980 +2050:1:988 +2051:1:993 +2052:1:997 +2053:1:998 +2054:1:1005 +2055:1:1006 +2056:1:1017 +2057:1:1018 +2058:1:1019 +2059:1:1030 +2060:1:1035 +2061:1:1036 +2062:0:2969 +2063:2:1862 +2064:0:2969 +2065:2:1863 +2066:0:2969 +2067:1:1048 +2068:0:2969 +2069:1:762 +2070:0:2969 +2071:1:955 +2072:0:2969 +2073:1:956 +2074:0:2969 +2075:2:1862 +2076:0:2969 +2077:2:1863 +2078:0:2969 +2079:1:960 +2080:0:2969 +2081:2:1862 +2082:0:2969 +2083:2:1863 +2084:0:2969 +2085:1:961 +2086:1:965 +2087:1:966 +2088:1:974 +2089:1:975 +2090:1:976 +2091:1:988 +2092:1:993 +2093:1:997 +2094:1:998 +2095:1:1005 +2096:1:1006 +2097:1:1017 +2098:1:1018 +2099:1:1019 +2100:1:1030 +2101:1:1035 +2102:1:1036 +2103:0:2969 +2104:2:1862 +2105:0:2969 +2106:2:1863 +2107:0:2969 +2108:1:1048 +2109:0:2969 +2110:1:1052 +2111:0:2969 +2112:2:1862 +2113:0:2969 +2114:2:1863 +2115:0:2969 +2116:1:1057 +2117:1:1061 +2118:1:1062 +2119:1:1070 +2120:1:1071 +2121:1:1072 +2122:1:1084 +2123:1:1089 +2124:1:1093 +2125:1:1094 +2126:1:1101 +2127:1:1102 +2128:1:1113 +2129:1:1114 +2130:1:1115 +2131:1:1126 +2132:1:1131 +2133:1:1132 +2134:0:2969 +2135:1:9 +2136:0:2969 +2137:2:1862 +2138:0:2969 +2139:2:1863 +2140:0:2969 +2141:1:10 +2142:0:2969 +2143:2:1864 +2144:0:2969 +2145:2:1967 +2146:0:2969 +2147:2:2072 +2148:0:2969 +2149:2:2073 +2150:0:2969 +2151:2:2077 +2152:0:2969 +2153:2:2083 +2154:2:2087 +2155:2:2088 +2156:2:2096 +2157:2:2097 +2158:2:2101 +2159:2:2102 +2160:2:2110 +2161:2:2115 +2162:2:2119 +2163:2:2120 +2164:2:2127 +2165:2:2128 +2166:2:2139 +2167:2:2140 +2168:2:2141 +2169:2:2152 +2170:2:2157 +2171:2:2158 +2172:0:2969 +2173:2:2170 +2174:0:2969 +2175:2:2171 +2176:0:2969 +2177:1:13 +2178:0:2969 +2179:2:2172 +2180:0:2969 +2181:1:19 +2182:0:2969 +2183:1:20 +2184:0:2969 +2185:2:2171 +2186:0:2969 +2187:2:2172 +2188:0:2969 +2189:1:21 +2190:1:25 +2191:1:26 +2192:1:34 +2193:1:35 +2194:1:39 +2195:1:40 +2196:1:48 +2197:1:53 +2198:1:57 +2199:1:58 +2200:1:65 +2201:1:66 +2202:1:77 +2203:1:78 +2204:1:79 +2205:1:90 +2206:1:95 +2207:1:96 +2208:0:2969 +2209:2:2171 +2210:0:2969 +2211:2:2172 +2212:0:2969 +2213:1:108 +2214:0:2969 +2215:2:2171 +2216:0:2969 +2217:2:2172 +2218:0:2969 +2219:1:109 +2220:1:113 +2221:1:114 +2222:1:122 +2223:1:123 +2224:1:127 +2225:1:128 +2226:1:136 +2227:1:141 +2228:1:145 +2229:1:146 +2230:1:153 +2231:1:154 +2232:1:165 +2233:1:166 +2234:1:167 +2235:1:178 +2236:1:183 +2237:1:184 +2238:0:2969 +2239:1:196 +2240:0:2969 +2241:2:2171 +2242:0:2969 +2243:2:2172 +2244:0:2969 +2245:1:197 +2246:0:2969 +2247:2:2171 +2248:0:2969 +2249:2:2172 +2250:0:2969 +2251:1:198 +2252:1:202 +2253:1:203 +2254:1:211 +2255:1:212 +2256:1:216 +2257:1:217 +2258:1:225 +2259:1:230 +2260:1:234 +2261:1:235 +2262:1:242 +2263:1:243 +2264:1:254 +2265:1:255 +2266:1:256 +2267:1:267 +2268:1:272 +2269:1:273 +2270:0:2969 +2271:2:2171 +2272:0:2969 +2273:2:2172 +2274:0:2969 +2275:1:285 +2276:0:2969 +2277:1:486 +2278:0:2969 +2279:1:487 +2280:0:2969 +2281:1:20 +2282:0:2969 +2283:2:2171 +2284:0:2969 +2285:2:2172 +2286:0:2969 +2287:1:21 +2288:1:25 +2289:1:26 +2290:1:34 +2291:1:35 +2292:1:36 +2293:1:48 +2294:1:53 +2295:1:57 +2296:1:58 +2297:1:65 +2298:1:66 +2299:1:77 +2300:1:78 +2301:1:79 +2302:1:90 +2303:1:95 +2304:1:96 +2305:0:2969 +2306:2:2171 +2307:0:2969 +2308:2:2172 +2309:0:2969 +2310:1:108 +2311:0:2969 +2312:2:2171 +2313:0:2969 +2314:2:2172 +2315:0:2969 +2316:1:109 +2317:1:113 +2318:1:114 +2319:1:122 +2320:1:123 +2321:1:127 +2322:1:128 +2323:1:136 +2324:1:141 +2325:1:145 +2326:1:146 +2327:1:153 +2328:1:154 +2329:1:165 +2330:1:166 +2331:1:167 +2332:1:178 +2333:1:183 +2334:1:184 +2335:0:2969 +2336:1:288 +2337:0:2969 +2338:2:2171 +2339:0:2969 +2340:2:2172 +2341:0:2969 +2342:1:289 +2343:0:2969 +2344:1:486 +2345:0:2969 +2346:1:487 +2347:0:2969 +2348:1:492 +2349:0:2969 +2350:2:2171 +2351:0:2969 +2352:2:2172 +2353:0:2969 +2354:1:497 +2355:1:501 +2356:1:502 +2357:1:510 +2358:1:511 +2359:1:512 +2360:1:524 +2361:1:529 +2362:1:533 +2363:1:534 +2364:1:541 +2365:1:542 +2366:1:553 +2367:1:554 +2368:1:555 +2369:1:566 +2370:1:571 +2371:1:572 +2372:0:2969 +2373:2:2171 +2374:0:2969 +2375:2:2172 +2376:0:2969 +2377:1:584 +2378:0:2969 +2379:2:2171 +2380:0:2969 +2381:2:2172 +2382:0:2969 +2383:1:585 +2384:1:589 +2385:1:590 +2386:1:598 +2387:1:599 +2388:1:603 +2389:1:604 +2390:1:612 +2391:1:617 +2392:1:621 +2393:1:622 +2394:1:629 +2395:1:630 +2396:1:641 +2397:1:642 +2398:1:643 +2399:1:654 +2400:1:659 +2401:1:660 +2402:0:2969 +2403:2:2171 +2404:0:2969 +2405:2:2172 +2406:0:2969 +2407:1:672 +2408:0:2969 +2409:2:2171 +2410:0:2969 +2411:2:2172 +2412:0:2969 +2413:1:673 +2414:1:677 +2415:1:678 +2416:1:686 +2417:1:687 +2418:1:691 +2419:1:692 +2420:1:700 +2421:1:705 +2422:1:709 +2423:1:710 +2424:1:717 +2425:1:718 +2426:1:729 +2427:1:730 +2428:1:731 +2429:1:742 +2430:1:747 +2431:1:748 +2432:0:2969 +2433:2:2171 +2434:0:2969 +2435:2:2172 +2436:0:2969 +2437:1:760 +2438:0:2969 +2439:1:761 +2440:0:2969 +2441:1:762 +2442:0:2969 +2443:1:955 +2444:0:2969 +2445:1:956 +2446:0:2969 +2447:2:2171 +2448:0:2969 +2449:2:2172 +2450:0:2969 +2451:1:960 +2452:0:2969 +2453:2:2171 +2454:0:2969 +2455:2:2172 +2456:0:2969 +2457:1:961 +2458:1:965 +2459:1:966 +2460:1:974 +2461:1:975 +2462:1:979 +2463:1:980 +2464:1:988 +2465:1:993 +2466:1:997 +2467:1:998 +2468:1:1005 +2469:1:1006 +2470:1:1017 +2471:1:1018 +2472:1:1019 +2473:1:1030 +2474:1:1035 +2475:1:1036 +2476:0:2969 +2477:2:2171 +2478:0:2969 +2479:2:2172 +2480:0:2969 +2481:1:1048 +2482:0:2969 +2483:1:762 +2484:0:2969 +2485:1:955 +2486:0:2969 +2487:1:956 +2488:0:2969 +2489:2:2171 +2490:0:2969 +2491:2:2172 +2492:0:2969 +2493:1:960 +2494:0:2969 +2495:2:2171 +2496:0:2969 +2497:2:2172 +2498:0:2969 +2499:1:961 +2500:1:965 +2501:1:966 +2502:1:974 +2503:1:975 +2504:1:976 +2505:1:988 +2506:1:993 +2507:1:997 +2508:1:998 +2509:1:1005 +2510:1:1006 +2511:1:1017 +2512:1:1018 +2513:1:1019 +2514:1:1030 +2515:1:1035 +2516:1:1036 +2517:0:2969 +2518:2:2171 +2519:0:2969 +2520:2:2172 +2521:0:2969 +2522:1:1048 +2523:0:2969 +2524:1:1052 +2525:0:2969 +2526:2:2171 +2527:0:2969 +2528:2:2172 +2529:0:2969 +2530:1:1057 +2531:1:1061 +2532:1:1062 +2533:1:1070 +2534:1:1071 +2535:1:1072 +2536:1:1084 +2537:1:1089 +2538:1:1093 +2539:1:1094 +2540:1:1101 +2541:1:1102 +2542:1:1113 +2543:1:1114 +2544:1:1115 +2545:1:1126 +2546:1:1131 +2547:1:1132 +2548:0:2969 +2549:1:9 +2550:0:2969 +2551:2:2171 +2552:0:2969 +2553:2:2172 +2554:0:2969 +2555:1:10 +2556:0:2969 +2557:2:2173 +2558:0:2969 +2559:2:2179 +2560:0:2969 +2561:2:2180 +2562:2:2184 +2563:2:2185 +2564:2:2193 +2565:2:2194 +2566:2:2198 +2567:2:2199 +2568:2:2207 +2569:2:2212 +2570:2:2216 +2571:2:2217 +2572:2:2224 +2573:2:2225 +2574:2:2236 +2575:2:2237 +2576:2:2238 +2577:2:2249 +2578:2:2254 +2579:2:2255 +2580:0:2969 +2581:2:2267 +2582:0:2969 +2583:2:2268 +2584:0:2969 +2585:1:13 +2586:0:2969 +2587:2:2269 +2588:0:2969 +2589:1:19 +2590:0:2969 +2591:1:20 +2592:0:2969 +2593:2:2268 +2594:0:2969 +2595:2:2269 +2596:0:2969 +2597:1:21 +2598:1:25 +2599:1:26 +2600:1:34 +2601:1:35 +2602:1:39 +2603:1:40 +2604:1:48 +2605:1:53 +2606:1:57 +2607:1:58 +2608:1:65 +2609:1:66 +2610:1:77 +2611:1:78 +2612:1:79 +2613:1:90 +2614:1:95 +2615:1:96 +2616:0:2969 +2617:2:2268 +2618:0:2969 +2619:2:2269 +2620:0:2969 +2621:1:108 +2622:0:2969 +2623:2:2268 +2624:0:2969 +2625:2:2269 +2626:0:2969 +2627:1:109 +2628:1:113 +2629:1:114 +2630:1:122 +2631:1:123 +2632:1:127 +2633:1:128 +2634:1:136 +2635:1:141 +2636:1:145 +2637:1:146 +2638:1:153 +2639:1:154 +2640:1:165 +2641:1:166 +2642:1:167 +2643:1:178 +2644:1:183 +2645:1:184 +2646:0:2969 +2647:1:196 +2648:0:2969 +2649:2:2268 +2650:0:2969 +2651:2:2269 +2652:0:2969 +2653:1:197 +2654:0:2969 +2655:2:2268 +2656:0:2969 +2657:2:2269 +2658:0:2969 +2659:1:198 +2660:1:202 +2661:1:203 +2662:1:211 +2663:1:212 +2664:1:216 +2665:1:217 +2666:1:225 +2667:1:230 +2668:1:234 +2669:1:235 +2670:1:242 +2671:1:243 +2672:1:254 +2673:1:255 +2674:1:256 +2675:1:267 +2676:1:272 +2677:1:273 +2678:0:2969 +2679:2:2268 +2680:0:2969 +2681:2:2269 +2682:0:2969 +2683:1:285 +2684:0:2969 +2685:1:486 +2686:0:2969 +2687:1:487 +2688:0:2969 +2689:1:20 +2690:0:2969 +2691:2:2268 +2692:0:2969 +2693:2:2269 +2694:0:2969 +2695:1:21 +2696:1:25 +2697:1:26 +2698:1:34 +2699:1:35 +2700:1:36 +2701:1:48 +2702:1:53 +2703:1:57 +2704:1:58 +2705:1:65 +2706:1:66 +2707:1:77 +2708:1:78 +2709:1:79 +2710:1:90 +2711:1:95 +2712:1:96 +2713:0:2969 +2714:2:2268 +2715:0:2969 +2716:2:2269 +2717:0:2969 +2718:1:108 +2719:0:2969 +2720:2:2268 +2721:0:2969 +2722:2:2269 +2723:0:2969 +2724:1:109 +2725:1:113 +2726:1:114 +2727:1:122 +2728:1:123 +2729:1:127 +2730:1:128 +2731:1:136 +2732:1:141 +2733:1:145 +2734:1:146 +2735:1:153 +2736:1:154 +2737:1:165 +2738:1:166 +2739:1:167 +2740:1:178 +2741:1:183 +2742:1:184 +2743:0:2969 +2744:1:288 +2745:0:2969 +2746:2:2268 +2747:0:2969 +2748:2:2269 +2749:0:2969 +2750:1:289 +2751:0:2969 +2752:1:486 +2753:0:2969 +2754:1:487 +2755:0:2969 +2756:1:492 +2757:0:2969 +2758:2:2268 +2759:0:2969 +2760:2:2269 +2761:0:2969 +2762:1:497 +2763:1:501 +2764:1:502 +2765:1:510 +2766:1:511 +2767:1:512 +2768:1:524 +2769:1:529 +2770:1:533 +2771:1:534 +2772:1:541 +2773:1:542 +2774:1:553 +2775:1:554 +2776:1:555 +2777:1:566 +2778:1:571 +2779:1:572 +2780:0:2969 +2781:2:2268 +2782:0:2969 +2783:2:2269 +2784:0:2969 +2785:1:584 +2786:0:2969 +2787:2:2268 +2788:0:2969 +2789:2:2269 +2790:0:2969 +2791:1:585 +2792:1:589 +2793:1:590 +2794:1:598 +2795:1:599 +2796:1:603 +2797:1:604 +2798:1:612 +2799:1:617 +2800:1:621 +2801:1:622 +2802:1:629 +2803:1:630 +2804:1:641 +2805:1:642 +2806:1:643 +2807:1:654 +2808:1:659 +2809:1:660 +2810:0:2969 +2811:2:2268 +2812:0:2969 +2813:2:2269 +2814:0:2969 +2815:1:672 +2816:0:2969 +2817:2:2268 +2818:0:2969 +2819:2:2269 +2820:0:2969 +2821:1:673 +2822:1:677 +2823:1:678 +2824:1:686 +2825:1:687 +2826:1:691 +2827:1:692 +2828:1:700 +2829:1:705 +2830:1:709 +2831:1:710 +2832:1:717 +2833:1:718 +2834:1:729 +2835:1:730 +2836:1:731 +2837:1:742 +2838:1:747 +2839:1:748 +2840:0:2969 +2841:2:2268 +2842:0:2969 +2843:2:2269 +2844:0:2969 +2845:1:760 +2846:0:2969 +2847:1:761 +2848:0:2969 +2849:1:762 +2850:0:2969 +2851:1:955 +2852:0:2969 +2853:1:956 +2854:0:2969 +2855:2:2268 +2856:0:2969 +2857:2:2269 +2858:0:2969 +2859:1:960 +2860:0:2969 +2861:2:2268 +2862:0:2969 +2863:2:2269 +2864:0:2969 +2865:1:961 +2866:1:965 +2867:1:966 +2868:1:974 +2869:1:975 +2870:1:979 +2871:1:980 +2872:1:988 +2873:1:993 +2874:1:997 +2875:1:998 +2876:1:1005 +2877:1:1006 +2878:1:1017 +2879:1:1018 +2880:1:1019 +2881:1:1030 +2882:1:1035 +2883:1:1036 +2884:0:2969 +2885:2:2268 +2886:0:2969 +2887:2:2269 +2888:0:2969 +2889:1:1048 +2890:0:2969 +2891:1:762 +2892:0:2969 +2893:1:955 +2894:0:2969 +2895:1:956 +2896:0:2969 +2897:2:2268 +2898:0:2969 +2899:2:2269 +2900:0:2969 +2901:1:960 +2902:0:2969 +2903:2:2268 +2904:0:2969 +2905:2:2269 +2906:0:2969 +2907:1:961 +2908:1:965 +2909:1:966 +2910:1:974 +2911:1:975 +2912:1:976 +2913:1:988 +2914:1:993 +2915:1:997 +2916:1:998 +2917:1:1005 +2918:1:1006 +2919:1:1017 +2920:1:1018 +2921:1:1019 +2922:1:1030 +2923:1:1035 +2924:1:1036 +2925:0:2969 +2926:2:2268 +2927:0:2969 +2928:2:2269 +2929:0:2969 +2930:1:1048 +2931:0:2969 +2932:1:1052 +2933:0:2969 +2934:2:2268 +2935:0:2969 +2936:2:2269 +2937:0:2969 +2938:1:1057 +2939:1:1061 +2940:1:1062 +2941:1:1070 +2942:1:1079 +2943:1:1080 +2944:1:1084 +2945:1:1089 +2946:1:1093 +2947:1:1094 +2948:1:1101 +2949:1:1102 +2950:1:1113 +2951:1:1114 +2952:1:1117 +2953:1:1118 +2954:1:1126 +2955:1:1131 +2956:1:1132 +2957:0:2969 +2958:1:9 +2959:0:2969 +2960:2:2268 +2961:0:2969 +2962:2:2269 +2963:0:2969 +2964:1:10 +2965:0:2969 +2966:2:2270 +2967:0:2969 +2968:2:2276 +2969:0:2969 +2970:2:2279 +2971:2:2280 +2972:2:2292 +2973:2:2293 +2974:2:2297 +2975:2:2298 +2976:2:2306 +2977:2:2311 +2978:2:2315 +2979:2:2316 +2980:2:2323 +2981:2:2324 +2982:2:2335 +2983:2:2336 +2984:2:2337 +2985:2:2348 +2986:2:2353 +2987:2:2354 +2988:0:2969 +2989:2:2366 +2990:0:2969 +2991:2:2367 +2992:0:2969 +2993:1:13 +2994:0:2969 +2995:2:2368 +2996:0:2969 +2997:1:19 +2998:0:2969 +2999:1:20 +3000:0:2969 +3001:2:2367 +3002:0:2969 +3003:2:2368 +3004:0:2969 +3005:1:21 +3006:1:25 +3007:1:26 +3008:1:34 +3009:1:35 +3010:1:36 +3011:1:48 +3012:1:53 +3013:1:57 +3014:1:58 +3015:1:65 +3016:1:66 +3017:1:77 +3018:1:78 +3019:1:79 +3020:1:90 +3021:1:95 +3022:1:96 +3023:0:2969 +3024:2:2367 +3025:0:2969 +3026:2:2368 +3027:0:2969 +3028:1:108 +3029:0:2969 +3030:2:2367 +3031:0:2969 +3032:2:2368 +3033:0:2969 +3034:1:109 +3035:1:113 +3036:1:114 +3037:1:122 +3038:1:123 +3039:1:127 +3040:1:128 +3041:1:136 +3042:1:141 +3043:1:145 +3044:1:146 +3045:1:153 +3046:1:154 +3047:1:165 +3048:1:166 +3049:1:167 +3050:1:178 +3051:1:183 +3052:1:184 +3053:0:2969 +3054:1:196 +3055:0:2969 +3056:2:2367 +3057:0:2969 +3058:2:2368 +3059:0:2969 +3060:1:197 +3061:0:2969 +3062:2:2367 +3063:0:2969 +3064:2:2368 +3065:0:2969 +3066:1:198 +3067:1:202 +3068:1:203 +3069:1:211 +3070:1:212 +3071:1:216 +3072:1:217 +3073:1:225 +3074:1:230 +3075:1:234 +3076:1:235 +3077:1:242 +3078:1:243 +3079:1:254 +3080:1:255 +3081:1:256 +3082:1:267 +3083:1:272 +3084:1:273 +3085:0:2969 +3086:2:2367 +3087:0:2969 +3088:2:2368 +3089:0:2969 +3090:1:285 +3091:0:2969 +3092:1:486 +3093:0:2969 +3094:1:487 +3095:0:2969 +3096:1:20 +3097:0:2969 +3098:2:2367 +3099:0:2969 +3100:2:2368 +3101:0:2969 +3102:1:21 +3103:1:25 +3104:1:26 +3105:1:34 +3106:1:35 +3107:1:36 +3108:1:48 +3109:1:53 +3110:1:57 +3111:1:58 +3112:1:65 +3113:1:66 +3114:1:77 +3115:1:78 +3116:1:79 +3117:1:90 +3118:1:95 +3119:1:96 +3120:0:2969 +3121:2:2367 +3122:0:2969 +3123:2:2368 +3124:0:2969 +3125:1:108 +3126:0:2969 +3127:2:2367 +3128:0:2969 +3129:2:2368 +3130:0:2969 +3131:1:109 +3132:1:113 +3133:1:114 +3134:1:122 +3135:1:123 +3136:1:127 +3137:1:128 +3138:1:136 +3139:1:141 +3140:1:145 +3141:1:146 +3142:1:153 +3143:1:154 +3144:1:165 +3145:1:166 +3146:1:167 +3147:1:178 +3148:1:183 +3149:1:184 +3150:0:2969 +3151:1:288 +3152:0:2969 +3153:2:2367 +3154:0:2969 +3155:2:2368 +3156:0:2969 +3157:1:289 +3158:0:2969 +3159:1:486 +3160:0:2969 +3161:1:487 +3162:0:2969 +3163:1:492 +3164:0:2969 +3165:2:2367 +3166:0:2969 +3167:2:2368 +3168:0:2969 +3169:1:497 +3170:1:501 +3171:1:502 +3172:1:510 +3173:1:511 +3174:1:512 +3175:1:524 +3176:1:529 +3177:1:533 +3178:1:534 +3179:1:541 +3180:1:542 +3181:1:553 +3182:1:554 +3183:1:555 +3184:1:566 +3185:1:571 +3186:1:572 +3187:0:2969 +3188:2:2367 +3189:0:2969 +3190:2:2368 +3191:0:2969 +3192:1:584 +3193:0:2969 +3194:2:2367 +3195:0:2969 +3196:2:2368 +3197:0:2969 +3198:1:585 +3199:1:589 +3200:1:590 +3201:1:598 +3202:1:599 +3203:1:603 +3204:1:604 +3205:1:612 +3206:1:617 +3207:1:621 +3208:1:622 +3209:1:629 +3210:1:630 +3211:1:641 +3212:1:642 +3213:1:643 +3214:1:654 +3215:1:659 +3216:1:660 +3217:0:2969 +3218:2:2367 +3219:0:2969 +3220:2:2368 +3221:0:2969 +3222:1:672 +3223:0:2969 +3224:2:2367 +3225:0:2969 +3226:2:2368 +3227:0:2969 +3228:1:673 +3229:1:677 +3230:1:678 +3231:1:686 +3232:1:687 +3233:1:691 +3234:1:692 +3235:1:700 +3236:1:705 +3237:1:709 +3238:1:710 +3239:1:717 +3240:1:718 +3241:1:729 +3242:1:730 +3243:1:731 +3244:1:742 +3245:1:747 +3246:1:748 +3247:0:2969 +3248:2:2367 +3249:0:2969 +3250:2:2368 +3251:0:2969 +3252:1:760 +3253:0:2969 +3254:1:761 +3255:0:2969 +3256:1:762 +3257:0:2969 +3258:1:955 +3259:0:2969 +3260:1:956 +3261:0:2969 +3262:2:2367 +3263:0:2969 +3264:2:2368 +3265:0:2969 +3266:1:960 +3267:0:2969 +3268:2:2367 +3269:0:2969 +3270:2:2368 +3271:0:2969 +3272:1:961 +3273:1:965 +3274:1:966 +3275:1:974 +3276:1:975 +3277:1:979 +3278:1:980 +3279:1:988 +3280:1:993 +3281:1:997 +3282:1:998 +3283:1:1005 +3284:1:1006 +3285:1:1017 +3286:1:1018 +3287:1:1019 +3288:1:1030 +3289:1:1035 +3290:1:1036 +3291:0:2969 +3292:2:2367 +3293:0:2969 +3294:2:2368 +3295:0:2969 +3296:1:1048 +3297:0:2969 +3298:1:762 +3299:0:2969 +3300:1:955 +3301:0:2969 +3302:1:956 +3303:0:2969 +3304:2:2367 +3305:0:2969 +3306:2:2368 +3307:0:2969 +3308:1:960 +3309:0:2969 +3310:2:2367 +3311:0:2969 +3312:2:2368 +3313:0:2969 +3314:1:961 +3315:1:965 +3316:1:966 +3317:1:974 +3318:1:975 +3319:1:976 +3320:1:988 +3321:1:993 +3322:1:997 +3323:1:998 +3324:1:1005 +3325:1:1006 +3326:1:1017 +3327:1:1018 +3328:1:1019 +3329:1:1030 +3330:1:1035 +3331:1:1036 +3332:0:2969 +3333:2:2367 +3334:0:2969 +3335:2:2368 +3336:0:2969 +3337:1:1048 +3338:0:2969 +3339:1:1052 +3340:0:2969 +3341:2:2367 +3342:0:2969 +3343:2:2368 +3344:0:2969 +3345:1:1057 +3346:1:1061 +3347:1:1062 +3348:1:1070 +3349:1:1071 +3350:1:1072 +3351:1:1084 +3352:1:1089 +3353:1:1093 +3354:1:1094 +3355:1:1101 +3356:1:1102 +3357:1:1113 +3358:1:1114 +3359:1:1115 +3360:1:1126 +3361:1:1131 +3362:1:1132 +3363:0:2969 +3364:1:9 +3365:0:2969 +3366:2:2367 +3367:0:2969 +3368:2:2368 +3369:0:2969 +3370:1:10 +3371:0:2969 +3372:2:2369 +3373:0:2969 +3374:2:2375 +3375:0:2969 +3376:2:2376 +3377:0:2969 +3378:2:2377 +3379:0:2969 +3380:2:2378 +3381:0:2969 +3382:2:2379 +3383:2:2383 +3384:2:2384 +3385:2:2392 +3386:2:2393 +3387:2:2397 +3388:2:2398 +3389:2:2406 +3390:2:2411 +3391:2:2415 +3392:2:2416 +3393:2:2423 +3394:2:2424 +3395:2:2435 +3396:2:2443 +3397:2:2444 +3398:2:2448 +3399:2:2453 +3400:2:2454 +3401:0:2969 +3402:2:2466 +3403:0:2969 +3404:2:2467 +3405:0:2969 +3406:1:13 +-1:-1:-1 +3407:0:2969 +3408:2:2468 +3409:0:2969 +3410:1:19 +3411:0:2969 +3412:1:20 +3413:0:2969 +3414:2:2467 +3415:0:2969 +3416:2:2468 +3417:0:2969 +3418:1:21 +3419:1:25 +3420:1:26 +3421:1:34 +3422:1:35 +3423:1:39 +3424:1:40 +3425:1:48 +3426:1:53 +3427:1:57 +3428:1:58 +3429:1:65 +3430:1:66 +3431:1:77 +3432:1:78 +3433:1:79 +3434:1:90 +3435:1:95 +3436:1:96 +3437:0:2969 +3438:2:2467 +3439:0:2969 +3440:2:2468 +3441:0:2969 +3442:1:108 +3443:0:2969 +3444:2:2467 +3445:0:2969 +3446:2:2468 +3447:0:2969 +3448:1:109 +3449:1:113 +3450:1:114 +3451:1:122 +3452:1:123 +3453:1:127 +3454:1:128 +3455:1:136 +3456:1:141 +3457:1:145 +3458:1:146 +3459:1:153 +3460:1:154 +3461:1:165 +3462:1:166 +3463:1:167 +3464:1:178 +3465:1:183 +3466:1:184 +3467:0:2969 +3468:1:196 +3469:0:2969 +3470:2:2467 +3471:0:2969 +3472:2:2468 +3473:0:2969 +3474:1:197 +3475:0:2969 +3476:2:2467 +3477:0:2969 +3478:2:2468 +3479:0:2969 +3480:1:198 +3481:1:202 +3482:1:203 +3483:1:211 +3484:1:212 +3485:1:216 +3486:1:217 +3487:1:225 +3488:1:230 +3489:1:234 +3490:1:235 +3491:1:242 +3492:1:243 +3493:1:254 +3494:1:255 +3495:1:256 +3496:1:267 +3497:1:272 +3498:1:273 +3499:0:2969 +3500:2:2467 +3501:0:2969 +3502:2:2468 +3503:0:2969 +3504:1:285 +3505:0:2969 +3506:1:486 +3507:0:2969 +3508:1:487 +3509:0:2969 +3510:1:20 +3511:0:2969 +3512:2:2467 +3513:0:2969 +3514:2:2468 +3515:0:2969 +3516:1:21 +3517:1:25 +3518:1:26 +3519:1:34 +3520:1:35 +3521:1:36 +3522:1:48 +3523:1:53 +3524:1:57 +3525:1:58 +3526:1:65 +3527:1:66 +3528:1:77 +3529:1:78 +3530:1:79 +3531:1:90 +3532:1:95 +3533:1:96 +3534:0:2969 +3535:2:2467 +3536:0:2969 +3537:2:2468 +3538:0:2969 +3539:1:108 +3540:0:2969 +3541:2:2467 +3542:0:2969 +3543:2:2468 +3544:0:2969 +3545:1:109 +3546:1:113 +3547:1:114 +3548:1:122 +3549:1:123 +3550:1:127 +3551:1:128 +3552:1:136 +3553:1:141 +3554:1:145 +3555:1:146 +3556:1:153 +3557:1:154 +3558:1:165 +3559:1:166 +3560:1:167 +3561:1:178 +3562:1:183 +3563:1:184 +3564:0:2969 +3565:1:288 +3566:0:2969 +3567:2:2467 +3568:0:2969 +3569:2:2468 +3570:0:2969 +3571:1:289 +3572:0:2969 +3573:1:486 +3574:0:2969 +3575:1:487 +3576:0:2969 +3577:1:492 +3578:0:2969 +3579:2:2467 +3580:0:2969 +3581:2:2468 +3582:0:2969 +3583:1:497 +3584:1:501 +3585:1:502 +3586:1:510 +3587:1:511 +3588:1:512 +3589:1:524 +3590:1:529 +3591:1:533 +3592:1:534 +3593:1:541 +3594:1:542 +3595:1:553 +3596:1:554 +3597:1:555 +3598:1:566 +3599:1:571 +3600:1:572 +3601:0:2969 +3602:2:2467 +3603:0:2969 +3604:2:2468 +3605:0:2969 +3606:1:584 +3607:0:2969 +3608:2:2467 +3609:0:2969 +3610:2:2468 +3611:0:2969 +3612:1:585 +3613:1:589 +3614:1:590 +3615:1:598 +3616:1:599 +3617:1:603 +3618:1:604 +3619:1:612 +3620:1:617 +3621:1:621 +3622:1:622 +3623:1:629 +3624:1:630 +3625:1:641 +3626:1:642 +3627:1:643 +3628:1:654 +3629:1:659 +3630:1:660 +3631:0:2969 +3632:2:2467 +3633:0:2969 +3634:2:2468 +3635:0:2969 +3636:1:672 +3637:0:2969 +3638:2:2467 +3639:0:2969 +3640:2:2468 +3641:0:2969 +3642:1:673 +3643:1:677 +3644:1:678 +3645:1:686 +3646:1:687 +3647:1:691 +3648:1:692 +3649:1:700 +3650:1:705 +3651:1:709 +3652:1:710 +3653:1:717 +3654:1:718 +3655:1:729 +3656:1:730 +3657:1:731 +3658:1:742 +3659:1:747 +3660:1:748 +3661:0:2969 +3662:2:2467 +3663:0:2969 +3664:2:2468 +3665:0:2969 +3666:1:760 +3667:0:2969 +3668:1:761 +3669:0:2969 +3670:1:762 +3671:0:2969 +3672:1:955 +3673:0:2969 +3674:1:956 +3675:0:2969 +3676:2:2467 +3677:0:2969 +3678:2:2468 +3679:0:2969 +3680:1:960 +3681:0:2969 +3682:2:2467 +3683:0:2969 +3684:2:2468 +3685:0:2969 +3686:1:961 +3687:1:965 +3688:1:966 +3689:1:974 +3690:1:975 +3691:1:979 +3692:1:980 +3693:1:988 +3694:1:993 +3695:1:997 +3696:1:998 +3697:1:1005 +3698:1:1006 +3699:1:1017 +3700:1:1018 +3701:1:1019 +3702:1:1030 +3703:1:1035 +3704:1:1036 +3705:0:2969 +3706:2:2467 +3707:0:2969 +3708:2:2468 +3709:0:2969 +3710:1:1048 +3711:0:2969 +3712:1:762 +3713:0:2969 +3714:1:955 +3715:0:2969 +3716:1:956 +3717:0:2969 +3718:2:2467 +3719:0:2969 +3720:2:2468 +3721:0:2969 +3722:1:960 +3723:0:2969 +3724:2:2467 +3725:0:2969 +3726:2:2468 +3727:0:2969 +3728:1:961 +3729:1:965 +3730:1:966 +3731:1:974 +3732:1:975 +3733:1:976 +3734:1:988 +3735:1:993 +3736:1:997 +3737:1:998 +3738:1:1005 +3739:1:1006 +3740:1:1017 +3741:1:1018 +3742:1:1019 +3743:1:1030 +3744:1:1035 +3745:1:1036 +3746:0:2969 +3747:2:2467 +3748:0:2969 +3749:2:2468 +3750:0:2969 +3751:1:1048 +3752:0:2969 +3753:1:1052 +3754:0:2969 +3755:2:2467 +3756:0:2969 +3757:2:2468 +3758:0:2969 +3759:1:1057 +3760:1:1061 +3761:1:1062 +3762:1:1070 +3763:1:1071 +3764:1:1072 +3765:1:1084 +3766:1:1089 +3767:1:1093 +3768:1:1094 +3769:1:1101 +3770:1:1102 +3771:1:1113 +3772:1:1114 +3773:1:1115 +3774:1:1126 +3775:1:1131 +3776:1:1132 +3777:0:2969 +3778:1:9 +3779:0:2969 +3780:2:2467 +3781:0:2969 +3782:2:2468 +3783:0:2969 +3784:1:10 +3785:0:2969 +3786:2:2469 +3787:0:2969 +3788:2:2475 +3789:0:2969 +3790:2:2476 +3791:2:2480 +3792:2:2481 +3793:2:2489 +3794:2:2490 +3795:2:2494 +3796:2:2495 +3797:2:2503 +3798:2:2508 +3799:2:2512 +3800:2:2513 +3801:2:2520 +3802:2:2521 +3803:2:2532 +3804:2:2540 +3805:2:2541 +3806:2:2545 +3807:2:2550 +3808:2:2551 +3809:0:2969 +3810:2:2563 +3811:0:2969 +3812:2:2564 +3813:0:2969 +3814:1:13 +3815:0:2969 +3816:2:2565 +3817:0:2969 +3818:1:19 +3819:0:2969 +3820:1:20 +3821:0:2969 +3822:2:2564 +3823:0:2969 +3824:2:2565 +3825:0:2969 +3826:1:21 +3827:1:25 +3828:1:26 +3829:1:34 +3830:1:35 +3831:1:39 +3832:1:40 +3833:1:48 +3834:1:53 +3835:1:57 +3836:1:58 +3837:1:65 +3838:1:66 +3839:1:77 +3840:1:78 +3841:1:79 +3842:1:90 +3843:1:95 +3844:1:96 +3845:0:2969 +3846:2:2564 +3847:0:2969 +3848:2:2565 +3849:0:2969 +3850:1:108 +3851:0:2969 +3852:2:2564 +3853:0:2969 +3854:2:2565 +3855:0:2969 +3856:1:109 +3857:1:113 +3858:1:114 +3859:1:122 +3860:1:123 +3861:1:127 +3862:1:128 +3863:1:136 +3864:1:141 +3865:1:145 +3866:1:146 +3867:1:153 +3868:1:154 +3869:1:165 +3870:1:166 +3871:1:167 +3872:1:178 +3873:1:183 +3874:1:184 +3875:0:2969 +3876:1:196 +3877:0:2969 +3878:2:2564 +3879:0:2969 +3880:2:2565 +3881:0:2969 +3882:1:197 +3883:0:2969 +3884:2:2564 +3885:0:2969 +3886:2:2565 +3887:0:2969 +3888:1:198 +3889:1:202 +3890:1:203 +3891:1:211 +3892:1:212 +3893:1:216 +3894:1:217 +3895:1:225 +3896:1:230 +3897:1:234 +3898:1:235 +3899:1:242 +3900:1:243 +3901:1:254 +3902:1:255 +3903:1:256 +3904:1:267 +3905:1:272 +3906:1:273 +3907:0:2969 +3908:2:2564 +3909:0:2969 +3910:2:2565 +3911:0:2969 +3912:1:285 +3913:0:2969 +3914:1:486 +3915:0:2969 +3916:1:487 +3917:0:2969 +3918:1:20 +3919:0:2969 +3920:2:2564 +3921:0:2969 +3922:2:2565 +3923:0:2969 +3924:1:21 +3925:1:25 +3926:1:26 +3927:1:34 +3928:1:35 +3929:1:36 +3930:1:48 +3931:1:53 +3932:1:57 +3933:1:58 +3934:1:65 +3935:1:66 +3936:1:77 +3937:1:78 +3938:1:79 +3939:1:90 +3940:1:95 +3941:1:96 +3942:0:2969 +3943:2:2564 +3944:0:2969 +3945:2:2565 +3946:0:2969 +3947:1:108 +3948:0:2969 +3949:2:2564 +3950:0:2969 +3951:2:2565 +3952:0:2969 +3953:1:109 +3954:1:113 +3955:1:114 +3956:1:122 +3957:1:123 +3958:1:127 +3959:1:128 +3960:1:136 +3961:1:141 +3962:1:145 +3963:1:146 +3964:1:153 +3965:1:154 +3966:1:165 +3967:1:166 +3968:1:167 +3969:1:178 +3970:1:183 +3971:1:184 +3972:0:2969 +3973:1:288 +3974:0:2969 +3975:2:2564 +3976:0:2969 +3977:2:2565 +3978:0:2969 +3979:1:289 +3980:0:2969 +3981:1:486 +3982:0:2969 +3983:1:487 +3984:0:2969 +3985:1:492 +3986:0:2969 +3987:2:2564 +3988:0:2969 +3989:2:2565 +3990:0:2969 +3991:1:497 +3992:1:501 +3993:1:502 +3994:1:510 +3995:1:511 +3996:1:512 +3997:1:524 +3998:1:529 +3999:1:533 +4000:1:534 +4001:1:541 +4002:1:542 +4003:1:553 +4004:1:554 +4005:1:555 +4006:1:566 +4007:1:571 +4008:1:572 +4009:0:2969 +4010:2:2564 +4011:0:2969 +4012:2:2565 +4013:0:2969 +4014:1:584 +4015:0:2969 +4016:2:2564 +4017:0:2969 +4018:2:2565 +4019:0:2969 +4020:1:585 +4021:1:589 +4022:1:590 +4023:1:598 +4024:1:599 +4025:1:603 +4026:1:604 +4027:1:612 +4028:1:617 +4029:1:621 +4030:1:622 +4031:1:629 +4032:1:630 +4033:1:641 +4034:1:642 +4035:1:643 +4036:1:654 +4037:1:659 +4038:1:660 +4039:0:2969 +4040:2:2564 +4041:0:2969 +4042:2:2565 +4043:0:2969 +4044:1:672 +4045:0:2969 +4046:2:2564 +4047:0:2969 +4048:2:2565 +4049:0:2969 +4050:1:673 +4051:1:677 +4052:1:678 +4053:1:686 +4054:1:687 +4055:1:691 +4056:1:692 +4057:1:700 +4058:1:705 +4059:1:709 +4060:1:710 +4061:1:717 +4062:1:718 +4063:1:729 +4064:1:730 +4065:1:731 +4066:1:742 +4067:1:747 +4068:1:748 +4069:0:2969 +4070:2:2564 +4071:0:2969 +4072:2:2565 +4073:0:2969 +4074:1:760 +4075:0:2969 +4076:1:761 +4077:0:2969 +4078:1:762 +4079:0:2969 +4080:1:955 +4081:0:2969 +4082:1:956 +4083:0:2969 +4084:2:2564 +4085:0:2969 +4086:2:2565 +4087:0:2969 +4088:1:960 +4089:0:2969 +4090:2:2564 +4091:0:2969 +4092:2:2565 +4093:0:2969 +4094:1:961 +4095:1:965 +4096:1:966 +4097:1:974 +4098:1:975 +4099:1:979 +4100:1:980 +4101:1:988 +4102:1:993 +4103:1:997 +4104:1:998 +4105:1:1005 +4106:1:1006 +4107:1:1017 +4108:1:1018 +4109:1:1019 +4110:1:1030 +4111:1:1035 +4112:1:1036 +4113:0:2969 +4114:2:2564 +4115:0:2969 +4116:2:2565 +4117:0:2969 +4118:1:1048 +4119:0:2969 +4120:1:762 +4121:0:2969 +4122:1:955 +4123:0:2969 +4124:1:956 +4125:0:2969 +4126:2:2564 +4127:0:2969 +4128:2:2565 +4129:0:2969 +4130:1:960 +4131:0:2969 +4132:2:2564 +4133:0:2969 +4134:2:2565 +4135:0:2969 +4136:1:961 +4137:1:965 +4138:1:966 +4139:1:974 +4140:1:975 +4141:1:976 +4142:1:988 +4143:1:993 +4144:1:997 +4145:1:998 +4146:1:1005 +4147:1:1006 +4148:1:1017 +4149:1:1018 +4150:1:1019 +4151:1:1030 +4152:1:1035 +4153:1:1036 +4154:0:2969 +4155:2:2564 +4156:0:2969 +4157:2:2565 +4158:0:2969 +4159:1:1048 +4160:0:2969 +4161:1:1052 +4162:0:2969 +4163:2:2564 +4164:0:2969 +4165:2:2565 +4166:0:2969 +4167:1:1057 +4168:1:1061 +4169:1:1062 +4170:1:1070 +4171:1:1071 +4172:1:1072 +4173:1:1084 +4174:1:1089 +4175:1:1093 +4176:1:1094 +4177:1:1101 +4178:1:1102 +4179:1:1113 +4180:1:1114 +4181:1:1115 +4182:1:1126 +4183:1:1131 +4184:1:1132 +4185:0:2969 +4186:1:9 +4187:0:2969 +4188:2:2564 +4189:0:2969 +4190:2:2565 +4191:0:2969 +4192:1:10 +4193:0:2969 +4194:2:2566 +4195:0:2969 +4196:1:11 +4197:0:2969 +4198:2:2377 +4199:0:2969 +4200:1:12 +4201:0:2969 +4202:2:2378 +4203:0:2969 +4204:2:2379 +4205:2:2383 +4206:2:2384 +4207:2:2392 +4208:2:2393 +4209:2:2397 +4210:2:2398 +4211:2:2406 +4212:2:2411 +4213:2:2415 +4214:2:2416 +4215:2:2423 +4216:2:2424 +4217:2:2435 +4218:2:2443 +4219:2:2444 +4220:2:2448 +4221:2:2453 +4222:2:2454 +4223:0:2969 +4224:2:2466 +4225:0:2969 +4226:2:2467 +4227:0:2969 +4228:1:13 diff --git a/formal-model/urcu/result-standard-execution-nest/DEFINES b/formal-model/urcu/result-standard-execution-nest/DEFINES new file mode 100644 index 0000000..150a83c --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/DEFINES @@ -0,0 +1,17 @@ + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +//#define TEST_SIGNAL +//#define TEST_SIGNAL_ON_READ +//#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +//#define READER_NEST_LEVEL 1 +#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS diff --git a/formal-model/urcu/result-standard-execution-nest/Makefile b/formal-model/urcu/result-standard-execution-nest/Makefile new file mode 100644 index 0000000..8af320d --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/Makefile @@ -0,0 +1,172 @@ +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Copyright (C) Mathieu Desnoyers, 2009 +# +# Authors: Mathieu Desnoyers + +#CFLAGS=-DSAFETY +#for multi-core verif, 15.5GB shared mem, use files if full +#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 +#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 + +#liveness +#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 +CFLAGS=-DHASH64 + +SPINFILE=urcu.spin + +default: + make urcu_free | tee urcu_free.log + #nested useless with signal test. + #make urcu_free_nested | tee urcu_free_nested.log + make urcu_free_no_rmb | tee urcu_free_no_rmb.log + make urcu_free_no_wmb | tee urcu_free_no_wmb.log + make urcu_free_no_mb | tee urcu_free_no_mb.log + make urcu_free_single_flip | tee urcu_free_single_flip.log + make urcu_progress_writer | tee urcu_progress_writer.log + make urcu_progress_reader | tee urcu_progress_reader.log + make urcu_progress_writer_error | tee urcu_progress_writer_error.log + make asserts | tee asserts.log + make summary + +#show trail : spin -v -t -N pan.ltl input.spin +# after each individual make. + +summary: + @echo + @echo "Verification summary" + @grep errors: *.log + +asserts: clean + cat DEFINES > .input.spin + cat ${SPINFILE} >> .input.spin + rm -f .input.spin.trail + spin -a -X .input.spin + gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c + ./pan -v -c1 -X -m10000000 -w20 + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free: clean urcu_free_ltl run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_nested_define: + cp urcu_free_nested.define .input.define + +urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_no_rmb_define: + cp urcu_free_no_rmb.define .input.define + +urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_no_wmb_define: + cp urcu_free_no_wmb.define .input.define + +urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_no_mb_define: + cp urcu_free_no_mb.define .input.define + +urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_single_flip_define: + cp urcu_free_single_flip.define .input.define + +urcu_free_ltl: + touch .input.define + cat .input.define >> pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl + +# Progress checks + +urcu_progress_writer: clean urcu_progress_writer_ltl \ + urcu_progress_writer_define run_weak_fair + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_progress_writer_define: + cp urcu_progress_writer.define .input.define + +urcu_progress_writer_ltl: + touch .input.define + cat .input.define > pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl + +urcu_progress_reader: clean urcu_progress_reader_ltl \ + urcu_progress_reader_define run_weak_fair + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_progress_reader_define: + cp urcu_progress_reader.define .input.define + +urcu_progress_reader_ltl: + touch .input.define + cat .input.define > pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl + +urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ + urcu_progress_writer_error_define run_weak_fair + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_progress_writer_error_define: + cp urcu_progress_writer_error.define .input.define + +urcu_progress_writer_error_ltl: + touch .input.define + cat .input.define > pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl + + +run_weak_fair: pan + ./pan -a -f -v -c1 -X -m10000000 -w20 + +run: pan + ./pan -a -v -c1 -X -m10000000 -w20 + +pan: pan.c + gcc -O2 -w ${CFLAGS} -o pan pan.c + +pan.c: pan.ltl ${SPINFILE} + cat .input.define > .input.spin + cat DEFINES >> .input.spin + cat ${SPINFILE} >> .input.spin + rm -f .input.spin.trail + spin -a -X -N pan.ltl .input.spin + +.PHONY: clean default distclean summary +clean: + rm -f pan* trail.out .input.spin* *.spin.trail .input.define +distclean: + rm -f *.trail *.input *.log diff --git a/formal-model/urcu/result-standard-execution-nest/asserts.log b/formal-model/urcu/result-standard-execution-nest/asserts.log new file mode 100644 index 0000000..51f1ac0 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/asserts.log @@ -0,0 +1,250 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +cat DEFINES > .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -DSAFETY -o pan pan.c +./pan -v -c1 -X -m10000000 -w20 +Depth= 3212 States= 1e+06 Transitions= 1.17e+07 Memory= 519.572 t= 7.66 R= 1e+05 +Depth= 3212 States= 2e+06 Transitions= 2.38e+07 Memory= 572.990 t= 16 R= 1e+05 +Depth= 3212 States= 3e+06 Transitions= 3.62e+07 Memory= 626.408 t= 24.9 R= 1e+05 +pan: resizing hashtable to -w22.. done + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim - (none specified) + assertion violations + + cycle checks - (disabled by -DSAFETY) + invalid end states + + +State-vector 48 byte, depth reached 3212, errors: 0 + 3539988 states, stored + 39085459 states, matched + 42625447 transitions (= stored+matched) +1.5602888e+08 atomic steps +hash conflicts: 28971442 (resolved) + +Stats on memory usage (in Megabytes): + 256.576 equivalent memory usage for states (stored*(State-vector + overhead)) + 196.718 actual memory usage for states (compression: 76.67%) + state-vector as stored = 30 byte + 28 byte overhead + 32.000 memory used for hash table (-w22) + 457.764 memory used for DFS stack (-m10000000) + 686.338 total actual memory usage + +unreached in proctype urcu_reader + line 398, ".input.spin", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 407, ".input.spin", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, ".input.spin", state 61, "(1)" + line 417, ".input.spin", state 91, "(1)" + line 398, ".input.spin", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 407, ".input.spin", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, ".input.spin", state 151, "(1)" + line 417, ".input.spin", state 181, "(1)" + line 398, ".input.spin", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 407, ".input.spin", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, ".input.spin", state 242, "(1)" + line 417, ".input.spin", state 272, "(1)" + line 398, ".input.spin", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 407, ".input.spin", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, ".input.spin", state 360, "(1)" + line 417, ".input.spin", state 390, "(1)" + line 539, ".input.spin", state 414, "-end-" + (17 of 414 states) +unreached in proctype urcu_writer + line 398, ".input.spin", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 402, ".input.spin", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 407, ".input.spin", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, ".input.spin", state 59, "(1)" + line 412, ".input.spin", state 72, "(1)" + line 417, ".input.spin", state 89, "(1)" + line 398, ".input.spin", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 402, ".input.spin", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, ".input.spin", state 153, "(1)" + line 412, ".input.spin", state 166, "(1)" + line 651, ".input.spin", state 199, "(1)" + line 174, ".input.spin", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 178, ".input.spin", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 159, ".input.spin", state 240, "(1)" + line 163, ".input.spin", state 248, "(1)" + line 167, ".input.spin", state 260, "(1)" + line 174, ".input.spin", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 407, ".input.spin", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, ".input.spin", state 927, "(1)" + line 408, ".input.spin", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 408, ".input.spin", state 928, "else" + line 408, ".input.spin", state 931, "(1)" + line 408, ".input.spin", state 932, "(1)" + line 408, ".input.spin", state 932, "(1)" + line 412, ".input.spin", state 940, "(1)" + line 412, ".input.spin", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 412, ".input.spin", state 941, "else" + line 412, ".input.spin", state 944, "(1)" + line 412, ".input.spin", state 945, "(1)" + line 412, ".input.spin", state 945, "(1)" + line 410, ".input.spin", state 950, "((i<1))" + line 410, ".input.spin", state 950, "((i>=1))" + line 417, ".input.spin", state 957, "(1)" + line 417, ".input.spin", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 417, ".input.spin", state 958, "else" + line 417, ".input.spin", state 961, "(1)" + line 417, ".input.spin", state 962, "(1)" + line 417, ".input.spin", state 962, "(1)" + line 419, ".input.spin", state 965, "(1)" + line 419, ".input.spin", state 965, "(1)" + line 402, ".input.spin", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 407, ".input.spin", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 412, ".input.spin", state 1040, "(1)" + line 417, ".input.spin", state 1057, "(1)" + line 402, ".input.spin", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 407, ".input.spin", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 412, ".input.spin", state 1130, "(1)" + line 417, ".input.spin", state 1147, "(1)" + line 398, ".input.spin", state 1166, "(1)" + line 402, ".input.spin", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 407, ".input.spin", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 412, ".input.spin", state 1222, "(1)" + line 417, ".input.spin", state 1239, "(1)" + line 402, ".input.spin", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 407, ".input.spin", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 412, ".input.spin", state 1315, "(1)" + line 417, ".input.spin", state 1332, "(1)" + line 178, ".input.spin", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 182, ".input.spin", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 159, ".input.spin", state 1378, "(1)" + line 163, ".input.spin", state 1386, "(1)" + line 167, ".input.spin", state 1398, "(1)" + line 174, ".input.spin", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 407, ".input.spin", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, ".input.spin", state 1595, "(1)" + line 408, ".input.spin", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 408, ".input.spin", state 1596, "else" + line 408, ".input.spin", state 1599, "(1)" + line 408, ".input.spin", state 1600, "(1)" + line 408, ".input.spin", state 1600, "(1)" + line 412, ".input.spin", state 1608, "(1)" + line 412, ".input.spin", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 412, ".input.spin", state 1609, "else" + line 412, ".input.spin", state 1612, "(1)" + line 412, ".input.spin", state 1613, "(1)" + line 412, ".input.spin", state 1613, "(1)" + line 410, ".input.spin", state 1618, "((i<1))" + line 410, ".input.spin", state 1618, "((i>=1))" + line 417, ".input.spin", state 1625, "(1)" + line 417, ".input.spin", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 417, ".input.spin", state 1626, "else" + line 417, ".input.spin", state 1629, "(1)" + line 417, ".input.spin", state 1630, "(1)" + line 417, ".input.spin", state 1630, "(1)" + line 419, ".input.spin", state 1633, "(1)" + line 419, ".input.spin", state 1633, "(1)" + line 178, ".input.spin", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 182, ".input.spin", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 159, ".input.spin", state 1681, "(1)" + line 163, ".input.spin", state 1689, "(1)" + line 167, ".input.spin", state 1701, "(1)" + line 174, ".input.spin", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-standard-execution-nest/asserts.spin.input.trail b/formal-model/urcu/result-standard-execution-nest/asserts.spin.input.trail new file mode 100644 index 0000000..287e52a --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/asserts.spin.input.trail @@ -0,0 +1,6 @@ +-4:-4:-4 +1:0:2673 +2:0:2674 +3:0:2675 +4:0:2676 +5:4:1129 diff --git a/formal-model/urcu/result-standard-execution-nest/urcu.sh b/formal-model/urcu/result-standard-execution-nest/urcu.sh new file mode 100644 index 0000000..65ff517 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu.sh @@ -0,0 +1,29 @@ +#!/bin/sh +# +# Compiles and runs the urcu.spin Promela model. +# +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Copyright (C) IBM Corporation, 2009 +# Mathieu Desnoyers, 2009 +# +# Authors: Paul E. McKenney +# Mathieu Desnoyers + +# Basic execution, without LTL clauses. See Makefile. + +spin -a urcu.spin +cc -DSAFETY -o pan pan.c +./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu/result-standard-execution-nest/urcu.spin b/formal-model/urcu/result-standard-execution-nest/urcu.spin new file mode 100644 index 0000000..2cfcb70 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu.spin @@ -0,0 +1,705 @@ +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free.log b/formal-model/urcu/result-standard-execution-nest/urcu_free.log new file mode 100644 index 0000000..884b15e --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_free.log @@ -0,0 +1,262 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 743) +Depth= 3880 States= 1e+06 Transitions= 1.18e+07 Memory= 527.190 t= 9.53 R= 1e+05 +Depth= 3880 States= 2e+06 Transitions= 2.39e+07 Memory= 588.225 t= 19.8 R= 1e+05 +Depth= 3880 States= 3e+06 Transitions= 3.61e+07 Memory= 649.260 t= 30.5 R= 1e+05 +pan: resizing hashtable to -w22.. done +Depth= 3880 States= 4e+06 Transitions= 4.84e+07 Memory= 741.318 t= 41.1 R= 1e+05 + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 3880, errors: 0 + 4015564 states, stored + 44539121 states, matched + 48554685 transitions (= stored+matched) +1.7777933e+08 atomic steps +hash conflicts: 33629695 (resolved) + +Stats on memory usage (in Megabytes): + 321.681 equivalent memory usage for states (stored*(State-vector + overhead)) + 252.629 actual memory usage for states (compression: 78.53%) + state-vector as stored = 38 byte + 28 byte overhead + 32.000 memory used for hash table (-w22) + 457.764 memory used for DFS stack (-m10000000) + 742.295 total actual memory usage + +unreached in proctype urcu_reader + line 398, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 407, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 61, "(1)" + line 417, "pan.___", state 91, "(1)" + line 398, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 407, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 151, "(1)" + line 417, "pan.___", state 181, "(1)" + line 398, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 407, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 242, "(1)" + line 417, "pan.___", state 272, "(1)" + line 398, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 407, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 360, "(1)" + line 417, "pan.___", state 390, "(1)" + line 539, "pan.___", state 414, "-end-" + (17 of 414 states) +unreached in proctype urcu_writer + line 398, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 402, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 407, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 59, "(1)" + line 412, "pan.___", state 72, "(1)" + line 417, "pan.___", state 89, "(1)" + line 398, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 402, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 153, "(1)" + line 412, "pan.___", state 166, "(1)" + line 651, "pan.___", state 199, "(1)" + line 174, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 178, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 159, "pan.___", state 240, "(1)" + line 163, "pan.___", state 248, "(1)" + line 167, "pan.___", state 260, "(1)" + line 174, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 407, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 927, "(1)" + line 408, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 408, "pan.___", state 928, "else" + line 408, "pan.___", state 931, "(1)" + line 408, "pan.___", state 932, "(1)" + line 408, "pan.___", state 932, "(1)" + line 412, "pan.___", state 940, "(1)" + line 412, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 412, "pan.___", state 941, "else" + line 412, "pan.___", state 944, "(1)" + line 412, "pan.___", state 945, "(1)" + line 412, "pan.___", state 945, "(1)" + line 410, "pan.___", state 950, "((i<1))" + line 410, "pan.___", state 950, "((i>=1))" + line 417, "pan.___", state 957, "(1)" + line 417, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 417, "pan.___", state 958, "else" + line 417, "pan.___", state 961, "(1)" + line 417, "pan.___", state 962, "(1)" + line 417, "pan.___", state 962, "(1)" + line 419, "pan.___", state 965, "(1)" + line 419, "pan.___", state 965, "(1)" + line 402, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 407, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 412, "pan.___", state 1040, "(1)" + line 417, "pan.___", state 1057, "(1)" + line 402, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 407, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 412, "pan.___", state 1130, "(1)" + line 417, "pan.___", state 1147, "(1)" + line 398, "pan.___", state 1166, "(1)" + line 402, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 407, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 412, "pan.___", state 1222, "(1)" + line 417, "pan.___", state 1239, "(1)" + line 402, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 407, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 412, "pan.___", state 1315, "(1)" + line 417, "pan.___", state 1332, "(1)" + line 178, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 182, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 159, "pan.___", state 1378, "(1)" + line 163, "pan.___", state 1386, "(1)" + line 167, "pan.___", state 1398, "(1)" + line 174, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 407, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1595, "(1)" + line 408, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 408, "pan.___", state 1596, "else" + line 408, "pan.___", state 1599, "(1)" + line 408, "pan.___", state 1600, "(1)" + line 408, "pan.___", state 1600, "(1)" + line 412, "pan.___", state 1608, "(1)" + line 412, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 412, "pan.___", state 1609, "else" + line 412, "pan.___", state 1612, "(1)" + line 412, "pan.___", state 1613, "(1)" + line 412, "pan.___", state 1613, "(1)" + line 410, "pan.___", state 1618, "((i<1))" + line 410, "pan.___", state 1618, "((i>=1))" + line 417, "pan.___", state 1625, "(1)" + line 417, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 417, "pan.___", state 1626, "else" + line 417, "pan.___", state 1629, "(1)" + line 417, "pan.___", state 1630, "(1)" + line 417, "pan.___", state 1630, "(1)" + line 419, "pan.___", state 1633, "(1)" + line 419, "pan.___", state 1633, "(1)" + line 178, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 182, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 159, "pan.___", state 1681, "(1)" + line 163, "pan.___", state 1689, "(1)" + line 167, "pan.___", state 1701, "(1)" + line 174, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< !read_free_race) diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free.spin.input b/formal-model/urcu/result-standard-execution-nest/urcu_free.spin.input new file mode 100644 index 0000000..f2f00e4 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_free.spin.input @@ -0,0 +1,722 @@ + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +//#define TEST_SIGNAL +//#define TEST_SIGNAL_ON_READ +//#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +//#define READER_NEST_LEVEL 1 +#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free.spin.input.trail b/formal-model/urcu/result-standard-execution-nest/urcu_free.spin.input.trail new file mode 100644 index 0000000..837f3d9 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_free.spin.input.trail @@ -0,0 +1,15043 @@ +-2:4:-2 +-4:-4:-4 +1:0:4365 +2:4:4317 +3:4:4320 +4:4:4320 +5:4:4320 +6:4:4323 +7:4:4331 +8:4:4331 +9:4:4331 +10:4:4334 +11:4:4340 +12:4:4344 +13:4:4344 +14:4:4344 +15:4:4347 +16:4:4340 +17:4:4344 +18:4:4344 +19:4:4344 +20:4:4347 +21:4:4355 +22:4:4359 +23:4:4360 +24:0:4365 +25:4:4362 +26:0:4365 +27:3:2331 +28:0:4365 +29:3:2337 +30:0:4365 +31:3:2338 +32:0:4365 +33:3:2339 +34:3:2343 +35:3:2344 +36:3:2352 +37:3:2353 +38:3:2357 +39:3:2358 +40:3:2352 +41:3:2353 +42:3:2357 +43:3:2358 +44:3:2366 +45:3:2371 +46:3:2375 +47:3:2376 +48:3:2383 +49:3:2384 +50:3:2395 +51:3:2396 +52:3:2397 +53:3:2395 +54:3:2396 +55:3:2397 +56:3:2408 +57:3:2413 +58:3:2414 +59:0:4365 +60:3:2426 +61:0:4365 +62:3:2427 +63:0:4365 +64:2:1162 +65:0:4365 +66:3:2428 +67:0:4365 +68:2:1168 +69:0:4365 +70:2:1169 +71:0:4365 +72:3:2427 +73:0:4365 +74:2:1170 +75:0:4365 +76:3:2428 +77:0:4365 +78:3:2429 +79:0:4365 +80:3:2435 +81:3:2436 +82:0:4365 +83:3:2440 +84:3:2444 +85:3:2445 +86:3:2453 +87:3:2454 +88:3:2458 +89:3:2459 +90:3:2453 +91:3:2454 +92:3:2458 +93:3:2459 +94:3:2467 +95:3:2472 +96:3:2473 +97:3:2484 +98:3:2485 +99:3:2496 +100:3:2497 +101:3:2498 +102:3:2496 +103:3:2497 +104:3:2498 +105:3:2509 +106:3:2514 +107:3:2515 +108:0:4365 +109:3:2527 +110:0:4365 +111:3:2528 +112:0:4365 +113:2:1173 +114:0:4365 +115:3:2529 +116:0:4365 +117:2:1179 +118:0:4365 +119:2:1180 +120:0:4365 +121:3:2528 +122:0:4365 +123:2:1181 +124:2:1185 +125:2:1186 +126:2:1194 +127:2:1195 +128:2:1199 +129:2:1200 +130:2:1194 +131:2:1195 +132:2:1199 +133:2:1200 +134:2:1208 +135:2:1213 +136:2:1217 +137:2:1218 +138:2:1225 +139:2:1226 +140:2:1237 +141:2:1238 +142:2:1239 +143:2:1237 +144:2:1238 +145:2:1239 +146:2:1250 +147:2:1255 +148:2:1256 +149:0:4365 +150:3:2529 +151:0:4365 +152:2:1268 +153:0:4365 +154:3:2528 +155:0:4365 +156:2:1270 +157:0:4365 +158:3:2529 +159:0:4365 +160:2:1271 +161:2:1275 +162:2:1276 +163:2:1284 +164:2:1285 +165:2:1289 +166:2:1290 +167:2:1284 +168:2:1285 +169:2:1289 +170:2:1290 +171:2:1298 +172:2:1303 +173:2:1307 +174:2:1308 +175:2:1315 +176:2:1316 +177:2:1327 +178:2:1328 +179:2:1329 +180:2:1327 +181:2:1328 +182:2:1329 +183:2:1340 +184:2:1345 +185:2:1346 +186:0:4365 +187:2:1358 +188:0:4365 +189:2:1360 +190:0:4365 +191:3:2528 +192:0:4365 +193:2:1361 +194:0:4365 +195:3:2529 +196:0:4365 +197:2:1362 +198:2:1366 +199:2:1367 +200:2:1375 +201:2:1376 +202:2:1380 +203:2:1381 +204:2:1375 +205:2:1376 +206:2:1380 +207:2:1381 +208:2:1389 +209:2:1394 +210:2:1398 +211:2:1399 +212:2:1406 +213:2:1407 +214:2:1418 +215:2:1419 +216:2:1420 +217:2:1418 +218:2:1419 +219:2:1420 +220:2:1431 +221:2:1436 +222:2:1437 +223:0:4365 +224:2:1449 +225:0:4365 +226:3:2528 +227:0:4365 +228:2:1451 +229:0:4365 +230:3:2529 +231:0:4365 +232:2:1652 +233:0:4365 +234:2:1653 +235:0:4365 +236:2:1657 +237:0:4365 +238:2:1180 +239:0:4365 +240:3:2528 +241:0:4365 +242:2:1181 +243:2:1185 +244:2:1186 +245:2:1194 +246:2:1195 +247:2:1199 +248:2:1200 +249:2:1194 +250:2:1195 +251:2:1196 +252:2:1208 +253:2:1213 +254:2:1217 +255:2:1218 +256:2:1225 +257:2:1226 +258:2:1237 +259:2:1238 +260:2:1239 +261:2:1237 +262:2:1238 +263:2:1239 +264:2:1250 +265:2:1255 +266:2:1256 +267:0:4365 +268:3:2529 +269:0:4365 +270:2:1268 +271:0:4365 +272:3:2528 +273:0:4365 +274:2:1270 +275:0:4365 +276:3:2529 +277:0:4365 +278:2:1271 +279:2:1275 +280:2:1276 +281:2:1284 +282:2:1285 +283:2:1289 +284:2:1290 +285:2:1284 +286:2:1285 +287:2:1289 +288:2:1290 +289:2:1298 +290:2:1303 +291:2:1307 +292:2:1308 +293:2:1315 +294:2:1316 +295:2:1327 +296:2:1328 +297:2:1329 +298:2:1327 +299:2:1328 +300:2:1329 +301:2:1340 +302:2:1345 +303:2:1346 +304:0:4365 +305:2:1358 +306:0:4365 +307:2:1454 +308:0:4365 +309:3:2528 +310:0:4365 +311:2:1455 +312:0:4365 +313:3:2529 +314:0:4365 +315:2:1652 +316:0:4365 +317:2:1653 +318:0:4365 +319:2:1657 +320:0:4365 +321:2:1660 +322:0:4365 +323:3:2528 +324:0:4365 +325:2:1665 +326:2:1669 +327:2:1670 +328:2:1678 +329:2:1679 +330:2:1683 +331:2:1684 +332:2:1678 +333:2:1679 +334:2:1680 +335:2:1692 +336:2:1697 +337:2:1701 +338:2:1702 +339:2:1709 +340:2:1710 +341:2:1721 +342:2:1722 +343:2:1723 +344:2:1721 +345:2:1722 +346:2:1723 +347:2:1734 +348:2:1739 +349:2:1740 +350:0:4365 +351:3:2529 +352:0:4365 +353:2:1752 +354:0:4365 +355:3:2528 +356:0:4365 +357:2:1754 +358:0:4365 +359:3:2529 +360:0:4365 +361:2:1755 +362:2:1759 +363:2:1760 +364:2:1768 +365:2:1769 +366:2:1773 +367:2:1774 +368:2:1768 +369:2:1769 +370:2:1773 +371:2:1774 +372:2:1782 +373:2:1787 +374:2:1791 +375:2:1792 +376:2:1799 +377:2:1800 +378:2:1811 +379:2:1812 +380:2:1813 +381:2:1811 +382:2:1812 +383:2:1813 +384:2:1824 +385:2:1829 +386:2:1830 +387:0:4365 +388:2:1842 +389:0:4365 +390:3:2528 +391:0:4365 +392:2:1844 +393:0:4365 +394:3:2529 +395:0:4365 +396:2:1845 +397:2:1849 +398:2:1850 +399:2:1858 +400:2:1859 +401:2:1863 +402:2:1864 +403:2:1858 +404:2:1859 +405:2:1863 +406:2:1864 +407:2:1872 +408:2:1877 +409:2:1881 +410:2:1882 +411:2:1889 +412:2:1890 +413:2:1901 +414:2:1902 +415:2:1903 +416:2:1901 +417:2:1902 +418:2:1903 +419:2:1914 +420:2:1919 +421:2:1920 +422:0:4365 +423:2:1932 +424:0:4365 +425:3:2528 +426:0:4365 +427:2:1934 +428:0:4365 +429:3:2529 +430:0:4365 +431:2:1935 +432:0:4365 +433:2:1936 +434:0:4365 +435:2:2129 +436:0:4365 +437:2:2130 +438:0:4365 +439:2:2134 +440:0:4365 +441:3:2528 +442:0:4365 +443:2:2136 +444:0:4365 +445:3:2529 +446:0:4365 +447:2:2137 +448:2:2141 +449:2:2142 +450:2:2150 +451:2:2151 +452:2:2155 +453:2:2156 +454:2:2150 +455:2:2151 +456:2:2155 +457:2:2156 +458:2:2164 +459:2:2169 +460:2:2173 +461:2:2174 +462:2:2181 +463:2:2182 +464:2:2193 +465:2:2194 +466:2:2195 +467:2:2193 +468:2:2194 +469:2:2195 +470:2:2206 +471:2:2211 +472:2:2212 +473:0:4365 +474:2:2224 +475:0:4365 +476:3:2528 +477:0:4365 +478:2:2226 +479:0:4365 +480:3:2529 +481:0:4365 +482:2:1936 +483:0:4365 +484:2:2129 +485:0:4365 +486:2:2130 +487:0:4365 +488:2:2134 +489:0:4365 +490:3:2528 +491:0:4365 +492:2:2136 +493:0:4365 +494:3:2529 +495:0:4365 +496:2:2137 +497:2:2141 +498:2:2142 +499:2:2150 +500:2:2151 +501:2:2155 +502:2:2156 +503:2:2150 +504:2:2151 +505:2:2152 +506:2:2164 +507:2:2169 +508:2:2173 +509:2:2174 +510:2:2181 +511:2:2182 +512:2:2193 +513:2:2194 +514:2:2195 +515:2:2193 +516:2:2194 +517:2:2195 +518:2:2206 +519:2:2211 +520:2:2212 +521:0:4365 +522:2:2224 +523:0:4365 +524:3:2528 +525:0:4365 +526:2:2226 +527:0:4365 +528:3:2529 +529:0:4365 +530:2:2230 +531:0:4365 +532:3:2528 +533:0:4365 +534:2:2235 +535:2:2239 +536:2:2240 +537:2:2248 +538:2:2249 +539:2:2253 +540:2:2254 +541:2:2248 +542:2:2249 +543:2:2250 +544:2:2262 +545:2:2267 +546:2:2271 +547:2:2272 +548:2:2279 +549:2:2280 +550:2:2291 +551:2:2292 +552:2:2293 +553:2:2291 +554:2:2292 +555:2:2293 +556:2:2304 +557:2:2309 +558:2:2310 +559:0:4365 +560:3:2529 +561:0:4365 +562:2:2322 +563:0:4365 +564:2:1169 +565:0:4365 +566:3:2528 +567:0:4365 +568:2:1170 +569:0:4365 +570:3:2529 +571:0:4365 +572:3:2530 +573:0:4365 +574:3:2536 +575:0:4365 +576:3:2537 +577:0:4365 +578:3:2547 +579:0:4365 +580:3:2548 +581:0:4365 +582:3:2552 +583:3:2553 +584:3:2557 +585:3:2561 +586:3:2562 +587:3:2557 +588:3:2561 +589:3:2562 +590:3:2566 +591:3:2574 +592:3:2575 +593:3:2580 +594:3:2587 +595:3:2588 +596:3:2587 +597:3:2588 +598:3:2595 +599:3:2600 +600:0:4365 +601:3:2611 +602:0:4365 +603:3:2615 +604:3:2616 +605:3:2620 +606:3:2624 +607:3:2625 +608:3:2620 +609:3:2624 +610:3:2625 +611:3:2629 +612:3:2637 +613:3:2638 +614:3:2643 +615:3:2650 +616:3:2651 +617:3:2650 +618:3:2651 +619:3:2658 +620:3:2663 +621:0:4365 +622:3:2611 +623:0:4365 +624:3:2615 +625:3:2616 +626:3:2620 +627:3:2624 +628:3:2625 +629:3:2620 +630:3:2624 +631:3:2625 +632:3:2629 +633:3:2637 +634:3:2638 +635:3:2643 +636:3:2650 +637:3:2651 +638:3:2650 +639:3:2651 +640:3:2658 +641:3:2663 +642:0:4365 +643:3:2674 +644:0:4365 +645:3:2682 +646:3:2683 +647:3:2687 +648:3:2691 +649:3:2692 +650:3:2687 +651:3:2691 +652:3:2692 +653:3:2696 +654:3:2704 +655:3:2705 +656:3:2710 +657:3:2717 +658:3:2718 +659:3:2717 +660:3:2718 +661:3:2725 +662:3:2730 +663:0:4365 +664:3:2745 +665:0:4365 +666:3:2746 +667:0:4365 +668:2:1173 +669:0:4365 +670:3:2747 +671:0:4365 +672:2:1179 +673:0:4365 +674:2:1180 +675:0:4365 +676:3:2746 +677:0:4365 +678:2:1181 +679:2:1185 +680:2:1186 +681:2:1194 +682:2:1195 +683:2:1199 +684:2:1200 +685:2:1194 +686:2:1195 +687:2:1199 +688:2:1200 +689:2:1208 +690:2:1213 +691:2:1217 +692:2:1218 +693:2:1225 +694:2:1226 +695:2:1237 +696:2:1238 +697:2:1239 +698:2:1237 +699:2:1238 +700:2:1239 +701:2:1250 +702:2:1255 +703:2:1256 +704:0:4365 +705:3:2747 +706:0:4365 +707:2:1268 +708:0:4365 +709:3:2746 +710:0:4365 +711:2:1270 +712:0:4365 +713:3:2747 +714:0:4365 +715:2:1271 +716:2:1275 +717:2:1276 +718:2:1284 +719:2:1285 +720:2:1289 +721:2:1290 +722:2:1284 +723:2:1285 +724:2:1289 +725:2:1290 +726:2:1298 +727:2:1303 +728:2:1307 +729:2:1308 +730:2:1315 +731:2:1316 +732:2:1327 +733:2:1328 +734:2:1329 +735:2:1327 +736:2:1328 +737:2:1329 +738:2:1340 +739:2:1345 +740:2:1346 +741:0:4365 +742:2:1358 +743:0:4365 +744:2:1360 +745:0:4365 +746:3:2746 +747:0:4365 +748:2:1361 +749:0:4365 +750:3:2747 +751:0:4365 +752:2:1362 +753:2:1366 +754:2:1367 +755:2:1375 +756:2:1376 +757:2:1380 +758:2:1381 +759:2:1375 +760:2:1376 +761:2:1380 +762:2:1381 +763:2:1389 +764:2:1394 +765:2:1398 +766:2:1399 +767:2:1406 +768:2:1407 +769:2:1418 +770:2:1419 +771:2:1420 +772:2:1418 +773:2:1419 +774:2:1420 +775:2:1431 +776:2:1436 +777:2:1437 +778:0:4365 +779:2:1449 +780:0:4365 +781:3:2746 +782:0:4365 +783:2:1451 +784:0:4365 +785:3:2747 +786:0:4365 +787:2:1652 +788:0:4365 +789:2:1653 +790:0:4365 +791:2:1657 +792:0:4365 +793:2:1180 +794:0:4365 +795:3:2746 +796:0:4365 +797:2:1181 +798:2:1185 +799:2:1186 +800:2:1194 +801:2:1195 +802:2:1199 +803:2:1200 +804:2:1194 +805:2:1195 +806:2:1196 +807:2:1208 +808:2:1213 +809:2:1217 +810:2:1218 +811:2:1225 +812:2:1226 +813:2:1237 +814:2:1238 +815:2:1239 +816:2:1237 +817:2:1238 +818:2:1239 +819:2:1250 +820:2:1255 +821:2:1256 +822:0:4365 +823:3:2747 +824:0:4365 +825:2:1268 +826:0:4365 +827:3:2746 +828:0:4365 +829:2:1270 +830:0:4365 +831:3:2747 +832:0:4365 +833:2:1271 +834:2:1275 +835:2:1276 +836:2:1284 +837:2:1285 +838:2:1289 +839:2:1290 +840:2:1284 +841:2:1285 +842:2:1289 +843:2:1290 +844:2:1298 +845:2:1303 +846:2:1307 +847:2:1308 +848:2:1315 +849:2:1316 +850:2:1327 +851:2:1328 +852:2:1329 +853:2:1327 +854:2:1328 +855:2:1329 +856:2:1340 +857:2:1345 +858:2:1346 +859:0:4365 +860:2:1358 +861:0:4365 +862:2:1454 +863:0:4365 +864:3:2746 +865:0:4365 +866:2:1455 +867:0:4365 +868:3:2747 +869:0:4365 +870:2:1652 +871:0:4365 +872:2:1653 +873:0:4365 +874:2:1657 +875:0:4365 +876:2:1660 +877:0:4365 +878:3:2746 +879:0:4365 +880:2:1665 +881:2:1669 +882:2:1670 +883:2:1678 +884:2:1679 +885:2:1683 +886:2:1684 +887:2:1678 +888:2:1679 +889:2:1680 +890:2:1692 +891:2:1697 +892:2:1701 +893:2:1702 +894:2:1709 +895:2:1710 +896:2:1721 +897:2:1722 +898:2:1723 +899:2:1721 +900:2:1722 +901:2:1723 +902:2:1734 +903:2:1739 +904:2:1740 +905:0:4365 +906:3:2747 +907:0:4365 +908:2:1752 +909:0:4365 +910:3:2746 +911:0:4365 +912:2:1754 +913:0:4365 +914:3:2747 +915:0:4365 +916:2:1755 +917:2:1759 +918:2:1760 +919:2:1768 +920:2:1769 +921:2:1773 +922:2:1774 +923:2:1768 +924:2:1769 +925:2:1773 +926:2:1774 +927:2:1782 +928:2:1787 +929:2:1791 +930:2:1792 +931:2:1799 +932:2:1800 +933:2:1811 +934:2:1812 +935:2:1813 +936:2:1811 +937:2:1812 +938:2:1813 +939:2:1824 +940:2:1829 +941:2:1830 +942:0:4365 +943:2:1842 +944:0:4365 +945:3:2746 +946:0:4365 +947:2:1844 +948:0:4365 +949:3:2747 +950:0:4365 +951:2:1845 +952:2:1849 +953:2:1850 +954:2:1858 +955:2:1859 +956:2:1863 +957:2:1864 +958:2:1858 +959:2:1859 +960:2:1863 +961:2:1864 +962:2:1872 +963:2:1877 +964:2:1881 +965:2:1882 +966:2:1889 +967:2:1890 +968:2:1901 +969:2:1902 +970:2:1903 +971:2:1901 +972:2:1902 +973:2:1903 +974:2:1914 +975:2:1919 +976:2:1920 +977:0:4365 +978:2:1932 +979:0:4365 +980:3:2746 +981:0:4365 +982:2:1934 +983:0:4365 +984:3:2747 +985:0:4365 +986:2:1935 +987:0:4365 +988:2:1936 +989:0:4365 +990:2:2129 +991:0:4365 +992:2:2130 +993:0:4365 +994:2:2134 +995:0:4365 +996:3:2746 +997:0:4365 +998:2:2136 +999:0:4365 +1000:3:2747 +1001:0:4365 +1002:2:2137 +1003:2:2141 +1004:2:2142 +1005:2:2150 +1006:2:2151 +1007:2:2155 +1008:2:2156 +1009:2:2150 +1010:2:2151 +1011:2:2155 +1012:2:2156 +1013:2:2164 +1014:2:2169 +1015:2:2173 +1016:2:2174 +1017:2:2181 +1018:2:2182 +1019:2:2193 +1020:2:2194 +1021:2:2195 +1022:2:2193 +1023:2:2194 +1024:2:2195 +1025:2:2206 +1026:2:2211 +1027:2:2212 +1028:0:4365 +1029:2:2224 +1030:0:4365 +1031:3:2746 +1032:0:4365 +1033:2:2226 +1034:0:4365 +1035:3:2747 +1036:0:4365 +1037:2:1936 +1038:0:4365 +1039:2:2129 +1040:0:4365 +1041:2:2130 +1042:0:4365 +1043:2:2134 +1044:0:4365 +1045:3:2746 +1046:0:4365 +1047:2:2136 +1048:0:4365 +1049:3:2747 +1050:0:4365 +1051:2:2137 +1052:2:2141 +1053:2:2142 +1054:2:2150 +1055:2:2151 +1056:2:2155 +1057:2:2156 +1058:2:2150 +1059:2:2151 +1060:2:2152 +1061:2:2164 +1062:2:2169 +1063:2:2173 +1064:2:2174 +1065:2:2181 +1066:2:2182 +1067:2:2193 +1068:2:2194 +1069:2:2195 +1070:2:2193 +1071:2:2194 +1072:2:2195 +1073:2:2206 +1074:2:2211 +1075:2:2212 +1076:0:4365 +1077:2:2224 +1078:0:4365 +1079:3:2746 +1080:0:4365 +1081:2:2226 +1082:0:4365 +1083:3:2747 +1084:0:4365 +1085:2:2230 +1086:0:4365 +1087:3:2746 +1088:0:4365 +1089:2:2235 +1090:2:2239 +1091:2:2240 +1092:2:2248 +1093:2:2249 +1094:2:2253 +1095:2:2254 +1096:2:2248 +1097:2:2249 +1098:2:2250 +1099:2:2262 +1100:2:2267 +1101:2:2271 +1102:2:2272 +1103:2:2279 +1104:2:2280 +1105:2:2291 +1106:2:2292 +1107:2:2293 +1108:2:2291 +1109:2:2292 +1110:2:2293 +1111:2:2304 +1112:2:2309 +1113:2:2310 +1114:0:4365 +1115:3:2747 +1116:0:4365 +1117:2:2322 +1118:0:4365 +1119:2:1169 +1120:0:4365 +1121:3:2746 +1122:0:4365 +1123:2:1170 +1124:0:4365 +1125:3:2747 +1126:0:4365 +1127:3:2748 +1128:0:4365 +1129:3:2754 +1130:0:4365 +1131:3:2755 +1132:3:2759 +1133:3:2760 +1134:3:2768 +1135:3:2769 +1136:3:2773 +1137:3:2774 +1138:3:2768 +1139:3:2769 +1140:3:2773 +1141:3:2774 +1142:3:2782 +1143:3:2787 +1144:3:2791 +1145:3:2792 +1146:3:2799 +1147:3:2800 +1148:3:2811 +1149:3:2812 +1150:3:2813 +1151:3:2811 +1152:3:2812 +1153:3:2813 +1154:3:2824 +1155:3:2829 +1156:3:2830 +1157:0:4365 +1158:3:2842 +1159:0:4365 +1160:3:2843 +1161:0:4365 +1162:2:1173 +1163:0:4365 +1164:3:2844 +1165:0:4365 +1166:2:1179 +1167:0:4365 +1168:2:1180 +1169:0:4365 +1170:3:2843 +1171:0:4365 +1172:2:1181 +1173:2:1185 +1174:2:1186 +1175:2:1194 +1176:2:1195 +1177:2:1199 +1178:2:1200 +1179:2:1194 +1180:2:1195 +1181:2:1199 +1182:2:1200 +1183:2:1208 +1184:2:1213 +1185:2:1217 +1186:2:1218 +1187:2:1225 +1188:2:1226 +1189:2:1237 +1190:2:1238 +1191:2:1239 +1192:2:1237 +1193:2:1238 +1194:2:1239 +1195:2:1250 +1196:2:1255 +1197:2:1256 +1198:0:4365 +1199:3:2844 +1200:0:4365 +1201:2:1268 +1202:0:4365 +1203:3:2843 +1204:0:4365 +1205:2:1270 +1206:0:4365 +1207:3:2844 +1208:0:4365 +1209:2:1271 +1210:2:1275 +1211:2:1276 +1212:2:1284 +1213:2:1285 +1214:2:1289 +1215:2:1290 +1216:2:1284 +1217:2:1285 +1218:2:1289 +1219:2:1290 +1220:2:1298 +1221:2:1303 +1222:2:1307 +1223:2:1308 +1224:2:1315 +1225:2:1316 +1226:2:1327 +1227:2:1328 +1228:2:1329 +1229:2:1327 +1230:2:1328 +1231:2:1329 +1232:2:1340 +1233:2:1345 +1234:2:1346 +1235:0:4365 +1236:2:1358 +1237:0:4365 +1238:2:1360 +1239:0:4365 +1240:3:2843 +1241:0:4365 +1242:2:1361 +1243:0:4365 +1244:3:2844 +1245:0:4365 +1246:2:1362 +1247:2:1366 +1248:2:1367 +1249:2:1375 +1250:2:1376 +1251:2:1380 +1252:2:1381 +1253:2:1375 +1254:2:1376 +1255:2:1380 +1256:2:1381 +1257:2:1389 +1258:2:1394 +1259:2:1398 +1260:2:1399 +1261:2:1406 +1262:2:1407 +1263:2:1418 +1264:2:1419 +1265:2:1420 +1266:2:1418 +1267:2:1419 +1268:2:1420 +1269:2:1431 +1270:2:1436 +1271:2:1437 +1272:0:4365 +1273:2:1449 +1274:0:4365 +1275:3:2843 +1276:0:4365 +1277:2:1451 +1278:0:4365 +1279:3:2844 +1280:0:4365 +1281:2:1652 +1282:0:4365 +1283:2:1653 +1284:0:4365 +1285:2:1657 +1286:0:4365 +1287:2:1180 +1288:0:4365 +1289:3:2843 +1290:0:4365 +1291:2:1181 +1292:2:1185 +1293:2:1186 +1294:2:1194 +1295:2:1195 +1296:2:1199 +1297:2:1200 +1298:2:1194 +1299:2:1195 +1300:2:1196 +1301:2:1208 +1302:2:1213 +1303:2:1217 +1304:2:1218 +1305:2:1225 +1306:2:1226 +1307:2:1237 +1308:2:1238 +1309:2:1239 +1310:2:1237 +1311:2:1238 +1312:2:1239 +1313:2:1250 +1314:2:1255 +1315:2:1256 +1316:0:4365 +1317:3:2844 +1318:0:4365 +1319:2:1268 +1320:0:4365 +1321:3:2843 +1322:0:4365 +1323:2:1270 +1324:0:4365 +1325:3:2844 +1326:0:4365 +1327:2:1271 +1328:2:1275 +1329:2:1276 +1330:2:1284 +1331:2:1285 +1332:2:1289 +1333:2:1290 +1334:2:1284 +1335:2:1285 +1336:2:1289 +1337:2:1290 +1338:2:1298 +1339:2:1303 +1340:2:1307 +1341:2:1308 +1342:2:1315 +1343:2:1316 +1344:2:1327 +1345:2:1328 +1346:2:1329 +1347:2:1327 +1348:2:1328 +1349:2:1329 +1350:2:1340 +1351:2:1345 +1352:2:1346 +1353:0:4365 +1354:2:1358 +1355:0:4365 +1356:2:1454 +1357:0:4365 +1358:3:2843 +1359:0:4365 +1360:2:1455 +1361:0:4365 +1362:3:2844 +1363:0:4365 +1364:2:1652 +1365:0:4365 +1366:2:1653 +1367:0:4365 +1368:2:1657 +1369:0:4365 +1370:2:1660 +1371:0:4365 +1372:3:2843 +1373:0:4365 +1374:2:1665 +1375:2:1669 +1376:2:1670 +1377:2:1678 +1378:2:1679 +1379:2:1683 +1380:2:1684 +1381:2:1678 +1382:2:1679 +1383:2:1680 +1384:2:1692 +1385:2:1697 +1386:2:1701 +1387:2:1702 +1388:2:1709 +1389:2:1710 +1390:2:1721 +1391:2:1722 +1392:2:1723 +1393:2:1721 +1394:2:1722 +1395:2:1723 +1396:2:1734 +1397:2:1739 +1398:2:1740 +1399:0:4365 +1400:3:2844 +1401:0:4365 +1402:2:1752 +1403:0:4365 +1404:3:2843 +1405:0:4365 +1406:2:1754 +1407:0:4365 +1408:3:2844 +1409:0:4365 +1410:2:1755 +1411:2:1759 +1412:2:1760 +1413:2:1768 +1414:2:1769 +1415:2:1773 +1416:2:1774 +1417:2:1768 +1418:2:1769 +1419:2:1773 +1420:2:1774 +1421:2:1782 +1422:2:1787 +1423:2:1791 +1424:2:1792 +1425:2:1799 +1426:2:1800 +1427:2:1811 +1428:2:1812 +1429:2:1813 +1430:2:1811 +1431:2:1812 +1432:2:1813 +1433:2:1824 +1434:2:1829 +1435:2:1830 +1436:0:4365 +1437:2:1842 +1438:0:4365 +1439:3:2843 +1440:0:4365 +1441:2:1844 +1442:0:4365 +1443:3:2844 +1444:0:4365 +1445:2:1845 +1446:2:1849 +1447:2:1850 +1448:2:1858 +1449:2:1859 +1450:2:1863 +1451:2:1864 +1452:2:1858 +1453:2:1859 +1454:2:1863 +1455:2:1864 +1456:2:1872 +1457:2:1877 +1458:2:1881 +1459:2:1882 +1460:2:1889 +1461:2:1890 +1462:2:1901 +1463:2:1902 +1464:2:1903 +1465:2:1901 +1466:2:1902 +1467:2:1903 +1468:2:1914 +1469:2:1919 +1470:2:1920 +1471:0:4365 +1472:2:1932 +1473:0:4365 +1474:3:2843 +1475:0:4365 +1476:2:1934 +1477:0:4365 +1478:3:2844 +1479:0:4365 +1480:2:1935 +1481:0:4365 +1482:2:1936 +1483:0:4365 +1484:2:2129 +1485:0:4365 +1486:2:2130 +1487:0:4365 +1488:2:2134 +1489:0:4365 +1490:3:2843 +1491:0:4365 +1492:2:2136 +1493:0:4365 +1494:3:2844 +1495:0:4365 +1496:2:2137 +1497:2:2141 +1498:2:2142 +1499:2:2150 +1500:2:2151 +1501:2:2155 +1502:2:2156 +1503:2:2150 +1504:2:2151 +1505:2:2155 +1506:2:2156 +1507:2:2164 +1508:2:2169 +1509:2:2173 +1510:2:2174 +1511:2:2181 +1512:2:2182 +1513:2:2193 +1514:2:2194 +1515:2:2195 +1516:2:2193 +1517:2:2194 +1518:2:2195 +1519:2:2206 +1520:2:2211 +1521:2:2212 +1522:0:4365 +1523:2:2224 +1524:0:4365 +1525:3:2843 +1526:0:4365 +1527:2:2226 +1528:0:4365 +1529:3:2844 +1530:0:4365 +1531:2:1936 +1532:0:4365 +1533:2:2129 +1534:0:4365 +1535:2:2130 +1536:0:4365 +1537:2:2134 +1538:0:4365 +1539:3:2843 +1540:0:4365 +1541:2:2136 +1542:0:4365 +1543:3:2844 +1544:0:4365 +1545:2:2137 +1546:2:2141 +1547:2:2142 +1548:2:2150 +1549:2:2151 +1550:2:2155 +1551:2:2156 +1552:2:2150 +1553:2:2151 +1554:2:2152 +1555:2:2164 +1556:2:2169 +1557:2:2173 +1558:2:2174 +1559:2:2181 +1560:2:2182 +1561:2:2193 +1562:2:2194 +1563:2:2195 +1564:2:2193 +1565:2:2194 +1566:2:2195 +1567:2:2206 +1568:2:2211 +1569:2:2212 +1570:0:4365 +1571:2:2224 +1572:0:4365 +1573:3:2843 +1574:0:4365 +1575:2:2226 +1576:0:4365 +1577:3:2844 +1578:0:4365 +1579:2:2230 +1580:0:4365 +1581:3:2843 +1582:0:4365 +1583:2:2235 +1584:2:2239 +1585:2:2240 +1586:2:2248 +1587:2:2249 +1588:2:2253 +1589:2:2254 +1590:2:2248 +1591:2:2249 +1592:2:2250 +1593:2:2262 +1594:2:2267 +1595:2:2271 +1596:2:2272 +1597:2:2279 +1598:2:2280 +1599:2:2291 +1600:2:2292 +1601:2:2293 +1602:2:2291 +1603:2:2292 +1604:2:2293 +1605:2:2304 +1606:2:2309 +1607:2:2310 +1608:0:4365 +1609:3:2844 +1610:0:4365 +1611:2:2322 +1612:0:4365 +1613:2:1169 +1614:0:4365 +1615:3:2843 +1616:0:4365 +1617:2:1170 +1618:0:4365 +1619:3:2844 +1620:0:4365 +1621:3:2845 +1622:0:4365 +1623:3:2851 +1624:0:4365 +1625:3:2854 +1626:3:2855 +1627:3:2867 +1628:3:2868 +1629:3:2872 +1630:3:2873 +1631:3:2867 +1632:3:2868 +1633:3:2872 +1634:3:2873 +1635:3:2881 +1636:3:2886 +1637:3:2890 +1638:3:2891 +1639:3:2898 +1640:3:2899 +1641:3:2910 +1642:3:2911 +1643:3:2912 +1644:3:2910 +1645:3:2911 +1646:3:2912 +1647:3:2923 +1648:3:2928 +1649:3:2929 +1650:0:4365 +1651:3:2941 +1652:0:4365 +1653:3:2942 +1654:0:4365 +1655:2:1173 +1656:0:4365 +1657:3:2943 +1658:0:4365 +1659:2:1179 +1660:0:4365 +1661:2:1180 +1662:0:4365 +1663:3:2942 +1664:0:4365 +1665:2:1181 +1666:2:1185 +1667:2:1186 +1668:2:1194 +1669:2:1195 +1670:2:1199 +1671:2:1200 +1672:2:1194 +1673:2:1195 +1674:2:1199 +1675:2:1200 +1676:2:1208 +1677:2:1213 +1678:2:1217 +1679:2:1218 +1680:2:1225 +1681:2:1226 +1682:2:1237 +1683:2:1238 +1684:2:1239 +1685:2:1237 +1686:2:1238 +1687:2:1239 +1688:2:1250 +1689:2:1255 +1690:2:1256 +1691:0:4365 +1692:3:2943 +1693:0:4365 +1694:2:1268 +1695:0:4365 +1696:3:2942 +1697:0:4365 +1698:2:1270 +1699:0:4365 +1700:3:2943 +1701:0:4365 +1702:2:1271 +1703:2:1275 +1704:2:1276 +1705:2:1284 +1706:2:1285 +1707:2:1289 +1708:2:1290 +1709:2:1284 +1710:2:1285 +1711:2:1289 +1712:2:1290 +1713:2:1298 +1714:2:1303 +1715:2:1307 +1716:2:1308 +1717:2:1315 +1718:2:1316 +1719:2:1327 +1720:2:1328 +1721:2:1329 +1722:2:1327 +1723:2:1328 +1724:2:1329 +1725:2:1340 +1726:2:1345 +1727:2:1346 +1728:0:4365 +1729:2:1358 +1730:0:4365 +1731:2:1360 +1732:0:4365 +1733:3:2942 +1734:0:4365 +1735:2:1361 +1736:0:4365 +1737:3:2943 +1738:0:4365 +1739:2:1362 +1740:2:1366 +1741:2:1367 +1742:2:1375 +1743:2:1376 +1744:2:1380 +1745:2:1381 +1746:2:1375 +1747:2:1376 +1748:2:1380 +1749:2:1381 +1750:2:1389 +1751:2:1394 +1752:2:1398 +1753:2:1399 +1754:2:1406 +1755:2:1407 +1756:2:1418 +1757:2:1419 +1758:2:1420 +1759:2:1418 +1760:2:1419 +1761:2:1420 +1762:2:1431 +1763:2:1436 +1764:2:1437 +1765:0:4365 +1766:2:1449 +1767:0:4365 +1768:3:2942 +1769:0:4365 +1770:2:1451 +1771:0:4365 +1772:3:2943 +1773:0:4365 +1774:2:1652 +1775:0:4365 +1776:2:1653 +1777:0:4365 +1778:2:1657 +1779:0:4365 +1780:2:1180 +1781:0:4365 +1782:3:2942 +1783:0:4365 +1784:2:1181 +1785:2:1185 +1786:2:1186 +1787:2:1194 +1788:2:1195 +1789:2:1199 +1790:2:1200 +1791:2:1194 +1792:2:1195 +1793:2:1196 +1794:2:1208 +1795:2:1213 +1796:2:1217 +1797:2:1218 +1798:2:1225 +1799:2:1226 +1800:2:1237 +1801:2:1238 +1802:2:1239 +1803:2:1237 +1804:2:1238 +1805:2:1239 +1806:2:1250 +1807:2:1255 +1808:2:1256 +1809:0:4365 +1810:3:2943 +1811:0:4365 +1812:2:1268 +1813:0:4365 +1814:3:2942 +1815:0:4365 +1816:2:1270 +1817:0:4365 +1818:3:2943 +1819:0:4365 +1820:2:1271 +1821:2:1275 +1822:2:1276 +1823:2:1284 +1824:2:1285 +1825:2:1289 +1826:2:1290 +1827:2:1284 +1828:2:1285 +1829:2:1289 +1830:2:1290 +1831:2:1298 +1832:2:1303 +1833:2:1307 +1834:2:1308 +1835:2:1315 +1836:2:1316 +1837:2:1327 +1838:2:1328 +1839:2:1329 +1840:2:1327 +1841:2:1328 +1842:2:1329 +1843:2:1340 +1844:2:1345 +1845:2:1346 +1846:0:4365 +1847:2:1358 +1848:0:4365 +1849:2:1454 +1850:0:4365 +1851:3:2942 +1852:0:4365 +1853:2:1455 +1854:0:4365 +1855:3:2943 +1856:0:4365 +1857:2:1652 +1858:0:4365 +1859:2:1653 +1860:0:4365 +1861:2:1657 +1862:0:4365 +1863:2:1660 +1864:0:4365 +1865:3:2942 +1866:0:4365 +1867:2:1665 +1868:2:1669 +1869:2:1670 +1870:2:1678 +1871:2:1679 +1872:2:1683 +1873:2:1684 +1874:2:1678 +1875:2:1679 +1876:2:1680 +1877:2:1692 +1878:2:1697 +1879:2:1701 +1880:2:1702 +1881:2:1709 +1882:2:1710 +1883:2:1721 +1884:2:1722 +1885:2:1723 +1886:2:1721 +1887:2:1722 +1888:2:1723 +1889:2:1734 +1890:2:1739 +1891:2:1740 +1892:0:4365 +1893:3:2943 +1894:0:4365 +1895:2:1752 +1896:0:4365 +1897:3:2942 +1898:0:4365 +1899:2:1754 +1900:0:4365 +1901:3:2943 +1902:0:4365 +1903:2:1755 +1904:2:1759 +1905:2:1760 +1906:2:1768 +1907:2:1769 +1908:2:1773 +1909:2:1774 +1910:2:1768 +1911:2:1769 +1912:2:1773 +1913:2:1774 +1914:2:1782 +1915:2:1787 +1916:2:1791 +1917:2:1792 +1918:2:1799 +1919:2:1800 +1920:2:1811 +1921:2:1812 +1922:2:1813 +1923:2:1811 +1924:2:1812 +1925:2:1813 +1926:2:1824 +1927:2:1829 +1928:2:1830 +1929:0:4365 +1930:2:1842 +1931:0:4365 +1932:3:2942 +1933:0:4365 +1934:2:1844 +1935:0:4365 +1936:3:2943 +1937:0:4365 +1938:2:1845 +1939:2:1849 +1940:2:1850 +1941:2:1858 +1942:2:1859 +1943:2:1863 +1944:2:1864 +1945:2:1858 +1946:2:1859 +1947:2:1863 +1948:2:1864 +1949:2:1872 +1950:2:1877 +1951:2:1881 +1952:2:1882 +1953:2:1889 +1954:2:1890 +1955:2:1901 +1956:2:1902 +1957:2:1903 +1958:2:1901 +1959:2:1902 +1960:2:1903 +1961:2:1914 +1962:2:1919 +1963:2:1920 +1964:0:4365 +1965:2:1932 +1966:0:4365 +1967:3:2942 +1968:0:4365 +1969:2:1934 +1970:0:4365 +1971:3:2943 +1972:0:4365 +1973:2:1935 +1974:0:4365 +1975:2:1936 +1976:0:4365 +1977:2:2129 +1978:0:4365 +1979:2:2130 +1980:0:4365 +1981:2:2134 +1982:0:4365 +1983:3:2942 +1984:0:4365 +1985:2:2136 +1986:0:4365 +1987:3:2943 +1988:0:4365 +1989:2:2137 +1990:2:2141 +1991:2:2142 +1992:2:2150 +1993:2:2151 +1994:2:2155 +1995:2:2156 +1996:2:2150 +1997:2:2151 +1998:2:2155 +1999:2:2156 +2000:2:2164 +2001:2:2169 +2002:2:2173 +2003:2:2174 +2004:2:2181 +2005:2:2182 +2006:2:2193 +2007:2:2194 +2008:2:2195 +2009:2:2193 +2010:2:2194 +2011:2:2195 +2012:2:2206 +2013:2:2211 +2014:2:2212 +2015:0:4365 +2016:2:2224 +2017:0:4365 +2018:3:2942 +2019:0:4365 +2020:2:2226 +2021:0:4365 +2022:3:2943 +2023:0:4365 +2024:2:1936 +2025:0:4365 +2026:2:2129 +2027:0:4365 +2028:2:2130 +2029:0:4365 +2030:2:2134 +2031:0:4365 +2032:3:2942 +2033:0:4365 +2034:2:2136 +2035:0:4365 +2036:3:2943 +2037:0:4365 +2038:2:2137 +2039:2:2141 +2040:2:2142 +2041:2:2150 +2042:2:2151 +2043:2:2155 +2044:2:2156 +2045:2:2150 +2046:2:2151 +2047:2:2152 +2048:2:2164 +2049:2:2169 +2050:2:2173 +2051:2:2174 +2052:2:2181 +2053:2:2182 +2054:2:2193 +2055:2:2194 +2056:2:2195 +2057:2:2193 +2058:2:2194 +2059:2:2195 +2060:2:2206 +2061:2:2211 +2062:2:2212 +2063:0:4365 +2064:2:2224 +2065:0:4365 +2066:3:2942 +2067:0:4365 +2068:2:2226 +2069:0:4365 +2070:3:2943 +2071:0:4365 +2072:2:2230 +2073:0:4365 +2074:3:2942 +2075:0:4365 +2076:2:2235 +2077:2:2239 +2078:2:2240 +2079:2:2248 +2080:2:2249 +2081:2:2253 +2082:2:2254 +2083:2:2248 +2084:2:2249 +2085:2:2250 +2086:2:2262 +2087:2:2267 +2088:2:2271 +2089:2:2272 +2090:2:2279 +2091:2:2280 +2092:2:2291 +2093:2:2292 +2094:2:2293 +2095:2:2291 +2096:2:2292 +2097:2:2293 +2098:2:2304 +2099:2:2309 +2100:2:2310 +2101:0:4365 +2102:3:2943 +2103:0:4365 +2104:2:2322 +2105:0:4365 +2106:2:1169 +2107:0:4365 +2108:3:2942 +2109:0:4365 +2110:2:1170 +2111:0:4365 +2112:3:2943 +2113:0:4365 +2114:3:2944 +2115:0:4365 +2116:3:2950 +2117:0:4365 +2118:3:2951 +2119:0:4365 +2120:3:2952 +2121:0:4365 +2122:3:2953 +2123:0:4365 +2124:3:2954 +2125:3:2958 +2126:3:2959 +2127:3:2967 +2128:3:2968 +2129:3:2972 +2130:3:2973 +2131:3:2967 +2132:3:2968 +2133:3:2972 +2134:3:2973 +2135:3:2981 +2136:3:2986 +2137:3:2990 +2138:3:2991 +2139:3:2998 +2140:3:2999 +2141:3:3010 +2142:3:3011 +2143:3:3012 +2144:3:3010 +2145:3:3011 +2146:3:3012 +2147:3:3023 +2148:3:3028 +2149:3:3029 +2150:0:4365 +2151:3:3041 +2152:0:4365 +2153:3:3042 +2154:0:4365 +2155:2:1173 +2156:0:4365 +2157:3:3043 +2158:0:4365 +2159:2:1179 +2160:0:4365 +2161:2:1180 +2162:0:4365 +2163:3:3042 +2164:0:4365 +2165:2:1181 +2166:2:1185 +2167:2:1186 +2168:2:1194 +2169:2:1195 +2170:2:1199 +2171:2:1200 +2172:2:1194 +2173:2:1195 +2174:2:1199 +2175:2:1200 +2176:2:1208 +2177:2:1213 +2178:2:1217 +2179:2:1218 +2180:2:1225 +2181:2:1226 +2182:2:1237 +2183:2:1238 +2184:2:1239 +2185:2:1237 +2186:2:1238 +2187:2:1239 +2188:2:1250 +2189:2:1255 +2190:2:1256 +2191:0:4365 +2192:3:3043 +2193:0:4365 +2194:2:1268 +2195:0:4365 +2196:3:3042 +2197:0:4365 +2198:2:1270 +2199:0:4365 +2200:3:3043 +2201:0:4365 +2202:2:1271 +2203:2:1275 +2204:2:1276 +2205:2:1284 +2206:2:1285 +2207:2:1289 +2208:2:1290 +2209:2:1284 +2210:2:1285 +2211:2:1289 +2212:2:1290 +2213:2:1298 +2214:2:1303 +2215:2:1307 +2216:2:1308 +2217:2:1315 +2218:2:1316 +2219:2:1327 +2220:2:1328 +2221:2:1329 +2222:2:1327 +2223:2:1328 +2224:2:1329 +2225:2:1340 +2226:2:1345 +2227:2:1346 +2228:0:4365 +2229:2:1358 +2230:0:4365 +2231:2:1360 +2232:0:4365 +2233:3:3042 +2234:0:4365 +2235:2:1361 +2236:0:4365 +2237:3:3043 +2238:0:4365 +2239:2:1362 +2240:2:1366 +2241:2:1367 +2242:2:1375 +2243:2:1376 +2244:2:1380 +2245:2:1381 +2246:2:1375 +2247:2:1376 +2248:2:1380 +2249:2:1381 +2250:2:1389 +2251:2:1394 +2252:2:1398 +2253:2:1399 +2254:2:1406 +2255:2:1407 +2256:2:1418 +2257:2:1419 +2258:2:1420 +2259:2:1418 +2260:2:1419 +2261:2:1420 +2262:2:1431 +2263:2:1436 +2264:2:1437 +2265:0:4365 +2266:2:1449 +2267:0:4365 +2268:3:3042 +2269:0:4365 +2270:2:1451 +2271:0:4365 +2272:3:3043 +2273:0:4365 +2274:2:1652 +2275:0:4365 +2276:2:1653 +2277:0:4365 +2278:2:1657 +2279:0:4365 +2280:2:1180 +2281:0:4365 +2282:3:3042 +2283:0:4365 +2284:2:1181 +2285:2:1185 +2286:2:1186 +2287:2:1194 +2288:2:1195 +2289:2:1199 +2290:2:1200 +2291:2:1194 +2292:2:1195 +2293:2:1196 +2294:2:1208 +2295:2:1213 +2296:2:1217 +2297:2:1218 +2298:2:1225 +2299:2:1226 +2300:2:1237 +2301:2:1238 +2302:2:1239 +2303:2:1237 +2304:2:1238 +2305:2:1239 +2306:2:1250 +2307:2:1255 +2308:2:1256 +2309:0:4365 +2310:3:3043 +2311:0:4365 +2312:2:1268 +2313:0:4365 +2314:3:3042 +2315:0:4365 +2316:2:1270 +2317:0:4365 +2318:3:3043 +2319:0:4365 +2320:2:1271 +2321:2:1275 +2322:2:1276 +2323:2:1284 +2324:2:1285 +2325:2:1289 +2326:2:1290 +2327:2:1284 +2328:2:1285 +2329:2:1289 +2330:2:1290 +2331:2:1298 +2332:2:1303 +2333:2:1307 +2334:2:1308 +2335:2:1315 +2336:2:1316 +2337:2:1327 +2338:2:1328 +2339:2:1329 +2340:2:1327 +2341:2:1328 +2342:2:1329 +2343:2:1340 +2344:2:1345 +2345:2:1346 +2346:0:4365 +2347:2:1358 +2348:0:4365 +2349:2:1454 +2350:0:4365 +2351:3:3042 +2352:0:4365 +2353:2:1455 +2354:0:4365 +2355:3:3043 +2356:0:4365 +2357:2:1652 +2358:0:4365 +2359:2:1653 +2360:0:4365 +2361:2:1657 +2362:0:4365 +2363:2:1660 +2364:0:4365 +2365:3:3042 +2366:0:4365 +2367:2:1665 +2368:2:1669 +2369:2:1670 +2370:2:1678 +2371:2:1679 +2372:2:1683 +2373:2:1684 +2374:2:1678 +2375:2:1679 +2376:2:1680 +2377:2:1692 +2378:2:1697 +2379:2:1701 +2380:2:1702 +2381:2:1709 +2382:2:1710 +2383:2:1721 +2384:2:1722 +2385:2:1723 +2386:2:1721 +2387:2:1722 +2388:2:1723 +2389:2:1734 +2390:2:1739 +2391:2:1740 +2392:0:4365 +2393:3:3043 +2394:0:4365 +2395:2:1752 +2396:0:4365 +2397:3:3042 +2398:0:4365 +2399:2:1754 +2400:0:4365 +2401:3:3043 +2402:0:4365 +2403:2:1755 +2404:2:1759 +2405:2:1760 +2406:2:1768 +2407:2:1769 +2408:2:1773 +2409:2:1774 +2410:2:1768 +2411:2:1769 +2412:2:1773 +2413:2:1774 +2414:2:1782 +2415:2:1787 +2416:2:1791 +2417:2:1792 +2418:2:1799 +2419:2:1800 +2420:2:1811 +2421:2:1812 +2422:2:1813 +2423:2:1811 +2424:2:1812 +2425:2:1813 +2426:2:1824 +2427:2:1829 +2428:2:1830 +2429:0:4365 +2430:2:1842 +2431:0:4365 +2432:3:3042 +2433:0:4365 +2434:2:1844 +2435:0:4365 +2436:3:3043 +2437:0:4365 +2438:2:1845 +2439:2:1849 +2440:2:1850 +2441:2:1858 +2442:2:1859 +2443:2:1863 +2444:2:1864 +2445:2:1858 +2446:2:1859 +2447:2:1863 +2448:2:1864 +2449:2:1872 +2450:2:1877 +2451:2:1881 +2452:2:1882 +2453:2:1889 +2454:2:1890 +2455:2:1901 +2456:2:1902 +2457:2:1903 +2458:2:1901 +2459:2:1902 +2460:2:1903 +2461:2:1914 +2462:2:1919 +2463:2:1920 +2464:0:4365 +2465:2:1932 +2466:0:4365 +2467:3:3042 +2468:0:4365 +2469:2:1934 +2470:0:4365 +2471:3:3043 +2472:0:4365 +2473:2:1935 +2474:0:4365 +2475:2:1936 +2476:0:4365 +2477:2:2129 +2478:0:4365 +2479:2:2130 +2480:0:4365 +2481:2:2134 +2482:0:4365 +2483:3:3042 +2484:0:4365 +2485:2:2136 +2486:0:4365 +2487:3:3043 +2488:0:4365 +2489:2:2137 +2490:2:2141 +2491:2:2142 +2492:2:2150 +2493:2:2151 +2494:2:2155 +2495:2:2156 +2496:2:2150 +2497:2:2151 +2498:2:2155 +2499:2:2156 +2500:2:2164 +2501:2:2169 +2502:2:2173 +2503:2:2174 +2504:2:2181 +2505:2:2182 +2506:2:2193 +2507:2:2194 +2508:2:2195 +2509:2:2193 +2510:2:2194 +2511:2:2195 +2512:2:2206 +2513:2:2211 +2514:2:2212 +2515:0:4365 +2516:2:2224 +2517:0:4365 +2518:3:3042 +2519:0:4365 +2520:2:2226 +2521:0:4365 +2522:3:3043 +2523:0:4365 +2524:2:1936 +2525:0:4365 +2526:2:2129 +2527:0:4365 +2528:2:2130 +2529:0:4365 +2530:2:2134 +2531:0:4365 +2532:3:3042 +2533:0:4365 +2534:2:2136 +2535:0:4365 +2536:3:3043 +2537:0:4365 +2538:2:2137 +2539:2:2141 +2540:2:2142 +2541:2:2150 +2542:2:2151 +2543:2:2155 +2544:2:2156 +2545:2:2150 +2546:2:2151 +2547:2:2152 +2548:2:2164 +2549:2:2169 +2550:2:2173 +2551:2:2174 +2552:2:2181 +2553:2:2182 +2554:2:2193 +2555:2:2194 +2556:2:2195 +2557:2:2193 +2558:2:2194 +2559:2:2195 +2560:2:2206 +2561:2:2211 +2562:2:2212 +2563:0:4365 +2564:2:2224 +2565:0:4365 +2566:3:3042 +2567:0:4365 +2568:2:2226 +2569:0:4365 +2570:3:3043 +2571:0:4365 +2572:2:2230 +2573:0:4365 +2574:3:3042 +2575:0:4365 +2576:2:2235 +2577:2:2239 +2578:2:2240 +2579:2:2248 +2580:2:2249 +2581:2:2253 +2582:2:2254 +2583:2:2248 +2584:2:2249 +2585:2:2250 +2586:2:2262 +2587:2:2267 +2588:2:2271 +2589:2:2272 +2590:2:2279 +2591:2:2280 +2592:2:2291 +2593:2:2292 +2594:2:2293 +2595:2:2291 +2596:2:2292 +2597:2:2293 +2598:2:2304 +2599:2:2309 +2600:2:2310 +2601:0:4365 +2602:3:3043 +2603:0:4365 +2604:2:2322 +2605:0:4365 +2606:2:1169 +2607:0:4365 +2608:3:3042 +2609:0:4365 +2610:2:1170 +2611:0:4365 +2612:3:3043 +2613:0:4365 +2614:3:3044 +2615:0:4365 +2616:3:3257 +2617:0:4365 +2618:3:3265 +2619:0:4365 +2620:3:3266 +2621:3:3270 +2622:3:3271 +2623:3:3279 +2624:3:3280 +2625:3:3284 +2626:3:3285 +2627:3:3279 +2628:3:3280 +2629:3:3284 +2630:3:3285 +2631:3:3293 +2632:3:3298 +2633:3:3302 +2634:3:3303 +2635:3:3310 +2636:3:3311 +2637:3:3322 +2638:3:3323 +2639:3:3324 +2640:3:3322 +2641:3:3323 +2642:3:3324 +2643:3:3335 +2644:3:3340 +2645:3:3341 +2646:0:4365 +2647:3:3353 +2648:0:4365 +2649:3:3354 +2650:0:4365 +2651:2:1173 +2652:0:4365 +2653:3:3355 +2654:0:4365 +2655:2:1179 +2656:0:4365 +2657:2:1180 +2658:0:4365 +2659:3:3354 +2660:0:4365 +2661:2:1181 +2662:2:1185 +2663:2:1186 +2664:2:1194 +2665:2:1195 +2666:2:1199 +2667:2:1200 +2668:2:1194 +2669:2:1195 +2670:2:1199 +2671:2:1200 +2672:2:1208 +2673:2:1213 +2674:2:1217 +2675:2:1218 +2676:2:1225 +2677:2:1226 +2678:2:1237 +2679:2:1238 +2680:2:1239 +2681:2:1237 +2682:2:1238 +2683:2:1239 +2684:2:1250 +2685:2:1255 +2686:2:1256 +2687:0:4365 +2688:3:3355 +2689:0:4365 +2690:2:1268 +2691:0:4365 +2692:3:3354 +2693:0:4365 +2694:2:1270 +2695:0:4365 +2696:3:3355 +2697:0:4365 +2698:2:1271 +2699:2:1275 +2700:2:1276 +2701:2:1284 +2702:2:1285 +2703:2:1289 +2704:2:1290 +2705:2:1284 +2706:2:1285 +2707:2:1289 +2708:2:1290 +2709:2:1298 +2710:2:1303 +2711:2:1307 +2712:2:1308 +2713:2:1315 +2714:2:1316 +2715:2:1327 +2716:2:1328 +2717:2:1329 +2718:2:1327 +2719:2:1328 +2720:2:1329 +2721:2:1340 +2722:2:1345 +2723:2:1346 +2724:0:4365 +2725:2:1358 +2726:0:4365 +2727:2:1360 +2728:0:4365 +2729:3:3354 +2730:0:4365 +2731:2:1361 +2732:0:4365 +2733:3:3355 +2734:0:4365 +2735:2:1362 +2736:2:1366 +2737:2:1367 +2738:2:1375 +2739:2:1376 +2740:2:1380 +2741:2:1381 +2742:2:1375 +2743:2:1376 +2744:2:1380 +2745:2:1381 +2746:2:1389 +2747:2:1394 +2748:2:1398 +2749:2:1399 +2750:2:1406 +2751:2:1407 +2752:2:1418 +2753:2:1419 +2754:2:1420 +2755:2:1418 +2756:2:1419 +2757:2:1420 +2758:2:1431 +2759:2:1436 +2760:2:1437 +2761:0:4365 +2762:2:1449 +2763:0:4365 +2764:3:3354 +2765:0:4365 +2766:2:1451 +2767:0:4365 +2768:3:3355 +2769:0:4365 +2770:2:1652 +2771:0:4365 +2772:2:1653 +2773:0:4365 +2774:2:1657 +2775:0:4365 +2776:2:1180 +2777:0:4365 +2778:3:3354 +2779:0:4365 +2780:2:1181 +2781:2:1185 +2782:2:1186 +2783:2:1194 +2784:2:1195 +2785:2:1199 +2786:2:1200 +2787:2:1194 +2788:2:1195 +2789:2:1196 +2790:2:1208 +2791:2:1213 +2792:2:1217 +2793:2:1218 +2794:2:1225 +2795:2:1226 +2796:2:1237 +2797:2:1238 +2798:2:1239 +2799:2:1237 +2800:2:1238 +2801:2:1239 +2802:2:1250 +2803:2:1255 +2804:2:1256 +2805:0:4365 +2806:3:3355 +2807:0:4365 +2808:2:1268 +2809:0:4365 +2810:3:3354 +2811:0:4365 +2812:2:1270 +2813:0:4365 +2814:3:3355 +2815:0:4365 +2816:2:1271 +2817:2:1275 +2818:2:1276 +2819:2:1284 +2820:2:1285 +2821:2:1289 +2822:2:1290 +2823:2:1284 +2824:2:1285 +2825:2:1289 +2826:2:1290 +2827:2:1298 +2828:2:1303 +2829:2:1307 +2830:2:1308 +2831:2:1315 +2832:2:1316 +2833:2:1327 +2834:2:1328 +2835:2:1329 +2836:2:1327 +2837:2:1328 +2838:2:1329 +2839:2:1340 +2840:2:1345 +2841:2:1346 +2842:0:4365 +2843:2:1358 +2844:0:4365 +2845:2:1454 +2846:0:4365 +2847:3:3354 +2848:0:4365 +2849:2:1455 +2850:0:4365 +2851:3:3355 +2852:0:4365 +2853:2:1652 +2854:0:4365 +2855:2:1653 +2856:0:4365 +2857:2:1657 +2858:0:4365 +2859:2:1660 +2860:0:4365 +2861:3:3354 +2862:0:4365 +2863:2:1665 +2864:2:1669 +2865:2:1670 +2866:2:1678 +2867:2:1679 +2868:2:1683 +2869:2:1684 +2870:2:1678 +2871:2:1679 +2872:2:1680 +2873:2:1692 +2874:2:1697 +2875:2:1701 +2876:2:1702 +2877:2:1709 +2878:2:1710 +2879:2:1721 +2880:2:1722 +2881:2:1723 +2882:2:1721 +2883:2:1722 +2884:2:1723 +2885:2:1734 +2886:2:1739 +2887:2:1740 +2888:0:4365 +2889:3:3355 +2890:0:4365 +2891:2:1752 +2892:0:4365 +2893:3:3354 +2894:0:4365 +2895:2:1754 +2896:0:4365 +2897:3:3355 +2898:0:4365 +2899:2:1755 +2900:2:1759 +2901:2:1760 +2902:2:1768 +2903:2:1769 +2904:2:1773 +2905:2:1774 +2906:2:1768 +2907:2:1769 +2908:2:1773 +2909:2:1774 +2910:2:1782 +2911:2:1787 +2912:2:1791 +2913:2:1792 +2914:2:1799 +2915:2:1800 +2916:2:1811 +2917:2:1812 +2918:2:1813 +2919:2:1811 +2920:2:1812 +2921:2:1813 +2922:2:1824 +2923:2:1829 +2924:2:1830 +2925:0:4365 +2926:2:1842 +2927:0:4365 +2928:3:3354 +2929:0:4365 +2930:2:1844 +2931:0:4365 +2932:3:3355 +2933:0:4365 +2934:2:1845 +2935:2:1849 +2936:2:1850 +2937:2:1858 +2938:2:1859 +2939:2:1863 +2940:2:1864 +2941:2:1858 +2942:2:1859 +2943:2:1863 +2944:2:1864 +2945:2:1872 +2946:2:1877 +2947:2:1881 +2948:2:1882 +2949:2:1889 +2950:2:1890 +2951:2:1901 +2952:2:1902 +2953:2:1903 +2954:2:1901 +2955:2:1902 +2956:2:1903 +2957:2:1914 +2958:2:1919 +2959:2:1920 +2960:0:4365 +2961:2:1932 +2962:0:4365 +2963:3:3354 +2964:0:4365 +2965:2:1934 +2966:0:4365 +2967:3:3355 +2968:0:4365 +2969:2:1935 +2970:0:4365 +2971:2:1936 +2972:0:4365 +2973:2:2129 +2974:0:4365 +2975:2:2130 +2976:0:4365 +2977:2:2134 +2978:0:4365 +2979:3:3354 +2980:0:4365 +2981:2:2136 +2982:0:4365 +2983:3:3355 +2984:0:4365 +2985:2:2137 +2986:2:2141 +2987:2:2142 +2988:2:2150 +2989:2:2151 +2990:2:2155 +2991:2:2156 +2992:2:2150 +2993:2:2151 +2994:2:2155 +2995:2:2156 +2996:2:2164 +2997:2:2169 +2998:2:2173 +2999:2:2174 +3000:2:2181 +3001:2:2182 +3002:2:2193 +3003:2:2194 +3004:2:2195 +3005:2:2193 +3006:2:2194 +3007:2:2195 +3008:2:2206 +3009:2:2211 +3010:2:2212 +3011:0:4365 +3012:2:2224 +3013:0:4365 +3014:3:3354 +3015:0:4365 +3016:2:2226 +3017:0:4365 +3018:3:3355 +3019:0:4365 +3020:2:1936 +3021:0:4365 +3022:2:2129 +3023:0:4365 +3024:2:2130 +3025:0:4365 +3026:2:2134 +3027:0:4365 +3028:3:3354 +3029:0:4365 +3030:2:2136 +3031:0:4365 +3032:3:3355 +3033:0:4365 +3034:2:2137 +3035:2:2141 +3036:2:2142 +3037:2:2150 +3038:2:2151 +3039:2:2155 +3040:2:2156 +3041:2:2150 +3042:2:2151 +3043:2:2152 +3044:2:2164 +3045:2:2169 +3046:2:2173 +3047:2:2174 +3048:2:2181 +3049:2:2182 +3050:2:2193 +3051:2:2194 +3052:2:2195 +3053:2:2193 +3054:2:2194 +3055:2:2195 +3056:2:2206 +3057:2:2211 +3058:2:2212 +3059:0:4365 +3060:2:2224 +3061:0:4365 +3062:3:3354 +3063:0:4365 +3064:2:2226 +3065:0:4365 +3066:3:3355 +3067:0:4365 +3068:2:2230 +3069:0:4365 +3070:3:3354 +3071:0:4365 +3072:2:2235 +3073:2:2239 +3074:2:2240 +3075:2:2248 +3076:2:2249 +3077:2:2253 +3078:2:2254 +3079:2:2248 +3080:2:2249 +3081:2:2250 +3082:2:2262 +3083:2:2267 +3084:2:2271 +3085:2:2272 +3086:2:2279 +3087:2:2280 +3088:2:2291 +3089:2:2292 +3090:2:2293 +3091:2:2291 +3092:2:2292 +3093:2:2293 +3094:2:2304 +3095:2:2309 +3096:2:2310 +3097:0:4365 +3098:3:3355 +3099:0:4365 +3100:2:2322 +3101:0:4365 +3102:2:1169 +3103:0:4365 +3104:3:3354 +3105:0:4365 +3106:2:1170 +3107:0:4365 +3108:3:3355 +3109:0:4365 +3110:3:3356 +3111:0:4365 +3112:3:3366 +3113:0:4365 +3114:3:2951 +3115:0:4365 +3116:3:2952 +3117:0:4365 +3118:3:2953 +3119:0:4365 +3120:3:2954 +3121:3:2958 +3122:3:2959 +3123:3:2967 +3124:3:2968 +3125:3:2972 +3126:3:2973 +3127:3:2967 +3128:3:2968 +3129:3:2972 +3130:3:2973 +3131:3:2981 +3132:3:2986 +3133:3:2990 +3134:3:2991 +3135:3:2998 +3136:3:2999 +3137:3:3010 +3138:3:3011 +3139:3:3012 +3140:3:3010 +3141:3:3011 +3142:3:3012 +3143:3:3023 +3144:3:3028 +3145:3:3029 +3146:0:4365 +3147:3:3041 +3148:0:4365 +3149:3:3042 +3150:0:4365 +3151:2:1173 +3152:0:4365 +3153:3:3043 +3154:0:4365 +3155:2:1179 +3156:0:4365 +3157:2:1180 +3158:0:4365 +3159:3:3042 +3160:0:4365 +3161:2:1181 +3162:2:1185 +3163:2:1186 +3164:2:1194 +3165:2:1195 +3166:2:1199 +3167:2:1200 +3168:2:1194 +3169:2:1195 +3170:2:1199 +3171:2:1200 +3172:2:1208 +3173:2:1213 +3174:2:1217 +3175:2:1218 +3176:2:1225 +3177:2:1226 +3178:2:1237 +3179:2:1238 +3180:2:1239 +3181:2:1237 +3182:2:1238 +3183:2:1239 +3184:2:1250 +3185:2:1255 +3186:2:1256 +3187:0:4365 +3188:3:3043 +3189:0:4365 +3190:2:1268 +3191:0:4365 +3192:3:3042 +3193:0:4365 +3194:2:1270 +3195:0:4365 +3196:3:3043 +3197:0:4365 +3198:2:1271 +3199:2:1275 +3200:2:1276 +3201:2:1284 +3202:2:1285 +3203:2:1289 +3204:2:1290 +3205:2:1284 +3206:2:1285 +3207:2:1289 +3208:2:1290 +3209:2:1298 +3210:2:1303 +3211:2:1307 +3212:2:1308 +3213:2:1315 +3214:2:1316 +3215:2:1327 +3216:2:1328 +3217:2:1329 +3218:2:1327 +3219:2:1328 +3220:2:1329 +3221:2:1340 +3222:2:1345 +3223:2:1346 +3224:0:4365 +3225:2:1358 +3226:0:4365 +3227:2:1360 +3228:0:4365 +3229:3:3042 +3230:0:4365 +3231:2:1361 +3232:0:4365 +3233:3:3043 +3234:0:4365 +3235:2:1362 +3236:2:1366 +3237:2:1367 +3238:2:1375 +3239:2:1376 +3240:2:1380 +3241:2:1381 +3242:2:1375 +3243:2:1376 +3244:2:1380 +3245:2:1381 +3246:2:1389 +3247:2:1394 +3248:2:1398 +3249:2:1399 +3250:2:1406 +3251:2:1407 +3252:2:1418 +3253:2:1419 +3254:2:1420 +3255:2:1418 +3256:2:1419 +3257:2:1420 +3258:2:1431 +3259:2:1436 +3260:2:1437 +3261:0:4365 +3262:2:1449 +3263:0:4365 +3264:3:3042 +3265:0:4365 +3266:2:1451 +3267:0:4365 +3268:3:3043 +3269:0:4365 +3270:2:1652 +3271:0:4365 +3272:2:1653 +3273:0:4365 +3274:2:1657 +3275:0:4365 +3276:2:1180 +3277:0:4365 +3278:3:3042 +3279:0:4365 +3280:2:1181 +3281:2:1185 +3282:2:1186 +3283:2:1194 +3284:2:1195 +3285:2:1199 +3286:2:1200 +3287:2:1194 +3288:2:1195 +3289:2:1196 +3290:2:1208 +3291:2:1213 +3292:2:1217 +3293:2:1218 +3294:2:1225 +3295:2:1226 +3296:2:1237 +3297:2:1238 +3298:2:1239 +3299:2:1237 +3300:2:1238 +3301:2:1239 +3302:2:1250 +3303:2:1255 +3304:2:1256 +3305:0:4365 +3306:3:3043 +3307:0:4365 +3308:2:1268 +3309:0:4365 +3310:3:3042 +3311:0:4365 +3312:2:1270 +3313:0:4365 +3314:3:3043 +3315:0:4365 +3316:2:1271 +3317:2:1275 +3318:2:1276 +3319:2:1284 +3320:2:1285 +3321:2:1289 +3322:2:1290 +3323:2:1284 +3324:2:1285 +3325:2:1289 +3326:2:1290 +3327:2:1298 +3328:2:1303 +3329:2:1307 +3330:2:1308 +3331:2:1315 +3332:2:1316 +3333:2:1327 +3334:2:1328 +3335:2:1329 +3336:2:1327 +3337:2:1328 +3338:2:1329 +3339:2:1340 +3340:2:1345 +3341:2:1346 +3342:0:4365 +3343:2:1358 +3344:0:4365 +3345:2:1454 +3346:0:4365 +3347:3:3042 +3348:0:4365 +3349:2:1455 +3350:0:4365 +3351:3:3043 +3352:0:4365 +3353:2:1652 +3354:0:4365 +3355:2:1653 +3356:0:4365 +3357:2:1657 +3358:0:4365 +3359:2:1660 +3360:0:4365 +3361:3:3042 +3362:0:4365 +3363:2:1665 +3364:2:1669 +3365:2:1670 +3366:2:1678 +3367:2:1679 +3368:2:1683 +3369:2:1684 +3370:2:1678 +3371:2:1679 +3372:2:1680 +3373:2:1692 +3374:2:1697 +3375:2:1701 +3376:2:1702 +3377:2:1709 +3378:2:1710 +3379:2:1721 +3380:2:1722 +3381:2:1723 +3382:2:1721 +3383:2:1722 +3384:2:1723 +3385:2:1734 +3386:2:1739 +3387:2:1740 +3388:0:4365 +3389:3:3043 +3390:0:4365 +3391:2:1752 +3392:0:4365 +3393:3:3042 +3394:0:4365 +3395:2:1754 +3396:0:4365 +3397:3:3043 +3398:0:4365 +3399:2:1755 +3400:2:1759 +3401:2:1760 +3402:2:1768 +3403:2:1769 +3404:2:1773 +3405:2:1774 +3406:2:1768 +3407:2:1769 +3408:2:1773 +3409:2:1774 +3410:2:1782 +3411:2:1787 +3412:2:1791 +3413:2:1792 +3414:2:1799 +3415:2:1800 +3416:2:1811 +3417:2:1812 +3418:2:1813 +3419:2:1811 +3420:2:1812 +3421:2:1813 +3422:2:1824 +3423:2:1829 +3424:2:1830 +3425:0:4365 +3426:2:1842 +3427:0:4365 +3428:3:3042 +3429:0:4365 +3430:2:1844 +3431:0:4365 +3432:3:3043 +3433:0:4365 +3434:2:1845 +3435:2:1849 +3436:2:1850 +3437:2:1858 +3438:2:1859 +3439:2:1863 +3440:2:1864 +3441:2:1858 +3442:2:1859 +3443:2:1863 +3444:2:1864 +3445:2:1872 +3446:2:1877 +3447:2:1881 +3448:2:1882 +3449:2:1889 +3450:2:1890 +3451:2:1901 +3452:2:1902 +3453:2:1903 +3454:2:1901 +3455:2:1902 +3456:2:1903 +3457:2:1914 +3458:2:1919 +3459:2:1920 +3460:0:4365 +3461:2:1932 +3462:0:4365 +3463:3:3042 +3464:0:4365 +3465:2:1934 +3466:0:4365 +3467:3:3043 +3468:0:4365 +3469:2:1935 +3470:0:4365 +3471:2:1936 +3472:0:4365 +3473:2:2129 +3474:0:4365 +3475:2:2130 +3476:0:4365 +3477:2:2134 +3478:0:4365 +3479:3:3042 +3480:0:4365 +3481:2:2136 +3482:0:4365 +3483:3:3043 +3484:0:4365 +3485:2:2137 +3486:2:2141 +3487:2:2142 +3488:2:2150 +3489:2:2151 +3490:2:2155 +3491:2:2156 +3492:2:2150 +3493:2:2151 +3494:2:2155 +3495:2:2156 +3496:2:2164 +3497:2:2169 +3498:2:2173 +3499:2:2174 +3500:2:2181 +3501:2:2182 +3502:2:2193 +3503:2:2194 +3504:2:2195 +3505:2:2193 +3506:2:2194 +3507:2:2195 +3508:2:2206 +3509:2:2211 +3510:2:2212 +3511:0:4365 +3512:2:2224 +3513:0:4365 +3514:3:3042 +3515:0:4365 +3516:2:2226 +3517:0:4365 +3518:3:3043 +3519:0:4365 +3520:2:1936 +3521:0:4365 +3522:2:2129 +3523:0:4365 +3524:2:2130 +3525:0:4365 +3526:2:2134 +3527:0:4365 +3528:3:3042 +3529:0:4365 +3530:2:2136 +3531:0:4365 +3532:3:3043 +3533:0:4365 +3534:2:2137 +3535:2:2141 +3536:2:2142 +3537:2:2150 +3538:2:2151 +3539:2:2155 +3540:2:2156 +3541:2:2150 +3542:2:2151 +3543:2:2152 +3544:2:2164 +3545:2:2169 +3546:2:2173 +3547:2:2174 +3548:2:2181 +3549:2:2182 +3550:2:2193 +3551:2:2194 +3552:2:2195 +3553:2:2193 +3554:2:2194 +3555:2:2195 +3556:2:2206 +3557:2:2211 +3558:2:2212 +3559:0:4365 +3560:2:2224 +3561:0:4365 +3562:3:3042 +3563:0:4365 +3564:2:2226 +3565:0:4365 +3566:3:3043 +3567:0:4365 +3568:2:2230 +3569:0:4365 +3570:3:3042 +3571:0:4365 +3572:2:2235 +3573:2:2239 +3574:2:2240 +3575:2:2248 +3576:2:2249 +3577:2:2253 +3578:2:2254 +3579:2:2248 +3580:2:2249 +3581:2:2250 +3582:2:2262 +3583:2:2267 +3584:2:2271 +3585:2:2272 +3586:2:2279 +3587:2:2280 +3588:2:2291 +3589:2:2292 +3590:2:2293 +3591:2:2291 +3592:2:2292 +3593:2:2293 +3594:2:2304 +3595:2:2309 +3596:2:2310 +3597:0:4365 +3598:3:3043 +3599:0:4365 +3600:2:2322 +3601:0:4365 +3602:2:1169 +3603:0:4365 +3604:3:3042 +3605:0:4365 +3606:2:1170 +3607:0:4365 +3608:3:3043 +3609:0:4365 +3610:3:3044 +3611:0:4365 +3612:3:3257 +3613:0:4365 +3614:3:3362 +3615:0:4365 +3616:3:3363 +3617:0:4365 +3618:3:3367 +3619:0:4365 +3620:3:3373 +3621:3:3377 +3622:3:3378 +3623:3:3386 +3624:3:3387 +3625:3:3391 +3626:3:3392 +3627:3:3386 +3628:3:3387 +3629:3:3391 +3630:3:3392 +3631:3:3400 +3632:3:3405 +3633:3:3409 +3634:3:3410 +3635:3:3417 +3636:3:3418 +3637:3:3429 +3638:3:3430 +3639:3:3431 +3640:3:3429 +3641:3:3430 +3642:3:3431 +3643:3:3442 +3644:3:3447 +3645:3:3448 +3646:0:4365 +3647:3:3460 +3648:0:4365 +3649:3:3461 +3650:0:4365 +3651:2:1173 +3652:0:4365 +3653:3:3462 +3654:0:4365 +3655:2:1179 +3656:0:4365 +3657:2:1180 +3658:0:4365 +3659:3:3461 +3660:0:4365 +3661:2:1181 +3662:2:1185 +3663:2:1186 +3664:2:1194 +3665:2:1195 +3666:2:1199 +3667:2:1200 +3668:2:1194 +3669:2:1195 +3670:2:1199 +3671:2:1200 +3672:2:1208 +3673:2:1213 +3674:2:1217 +3675:2:1218 +3676:2:1225 +3677:2:1226 +3678:2:1237 +3679:2:1238 +3680:2:1239 +3681:2:1237 +3682:2:1238 +3683:2:1239 +3684:2:1250 +3685:2:1255 +3686:2:1256 +3687:0:4365 +3688:3:3462 +3689:0:4365 +3690:2:1268 +3691:0:4365 +3692:3:3461 +3693:0:4365 +3694:2:1270 +3695:0:4365 +3696:3:3462 +3697:0:4365 +3698:2:1271 +3699:2:1275 +3700:2:1276 +3701:2:1284 +3702:2:1285 +3703:2:1289 +3704:2:1290 +3705:2:1284 +3706:2:1285 +3707:2:1289 +3708:2:1290 +3709:2:1298 +3710:2:1303 +3711:2:1307 +3712:2:1308 +3713:2:1315 +3714:2:1316 +3715:2:1327 +3716:2:1328 +3717:2:1329 +3718:2:1327 +3719:2:1328 +3720:2:1329 +3721:2:1340 +3722:2:1345 +3723:2:1346 +3724:0:4365 +3725:2:1358 +3726:0:4365 +3727:2:1360 +3728:0:4365 +3729:3:3461 +3730:0:4365 +3731:2:1361 +3732:0:4365 +3733:3:3462 +3734:0:4365 +3735:2:1362 +3736:2:1366 +3737:2:1367 +3738:2:1375 +3739:2:1376 +3740:2:1380 +3741:2:1381 +3742:2:1375 +3743:2:1376 +3744:2:1380 +3745:2:1381 +3746:2:1389 +3747:2:1394 +3748:2:1398 +3749:2:1399 +3750:2:1406 +3751:2:1407 +3752:2:1418 +3753:2:1419 +3754:2:1420 +3755:2:1418 +3756:2:1419 +3757:2:1420 +3758:2:1431 +3759:2:1436 +3760:2:1437 +3761:0:4365 +3762:2:1449 +3763:0:4365 +3764:3:3461 +3765:0:4365 +3766:2:1451 +3767:0:4365 +3768:3:3462 +3769:0:4365 +3770:2:1652 +3771:0:4365 +3772:2:1653 +3773:0:4365 +3774:2:1657 +3775:0:4365 +3776:2:1180 +3777:0:4365 +3778:3:3461 +3779:0:4365 +3780:2:1181 +3781:2:1185 +3782:2:1186 +3783:2:1194 +3784:2:1195 +3785:2:1199 +3786:2:1200 +3787:2:1194 +3788:2:1195 +3789:2:1196 +3790:2:1208 +3791:2:1213 +3792:2:1217 +3793:2:1218 +3794:2:1225 +3795:2:1226 +3796:2:1237 +3797:2:1238 +3798:2:1239 +3799:2:1237 +3800:2:1238 +3801:2:1239 +3802:2:1250 +3803:2:1255 +3804:2:1256 +3805:0:4365 +3806:3:3462 +3807:0:4365 +3808:2:1268 +3809:0:4365 +3810:3:3461 +3811:0:4365 +3812:2:1270 +3813:0:4365 +3814:3:3462 +3815:0:4365 +3816:2:1271 +3817:2:1275 +3818:2:1276 +3819:2:1284 +3820:2:1285 +3821:2:1289 +3822:2:1290 +3823:2:1284 +3824:2:1285 +3825:2:1289 +3826:2:1290 +3827:2:1298 +3828:2:1303 +3829:2:1307 +3830:2:1308 +3831:2:1315 +3832:2:1316 +3833:2:1327 +3834:2:1328 +3835:2:1329 +3836:2:1327 +3837:2:1328 +3838:2:1329 +3839:2:1340 +3840:2:1345 +3841:2:1346 +3842:0:4365 +3843:2:1358 +3844:0:4365 +3845:2:1454 +3846:0:4365 +3847:3:3461 +3848:0:4365 +3849:2:1455 +3850:0:4365 +3851:3:3462 +3852:0:4365 +3853:2:1652 +3854:0:4365 +3855:2:1653 +3856:0:4365 +3857:2:1657 +3858:0:4365 +3859:2:1660 +3860:0:4365 +3861:3:3461 +3862:0:4365 +3863:2:1665 +3864:2:1669 +3865:2:1670 +3866:2:1678 +3867:2:1679 +3868:2:1683 +3869:2:1684 +3870:2:1678 +3871:2:1679 +3872:2:1680 +3873:2:1692 +3874:2:1697 +3875:2:1701 +3876:2:1702 +3877:2:1709 +3878:2:1710 +3879:2:1721 +3880:2:1722 +3881:2:1723 +3882:2:1721 +3883:2:1722 +3884:2:1723 +3885:2:1734 +3886:2:1739 +3887:2:1740 +3888:0:4365 +3889:3:3462 +3890:0:4365 +3891:2:1752 +3892:0:4365 +3893:3:3461 +3894:0:4365 +3895:2:1754 +3896:0:4365 +3897:3:3462 +3898:0:4365 +3899:2:1755 +3900:2:1759 +3901:2:1760 +3902:2:1768 +3903:2:1769 +3904:2:1773 +3905:2:1774 +3906:2:1768 +3907:2:1769 +3908:2:1773 +3909:2:1774 +3910:2:1782 +3911:2:1787 +3912:2:1791 +3913:2:1792 +3914:2:1799 +3915:2:1800 +3916:2:1811 +3917:2:1812 +3918:2:1813 +3919:2:1811 +3920:2:1812 +3921:2:1813 +3922:2:1824 +3923:2:1829 +3924:2:1830 +3925:0:4365 +3926:2:1842 +3927:0:4365 +3928:3:3461 +3929:0:4365 +3930:2:1844 +3931:0:4365 +3932:3:3462 +3933:0:4365 +3934:2:1845 +3935:2:1849 +3936:2:1850 +3937:2:1858 +3938:2:1859 +3939:2:1863 +3940:2:1864 +3941:2:1858 +3942:2:1859 +3943:2:1863 +3944:2:1864 +3945:2:1872 +3946:2:1877 +3947:2:1881 +3948:2:1882 +3949:2:1889 +3950:2:1890 +3951:2:1901 +3952:2:1902 +3953:2:1903 +3954:2:1901 +3955:2:1902 +3956:2:1903 +3957:2:1914 +3958:2:1919 +3959:2:1920 +3960:0:4365 +3961:2:1932 +3962:0:4365 +3963:3:3461 +3964:0:4365 +3965:2:1934 +3966:0:4365 +3967:3:3462 +3968:0:4365 +3969:2:1935 +3970:0:4365 +3971:2:1936 +3972:0:4365 +3973:2:2129 +3974:0:4365 +3975:2:2130 +3976:0:4365 +3977:2:2134 +3978:0:4365 +3979:3:3461 +3980:0:4365 +3981:2:2136 +3982:0:4365 +3983:3:3462 +3984:0:4365 +3985:2:2137 +3986:2:2141 +3987:2:2142 +3988:2:2150 +3989:2:2151 +3990:2:2155 +3991:2:2156 +3992:2:2150 +3993:2:2151 +3994:2:2155 +3995:2:2156 +3996:2:2164 +3997:2:2169 +3998:2:2173 +3999:2:2174 +4000:2:2181 +4001:2:2182 +4002:2:2193 +4003:2:2194 +4004:2:2195 +4005:2:2193 +4006:2:2194 +4007:2:2195 +4008:2:2206 +4009:2:2211 +4010:2:2212 +4011:0:4365 +4012:2:2224 +4013:0:4365 +4014:3:3461 +4015:0:4365 +4016:2:2226 +4017:0:4365 +4018:3:3462 +4019:0:4365 +4020:2:1936 +4021:0:4365 +4022:2:2129 +4023:0:4365 +4024:2:2130 +4025:0:4365 +4026:2:2134 +4027:0:4365 +4028:3:3461 +4029:0:4365 +4030:2:2136 +4031:0:4365 +4032:3:3462 +4033:0:4365 +4034:2:2137 +4035:2:2141 +4036:2:2142 +4037:2:2150 +4038:2:2151 +4039:2:2155 +4040:2:2156 +4041:2:2150 +4042:2:2151 +4043:2:2152 +4044:2:2164 +4045:2:2169 +4046:2:2173 +4047:2:2174 +4048:2:2181 +4049:2:2182 +4050:2:2193 +4051:2:2194 +4052:2:2195 +4053:2:2193 +4054:2:2194 +4055:2:2195 +4056:2:2206 +4057:2:2211 +4058:2:2212 +4059:0:4365 +4060:2:2224 +4061:0:4365 +4062:3:3461 +4063:0:4365 +4064:2:2226 +4065:0:4365 +4066:3:3462 +4067:0:4365 +4068:2:2230 +4069:0:4365 +4070:3:3461 +4071:0:4365 +4072:2:2235 +4073:2:2239 +4074:2:2240 +4075:2:2248 +4076:2:2249 +4077:2:2253 +4078:2:2254 +4079:2:2248 +4080:2:2249 +4081:2:2250 +4082:2:2262 +4083:2:2267 +4084:2:2271 +4085:2:2272 +4086:2:2279 +4087:2:2280 +4088:2:2291 +4089:2:2292 +4090:2:2293 +4091:2:2291 +4092:2:2292 +4093:2:2293 +4094:2:2304 +4095:2:2309 +4096:2:2310 +4097:0:4365 +4098:3:3462 +4099:0:4365 +4100:2:2322 +4101:0:4365 +4102:2:1169 +4103:0:4365 +4104:3:3461 +4105:0:4365 +4106:2:1170 +4107:0:4365 +4108:3:3462 +4109:0:4365 +4110:3:3463 +4111:0:4365 +4112:3:3469 +4113:0:4365 +4114:3:3470 +4115:3:3474 +4116:3:3475 +4117:3:3483 +4118:3:3484 +4119:3:3488 +4120:3:3489 +4121:3:3483 +4122:3:3484 +4123:3:3488 +4124:3:3489 +4125:3:3497 +4126:3:3502 +4127:3:3506 +4128:3:3507 +4129:3:3514 +4130:3:3515 +4131:3:3526 +4132:3:3527 +4133:3:3528 +4134:3:3526 +4135:3:3527 +4136:3:3528 +4137:3:3539 +4138:3:3544 +4139:3:3545 +4140:0:4365 +4141:3:3557 +4142:0:4365 +4143:3:3558 +4144:0:4365 +4145:2:1173 +4146:0:4365 +4147:3:3559 +4148:0:4365 +4149:2:1179 +4150:0:4365 +4151:2:1180 +4152:0:4365 +4153:3:3558 +4154:0:4365 +4155:2:1181 +4156:2:1185 +4157:2:1186 +4158:2:1194 +4159:2:1195 +4160:2:1199 +4161:2:1200 +4162:2:1194 +4163:2:1195 +4164:2:1199 +4165:2:1200 +4166:2:1208 +4167:2:1213 +4168:2:1217 +4169:2:1218 +4170:2:1225 +4171:2:1226 +4172:2:1237 +4173:2:1238 +4174:2:1239 +4175:2:1237 +4176:2:1238 +4177:2:1239 +4178:2:1250 +4179:2:1255 +4180:2:1256 +4181:0:4365 +4182:3:3559 +4183:0:4365 +4184:2:1268 +4185:0:4365 +4186:3:3558 +4187:0:4365 +4188:2:1270 +4189:0:4365 +4190:3:3559 +4191:0:4365 +4192:2:1271 +4193:2:1275 +4194:2:1276 +4195:2:1284 +4196:2:1285 +4197:2:1289 +4198:2:1290 +4199:2:1284 +4200:2:1285 +4201:2:1289 +4202:2:1290 +4203:2:1298 +4204:2:1303 +4205:2:1307 +4206:2:1308 +4207:2:1315 +4208:2:1316 +4209:2:1327 +4210:2:1328 +4211:2:1329 +4212:2:1327 +4213:2:1328 +4214:2:1329 +4215:2:1340 +4216:2:1345 +4217:2:1346 +4218:0:4365 +4219:2:1358 +4220:0:4365 +4221:2:1360 +4222:0:4365 +4223:3:3558 +4224:0:4365 +4225:2:1361 +4226:0:4365 +4227:3:3559 +4228:0:4365 +4229:2:1362 +4230:2:1366 +4231:2:1367 +4232:2:1375 +4233:2:1376 +4234:2:1380 +4235:2:1381 +4236:2:1375 +4237:2:1376 +4238:2:1380 +4239:2:1381 +4240:2:1389 +4241:2:1394 +4242:2:1398 +4243:2:1399 +4244:2:1406 +4245:2:1407 +4246:2:1418 +4247:2:1419 +4248:2:1420 +4249:2:1418 +4250:2:1419 +4251:2:1420 +4252:2:1431 +4253:2:1436 +4254:2:1437 +4255:0:4365 +4256:2:1449 +4257:0:4365 +4258:3:3558 +4259:0:4365 +4260:2:1451 +4261:0:4365 +4262:3:3559 +4263:0:4365 +4264:2:1652 +4265:0:4365 +4266:2:1653 +4267:0:4365 +4268:2:1657 +4269:0:4365 +4270:2:1180 +4271:0:4365 +4272:3:3558 +4273:0:4365 +4274:2:1181 +4275:2:1185 +4276:2:1186 +4277:2:1194 +4278:2:1195 +4279:2:1199 +4280:2:1200 +4281:2:1194 +4282:2:1195 +4283:2:1196 +4284:2:1208 +4285:2:1213 +4286:2:1217 +4287:2:1218 +4288:2:1225 +4289:2:1226 +4290:2:1237 +4291:2:1238 +4292:2:1239 +4293:2:1237 +4294:2:1238 +4295:2:1239 +4296:2:1250 +4297:2:1255 +4298:2:1256 +4299:0:4365 +4300:3:3559 +4301:0:4365 +4302:2:1268 +4303:0:4365 +4304:3:3558 +4305:0:4365 +4306:2:1270 +4307:0:4365 +4308:3:3559 +4309:0:4365 +4310:2:1271 +4311:2:1275 +4312:2:1276 +4313:2:1284 +4314:2:1285 +4315:2:1289 +4316:2:1290 +4317:2:1284 +4318:2:1285 +4319:2:1289 +4320:2:1290 +4321:2:1298 +4322:2:1303 +4323:2:1307 +4324:2:1308 +4325:2:1315 +4326:2:1316 +4327:2:1327 +4328:2:1328 +4329:2:1329 +4330:2:1327 +4331:2:1328 +4332:2:1329 +4333:2:1340 +4334:2:1345 +4335:2:1346 +4336:0:4365 +4337:2:1358 +4338:0:4365 +4339:2:1454 +4340:0:4365 +4341:3:3558 +4342:0:4365 +4343:2:1455 +4344:0:4365 +4345:3:3559 +4346:0:4365 +4347:2:1652 +4348:0:4365 +4349:2:1653 +4350:0:4365 +4351:2:1657 +4352:0:4365 +4353:2:1660 +4354:0:4365 +4355:3:3558 +4356:0:4365 +4357:2:1665 +4358:2:1669 +4359:2:1670 +4360:2:1678 +4361:2:1679 +4362:2:1683 +4363:2:1684 +4364:2:1678 +4365:2:1679 +4366:2:1680 +4367:2:1692 +4368:2:1697 +4369:2:1701 +4370:2:1702 +4371:2:1709 +4372:2:1710 +4373:2:1721 +4374:2:1722 +4375:2:1723 +4376:2:1721 +4377:2:1722 +4378:2:1723 +4379:2:1734 +4380:2:1739 +4381:2:1740 +4382:0:4365 +4383:3:3559 +4384:0:4365 +4385:2:1752 +4386:0:4365 +4387:3:3558 +4388:0:4365 +4389:2:1754 +4390:0:4365 +4391:3:3559 +4392:0:4365 +4393:2:1755 +4394:2:1759 +4395:2:1760 +4396:2:1768 +4397:2:1769 +4398:2:1773 +4399:2:1774 +4400:2:1768 +4401:2:1769 +4402:2:1773 +4403:2:1774 +4404:2:1782 +4405:2:1787 +4406:2:1791 +4407:2:1792 +4408:2:1799 +4409:2:1800 +4410:2:1811 +4411:2:1812 +4412:2:1813 +4413:2:1811 +4414:2:1812 +4415:2:1813 +4416:2:1824 +4417:2:1829 +4418:2:1830 +4419:0:4365 +4420:2:1842 +4421:0:4365 +4422:3:3558 +4423:0:4365 +4424:2:1844 +4425:0:4365 +4426:3:3559 +4427:0:4365 +4428:2:1845 +4429:2:1849 +4430:2:1850 +4431:2:1858 +4432:2:1859 +4433:2:1863 +4434:2:1864 +4435:2:1858 +4436:2:1859 +4437:2:1863 +4438:2:1864 +4439:2:1872 +4440:2:1877 +4441:2:1881 +4442:2:1882 +4443:2:1889 +4444:2:1890 +4445:2:1901 +4446:2:1902 +4447:2:1903 +4448:2:1901 +4449:2:1902 +4450:2:1903 +4451:2:1914 +4452:2:1919 +4453:2:1920 +4454:0:4365 +4455:2:1932 +4456:0:4365 +4457:3:3558 +4458:0:4365 +4459:2:1934 +4460:0:4365 +4461:3:3559 +4462:0:4365 +4463:2:1935 +4464:0:4365 +4465:2:1936 +4466:0:4365 +4467:2:2129 +4468:0:4365 +4469:2:2130 +4470:0:4365 +4471:2:2134 +4472:0:4365 +4473:3:3558 +4474:0:4365 +4475:2:2136 +4476:0:4365 +4477:3:3559 +4478:0:4365 +4479:2:2137 +4480:2:2141 +4481:2:2142 +4482:2:2150 +4483:2:2151 +4484:2:2155 +4485:2:2156 +4486:2:2150 +4487:2:2151 +4488:2:2155 +4489:2:2156 +4490:2:2164 +4491:2:2169 +4492:2:2173 +4493:2:2174 +4494:2:2181 +4495:2:2182 +4496:2:2193 +4497:2:2194 +4498:2:2195 +4499:2:2193 +4500:2:2194 +4501:2:2195 +4502:2:2206 +4503:2:2211 +4504:2:2212 +4505:0:4365 +4506:2:2224 +4507:0:4365 +4508:3:3558 +4509:0:4365 +4510:2:2226 +4511:0:4365 +4512:3:3559 +4513:0:4365 +4514:2:1936 +4515:0:4365 +4516:2:2129 +4517:0:4365 +4518:2:2130 +4519:0:4365 +4520:2:2134 +4521:0:4365 +4522:3:3558 +4523:0:4365 +4524:2:2136 +4525:0:4365 +4526:3:3559 +4527:0:4365 +4528:2:2137 +4529:2:2141 +4530:2:2142 +4531:2:2150 +4532:2:2151 +4533:2:2155 +4534:2:2156 +4535:2:2150 +4536:2:2151 +4537:2:2152 +4538:2:2164 +4539:2:2169 +4540:2:2173 +4541:2:2174 +4542:2:2181 +4543:2:2182 +4544:2:2193 +4545:2:2194 +4546:2:2195 +4547:2:2193 +4548:2:2194 +4549:2:2195 +4550:2:2206 +4551:2:2211 +4552:2:2212 +4553:0:4365 +4554:2:2224 +4555:0:4365 +4556:3:3558 +4557:0:4365 +4558:2:2226 +4559:0:4365 +4560:3:3559 +4561:0:4365 +4562:2:2230 +4563:0:4365 +4564:3:3558 +4565:0:4365 +4566:2:2235 +4567:2:2239 +4568:2:2240 +4569:2:2248 +4570:2:2249 +4571:2:2253 +4572:2:2254 +4573:2:2248 +4574:2:2249 +4575:2:2250 +4576:2:2262 +4577:2:2267 +4578:2:2271 +4579:2:2272 +4580:2:2279 +4581:2:2280 +4582:2:2291 +4583:2:2292 +4584:2:2293 +4585:2:2291 +4586:2:2292 +4587:2:2293 +4588:2:2304 +4589:2:2309 +4590:2:2310 +4591:0:4365 +4592:3:3559 +4593:0:4365 +4594:2:2322 +4595:0:4365 +4596:2:1169 +4597:0:4365 +4598:3:3558 +4599:0:4365 +4600:2:1170 +4601:0:4365 +4602:3:3559 +4603:0:4365 +4604:3:3560 +4605:0:4365 +4606:3:3566 +4607:0:4365 +4608:3:3569 +4609:3:3570 +4610:3:3582 +4611:3:3583 +4612:3:3587 +4613:3:3588 +4614:3:3582 +4615:3:3583 +4616:3:3587 +4617:3:3588 +4618:3:3596 +4619:3:3601 +4620:3:3605 +4621:3:3606 +4622:3:3613 +4623:3:3614 +4624:3:3625 +4625:3:3626 +4626:3:3627 +4627:3:3625 +4628:3:3626 +4629:3:3627 +4630:3:3638 +4631:3:3643 +4632:3:3644 +4633:0:4365 +4634:3:3656 +4635:0:4365 +4636:3:3657 +4637:0:4365 +4638:2:1173 +4639:0:4365 +4640:3:3658 +4641:0:4365 +4642:2:1179 +4643:0:4365 +4644:2:1180 +4645:0:4365 +4646:3:3657 +4647:0:4365 +4648:2:1181 +4649:2:1185 +4650:2:1186 +4651:2:1194 +4652:2:1195 +4653:2:1199 +4654:2:1200 +4655:2:1194 +4656:2:1195 +4657:2:1199 +4658:2:1200 +4659:2:1208 +4660:2:1213 +4661:2:1217 +4662:2:1218 +4663:2:1225 +4664:2:1226 +4665:2:1237 +4666:2:1238 +4667:2:1239 +4668:2:1237 +4669:2:1238 +4670:2:1239 +4671:2:1250 +4672:2:1255 +4673:2:1256 +4674:0:4365 +4675:3:3658 +4676:0:4365 +4677:2:1268 +4678:0:4365 +4679:3:3657 +4680:0:4365 +4681:2:1270 +4682:0:4365 +4683:3:3658 +4684:0:4365 +4685:2:1271 +4686:2:1275 +4687:2:1276 +4688:2:1284 +4689:2:1285 +4690:2:1289 +4691:2:1290 +4692:2:1284 +4693:2:1285 +4694:2:1289 +4695:2:1290 +4696:2:1298 +4697:2:1303 +4698:2:1307 +4699:2:1308 +4700:2:1315 +4701:2:1316 +4702:2:1327 +4703:2:1328 +4704:2:1329 +4705:2:1327 +4706:2:1328 +4707:2:1329 +4708:2:1340 +4709:2:1345 +4710:2:1346 +4711:0:4365 +4712:2:1358 +4713:0:4365 +4714:2:1360 +4715:0:4365 +4716:3:3657 +4717:0:4365 +4718:2:1361 +4719:0:4365 +4720:3:3658 +4721:0:4365 +4722:2:1362 +4723:2:1366 +4724:2:1367 +4725:2:1375 +4726:2:1376 +4727:2:1380 +4728:2:1381 +4729:2:1375 +4730:2:1376 +4731:2:1380 +4732:2:1381 +4733:2:1389 +4734:2:1394 +4735:2:1398 +4736:2:1399 +4737:2:1406 +4738:2:1407 +4739:2:1418 +4740:2:1419 +4741:2:1420 +4742:2:1418 +4743:2:1419 +4744:2:1420 +4745:2:1431 +4746:2:1436 +4747:2:1437 +4748:0:4365 +4749:2:1449 +4750:0:4365 +4751:3:3657 +4752:0:4365 +4753:2:1451 +4754:0:4365 +4755:3:3658 +4756:0:4365 +4757:2:1652 +4758:0:4365 +4759:2:1653 +4760:0:4365 +4761:2:1657 +4762:0:4365 +4763:2:1180 +4764:0:4365 +4765:3:3657 +4766:0:4365 +4767:2:1181 +4768:2:1185 +4769:2:1186 +4770:2:1194 +4771:2:1195 +4772:2:1199 +4773:2:1200 +4774:2:1194 +4775:2:1195 +4776:2:1196 +4777:2:1208 +4778:2:1213 +4779:2:1217 +4780:2:1218 +4781:2:1225 +4782:2:1226 +4783:2:1237 +4784:2:1238 +4785:2:1239 +4786:2:1237 +4787:2:1238 +4788:2:1239 +4789:2:1250 +4790:2:1255 +4791:2:1256 +4792:0:4365 +4793:3:3658 +4794:0:4365 +4795:2:1268 +4796:0:4365 +4797:3:3657 +4798:0:4365 +4799:2:1270 +4800:0:4365 +4801:3:3658 +4802:0:4365 +4803:2:1271 +4804:2:1275 +4805:2:1276 +4806:2:1284 +4807:2:1285 +4808:2:1289 +4809:2:1290 +4810:2:1284 +4811:2:1285 +4812:2:1289 +4813:2:1290 +4814:2:1298 +4815:2:1303 +4816:2:1307 +4817:2:1308 +4818:2:1315 +4819:2:1316 +4820:2:1327 +4821:2:1328 +4822:2:1329 +4823:2:1327 +4824:2:1328 +4825:2:1329 +4826:2:1340 +4827:2:1345 +4828:2:1346 +4829:0:4365 +4830:2:1358 +4831:0:4365 +4832:2:1454 +4833:0:4365 +4834:3:3657 +4835:0:4365 +4836:2:1455 +4837:0:4365 +4838:3:3658 +4839:0:4365 +4840:2:1652 +4841:0:4365 +4842:2:1653 +4843:0:4365 +4844:2:1657 +4845:0:4365 +4846:2:1660 +4847:0:4365 +4848:3:3657 +4849:0:4365 +4850:2:1665 +4851:2:1669 +4852:2:1670 +4853:2:1678 +4854:2:1679 +4855:2:1683 +4856:2:1684 +4857:2:1678 +4858:2:1679 +4859:2:1680 +4860:2:1692 +4861:2:1697 +4862:2:1701 +4863:2:1702 +4864:2:1709 +4865:2:1710 +4866:2:1721 +4867:2:1722 +4868:2:1723 +4869:2:1721 +4870:2:1722 +4871:2:1723 +4872:2:1734 +4873:2:1739 +4874:2:1740 +4875:0:4365 +4876:3:3658 +4877:0:4365 +4878:2:1752 +4879:0:4365 +4880:3:3657 +4881:0:4365 +4882:2:1754 +4883:0:4365 +4884:3:3658 +4885:0:4365 +4886:2:1755 +4887:2:1759 +4888:2:1760 +4889:2:1768 +4890:2:1769 +4891:2:1773 +4892:2:1774 +4893:2:1768 +4894:2:1769 +4895:2:1773 +4896:2:1774 +4897:2:1782 +4898:2:1787 +4899:2:1791 +4900:2:1792 +4901:2:1799 +4902:2:1800 +4903:2:1811 +4904:2:1812 +4905:2:1813 +4906:2:1811 +4907:2:1812 +4908:2:1813 +4909:2:1824 +4910:2:1829 +4911:2:1830 +4912:0:4365 +4913:2:1842 +4914:0:4365 +4915:3:3657 +4916:0:4365 +4917:2:1844 +4918:0:4365 +4919:3:3658 +4920:0:4365 +4921:2:1845 +4922:2:1849 +4923:2:1850 +4924:2:1858 +4925:2:1859 +4926:2:1863 +4927:2:1864 +4928:2:1858 +4929:2:1859 +4930:2:1863 +4931:2:1864 +4932:2:1872 +4933:2:1877 +4934:2:1881 +4935:2:1882 +4936:2:1889 +4937:2:1890 +4938:2:1901 +4939:2:1902 +4940:2:1903 +4941:2:1901 +4942:2:1902 +4943:2:1903 +4944:2:1914 +4945:2:1919 +4946:2:1920 +4947:0:4365 +4948:2:1932 +4949:0:4365 +4950:3:3657 +4951:0:4365 +4952:2:1934 +4953:0:4365 +4954:3:3658 +4955:0:4365 +4956:2:1935 +4957:0:4365 +4958:2:1936 +4959:0:4365 +4960:2:2129 +4961:0:4365 +4962:2:2130 +4963:0:4365 +4964:2:2134 +4965:0:4365 +4966:3:3657 +4967:0:4365 +4968:2:2136 +4969:0:4365 +4970:3:3658 +4971:0:4365 +4972:2:2137 +4973:2:2141 +4974:2:2142 +4975:2:2150 +4976:2:2151 +4977:2:2155 +4978:2:2156 +4979:2:2150 +4980:2:2151 +4981:2:2155 +4982:2:2156 +4983:2:2164 +4984:2:2169 +4985:2:2173 +4986:2:2174 +4987:2:2181 +4988:2:2182 +4989:2:2193 +4990:2:2194 +4991:2:2195 +4992:2:2193 +4993:2:2194 +4994:2:2195 +4995:2:2206 +4996:2:2211 +4997:2:2212 +4998:0:4365 +4999:2:2224 +5000:0:4365 +5001:3:3657 +5002:0:4365 +5003:2:2226 +5004:0:4365 +5005:3:3658 +5006:0:4365 +5007:2:1936 +5008:0:4365 +5009:2:2129 +5010:0:4365 +5011:2:2130 +5012:0:4365 +5013:2:2134 +5014:0:4365 +5015:3:3657 +5016:0:4365 +5017:2:2136 +5018:0:4365 +5019:3:3658 +5020:0:4365 +5021:2:2137 +5022:2:2141 +5023:2:2142 +5024:2:2150 +5025:2:2151 +5026:2:2155 +5027:2:2156 +5028:2:2150 +5029:2:2151 +5030:2:2152 +5031:2:2164 +5032:2:2169 +5033:2:2173 +5034:2:2174 +5035:2:2181 +5036:2:2182 +5037:2:2193 +5038:2:2194 +5039:2:2195 +5040:2:2193 +5041:2:2194 +5042:2:2195 +5043:2:2206 +5044:2:2211 +5045:2:2212 +5046:0:4365 +5047:2:2224 +5048:0:4365 +5049:3:3657 +5050:0:4365 +5051:2:2226 +5052:0:4365 +5053:3:3658 +5054:0:4365 +5055:2:2230 +5056:0:4365 +5057:3:3657 +5058:0:4365 +5059:2:2235 +5060:2:2239 +5061:2:2240 +5062:2:2248 +5063:2:2249 +5064:2:2253 +5065:2:2254 +5066:2:2248 +5067:2:2249 +5068:2:2250 +5069:2:2262 +5070:2:2267 +5071:2:2271 +5072:2:2272 +5073:2:2279 +5074:2:2280 +5075:2:2291 +5076:2:2292 +5077:2:2293 +5078:2:2291 +5079:2:2292 +5080:2:2293 +5081:2:2304 +5082:2:2309 +5083:2:2310 +5084:0:4365 +5085:3:3658 +5086:0:4365 +5087:2:2322 +5088:0:4365 +5089:2:1169 +5090:0:4365 +5091:3:3657 +5092:0:4365 +5093:2:1170 +5094:0:4365 +5095:3:3658 +5096:0:4365 +5097:3:3659 +5098:0:4365 +5099:3:3665 +5100:0:4365 +5101:3:3666 +5102:0:4365 +5103:3:3667 +5104:0:4365 +5105:3:3668 +5106:0:4365 +5107:3:3669 +5108:3:3673 +5109:3:3674 +5110:3:3682 +5111:3:3683 +5112:3:3687 +5113:3:3688 +5114:3:3682 +5115:3:3683 +5116:3:3687 +5117:3:3688 +5118:3:3696 +5119:3:3701 +5120:3:3705 +5121:3:3706 +5122:3:3713 +5123:3:3714 +5124:3:3725 +5125:3:3726 +5126:3:3727 +5127:3:3725 +5128:3:3726 +5129:3:3727 +5130:3:3738 +5131:3:3743 +5132:3:3744 +5133:0:4365 +5134:3:3756 +5135:0:4365 +5136:3:3757 +5137:0:4365 +5138:2:1173 +5139:0:4365 +5140:3:3758 +5141:0:4365 +5142:2:1179 +5143:0:4365 +5144:2:1180 +5145:0:4365 +5146:3:3757 +5147:0:4365 +5148:2:1181 +5149:2:1185 +5150:2:1186 +5151:2:1194 +5152:2:1195 +5153:2:1199 +5154:2:1200 +5155:2:1194 +5156:2:1195 +5157:2:1199 +5158:2:1200 +5159:2:1208 +5160:2:1213 +5161:2:1217 +5162:2:1218 +5163:2:1225 +5164:2:1226 +5165:2:1237 +5166:2:1238 +5167:2:1239 +5168:2:1237 +5169:2:1238 +5170:2:1239 +5171:2:1250 +5172:2:1255 +5173:2:1256 +5174:0:4365 +5175:3:3758 +5176:0:4365 +5177:2:1268 +5178:0:4365 +5179:3:3757 +5180:0:4365 +5181:2:1270 +5182:0:4365 +5183:3:3758 +5184:0:4365 +5185:2:1271 +5186:2:1275 +5187:2:1276 +5188:2:1284 +5189:2:1285 +5190:2:1289 +5191:2:1290 +5192:2:1284 +5193:2:1285 +5194:2:1289 +5195:2:1290 +5196:2:1298 +5197:2:1303 +5198:2:1307 +5199:2:1308 +5200:2:1315 +5201:2:1316 +5202:2:1327 +5203:2:1328 +5204:2:1329 +5205:2:1327 +5206:2:1328 +5207:2:1329 +5208:2:1340 +5209:2:1345 +5210:2:1346 +5211:0:4365 +5212:2:1358 +5213:0:4365 +5214:2:1360 +5215:0:4365 +5216:3:3757 +5217:0:4365 +5218:2:1361 +5219:0:4365 +5220:3:3758 +5221:0:4365 +5222:2:1362 +5223:2:1366 +5224:2:1367 +5225:2:1375 +5226:2:1376 +5227:2:1380 +5228:2:1381 +5229:2:1375 +5230:2:1376 +5231:2:1380 +5232:2:1381 +5233:2:1389 +5234:2:1394 +5235:2:1398 +5236:2:1399 +5237:2:1406 +5238:2:1407 +5239:2:1418 +5240:2:1419 +5241:2:1420 +5242:2:1418 +5243:2:1419 +5244:2:1420 +5245:2:1431 +5246:2:1436 +5247:2:1437 +5248:0:4365 +5249:2:1449 +5250:0:4365 +5251:3:3757 +5252:0:4365 +5253:2:1451 +5254:0:4365 +5255:3:3758 +5256:0:4365 +5257:2:1652 +5258:0:4365 +5259:2:1653 +5260:0:4365 +5261:2:1657 +5262:0:4365 +5263:2:1180 +5264:0:4365 +5265:3:3757 +5266:0:4365 +5267:2:1181 +5268:2:1185 +5269:2:1186 +5270:2:1194 +5271:2:1195 +5272:2:1199 +5273:2:1200 +5274:2:1194 +5275:2:1195 +5276:2:1196 +5277:2:1208 +5278:2:1213 +5279:2:1217 +5280:2:1218 +5281:2:1225 +5282:2:1226 +5283:2:1237 +5284:2:1238 +5285:2:1239 +5286:2:1237 +5287:2:1238 +5288:2:1239 +5289:2:1250 +5290:2:1255 +5291:2:1256 +5292:0:4365 +5293:3:3758 +5294:0:4365 +5295:2:1268 +5296:0:4365 +5297:3:3757 +5298:0:4365 +5299:2:1270 +5300:0:4365 +5301:3:3758 +5302:0:4365 +5303:2:1271 +5304:2:1275 +5305:2:1276 +5306:2:1284 +5307:2:1285 +5308:2:1289 +5309:2:1290 +5310:2:1284 +5311:2:1285 +5312:2:1289 +5313:2:1290 +5314:2:1298 +5315:2:1303 +5316:2:1307 +5317:2:1308 +5318:2:1315 +5319:2:1316 +5320:2:1327 +5321:2:1328 +5322:2:1329 +5323:2:1327 +5324:2:1328 +5325:2:1329 +5326:2:1340 +5327:2:1345 +5328:2:1346 +5329:0:4365 +5330:2:1358 +5331:0:4365 +5332:2:1454 +5333:0:4365 +5334:3:3757 +5335:0:4365 +5336:2:1455 +5337:0:4365 +5338:3:3758 +5339:0:4365 +5340:2:1652 +5341:0:4365 +5342:2:1653 +5343:0:4365 +5344:2:1657 +5345:0:4365 +5346:2:1660 +5347:0:4365 +5348:3:3757 +5349:0:4365 +5350:2:1665 +5351:2:1669 +5352:2:1670 +5353:2:1678 +5354:2:1679 +5355:2:1683 +5356:2:1684 +5357:2:1678 +5358:2:1679 +5359:2:1680 +5360:2:1692 +5361:2:1697 +5362:2:1701 +5363:2:1702 +5364:2:1709 +5365:2:1710 +5366:2:1721 +5367:2:1722 +5368:2:1723 +5369:2:1721 +5370:2:1722 +5371:2:1723 +5372:2:1734 +5373:2:1739 +5374:2:1740 +5375:0:4365 +5376:3:3758 +5377:0:4365 +5378:2:1752 +5379:0:4365 +5380:3:3757 +5381:0:4365 +5382:2:1754 +5383:0:4365 +5384:3:3758 +5385:0:4365 +5386:2:1755 +5387:2:1759 +5388:2:1760 +5389:2:1768 +5390:2:1769 +5391:2:1773 +5392:2:1774 +5393:2:1768 +5394:2:1769 +5395:2:1773 +5396:2:1774 +5397:2:1782 +5398:2:1787 +5399:2:1791 +5400:2:1792 +5401:2:1799 +5402:2:1800 +5403:2:1811 +5404:2:1812 +5405:2:1813 +5406:2:1811 +5407:2:1812 +5408:2:1813 +5409:2:1824 +5410:2:1829 +5411:2:1830 +5412:0:4365 +5413:2:1842 +5414:0:4365 +5415:3:3757 +5416:0:4365 +5417:2:1844 +5418:0:4365 +5419:3:3758 +5420:0:4365 +5421:2:1845 +5422:2:1849 +5423:2:1850 +5424:2:1858 +5425:2:1859 +5426:2:1863 +5427:2:1864 +5428:2:1858 +5429:2:1859 +5430:2:1863 +5431:2:1864 +5432:2:1872 +5433:2:1877 +5434:2:1881 +5435:2:1882 +5436:2:1889 +5437:2:1890 +5438:2:1901 +5439:2:1902 +5440:2:1903 +5441:2:1901 +5442:2:1902 +5443:2:1903 +5444:2:1914 +5445:2:1919 +5446:2:1920 +5447:0:4365 +5448:2:1932 +5449:0:4365 +5450:3:3757 +5451:0:4365 +5452:2:1934 +5453:0:4365 +5454:3:3758 +5455:0:4365 +5456:2:1935 +5457:0:4365 +5458:2:1936 +5459:0:4365 +5460:2:2129 +5461:0:4365 +5462:2:2130 +5463:0:4365 +5464:2:2134 +5465:0:4365 +5466:3:3757 +5467:0:4365 +5468:2:2136 +5469:0:4365 +5470:3:3758 +5471:0:4365 +5472:2:2137 +5473:2:2141 +5474:2:2142 +5475:2:2150 +5476:2:2151 +5477:2:2155 +5478:2:2156 +5479:2:2150 +5480:2:2151 +5481:2:2155 +5482:2:2156 +5483:2:2164 +5484:2:2169 +5485:2:2173 +5486:2:2174 +5487:2:2181 +5488:2:2182 +5489:2:2193 +5490:2:2194 +5491:2:2195 +5492:2:2193 +5493:2:2194 +5494:2:2195 +5495:2:2206 +5496:2:2211 +5497:2:2212 +5498:0:4365 +5499:2:2224 +5500:0:4365 +5501:3:3757 +5502:0:4365 +5503:2:2226 +5504:0:4365 +5505:3:3758 +5506:0:4365 +5507:2:1936 +5508:0:4365 +5509:2:2129 +5510:0:4365 +5511:2:2130 +5512:0:4365 +5513:2:2134 +5514:0:4365 +5515:3:3757 +5516:0:4365 +5517:2:2136 +5518:0:4365 +5519:3:3758 +5520:0:4365 +5521:2:2137 +5522:2:2141 +5523:2:2142 +5524:2:2150 +5525:2:2151 +5526:2:2155 +5527:2:2156 +5528:2:2150 +5529:2:2151 +5530:2:2152 +5531:2:2164 +5532:2:2169 +5533:2:2173 +5534:2:2174 +5535:2:2181 +5536:2:2182 +5537:2:2193 +5538:2:2194 +5539:2:2195 +5540:2:2193 +5541:2:2194 +5542:2:2195 +5543:2:2206 +5544:2:2211 +5545:2:2212 +5546:0:4365 +5547:2:2224 +5548:0:4365 +5549:3:3757 +5550:0:4365 +5551:2:2226 +5552:0:4365 +5553:3:3758 +5554:0:4365 +5555:2:2230 +5556:0:4365 +5557:3:3757 +5558:0:4365 +5559:2:2235 +5560:2:2239 +5561:2:2240 +5562:2:2248 +5563:2:2249 +5564:2:2253 +5565:2:2254 +5566:2:2248 +5567:2:2249 +5568:2:2250 +5569:2:2262 +5570:2:2267 +5571:2:2271 +5572:2:2272 +5573:2:2279 +5574:2:2280 +5575:2:2291 +5576:2:2292 +5577:2:2293 +5578:2:2291 +5579:2:2292 +5580:2:2293 +5581:2:2304 +5582:2:2309 +5583:2:2310 +5584:0:4365 +5585:3:3758 +5586:0:4365 +5587:2:2322 +5588:0:4365 +5589:2:1169 +5590:0:4365 +5591:3:3757 +5592:0:4365 +5593:2:1170 +5594:0:4365 +5595:3:3758 +5596:0:4365 +5597:3:3759 +5598:0:4365 +5599:3:3972 +5600:0:4365 +5601:3:3980 +5602:0:4365 +5603:3:3981 +5604:3:3985 +5605:3:3986 +5606:3:3994 +5607:3:3995 +5608:3:3999 +5609:3:4000 +5610:3:3994 +5611:3:3995 +5612:3:3999 +5613:3:4000 +5614:3:4008 +5615:3:4013 +5616:3:4017 +5617:3:4018 +5618:3:4025 +5619:3:4026 +5620:3:4037 +5621:3:4038 +5622:3:4039 +5623:3:4037 +5624:3:4038 +5625:3:4039 +5626:3:4050 +5627:3:4055 +5628:3:4056 +5629:0:4365 +5630:3:4068 +5631:0:4365 +5632:3:4069 +5633:0:4365 +5634:2:1173 +5635:0:4365 +5636:3:4070 +5637:0:4365 +5638:2:1179 +5639:0:4365 +5640:2:1180 +5641:0:4365 +5642:3:4069 +5643:0:4365 +5644:2:1181 +5645:2:1185 +5646:2:1186 +5647:2:1194 +5648:2:1195 +5649:2:1199 +5650:2:1200 +5651:2:1194 +5652:2:1195 +5653:2:1199 +5654:2:1200 +5655:2:1208 +5656:2:1213 +5657:2:1217 +5658:2:1218 +5659:2:1225 +5660:2:1226 +5661:2:1237 +5662:2:1238 +5663:2:1239 +5664:2:1237 +5665:2:1238 +5666:2:1239 +5667:2:1250 +5668:2:1255 +5669:2:1256 +5670:0:4365 +5671:3:4070 +5672:0:4365 +5673:2:1268 +5674:0:4365 +5675:3:4069 +5676:0:4365 +5677:2:1270 +5678:0:4365 +5679:3:4070 +5680:0:4365 +5681:2:1271 +5682:2:1275 +5683:2:1276 +5684:2:1284 +5685:2:1285 +5686:2:1289 +5687:2:1290 +5688:2:1284 +5689:2:1285 +5690:2:1289 +5691:2:1290 +5692:2:1298 +5693:2:1303 +5694:2:1307 +5695:2:1308 +5696:2:1315 +5697:2:1316 +5698:2:1327 +5699:2:1328 +5700:2:1329 +5701:2:1327 +5702:2:1328 +5703:2:1329 +5704:2:1340 +5705:2:1345 +5706:2:1346 +5707:0:4365 +5708:2:1358 +5709:0:4365 +5710:2:1360 +5711:0:4365 +5712:3:4069 +5713:0:4365 +5714:2:1361 +5715:0:4365 +5716:3:4070 +5717:0:4365 +5718:2:1362 +5719:2:1366 +5720:2:1367 +5721:2:1375 +5722:2:1376 +5723:2:1380 +5724:2:1381 +5725:2:1375 +5726:2:1376 +5727:2:1380 +5728:2:1381 +5729:2:1389 +5730:2:1394 +5731:2:1398 +5732:2:1399 +5733:2:1406 +5734:2:1407 +5735:2:1418 +5736:2:1419 +5737:2:1420 +5738:2:1418 +5739:2:1419 +5740:2:1420 +5741:2:1431 +5742:2:1436 +5743:2:1437 +5744:0:4365 +5745:2:1449 +5746:0:4365 +5747:3:4069 +5748:0:4365 +5749:2:1451 +5750:0:4365 +5751:3:4070 +5752:0:4365 +5753:2:1652 +5754:0:4365 +5755:2:1653 +5756:0:4365 +5757:2:1657 +5758:0:4365 +5759:2:1180 +5760:0:4365 +5761:3:4069 +5762:0:4365 +5763:2:1181 +5764:2:1185 +5765:2:1186 +5766:2:1194 +5767:2:1195 +5768:2:1199 +5769:2:1200 +5770:2:1194 +5771:2:1195 +5772:2:1196 +5773:2:1208 +5774:2:1213 +5775:2:1217 +5776:2:1218 +5777:2:1225 +5778:2:1226 +5779:2:1237 +5780:2:1238 +5781:2:1239 +5782:2:1237 +5783:2:1238 +5784:2:1239 +5785:2:1250 +5786:2:1255 +5787:2:1256 +5788:0:4365 +5789:3:4070 +5790:0:4365 +5791:2:1268 +5792:0:4365 +5793:3:4069 +5794:0:4365 +5795:2:1270 +5796:0:4365 +5797:3:4070 +5798:0:4365 +5799:2:1271 +5800:2:1275 +5801:2:1276 +5802:2:1284 +5803:2:1285 +5804:2:1289 +5805:2:1290 +5806:2:1284 +5807:2:1285 +5808:2:1289 +5809:2:1290 +5810:2:1298 +5811:2:1303 +5812:2:1307 +5813:2:1308 +5814:2:1315 +5815:2:1316 +5816:2:1327 +5817:2:1328 +5818:2:1329 +5819:2:1327 +5820:2:1328 +5821:2:1329 +5822:2:1340 +5823:2:1345 +5824:2:1346 +5825:0:4365 +5826:2:1358 +5827:0:4365 +5828:2:1454 +5829:0:4365 +5830:3:4069 +5831:0:4365 +5832:2:1455 +5833:0:4365 +5834:3:4070 +5835:0:4365 +5836:2:1652 +5837:0:4365 +5838:2:1653 +5839:0:4365 +5840:2:1657 +5841:0:4365 +5842:2:1660 +5843:0:4365 +5844:3:4069 +5845:0:4365 +5846:2:1665 +5847:2:1669 +5848:2:1670 +5849:2:1678 +5850:2:1679 +5851:2:1683 +5852:2:1684 +5853:2:1678 +5854:2:1679 +5855:2:1680 +5856:2:1692 +5857:2:1697 +5858:2:1701 +5859:2:1702 +5860:2:1709 +5861:2:1710 +5862:2:1721 +5863:2:1722 +5864:2:1723 +5865:2:1721 +5866:2:1722 +5867:2:1723 +5868:2:1734 +5869:2:1739 +5870:2:1740 +5871:0:4365 +5872:3:4070 +5873:0:4365 +5874:2:1752 +5875:0:4365 +5876:3:4069 +5877:0:4365 +5878:2:1754 +5879:0:4365 +5880:3:4070 +5881:0:4365 +5882:2:1755 +5883:2:1759 +5884:2:1760 +5885:2:1768 +5886:2:1769 +5887:2:1773 +5888:2:1774 +5889:2:1768 +5890:2:1769 +5891:2:1773 +5892:2:1774 +5893:2:1782 +5894:2:1787 +5895:2:1791 +5896:2:1792 +5897:2:1799 +5898:2:1800 +5899:2:1811 +5900:2:1812 +5901:2:1813 +5902:2:1811 +5903:2:1812 +5904:2:1813 +5905:2:1824 +5906:2:1829 +5907:2:1830 +5908:0:4365 +5909:2:1842 +5910:0:4365 +5911:3:4069 +5912:0:4365 +5913:2:1844 +5914:0:4365 +5915:3:4070 +5916:0:4365 +5917:2:1845 +5918:2:1849 +5919:2:1850 +5920:2:1858 +5921:2:1859 +5922:2:1863 +5923:2:1864 +5924:2:1858 +5925:2:1859 +5926:2:1863 +5927:2:1864 +5928:2:1872 +5929:2:1877 +5930:2:1881 +5931:2:1882 +5932:2:1889 +5933:2:1890 +5934:2:1901 +5935:2:1902 +5936:2:1903 +5937:2:1901 +5938:2:1902 +5939:2:1903 +5940:2:1914 +5941:2:1919 +5942:2:1920 +5943:0:4365 +5944:2:1932 +5945:0:4365 +5946:3:4069 +5947:0:4365 +5948:2:1934 +5949:0:4365 +5950:3:4070 +5951:0:4365 +5952:2:1935 +5953:0:4365 +5954:2:1936 +5955:0:4365 +5956:2:2129 +5957:0:4365 +5958:2:2130 +5959:0:4365 +5960:2:2134 +5961:0:4365 +5962:3:4069 +5963:0:4365 +5964:2:2136 +5965:0:4365 +5966:3:4070 +5967:0:4365 +5968:2:2137 +5969:2:2141 +5970:2:2142 +5971:2:2150 +5972:2:2151 +5973:2:2155 +5974:2:2156 +5975:2:2150 +5976:2:2151 +5977:2:2155 +5978:2:2156 +5979:2:2164 +5980:2:2169 +5981:2:2173 +5982:2:2174 +5983:2:2181 +5984:2:2182 +5985:2:2193 +5986:2:2194 +5987:2:2195 +5988:2:2193 +5989:2:2194 +5990:2:2195 +5991:2:2206 +5992:2:2211 +5993:2:2212 +5994:0:4365 +5995:2:2224 +5996:0:4365 +5997:3:4069 +5998:0:4365 +5999:2:2226 +6000:0:4365 +6001:3:4070 +6002:0:4365 +6003:2:1936 +6004:0:4365 +6005:2:2129 +6006:0:4365 +6007:2:2130 +6008:0:4365 +6009:2:2134 +6010:0:4365 +6011:3:4069 +6012:0:4365 +6013:2:2136 +6014:0:4365 +6015:3:4070 +6016:0:4365 +6017:2:2137 +6018:2:2141 +6019:2:2142 +6020:2:2150 +6021:2:2151 +6022:2:2155 +6023:2:2156 +6024:2:2150 +6025:2:2151 +6026:2:2152 +6027:2:2164 +6028:2:2169 +6029:2:2173 +6030:2:2174 +6031:2:2181 +6032:2:2182 +6033:2:2193 +6034:2:2194 +6035:2:2195 +6036:2:2193 +6037:2:2194 +6038:2:2195 +6039:2:2206 +6040:2:2211 +6041:2:2212 +6042:0:4365 +6043:2:2224 +6044:0:4365 +6045:3:4069 +6046:0:4365 +6047:2:2226 +6048:0:4365 +6049:3:4070 +6050:0:4365 +6051:2:2230 +6052:0:4365 +6053:3:4069 +6054:0:4365 +6055:2:2235 +6056:2:2239 +6057:2:2240 +6058:2:2248 +6059:2:2249 +6060:2:2253 +6061:2:2254 +6062:2:2248 +6063:2:2249 +6064:2:2250 +6065:2:2262 +6066:2:2267 +6067:2:2271 +6068:2:2272 +6069:2:2279 +6070:2:2280 +6071:2:2291 +6072:2:2292 +6073:2:2293 +6074:2:2291 +6075:2:2292 +6076:2:2293 +6077:2:2304 +6078:2:2309 +6079:2:2310 +6080:0:4365 +6081:3:4070 +6082:0:4365 +6083:2:2322 +6084:0:4365 +6085:2:1169 +6086:0:4365 +6087:3:4069 +6088:0:4365 +6089:2:1170 +6090:0:4365 +6091:3:4070 +6092:0:4365 +6093:3:4071 +6094:0:4365 +6095:3:4081 +6096:0:4365 +6097:3:3666 +6098:0:4365 +6099:3:3667 +6100:0:4365 +6101:3:3668 +6102:0:4365 +6103:3:3669 +6104:3:3673 +6105:3:3674 +6106:3:3682 +6107:3:3683 +6108:3:3687 +6109:3:3688 +6110:3:3682 +6111:3:3683 +6112:3:3687 +6113:3:3688 +6114:3:3696 +6115:3:3701 +6116:3:3705 +6117:3:3706 +6118:3:3713 +6119:3:3714 +6120:3:3725 +6121:3:3726 +6122:3:3727 +6123:3:3725 +6124:3:3726 +6125:3:3727 +6126:3:3738 +6127:3:3743 +6128:3:3744 +6129:0:4365 +6130:3:3756 +6131:0:4365 +6132:3:3757 +6133:0:4365 +6134:2:1173 +6135:0:4365 +6136:3:3758 +6137:0:4365 +6138:2:1179 +6139:0:4365 +6140:2:1180 +6141:0:4365 +6142:3:3757 +6143:0:4365 +6144:2:1181 +6145:2:1185 +6146:2:1186 +6147:2:1194 +6148:2:1195 +6149:2:1199 +6150:2:1200 +6151:2:1194 +6152:2:1195 +6153:2:1199 +6154:2:1200 +6155:2:1208 +6156:2:1213 +6157:2:1217 +6158:2:1218 +6159:2:1225 +6160:2:1226 +6161:2:1237 +6162:2:1238 +6163:2:1239 +6164:2:1237 +6165:2:1238 +6166:2:1239 +6167:2:1250 +6168:2:1255 +6169:2:1256 +6170:0:4365 +6171:3:3758 +6172:0:4365 +6173:2:1268 +6174:0:4365 +6175:3:3757 +6176:0:4365 +6177:2:1270 +6178:0:4365 +6179:3:3758 +6180:0:4365 +6181:2:1271 +6182:2:1275 +6183:2:1276 +6184:2:1284 +6185:2:1285 +6186:2:1289 +6187:2:1290 +6188:2:1284 +6189:2:1285 +6190:2:1289 +6191:2:1290 +6192:2:1298 +6193:2:1303 +6194:2:1307 +6195:2:1308 +6196:2:1315 +6197:2:1316 +6198:2:1327 +6199:2:1328 +6200:2:1329 +6201:2:1327 +6202:2:1328 +6203:2:1329 +6204:2:1340 +6205:2:1345 +6206:2:1346 +6207:0:4365 +6208:2:1358 +6209:0:4365 +6210:2:1360 +6211:0:4365 +6212:3:3757 +6213:0:4365 +6214:2:1361 +6215:0:4365 +6216:3:3758 +6217:0:4365 +6218:2:1362 +6219:2:1366 +6220:2:1367 +6221:2:1375 +6222:2:1376 +6223:2:1380 +6224:2:1381 +6225:2:1375 +6226:2:1376 +6227:2:1380 +6228:2:1381 +6229:2:1389 +6230:2:1394 +6231:2:1398 +6232:2:1399 +6233:2:1406 +6234:2:1407 +6235:2:1418 +6236:2:1419 +6237:2:1420 +6238:2:1418 +6239:2:1419 +6240:2:1420 +6241:2:1431 +6242:2:1436 +6243:2:1437 +6244:0:4365 +6245:2:1449 +6246:0:4365 +6247:3:3757 +6248:0:4365 +6249:2:1451 +6250:0:4365 +6251:3:3758 +6252:0:4365 +6253:2:1652 +6254:0:4365 +6255:2:1653 +6256:0:4365 +6257:2:1657 +6258:0:4365 +6259:2:1180 +6260:0:4365 +6261:3:3757 +6262:0:4365 +6263:2:1181 +6264:2:1185 +6265:2:1186 +6266:2:1194 +6267:2:1195 +6268:2:1199 +6269:2:1200 +6270:2:1194 +6271:2:1195 +6272:2:1196 +6273:2:1208 +6274:2:1213 +6275:2:1217 +6276:2:1218 +6277:2:1225 +6278:2:1226 +6279:2:1237 +6280:2:1238 +6281:2:1239 +6282:2:1237 +6283:2:1238 +6284:2:1239 +6285:2:1250 +6286:2:1255 +6287:2:1256 +6288:0:4365 +6289:3:3758 +6290:0:4365 +6291:2:1268 +6292:0:4365 +6293:3:3757 +6294:0:4365 +6295:2:1270 +6296:0:4365 +6297:3:3758 +6298:0:4365 +6299:2:1271 +6300:2:1275 +6301:2:1276 +6302:2:1284 +6303:2:1285 +6304:2:1289 +6305:2:1290 +6306:2:1284 +6307:2:1285 +6308:2:1289 +6309:2:1290 +6310:2:1298 +6311:2:1303 +6312:2:1307 +6313:2:1308 +6314:2:1315 +6315:2:1316 +6316:2:1327 +6317:2:1328 +6318:2:1329 +6319:2:1327 +6320:2:1328 +6321:2:1329 +6322:2:1340 +6323:2:1345 +6324:2:1346 +6325:0:4365 +6326:2:1358 +6327:0:4365 +6328:2:1454 +6329:0:4365 +6330:3:3757 +6331:0:4365 +6332:2:1455 +6333:0:4365 +6334:3:3758 +6335:0:4365 +6336:2:1652 +6337:0:4365 +6338:2:1653 +6339:0:4365 +6340:2:1657 +6341:0:4365 +6342:2:1660 +6343:0:4365 +6344:3:3757 +6345:0:4365 +6346:2:1665 +6347:2:1669 +6348:2:1670 +6349:2:1678 +6350:2:1679 +6351:2:1683 +6352:2:1684 +6353:2:1678 +6354:2:1679 +6355:2:1680 +6356:2:1692 +6357:2:1697 +6358:2:1701 +6359:2:1702 +6360:2:1709 +6361:2:1710 +6362:2:1721 +6363:2:1722 +6364:2:1723 +6365:2:1721 +6366:2:1722 +6367:2:1723 +6368:2:1734 +6369:2:1739 +6370:2:1740 +6371:0:4365 +6372:3:3758 +6373:0:4365 +6374:2:1752 +6375:0:4365 +6376:3:3757 +6377:0:4365 +6378:2:1754 +6379:0:4365 +6380:3:3758 +6381:0:4365 +6382:2:1755 +6383:2:1759 +6384:2:1760 +6385:2:1768 +6386:2:1769 +6387:2:1773 +6388:2:1774 +6389:2:1768 +6390:2:1769 +6391:2:1773 +6392:2:1774 +6393:2:1782 +6394:2:1787 +6395:2:1791 +6396:2:1792 +6397:2:1799 +6398:2:1800 +6399:2:1811 +6400:2:1812 +6401:2:1813 +6402:2:1811 +6403:2:1812 +6404:2:1813 +6405:2:1824 +6406:2:1829 +6407:2:1830 +6408:0:4365 +6409:2:1842 +6410:0:4365 +6411:3:3757 +6412:0:4365 +6413:2:1844 +6414:0:4365 +6415:3:3758 +6416:0:4365 +6417:2:1845 +6418:2:1849 +6419:2:1850 +6420:2:1858 +6421:2:1859 +6422:2:1863 +6423:2:1864 +6424:2:1858 +6425:2:1859 +6426:2:1863 +6427:2:1864 +6428:2:1872 +6429:2:1877 +6430:2:1881 +6431:2:1882 +6432:2:1889 +6433:2:1890 +6434:2:1901 +6435:2:1902 +6436:2:1903 +6437:2:1901 +6438:2:1902 +6439:2:1903 +6440:2:1914 +6441:2:1919 +6442:2:1920 +6443:0:4365 +6444:2:1932 +6445:0:4365 +6446:3:3757 +6447:0:4365 +6448:2:1934 +6449:0:4365 +6450:3:3758 +6451:0:4365 +6452:2:1935 +6453:0:4365 +6454:2:1936 +6455:0:4365 +6456:2:2129 +6457:0:4365 +6458:2:2130 +6459:0:4365 +6460:2:2134 +6461:0:4365 +6462:3:3757 +6463:0:4365 +6464:2:2136 +6465:0:4365 +6466:3:3758 +6467:0:4365 +6468:2:2137 +6469:2:2141 +6470:2:2142 +6471:2:2150 +6472:2:2151 +6473:2:2155 +6474:2:2156 +6475:2:2150 +6476:2:2151 +6477:2:2155 +6478:2:2156 +6479:2:2164 +6480:2:2169 +6481:2:2173 +6482:2:2174 +6483:2:2181 +6484:2:2182 +6485:2:2193 +6486:2:2194 +6487:2:2195 +6488:2:2193 +6489:2:2194 +6490:2:2195 +6491:2:2206 +6492:2:2211 +6493:2:2212 +6494:0:4365 +6495:2:2224 +6496:0:4365 +6497:3:3757 +6498:0:4365 +6499:2:2226 +6500:0:4365 +6501:3:3758 +6502:0:4365 +6503:2:1936 +6504:0:4365 +6505:2:2129 +6506:0:4365 +6507:2:2130 +6508:0:4365 +6509:2:2134 +6510:0:4365 +6511:3:3757 +6512:0:4365 +6513:2:2136 +6514:0:4365 +6515:3:3758 +6516:0:4365 +6517:2:2137 +6518:2:2141 +6519:2:2142 +6520:2:2150 +6521:2:2151 +6522:2:2155 +6523:2:2156 +6524:2:2150 +6525:2:2151 +6526:2:2152 +6527:2:2164 +6528:2:2169 +6529:2:2173 +6530:2:2174 +6531:2:2181 +6532:2:2182 +6533:2:2193 +6534:2:2194 +6535:2:2195 +6536:2:2193 +6537:2:2194 +6538:2:2195 +6539:2:2206 +6540:2:2211 +6541:2:2212 +6542:0:4365 +6543:2:2224 +6544:0:4365 +6545:3:3757 +6546:0:4365 +6547:2:2226 +6548:0:4365 +6549:3:3758 +6550:0:4365 +6551:2:2230 +6552:0:4365 +6553:3:3757 +6554:0:4365 +6555:2:2235 +6556:2:2239 +6557:2:2240 +6558:2:2248 +6559:2:2249 +6560:2:2253 +6561:2:2254 +6562:2:2248 +6563:2:2249 +6564:2:2250 +6565:2:2262 +6566:2:2267 +6567:2:2271 +6568:2:2272 +6569:2:2279 +6570:2:2280 +6571:2:2291 +6572:2:2292 +6573:2:2293 +6574:2:2291 +6575:2:2292 +6576:2:2293 +6577:2:2304 +6578:2:2309 +6579:2:2310 +6580:0:4365 +6581:3:3758 +6582:0:4365 +6583:2:2322 +6584:0:4365 +6585:2:1169 +6586:0:4365 +6587:3:3757 +6588:0:4365 +6589:2:1170 +6590:0:4365 +6591:3:3758 +6592:0:4365 +6593:3:3759 +6594:0:4365 +6595:3:3972 +6596:0:4365 +6597:3:4077 +6598:0:4365 +6599:3:4078 +6600:0:4365 +6601:3:4082 +6602:0:4365 +6603:3:4088 +6604:0:4365 +6605:3:4092 +6606:3:4093 +6607:3:4097 +6608:3:4101 +6609:3:4102 +6610:3:4097 +6611:3:4101 +6612:3:4102 +6613:3:4106 +6614:3:4114 +6615:3:4115 +6616:3:4120 +6617:3:4127 +6618:3:4128 +6619:3:4127 +6620:3:4128 +6621:3:4135 +6622:3:4140 +6623:0:4365 +6624:3:4151 +6625:0:4365 +6626:3:4155 +6627:3:4156 +6628:3:4160 +6629:3:4164 +6630:3:4165 +6631:3:4160 +6632:3:4164 +6633:3:4165 +6634:3:4169 +6635:3:4177 +6636:3:4178 +6637:3:4183 +6638:3:4190 +6639:3:4191 +6640:3:4190 +6641:3:4191 +6642:3:4198 +6643:3:4203 +6644:0:4365 +6645:3:4151 +6646:0:4365 +6647:3:4155 +6648:3:4156 +6649:3:4160 +6650:3:4164 +6651:3:4165 +6652:3:4160 +6653:3:4164 +6654:3:4165 +6655:3:4169 +6656:3:4177 +6657:3:4178 +6658:3:4183 +6659:3:4190 +6660:3:4191 +6661:3:4190 +6662:3:4191 +6663:3:4198 +6664:3:4203 +6665:0:4365 +6666:3:4214 +6667:0:4365 +6668:3:4222 +6669:3:4223 +6670:3:4227 +6671:3:4231 +6672:3:4232 +6673:3:4227 +6674:3:4231 +6675:3:4232 +6676:3:4236 +6677:3:4244 +6678:3:4245 +6679:3:4250 +6680:3:4257 +6681:3:4258 +6682:3:4257 +6683:3:4258 +6684:3:4265 +6685:3:4270 +6686:0:4365 +6687:3:4285 +6688:0:4365 +6689:3:4286 +6690:0:4365 +6691:2:1173 +6692:0:4365 +6693:3:4287 +6694:0:4365 +6695:2:1179 +6696:0:4365 +6697:2:1180 +6698:0:4365 +6699:3:4286 +6700:0:4365 +6701:2:1181 +6702:2:1185 +6703:2:1186 +6704:2:1194 +6705:2:1195 +6706:2:1199 +6707:2:1200 +6708:2:1194 +6709:2:1195 +6710:2:1199 +6711:2:1200 +6712:2:1208 +6713:2:1213 +6714:2:1217 +6715:2:1218 +6716:2:1225 +6717:2:1226 +6718:2:1237 +6719:2:1238 +6720:2:1239 +6721:2:1237 +6722:2:1238 +6723:2:1239 +6724:2:1250 +6725:2:1255 +6726:2:1256 +6727:0:4365 +6728:3:4287 +6729:0:4365 +6730:2:1268 +6731:0:4365 +6732:3:4286 +6733:0:4365 +6734:2:1270 +6735:0:4365 +6736:3:4287 +6737:0:4365 +6738:2:1271 +6739:2:1275 +6740:2:1276 +6741:2:1284 +6742:2:1285 +6743:2:1289 +6744:2:1290 +6745:2:1284 +6746:2:1285 +6747:2:1289 +6748:2:1290 +6749:2:1298 +6750:2:1303 +6751:2:1307 +6752:2:1308 +6753:2:1315 +6754:2:1316 +6755:2:1327 +6756:2:1328 +6757:2:1329 +6758:2:1327 +6759:2:1328 +6760:2:1329 +6761:2:1340 +6762:2:1345 +6763:2:1346 +6764:0:4365 +6765:2:1358 +6766:0:4365 +6767:2:1360 +6768:0:4365 +6769:3:4286 +6770:0:4365 +6771:2:1361 +6772:0:4365 +6773:3:4287 +6774:0:4365 +6775:2:1362 +6776:2:1366 +6777:2:1367 +6778:2:1375 +6779:2:1376 +6780:2:1380 +6781:2:1381 +6782:2:1375 +6783:2:1376 +6784:2:1380 +6785:2:1381 +6786:2:1389 +6787:2:1394 +6788:2:1398 +6789:2:1399 +6790:2:1406 +6791:2:1407 +6792:2:1418 +6793:2:1419 +6794:2:1420 +6795:2:1418 +6796:2:1419 +6797:2:1420 +6798:2:1431 +6799:2:1436 +6800:2:1437 +6801:0:4365 +6802:2:1449 +6803:0:4365 +6804:3:4286 +6805:0:4365 +6806:2:1451 +6807:0:4365 +6808:3:4287 +6809:0:4365 +6810:2:1652 +6811:0:4365 +6812:2:1653 +6813:0:4365 +6814:2:1657 +6815:0:4365 +6816:2:1180 +6817:0:4365 +6818:3:4286 +6819:0:4365 +6820:2:1181 +6821:2:1185 +6822:2:1186 +6823:2:1194 +6824:2:1195 +6825:2:1199 +6826:2:1200 +6827:2:1194 +6828:2:1195 +6829:2:1196 +6830:2:1208 +6831:2:1213 +6832:2:1217 +6833:2:1218 +6834:2:1225 +6835:2:1226 +6836:2:1237 +6837:2:1238 +6838:2:1239 +6839:2:1237 +6840:2:1238 +6841:2:1239 +6842:2:1250 +6843:2:1255 +6844:2:1256 +6845:0:4365 +6846:3:4287 +6847:0:4365 +6848:2:1268 +6849:0:4365 +6850:3:4286 +6851:0:4365 +6852:2:1270 +6853:0:4365 +6854:3:4287 +6855:0:4365 +6856:2:1271 +6857:2:1275 +6858:2:1276 +6859:2:1284 +6860:2:1285 +6861:2:1289 +6862:2:1290 +6863:2:1284 +6864:2:1285 +6865:2:1289 +6866:2:1290 +6867:2:1298 +6868:2:1303 +6869:2:1307 +6870:2:1308 +6871:2:1315 +6872:2:1316 +6873:2:1327 +6874:2:1328 +6875:2:1329 +6876:2:1327 +6877:2:1328 +6878:2:1329 +6879:2:1340 +6880:2:1345 +6881:2:1346 +6882:0:4365 +6883:2:1358 +6884:0:4365 +6885:2:1454 +6886:0:4365 +6887:3:4286 +6888:0:4365 +6889:2:1455 +6890:0:4365 +6891:3:4287 +6892:0:4365 +6893:2:1652 +6894:0:4365 +6895:2:1653 +6896:0:4365 +6897:2:1657 +6898:0:4365 +6899:2:1660 +6900:0:4365 +6901:3:4286 +6902:0:4365 +6903:2:1665 +6904:2:1669 +6905:2:1670 +6906:2:1678 +6907:2:1679 +6908:2:1683 +6909:2:1684 +6910:2:1678 +6911:2:1679 +6912:2:1680 +6913:2:1692 +6914:2:1697 +6915:2:1701 +6916:2:1702 +6917:2:1709 +6918:2:1710 +6919:2:1721 +6920:2:1722 +6921:2:1723 +6922:2:1721 +6923:2:1722 +6924:2:1723 +6925:2:1734 +6926:2:1739 +6927:2:1740 +6928:0:4365 +6929:3:4287 +6930:0:4365 +6931:2:1752 +6932:0:4365 +6933:3:4286 +6934:0:4365 +6935:2:1754 +6936:0:4365 +6937:3:4287 +6938:0:4365 +6939:2:1755 +6940:2:1759 +6941:2:1760 +6942:2:1768 +6943:2:1769 +6944:2:1773 +6945:2:1774 +6946:2:1768 +6947:2:1769 +6948:2:1773 +6949:2:1774 +6950:2:1782 +6951:2:1787 +6952:2:1791 +6953:2:1792 +6954:2:1799 +6955:2:1800 +6956:2:1811 +6957:2:1812 +6958:2:1813 +6959:2:1811 +6960:2:1812 +6961:2:1813 +6962:2:1824 +6963:2:1829 +6964:2:1830 +6965:0:4365 +6966:2:1842 +6967:0:4365 +6968:3:4286 +6969:0:4365 +6970:2:1844 +6971:0:4365 +6972:3:4287 +6973:0:4365 +6974:2:1845 +6975:2:1849 +6976:2:1850 +6977:2:1858 +6978:2:1859 +6979:2:1863 +6980:2:1864 +6981:2:1858 +6982:2:1859 +6983:2:1863 +6984:2:1864 +6985:2:1872 +6986:2:1877 +6987:2:1881 +6988:2:1882 +6989:2:1889 +6990:2:1890 +6991:2:1901 +6992:2:1902 +6993:2:1903 +6994:2:1901 +6995:2:1902 +6996:2:1903 +6997:2:1914 +6998:2:1919 +6999:2:1920 +7000:0:4365 +7001:2:1932 +7002:0:4365 +7003:3:4286 +7004:0:4365 +7005:2:1934 +7006:0:4365 +7007:3:4287 +7008:0:4365 +7009:2:1935 +7010:0:4365 +7011:2:1936 +7012:0:4365 +7013:2:2129 +7014:0:4365 +7015:2:2130 +7016:0:4365 +7017:2:2134 +7018:0:4365 +7019:3:4286 +7020:0:4365 +7021:2:2136 +7022:0:4365 +7023:3:4287 +7024:0:4365 +7025:2:2137 +7026:2:2141 +7027:2:2142 +7028:2:2150 +7029:2:2151 +7030:2:2155 +7031:2:2156 +7032:2:2150 +7033:2:2151 +7034:2:2155 +7035:2:2156 +7036:2:2164 +7037:2:2169 +7038:2:2173 +7039:2:2174 +7040:2:2181 +7041:2:2182 +7042:2:2193 +7043:2:2194 +7044:2:2195 +7045:2:2193 +7046:2:2194 +7047:2:2195 +7048:2:2206 +7049:2:2211 +7050:2:2212 +7051:0:4365 +7052:2:2224 +7053:0:4365 +7054:3:4286 +7055:0:4365 +7056:2:2226 +7057:0:4365 +7058:3:4287 +7059:0:4365 +7060:2:1936 +7061:0:4365 +7062:2:2129 +7063:0:4365 +7064:2:2130 +7065:0:4365 +7066:2:2134 +7067:0:4365 +7068:3:4286 +7069:0:4365 +7070:2:2136 +7071:0:4365 +7072:3:4287 +7073:0:4365 +7074:2:2137 +7075:2:2141 +7076:2:2142 +7077:2:2150 +7078:2:2151 +7079:2:2155 +7080:2:2156 +7081:2:2150 +7082:2:2151 +7083:2:2152 +7084:2:2164 +7085:2:2169 +7086:2:2173 +7087:2:2174 +7088:2:2181 +7089:2:2182 +7090:2:2193 +7091:2:2194 +7092:2:2195 +7093:2:2193 +7094:2:2194 +7095:2:2195 +7096:2:2206 +7097:2:2211 +7098:2:2212 +7099:0:4365 +7100:2:2224 +7101:0:4365 +7102:3:4286 +7103:0:4365 +7104:2:2226 +7105:0:4365 +7106:3:4287 +7107:0:4365 +7108:2:2230 +7109:0:4365 +7110:3:4286 +7111:0:4365 +7112:2:2235 +7113:2:2239 +7114:2:2240 +7115:2:2248 +7116:2:2249 +7117:2:2253 +7118:2:2254 +7119:2:2248 +7120:2:2249 +7121:2:2250 +7122:2:2262 +7123:2:2267 +7124:2:2271 +7125:2:2272 +7126:2:2279 +7127:2:2280 +7128:2:2291 +7129:2:2292 +7130:2:2293 +7131:2:2291 +7132:2:2292 +7133:2:2293 +7134:2:2304 +7135:2:2309 +7136:2:2310 +7137:0:4365 +7138:3:4287 +7139:0:4365 +7140:2:2322 +7141:0:4365 +7142:2:1169 +7143:0:4365 +7144:3:4286 +7145:0:4365 +7146:2:1170 +7147:0:4365 +7148:3:4287 +7149:0:4365 +7150:3:4288 +7151:0:4365 +7152:3:4294 +7153:0:4365 +7154:3:4295 +7155:0:4365 +7156:3:2338 +7157:0:4365 +7158:3:2339 +7159:3:2343 +7160:3:2344 +7161:3:2352 +7162:3:2353 +7163:3:2357 +7164:3:2358 +7165:3:2352 +7166:3:2353 +7167:3:2357 +7168:3:2358 +7169:3:2366 +7170:3:2371 +7171:3:2375 +7172:3:2376 +7173:3:2383 +7174:3:2384 +7175:3:2395 +7176:3:2396 +7177:3:2397 +7178:3:2395 +7179:3:2396 +7180:3:2397 +7181:3:2408 +7182:3:2413 +7183:3:2414 +7184:0:4365 +7185:3:2426 +7186:0:4365 +7187:3:2427 +7188:0:4365 +7189:2:1173 +7190:0:4365 +7191:3:2428 +7192:0:4365 +7193:2:1179 +7194:0:4365 +7195:2:1180 +7196:0:4365 +7197:3:2427 +7198:0:4365 +7199:2:1181 +7200:2:1185 +7201:2:1186 +7202:2:1194 +7203:2:1195 +7204:2:1199 +7205:2:1200 +7206:2:1194 +7207:2:1195 +7208:2:1199 +7209:2:1200 +7210:2:1208 +7211:2:1213 +7212:2:1217 +7213:2:1218 +7214:2:1225 +7215:2:1226 +7216:2:1237 +7217:2:1238 +7218:2:1239 +7219:2:1237 +7220:2:1238 +7221:2:1239 +7222:2:1250 +7223:2:1255 +7224:2:1256 +7225:0:4365 +7226:3:2428 +7227:0:4365 +7228:2:1268 +7229:0:4365 +7230:3:2427 +7231:0:4365 +7232:2:1270 +7233:0:4365 +7234:3:2428 +7235:0:4365 +7236:2:1271 +7237:2:1275 +7238:2:1276 +7239:2:1284 +7240:2:1285 +7241:2:1289 +7242:2:1290 +7243:2:1284 +7244:2:1285 +7245:2:1289 +7246:2:1290 +7247:2:1298 +7248:2:1303 +7249:2:1307 +7250:2:1308 +7251:2:1315 +7252:2:1316 +7253:2:1327 +7254:2:1328 +7255:2:1329 +7256:2:1327 +7257:2:1328 +7258:2:1329 +7259:2:1340 +7260:2:1345 +7261:2:1346 +7262:0:4365 +7263:2:1358 +7264:0:4365 +7265:2:1360 +7266:0:4365 +7267:3:2427 +7268:0:4365 +7269:2:1361 +7270:0:4365 +7271:3:2428 +7272:0:4365 +7273:2:1362 +7274:2:1366 +7275:2:1367 +7276:2:1375 +7277:2:1376 +7278:2:1380 +7279:2:1381 +7280:2:1375 +7281:2:1376 +7282:2:1380 +7283:2:1381 +7284:2:1389 +7285:2:1394 +7286:2:1398 +7287:2:1399 +7288:2:1406 +7289:2:1407 +7290:2:1418 +7291:2:1419 +7292:2:1420 +7293:2:1418 +7294:2:1419 +7295:2:1420 +7296:2:1431 +7297:2:1436 +7298:2:1437 +7299:0:4365 +7300:2:1449 +7301:0:4365 +7302:3:2427 +7303:0:4365 +7304:2:1451 +7305:0:4365 +7306:3:2428 +7307:0:4365 +7308:2:1652 +7309:0:4365 +7310:2:1653 +7311:0:4365 +7312:2:1657 +7313:0:4365 +7314:2:1180 +7315:0:4365 +7316:3:2427 +7317:0:4365 +7318:2:1181 +7319:2:1185 +7320:2:1186 +7321:2:1194 +7322:2:1195 +7323:2:1199 +7324:2:1200 +7325:2:1194 +7326:2:1195 +7327:2:1196 +7328:2:1208 +7329:2:1213 +7330:2:1217 +7331:2:1218 +7332:2:1225 +7333:2:1226 +7334:2:1237 +7335:2:1238 +7336:2:1239 +7337:2:1237 +7338:2:1238 +7339:2:1239 +7340:2:1250 +7341:2:1255 +7342:2:1256 +7343:0:4365 +7344:3:2428 +7345:0:4365 +7346:2:1268 +7347:0:4365 +7348:3:2427 +7349:0:4365 +7350:2:1270 +7351:0:4365 +7352:3:2428 +7353:0:4365 +7354:2:1271 +7355:2:1275 +7356:2:1276 +7357:2:1284 +7358:2:1285 +7359:2:1289 +7360:2:1290 +7361:2:1284 +7362:2:1285 +7363:2:1289 +7364:2:1290 +7365:2:1298 +7366:2:1303 +7367:2:1307 +7368:2:1308 +7369:2:1315 +7370:2:1316 +7371:2:1327 +7372:2:1328 +7373:2:1329 +7374:2:1327 +7375:2:1328 +7376:2:1329 +7377:2:1340 +7378:2:1345 +7379:2:1346 +7380:0:4365 +7381:2:1358 +7382:0:4365 +7383:2:1454 +7384:0:4365 +7385:3:2427 +7386:0:4365 +7387:2:1455 +7388:0:4365 +7389:3:2428 +7390:0:4365 +7391:2:1652 +7392:0:4365 +7393:2:1653 +7394:0:4365 +7395:2:1657 +7396:0:4365 +7397:2:1660 +7398:0:4365 +7399:3:2427 +7400:0:4365 +7401:2:1665 +7402:2:1669 +7403:2:1670 +7404:2:1678 +7405:2:1679 +7406:2:1683 +7407:2:1684 +7408:2:1678 +7409:2:1679 +7410:2:1680 +7411:2:1692 +7412:2:1697 +7413:2:1701 +7414:2:1702 +7415:2:1709 +7416:2:1710 +7417:2:1721 +7418:2:1722 +7419:2:1723 +7420:2:1721 +7421:2:1722 +7422:2:1723 +7423:2:1734 +7424:2:1739 +7425:2:1740 +7426:0:4365 +7427:3:2428 +7428:0:4365 +7429:2:1752 +7430:0:4365 +7431:3:2427 +7432:0:4365 +7433:2:1754 +7434:0:4365 +7435:3:2428 +7436:0:4365 +7437:2:1755 +7438:2:1759 +7439:2:1760 +7440:2:1768 +7441:2:1769 +7442:2:1773 +7443:2:1774 +7444:2:1768 +7445:2:1769 +7446:2:1773 +7447:2:1774 +7448:2:1782 +7449:2:1787 +7450:2:1791 +7451:2:1792 +7452:2:1799 +7453:2:1800 +7454:2:1811 +7455:2:1812 +7456:2:1813 +7457:2:1811 +7458:2:1812 +7459:2:1813 +7460:2:1824 +7461:2:1829 +7462:2:1830 +7463:0:4365 +7464:2:1842 +7465:0:4365 +7466:3:2427 +7467:0:4365 +7468:2:1844 +7469:0:4365 +7470:3:2428 +7471:0:4365 +7472:2:1845 +7473:2:1849 +7474:2:1850 +7475:2:1858 +7476:2:1859 +7477:2:1863 +7478:2:1864 +7479:2:1858 +7480:2:1859 +7481:2:1863 +7482:2:1864 +7483:2:1872 +7484:2:1877 +7485:2:1881 +7486:2:1882 +7487:2:1889 +7488:2:1890 +7489:2:1901 +7490:2:1902 +7491:2:1903 +7492:2:1901 +7493:2:1902 +7494:2:1903 +7495:2:1914 +7496:2:1919 +7497:2:1920 +7498:0:4365 +7499:2:1932 +7500:0:4365 +7501:3:2427 +7502:0:4365 +7503:2:1934 +7504:0:4365 +7505:3:2428 +7506:0:4365 +7507:2:1935 +7508:0:4365 +7509:2:1936 +7510:0:4365 +7511:2:2129 +7512:0:4365 +7513:2:2130 +7514:0:4365 +7515:2:2134 +7516:0:4365 +7517:3:2427 +7518:0:4365 +7519:2:2136 +7520:0:4365 +7521:3:2428 +7522:0:4365 +7523:2:2137 +7524:2:2141 +7525:2:2142 +7526:2:2150 +7527:2:2151 +7528:2:2155 +7529:2:2156 +7530:2:2150 +7531:2:2151 +7532:2:2155 +7533:2:2156 +7534:2:2164 +7535:2:2169 +7536:2:2173 +7537:2:2174 +7538:2:2181 +7539:2:2182 +7540:2:2193 +7541:2:2194 +7542:2:2195 +7543:2:2193 +7544:2:2194 +7545:2:2195 +7546:2:2206 +7547:2:2211 +7548:2:2212 +7549:0:4365 +7550:2:2224 +7551:0:4365 +7552:3:2427 +7553:0:4365 +7554:2:2226 +7555:0:4365 +7556:3:2428 +7557:0:4365 +7558:2:1936 +7559:0:4365 +7560:2:2129 +7561:0:4365 +7562:2:2130 +7563:0:4365 +7564:2:2134 +7565:0:4365 +7566:3:2427 +7567:0:4365 +7568:2:2136 +7569:0:4365 +7570:3:2428 +7571:0:4365 +7572:2:2137 +7573:2:2141 +7574:2:2142 +7575:2:2150 +7576:2:2151 +7577:2:2155 +7578:2:2156 +7579:2:2150 +7580:2:2151 +7581:2:2152 +7582:2:2164 +7583:2:2169 +7584:2:2173 +7585:2:2174 +7586:2:2181 +7587:2:2182 +7588:2:2193 +7589:2:2194 +7590:2:2195 +7591:2:2193 +7592:2:2194 +7593:2:2195 +7594:2:2206 +7595:2:2211 +7596:2:2212 +7597:0:4365 +7598:2:2224 +7599:0:4365 +7600:3:2427 +7601:0:4365 +7602:2:2226 +7603:0:4365 +7604:3:2428 +7605:0:4365 +7606:2:2230 +7607:0:4365 +7608:3:2427 +7609:0:4365 +7610:2:2235 +7611:2:2239 +7612:2:2240 +7613:2:2248 +7614:2:2249 +7615:2:2253 +7616:2:2254 +7617:2:2248 +7618:2:2249 +7619:2:2250 +7620:2:2262 +7621:2:2267 +7622:2:2271 +7623:2:2272 +7624:2:2279 +7625:2:2280 +7626:2:2291 +7627:2:2292 +7628:2:2293 +7629:2:2291 +7630:2:2292 +7631:2:2293 +7632:2:2304 +7633:2:2309 +7634:2:2310 +7635:0:4365 +7636:3:2428 +7637:0:4365 +7638:2:2322 +7639:0:4365 +7640:2:1169 +7641:0:4365 +7642:3:2427 +7643:0:4365 +7644:2:1170 +7645:0:4365 +7646:3:2428 +7647:0:4365 +7648:3:2429 +7649:0:4365 +7650:3:2435 +7651:3:2436 +7652:0:4365 +7653:3:2440 +7654:3:2444 +7655:3:2445 +7656:3:2453 +7657:3:2454 +7658:3:2458 +7659:3:2459 +7660:3:2453 +7661:3:2454 +7662:3:2458 +7663:3:2459 +7664:3:2467 +7665:3:2472 +7666:3:2473 +7667:3:2484 +7668:3:2485 +7669:3:2496 +7670:3:2497 +7671:3:2498 +7672:3:2496 +7673:3:2497 +7674:3:2498 +7675:3:2509 +7676:3:2514 +7677:3:2515 +7678:0:4365 +7679:3:2527 +7680:0:4365 +7681:3:2528 +7682:0:4365 +7683:2:1173 +7684:0:4365 +7685:3:2529 +7686:0:4365 +7687:2:1179 +7688:0:4365 +7689:2:1180 +7690:0:4365 +7691:3:2528 +7692:0:4365 +7693:2:1181 +7694:2:1185 +7695:2:1186 +7696:2:1194 +7697:2:1195 +7698:2:1199 +7699:2:1200 +7700:2:1194 +7701:2:1195 +7702:2:1199 +7703:2:1200 +7704:2:1208 +7705:2:1213 +7706:2:1217 +7707:2:1218 +7708:2:1225 +7709:2:1226 +7710:2:1237 +7711:2:1238 +7712:2:1239 +7713:2:1237 +7714:2:1238 +7715:2:1239 +7716:2:1250 +7717:2:1255 +7718:2:1256 +7719:0:4365 +7720:3:2529 +7721:0:4365 +7722:2:1268 +7723:0:4365 +7724:3:2528 +7725:0:4365 +7726:2:1270 +7727:0:4365 +7728:3:2529 +7729:0:4365 +7730:2:1271 +7731:2:1275 +7732:2:1276 +7733:2:1284 +7734:2:1285 +7735:2:1289 +7736:2:1290 +7737:2:1284 +7738:2:1285 +7739:2:1289 +7740:2:1290 +7741:2:1298 +7742:2:1303 +7743:2:1307 +7744:2:1308 +7745:2:1315 +7746:2:1316 +7747:2:1327 +7748:2:1328 +7749:2:1329 +7750:2:1327 +7751:2:1328 +7752:2:1329 +7753:2:1340 +7754:2:1345 +7755:2:1346 +7756:0:4365 +7757:2:1358 +7758:0:4365 +7759:2:1360 +7760:0:4365 +7761:3:2528 +7762:0:4365 +7763:2:1361 +7764:0:4365 +7765:3:2529 +7766:0:4365 +7767:2:1362 +7768:2:1366 +7769:2:1367 +7770:2:1375 +7771:2:1376 +7772:2:1380 +7773:2:1381 +7774:2:1375 +7775:2:1376 +7776:2:1380 +7777:2:1381 +7778:2:1389 +7779:2:1394 +7780:2:1398 +7781:2:1399 +7782:2:1406 +7783:2:1407 +7784:2:1418 +7785:2:1419 +7786:2:1420 +7787:2:1418 +7788:2:1419 +7789:2:1420 +7790:2:1431 +7791:2:1436 +7792:2:1437 +7793:0:4365 +7794:2:1449 +7795:0:4365 +7796:3:2528 +7797:0:4365 +7798:2:1451 +7799:0:4365 +7800:3:2529 +7801:0:4365 +7802:2:1652 +7803:0:4365 +7804:2:1653 +7805:0:4365 +7806:2:1657 +7807:0:4365 +7808:2:1180 +7809:0:4365 +7810:3:2528 +7811:0:4365 +7812:2:1181 +7813:2:1185 +7814:2:1186 +7815:2:1194 +7816:2:1195 +7817:2:1199 +7818:2:1200 +7819:2:1194 +7820:2:1195 +7821:2:1196 +7822:2:1208 +7823:2:1213 +7824:2:1217 +7825:2:1218 +7826:2:1225 +7827:2:1226 +7828:2:1237 +7829:2:1238 +7830:2:1239 +7831:2:1237 +7832:2:1238 +7833:2:1239 +7834:2:1250 +7835:2:1255 +7836:2:1256 +7837:0:4365 +7838:3:2529 +7839:0:4365 +7840:2:1268 +7841:0:4365 +7842:3:2528 +7843:0:4365 +7844:2:1270 +7845:0:4365 +7846:3:2529 +7847:0:4365 +7848:2:1271 +7849:2:1275 +7850:2:1276 +7851:2:1284 +7852:2:1285 +7853:2:1289 +7854:2:1290 +7855:2:1284 +7856:2:1285 +7857:2:1289 +7858:2:1290 +7859:2:1298 +7860:2:1303 +7861:2:1307 +7862:2:1308 +7863:2:1315 +7864:2:1316 +7865:2:1327 +7866:2:1328 +7867:2:1329 +7868:2:1327 +7869:2:1328 +7870:2:1329 +7871:2:1340 +7872:2:1345 +7873:2:1346 +7874:0:4365 +7875:2:1358 +7876:0:4365 +7877:2:1454 +7878:0:4365 +7879:3:2528 +7880:0:4365 +7881:2:1455 +7882:0:4365 +7883:3:2529 +7884:0:4365 +7885:2:1652 +7886:0:4365 +7887:2:1653 +7888:0:4365 +7889:2:1657 +7890:0:4365 +7891:2:1660 +7892:0:4365 +7893:3:2528 +7894:0:4365 +7895:2:1665 +7896:2:1669 +7897:2:1670 +7898:2:1678 +7899:2:1679 +7900:2:1683 +7901:2:1684 +7902:2:1678 +7903:2:1679 +7904:2:1680 +7905:2:1692 +7906:2:1697 +7907:2:1701 +7908:2:1702 +7909:2:1709 +7910:2:1710 +7911:2:1721 +7912:2:1722 +7913:2:1723 +7914:2:1721 +7915:2:1722 +7916:2:1723 +7917:2:1734 +7918:2:1739 +7919:2:1740 +7920:0:4365 +7921:3:2529 +7922:0:4365 +7923:2:1752 +7924:0:4365 +7925:3:2528 +7926:0:4365 +7927:2:1754 +7928:0:4365 +7929:3:2529 +7930:0:4365 +7931:2:1755 +7932:2:1759 +7933:2:1760 +7934:2:1768 +7935:2:1769 +7936:2:1773 +7937:2:1774 +7938:2:1768 +7939:2:1769 +7940:2:1773 +7941:2:1774 +7942:2:1782 +7943:2:1787 +7944:2:1791 +7945:2:1792 +7946:2:1799 +7947:2:1800 +7948:2:1811 +7949:2:1812 +7950:2:1813 +7951:2:1811 +7952:2:1812 +7953:2:1813 +7954:2:1824 +7955:2:1829 +7956:2:1830 +7957:0:4365 +7958:2:1842 +7959:0:4365 +7960:3:2528 +7961:0:4365 +7962:2:1844 +7963:0:4365 +7964:3:2529 +7965:0:4365 +7966:2:1845 +7967:2:1849 +7968:2:1850 +7969:2:1858 +7970:2:1859 +7971:2:1863 +7972:2:1864 +7973:2:1858 +7974:2:1859 +7975:2:1863 +7976:2:1864 +7977:2:1872 +7978:2:1877 +7979:2:1881 +7980:2:1882 +7981:2:1889 +7982:2:1890 +7983:2:1901 +7984:2:1902 +7985:2:1903 +7986:2:1901 +7987:2:1902 +7988:2:1903 +7989:2:1914 +7990:2:1919 +7991:2:1920 +7992:0:4365 +7993:2:1932 +7994:0:4365 +7995:3:2528 +7996:0:4365 +7997:2:1934 +7998:0:4365 +7999:3:2529 +8000:0:4365 +8001:2:1935 +8002:0:4365 +8003:2:1936 +8004:0:4365 +8005:2:2129 +8006:0:4365 +8007:2:2130 +8008:0:4365 +8009:2:2134 +8010:0:4365 +8011:3:2528 +8012:0:4365 +8013:2:2136 +8014:0:4365 +8015:3:2529 +8016:0:4365 +8017:2:2137 +8018:2:2141 +8019:2:2142 +8020:2:2150 +8021:2:2151 +8022:2:2155 +8023:2:2156 +8024:2:2150 +8025:2:2151 +8026:2:2155 +8027:2:2156 +8028:2:2164 +8029:2:2169 +8030:2:2173 +8031:2:2174 +8032:2:2181 +8033:2:2182 +8034:2:2193 +8035:2:2194 +8036:2:2195 +8037:2:2193 +8038:2:2194 +8039:2:2195 +8040:2:2206 +8041:2:2211 +8042:2:2212 +8043:0:4365 +8044:2:2224 +8045:0:4365 +8046:3:2528 +8047:0:4365 +8048:2:2226 +8049:0:4365 +8050:3:2529 +8051:0:4365 +8052:2:1936 +8053:0:4365 +8054:2:2129 +8055:0:4365 +8056:2:2130 +8057:0:4365 +8058:2:2134 +8059:0:4365 +8060:3:2528 +8061:0:4365 +8062:2:2136 +8063:0:4365 +8064:3:2529 +8065:0:4365 +8066:2:2137 +8067:2:2141 +8068:2:2142 +8069:2:2150 +8070:2:2151 +8071:2:2155 +8072:2:2156 +8073:2:2150 +8074:2:2151 +8075:2:2152 +8076:2:2164 +8077:2:2169 +8078:2:2173 +8079:2:2174 +8080:2:2181 +8081:2:2182 +8082:2:2193 +8083:2:2194 +8084:2:2195 +8085:2:2193 +8086:2:2194 +8087:2:2195 +8088:2:2206 +8089:2:2211 +8090:2:2212 +8091:0:4365 +8092:2:2224 +8093:0:4365 +8094:3:2528 +8095:0:4365 +8096:2:2226 +8097:0:4365 +8098:3:2529 +8099:0:4365 +8100:2:2230 +8101:0:4365 +8102:3:2528 +8103:0:4365 +8104:2:2235 +8105:2:2239 +8106:2:2240 +8107:2:2248 +8108:2:2249 +8109:2:2253 +8110:2:2254 +8111:2:2248 +8112:2:2249 +8113:2:2250 +8114:2:2262 +8115:2:2267 +8116:2:2271 +8117:2:2272 +8118:2:2279 +8119:2:2280 +8120:2:2291 +8121:2:2292 +8122:2:2293 +8123:2:2291 +8124:2:2292 +8125:2:2293 +8126:2:2304 +8127:2:2309 +8128:2:2310 +8129:0:4365 +8130:3:2529 +8131:0:4365 +8132:2:2322 +8133:0:4365 +8134:2:1169 +8135:0:4365 +8136:3:2528 +8137:0:4365 +8138:2:1170 +8139:0:4365 +8140:3:2529 +8141:0:4365 +8142:3:2530 +8143:0:4365 +8144:3:2536 +8145:0:4365 +8146:3:2537 +8147:0:4365 +8148:3:2547 +8149:0:4365 +8150:3:2548 +8151:0:4365 +8152:3:2552 +8153:3:2553 +8154:3:2557 +8155:3:2561 +8156:3:2562 +8157:3:2557 +8158:3:2561 +8159:3:2562 +8160:3:2566 +8161:3:2574 +8162:3:2575 +8163:3:2580 +8164:3:2587 +8165:3:2588 +8166:3:2587 +8167:3:2588 +8168:3:2595 +8169:3:2600 +8170:0:4365 +8171:3:2611 +8172:0:4365 +8173:3:2615 +8174:3:2616 +8175:3:2620 +8176:3:2624 +8177:3:2625 +8178:3:2620 +8179:3:2624 +8180:3:2625 +8181:3:2629 +8182:3:2637 +8183:3:2638 +8184:3:2643 +8185:3:2650 +8186:3:2651 +8187:3:2650 +8188:3:2651 +8189:3:2658 +8190:3:2663 +8191:0:4365 +8192:3:2611 +8193:0:4365 +8194:3:2615 +8195:3:2616 +8196:3:2620 +8197:3:2624 +8198:3:2625 +8199:3:2620 +8200:3:2624 +8201:3:2625 +8202:3:2629 +8203:3:2637 +8204:3:2638 +8205:3:2643 +8206:3:2650 +8207:3:2651 +8208:3:2650 +8209:3:2651 +8210:3:2658 +8211:3:2663 +8212:0:4365 +8213:3:2674 +8214:0:4365 +8215:3:2682 +8216:3:2683 +8217:3:2687 +8218:3:2691 +8219:3:2692 +8220:3:2687 +8221:3:2691 +8222:3:2692 +8223:3:2696 +8224:3:2704 +8225:3:2705 +8226:3:2710 +8227:3:2717 +8228:3:2718 +8229:3:2717 +8230:3:2718 +8231:3:2725 +8232:3:2730 +8233:0:4365 +8234:3:2745 +8235:0:4365 +8236:3:2746 +8237:0:4365 +8238:2:1173 +8239:0:4365 +8240:3:2747 +8241:0:4365 +8242:2:1179 +8243:0:4365 +8244:2:1180 +8245:0:4365 +8246:3:2746 +8247:0:4365 +8248:2:1181 +8249:2:1185 +8250:2:1186 +8251:2:1194 +8252:2:1195 +8253:2:1199 +8254:2:1200 +8255:2:1194 +8256:2:1195 +8257:2:1199 +8258:2:1200 +8259:2:1208 +8260:2:1213 +8261:2:1217 +8262:2:1218 +8263:2:1225 +8264:2:1226 +8265:2:1237 +8266:2:1238 +8267:2:1239 +8268:2:1237 +8269:2:1238 +8270:2:1239 +8271:2:1250 +8272:2:1255 +8273:2:1256 +8274:0:4365 +8275:3:2747 +8276:0:4365 +8277:2:1268 +8278:0:4365 +8279:3:2746 +8280:0:4365 +8281:2:1270 +8282:0:4365 +8283:3:2747 +8284:0:4365 +8285:2:1271 +8286:2:1275 +8287:2:1276 +8288:2:1284 +8289:2:1285 +8290:2:1289 +8291:2:1290 +8292:2:1284 +8293:2:1285 +8294:2:1289 +8295:2:1290 +8296:2:1298 +8297:2:1303 +8298:2:1307 +8299:2:1308 +8300:2:1315 +8301:2:1316 +8302:2:1327 +8303:2:1328 +8304:2:1329 +8305:2:1327 +8306:2:1328 +8307:2:1329 +8308:2:1340 +8309:2:1345 +8310:2:1346 +8311:0:4365 +8312:2:1358 +8313:0:4365 +8314:2:1360 +8315:0:4365 +8316:3:2746 +8317:0:4365 +8318:2:1361 +8319:0:4365 +8320:3:2747 +8321:0:4365 +8322:2:1362 +8323:2:1366 +8324:2:1367 +8325:2:1375 +8326:2:1376 +8327:2:1380 +8328:2:1381 +8329:2:1375 +8330:2:1376 +8331:2:1380 +8332:2:1381 +8333:2:1389 +8334:2:1394 +8335:2:1398 +8336:2:1399 +8337:2:1406 +8338:2:1407 +8339:2:1418 +8340:2:1419 +8341:2:1420 +8342:2:1418 +8343:2:1419 +8344:2:1420 +8345:2:1431 +8346:2:1436 +8347:2:1437 +8348:0:4365 +8349:2:1449 +8350:0:4365 +8351:3:2746 +8352:0:4365 +8353:2:1451 +8354:0:4365 +8355:3:2747 +8356:0:4365 +8357:2:1652 +8358:0:4365 +8359:2:1653 +8360:0:4365 +8361:2:1657 +8362:0:4365 +8363:2:1180 +8364:0:4365 +8365:3:2746 +8366:0:4365 +8367:2:1181 +8368:2:1185 +8369:2:1186 +8370:2:1194 +8371:2:1195 +8372:2:1199 +8373:2:1200 +8374:2:1194 +8375:2:1195 +8376:2:1196 +8377:2:1208 +8378:2:1213 +8379:2:1217 +8380:2:1218 +8381:2:1225 +8382:2:1226 +8383:2:1237 +8384:2:1238 +8385:2:1239 +8386:2:1237 +8387:2:1238 +8388:2:1239 +8389:2:1250 +8390:2:1255 +8391:2:1256 +8392:0:4365 +8393:3:2747 +8394:0:4365 +8395:2:1268 +8396:0:4365 +8397:3:2746 +8398:0:4365 +8399:2:1270 +8400:0:4365 +8401:3:2747 +8402:0:4365 +8403:2:1271 +8404:2:1275 +8405:2:1276 +8406:2:1284 +8407:2:1285 +8408:2:1289 +8409:2:1290 +8410:2:1284 +8411:2:1285 +8412:2:1289 +8413:2:1290 +8414:2:1298 +8415:2:1303 +8416:2:1307 +8417:2:1308 +8418:2:1315 +8419:2:1316 +8420:2:1327 +8421:2:1328 +8422:2:1329 +8423:2:1327 +8424:2:1328 +8425:2:1329 +8426:2:1340 +8427:2:1345 +8428:2:1346 +8429:0:4365 +8430:2:1358 +8431:0:4365 +8432:2:1454 +8433:0:4365 +8434:3:2746 +8435:0:4365 +8436:2:1455 +8437:0:4365 +8438:3:2747 +8439:0:4365 +8440:2:1652 +8441:0:4365 +8442:2:1653 +8443:0:4365 +8444:2:1657 +8445:0:4365 +8446:2:1660 +8447:0:4365 +8448:3:2746 +8449:0:4365 +8450:2:1665 +8451:2:1669 +8452:2:1670 +8453:2:1678 +8454:2:1679 +8455:2:1683 +8456:2:1684 +8457:2:1678 +8458:2:1679 +8459:2:1680 +8460:2:1692 +8461:2:1697 +8462:2:1701 +8463:2:1702 +8464:2:1709 +8465:2:1710 +8466:2:1721 +8467:2:1722 +8468:2:1723 +8469:2:1721 +8470:2:1722 +8471:2:1723 +8472:2:1734 +8473:2:1739 +8474:2:1740 +8475:0:4365 +8476:3:2747 +8477:0:4365 +8478:2:1752 +8479:0:4365 +8480:3:2746 +8481:0:4365 +8482:2:1754 +8483:0:4365 +8484:3:2747 +8485:0:4365 +8486:2:1755 +8487:2:1759 +8488:2:1760 +8489:2:1768 +8490:2:1769 +8491:2:1773 +8492:2:1774 +8493:2:1768 +8494:2:1769 +8495:2:1773 +8496:2:1774 +8497:2:1782 +8498:2:1787 +8499:2:1791 +8500:2:1792 +8501:2:1799 +8502:2:1800 +8503:2:1811 +8504:2:1812 +8505:2:1813 +8506:2:1811 +8507:2:1812 +8508:2:1813 +8509:2:1824 +8510:2:1829 +8511:2:1830 +8512:0:4365 +8513:2:1842 +8514:0:4365 +8515:3:2746 +8516:0:4365 +8517:2:1844 +8518:0:4365 +8519:3:2747 +8520:0:4365 +8521:2:1845 +8522:2:1849 +8523:2:1850 +8524:2:1858 +8525:2:1859 +8526:2:1863 +8527:2:1864 +8528:2:1858 +8529:2:1859 +8530:2:1863 +8531:2:1864 +8532:2:1872 +8533:2:1877 +8534:2:1881 +8535:2:1882 +8536:2:1889 +8537:2:1890 +8538:2:1901 +8539:2:1902 +8540:2:1903 +8541:2:1901 +8542:2:1902 +8543:2:1903 +8544:2:1914 +8545:2:1919 +8546:2:1920 +8547:0:4365 +8548:2:1932 +8549:0:4365 +8550:3:2746 +8551:0:4365 +8552:2:1934 +8553:0:4365 +8554:3:2747 +8555:0:4365 +8556:2:1935 +8557:0:4365 +8558:2:1936 +8559:0:4365 +8560:2:2129 +8561:0:4365 +8562:2:2130 +8563:0:4365 +8564:2:2134 +8565:0:4365 +8566:3:2746 +8567:0:4365 +8568:2:2136 +8569:0:4365 +8570:3:2747 +8571:0:4365 +8572:2:2137 +8573:2:2141 +8574:2:2142 +8575:2:2150 +8576:2:2151 +8577:2:2155 +8578:2:2156 +8579:2:2150 +8580:2:2151 +8581:2:2155 +8582:2:2156 +8583:2:2164 +8584:2:2169 +8585:2:2173 +8586:2:2174 +8587:2:2181 +8588:2:2182 +8589:2:2193 +8590:2:2194 +8591:2:2195 +8592:2:2193 +8593:2:2194 +8594:2:2195 +8595:2:2206 +8596:2:2211 +8597:2:2212 +8598:0:4365 +8599:2:2224 +8600:0:4365 +8601:3:2746 +8602:0:4365 +8603:2:2226 +8604:0:4365 +8605:3:2747 +8606:0:4365 +8607:2:1936 +8608:0:4365 +8609:2:2129 +8610:0:4365 +8611:2:2130 +8612:0:4365 +8613:2:2134 +8614:0:4365 +8615:3:2746 +8616:0:4365 +8617:2:2136 +8618:0:4365 +8619:3:2747 +8620:0:4365 +8621:2:2137 +8622:2:2141 +8623:2:2142 +8624:2:2150 +8625:2:2151 +8626:2:2155 +8627:2:2156 +8628:2:2150 +8629:2:2151 +8630:2:2152 +8631:2:2164 +8632:2:2169 +8633:2:2173 +8634:2:2174 +8635:2:2181 +8636:2:2182 +8637:2:2193 +8638:2:2194 +8639:2:2195 +8640:2:2193 +8641:2:2194 +8642:2:2195 +8643:2:2206 +8644:2:2211 +8645:2:2212 +8646:0:4365 +8647:2:2224 +8648:0:4365 +8649:3:2746 +8650:0:4365 +8651:2:2226 +8652:0:4365 +8653:3:2747 +8654:0:4365 +8655:2:2230 +8656:0:4365 +8657:3:2746 +8658:0:4365 +8659:2:2235 +8660:2:2239 +8661:2:2240 +8662:2:2248 +8663:2:2249 +8664:2:2253 +8665:2:2254 +8666:2:2248 +8667:2:2249 +8668:2:2250 +8669:2:2262 +8670:2:2267 +8671:2:2271 +8672:2:2272 +8673:2:2279 +8674:2:2280 +8675:2:2291 +8676:2:2292 +8677:2:2293 +8678:2:2291 +8679:2:2292 +8680:2:2293 +8681:2:2304 +8682:2:2309 +8683:2:2310 +8684:0:4365 +8685:3:2747 +8686:0:4365 +8687:2:2322 +8688:0:4365 +8689:2:1169 +8690:0:4365 +8691:3:2746 +8692:0:4365 +8693:2:1170 +8694:0:4365 +8695:3:2747 +8696:0:4365 +8697:3:2748 +8698:0:4365 +8699:3:2754 +8700:0:4365 +8701:3:2755 +8702:3:2759 +8703:3:2760 +8704:3:2768 +8705:3:2769 +8706:3:2773 +8707:3:2774 +8708:3:2768 +8709:3:2769 +8710:3:2773 +8711:3:2774 +8712:3:2782 +8713:3:2787 +8714:3:2791 +8715:3:2792 +8716:3:2799 +8717:3:2800 +8718:3:2811 +8719:3:2812 +8720:3:2813 +8721:3:2811 +8722:3:2812 +8723:3:2813 +8724:3:2824 +8725:3:2829 +8726:3:2830 +8727:0:4365 +8728:3:2842 +8729:0:4365 +8730:3:2843 +8731:0:4365 +8732:2:1173 +8733:0:4365 +8734:3:2844 +8735:0:4365 +8736:2:1179 +8737:0:4365 +8738:2:1180 +8739:0:4365 +8740:3:2843 +8741:0:4365 +8742:2:1181 +8743:2:1185 +8744:2:1186 +8745:2:1194 +8746:2:1195 +8747:2:1199 +8748:2:1200 +8749:2:1194 +8750:2:1195 +8751:2:1199 +8752:2:1200 +8753:2:1208 +8754:2:1213 +8755:2:1217 +8756:2:1218 +8757:2:1225 +8758:2:1226 +8759:2:1237 +8760:2:1238 +8761:2:1239 +8762:2:1237 +8763:2:1238 +8764:2:1239 +8765:2:1250 +8766:2:1255 +8767:2:1256 +8768:0:4365 +8769:3:2844 +8770:0:4365 +8771:2:1268 +8772:0:4365 +8773:3:2843 +8774:0:4365 +8775:2:1270 +8776:0:4365 +8777:3:2844 +8778:0:4365 +8779:2:1271 +8780:2:1275 +8781:2:1276 +8782:2:1284 +8783:2:1285 +8784:2:1289 +8785:2:1290 +8786:2:1284 +8787:2:1285 +8788:2:1289 +8789:2:1290 +8790:2:1298 +8791:2:1303 +8792:2:1307 +8793:2:1308 +8794:2:1315 +8795:2:1316 +8796:2:1327 +8797:2:1328 +8798:2:1329 +8799:2:1327 +8800:2:1328 +8801:2:1329 +8802:2:1340 +8803:2:1345 +8804:2:1346 +8805:0:4365 +8806:2:1358 +8807:0:4365 +8808:2:1360 +8809:0:4365 +8810:3:2843 +8811:0:4365 +8812:2:1361 +8813:0:4365 +8814:3:2844 +8815:0:4365 +8816:2:1362 +8817:2:1366 +8818:2:1367 +8819:2:1375 +8820:2:1376 +8821:2:1380 +8822:2:1381 +8823:2:1375 +8824:2:1376 +8825:2:1380 +8826:2:1381 +8827:2:1389 +8828:2:1394 +8829:2:1398 +8830:2:1399 +8831:2:1406 +8832:2:1407 +8833:2:1418 +8834:2:1419 +8835:2:1420 +8836:2:1418 +8837:2:1419 +8838:2:1420 +8839:2:1431 +8840:2:1436 +8841:2:1437 +8842:0:4365 +8843:2:1449 +8844:0:4365 +8845:3:2843 +8846:0:4365 +8847:2:1451 +8848:0:4365 +8849:3:2844 +8850:0:4365 +8851:2:1652 +8852:0:4365 +8853:2:1653 +8854:0:4365 +8855:2:1657 +8856:0:4365 +8857:2:1180 +8858:0:4365 +8859:3:2843 +8860:0:4365 +8861:2:1181 +8862:2:1185 +8863:2:1186 +8864:2:1194 +8865:2:1195 +8866:2:1199 +8867:2:1200 +8868:2:1194 +8869:2:1195 +8870:2:1196 +8871:2:1208 +8872:2:1213 +8873:2:1217 +8874:2:1218 +8875:2:1225 +8876:2:1226 +8877:2:1237 +8878:2:1238 +8879:2:1239 +8880:2:1237 +8881:2:1238 +8882:2:1239 +8883:2:1250 +8884:2:1255 +8885:2:1256 +8886:0:4365 +8887:3:2844 +8888:0:4365 +8889:2:1268 +8890:0:4365 +8891:3:2843 +8892:0:4365 +8893:2:1270 +8894:0:4365 +8895:3:2844 +8896:0:4365 +8897:2:1271 +8898:2:1275 +8899:2:1276 +8900:2:1284 +8901:2:1285 +8902:2:1289 +8903:2:1290 +8904:2:1284 +8905:2:1285 +8906:2:1289 +8907:2:1290 +8908:2:1298 +8909:2:1303 +8910:2:1307 +8911:2:1308 +8912:2:1315 +8913:2:1316 +8914:2:1327 +8915:2:1328 +8916:2:1329 +8917:2:1327 +8918:2:1328 +8919:2:1329 +8920:2:1340 +8921:2:1345 +8922:2:1346 +8923:0:4365 +8924:2:1358 +8925:0:4365 +8926:2:1454 +8927:0:4365 +8928:3:2843 +8929:0:4365 +8930:2:1455 +8931:0:4365 +8932:3:2844 +8933:0:4365 +8934:2:1652 +8935:0:4365 +8936:2:1653 +8937:0:4365 +8938:2:1657 +8939:0:4365 +8940:2:1660 +8941:0:4365 +8942:3:2843 +8943:0:4365 +8944:2:1665 +8945:2:1669 +8946:2:1670 +8947:2:1678 +8948:2:1679 +8949:2:1683 +8950:2:1684 +8951:2:1678 +8952:2:1679 +8953:2:1680 +8954:2:1692 +8955:2:1697 +8956:2:1701 +8957:2:1702 +8958:2:1709 +8959:2:1710 +8960:2:1721 +8961:2:1722 +8962:2:1723 +8963:2:1721 +8964:2:1722 +8965:2:1723 +8966:2:1734 +8967:2:1739 +8968:2:1740 +8969:0:4365 +8970:3:2844 +8971:0:4365 +8972:2:1752 +8973:0:4365 +8974:3:2843 +8975:0:4365 +8976:2:1754 +8977:0:4365 +8978:3:2844 +8979:0:4365 +8980:2:1755 +8981:2:1759 +8982:2:1760 +8983:2:1768 +8984:2:1769 +8985:2:1773 +8986:2:1774 +8987:2:1768 +8988:2:1769 +8989:2:1773 +8990:2:1774 +8991:2:1782 +8992:2:1787 +8993:2:1791 +8994:2:1792 +8995:2:1799 +8996:2:1800 +8997:2:1811 +8998:2:1812 +8999:2:1813 +9000:2:1811 +9001:2:1812 +9002:2:1813 +9003:2:1824 +9004:2:1829 +9005:2:1830 +9006:0:4365 +9007:2:1842 +9008:0:4365 +9009:3:2843 +9010:0:4365 +9011:2:1844 +9012:0:4365 +9013:3:2844 +9014:0:4365 +9015:2:1845 +9016:2:1849 +9017:2:1850 +9018:2:1858 +9019:2:1859 +9020:2:1863 +9021:2:1864 +9022:2:1858 +9023:2:1859 +9024:2:1863 +9025:2:1864 +9026:2:1872 +9027:2:1877 +9028:2:1881 +9029:2:1882 +9030:2:1889 +9031:2:1890 +9032:2:1901 +9033:2:1902 +9034:2:1903 +9035:2:1901 +9036:2:1902 +9037:2:1903 +9038:2:1914 +9039:2:1919 +9040:2:1920 +9041:0:4365 +9042:2:1932 +9043:0:4365 +9044:3:2843 +9045:0:4365 +9046:2:1934 +9047:0:4365 +9048:3:2844 +9049:0:4365 +9050:2:1935 +9051:0:4365 +9052:2:1936 +9053:0:4365 +9054:2:2129 +9055:0:4365 +9056:2:2130 +9057:0:4365 +9058:2:2134 +9059:0:4365 +9060:3:2843 +9061:0:4365 +9062:2:2136 +9063:0:4365 +9064:3:2844 +9065:0:4365 +9066:2:2137 +9067:2:2141 +9068:2:2142 +9069:2:2150 +9070:2:2151 +9071:2:2155 +9072:2:2156 +9073:2:2150 +9074:2:2151 +9075:2:2155 +9076:2:2156 +9077:2:2164 +9078:2:2169 +9079:2:2173 +9080:2:2174 +9081:2:2181 +9082:2:2182 +9083:2:2193 +9084:2:2194 +9085:2:2195 +9086:2:2193 +9087:2:2194 +9088:2:2195 +9089:2:2206 +9090:2:2211 +9091:2:2212 +9092:0:4365 +9093:2:2224 +9094:0:4365 +9095:3:2843 +9096:0:4365 +9097:2:2226 +9098:0:4365 +9099:3:2844 +9100:0:4365 +9101:2:1936 +9102:0:4365 +9103:2:2129 +9104:0:4365 +9105:2:2130 +9106:0:4365 +9107:2:2134 +9108:0:4365 +9109:3:2843 +9110:0:4365 +9111:2:2136 +9112:0:4365 +9113:3:2844 +9114:0:4365 +9115:2:2137 +9116:2:2141 +9117:2:2142 +9118:2:2150 +9119:2:2151 +9120:2:2155 +9121:2:2156 +9122:2:2150 +9123:2:2151 +9124:2:2152 +9125:2:2164 +9126:2:2169 +9127:2:2173 +9128:2:2174 +9129:2:2181 +9130:2:2182 +9131:2:2193 +9132:2:2194 +9133:2:2195 +9134:2:2193 +9135:2:2194 +9136:2:2195 +9137:2:2206 +9138:2:2211 +9139:2:2212 +9140:0:4365 +9141:2:2224 +9142:0:4365 +9143:3:2843 +9144:0:4365 +9145:2:2226 +9146:0:4365 +9147:3:2844 +9148:0:4365 +9149:2:2230 +9150:0:4365 +9151:3:2843 +9152:0:4365 +9153:2:2235 +9154:2:2239 +9155:2:2240 +9156:2:2248 +9157:2:2249 +9158:2:2253 +9159:2:2254 +9160:2:2248 +9161:2:2249 +9162:2:2250 +9163:2:2262 +9164:2:2267 +9165:2:2271 +9166:2:2272 +9167:2:2279 +9168:2:2280 +9169:2:2291 +9170:2:2292 +9171:2:2293 +9172:2:2291 +9173:2:2292 +9174:2:2293 +9175:2:2304 +9176:2:2309 +9177:2:2310 +9178:0:4365 +9179:3:2844 +9180:0:4365 +9181:2:2322 +9182:0:4365 +9183:2:1169 +9184:0:4365 +9185:3:2843 +9186:0:4365 +9187:2:1170 +9188:0:4365 +9189:3:2844 +9190:0:4365 +9191:3:2845 +9192:0:4365 +9193:3:2851 +9194:0:4365 +9195:3:2854 +9196:3:2855 +9197:3:2867 +9198:3:2868 +9199:3:2872 +9200:3:2873 +9201:3:2867 +9202:3:2868 +9203:3:2872 +9204:3:2873 +9205:3:2881 +9206:3:2886 +9207:3:2890 +9208:3:2891 +9209:3:2898 +9210:3:2899 +9211:3:2910 +9212:3:2911 +9213:3:2912 +9214:3:2910 +9215:3:2911 +9216:3:2912 +9217:3:2923 +9218:3:2928 +9219:3:2929 +9220:0:4365 +9221:3:2941 +9222:0:4365 +9223:3:2942 +9224:0:4365 +9225:2:1173 +9226:0:4365 +9227:3:2943 +9228:0:4365 +9229:2:1179 +9230:0:4365 +9231:2:1180 +9232:0:4365 +9233:3:2942 +9234:0:4365 +9235:2:1181 +9236:2:1185 +9237:2:1186 +9238:2:1194 +9239:2:1195 +9240:2:1199 +9241:2:1200 +9242:2:1194 +9243:2:1195 +9244:2:1199 +9245:2:1200 +9246:2:1208 +9247:2:1213 +9248:2:1217 +9249:2:1218 +9250:2:1225 +9251:2:1226 +9252:2:1237 +9253:2:1238 +9254:2:1239 +9255:2:1237 +9256:2:1238 +9257:2:1239 +9258:2:1250 +9259:2:1255 +9260:2:1256 +9261:0:4365 +9262:3:2943 +9263:0:4365 +9264:2:1268 +9265:0:4365 +9266:3:2942 +9267:0:4365 +9268:2:1270 +9269:0:4365 +9270:3:2943 +9271:0:4365 +9272:2:1271 +9273:2:1275 +9274:2:1276 +9275:2:1284 +9276:2:1285 +9277:2:1289 +9278:2:1290 +9279:2:1284 +9280:2:1285 +9281:2:1289 +9282:2:1290 +9283:2:1298 +9284:2:1303 +9285:2:1307 +9286:2:1308 +9287:2:1315 +9288:2:1316 +9289:2:1327 +9290:2:1328 +9291:2:1329 +9292:2:1327 +9293:2:1328 +9294:2:1329 +9295:2:1340 +9296:2:1345 +9297:2:1346 +9298:0:4365 +9299:2:1358 +9300:0:4365 +9301:2:1360 +9302:0:4365 +9303:3:2942 +9304:0:4365 +9305:2:1361 +9306:0:4365 +9307:3:2943 +9308:0:4365 +9309:2:1362 +9310:2:1366 +9311:2:1367 +9312:2:1375 +9313:2:1376 +9314:2:1380 +9315:2:1381 +9316:2:1375 +9317:2:1376 +9318:2:1380 +9319:2:1381 +9320:2:1389 +9321:2:1394 +9322:2:1398 +9323:2:1399 +9324:2:1406 +9325:2:1407 +9326:2:1418 +9327:2:1419 +9328:2:1420 +9329:2:1418 +9330:2:1419 +9331:2:1420 +9332:2:1431 +9333:2:1436 +9334:2:1437 +9335:0:4365 +9336:2:1449 +9337:0:4365 +9338:3:2942 +9339:0:4365 +9340:2:1451 +9341:0:4365 +9342:3:2943 +9343:0:4365 +9344:2:1652 +9345:0:4365 +9346:2:1653 +9347:0:4365 +9348:2:1657 +9349:0:4365 +9350:2:1180 +9351:0:4365 +9352:3:2942 +9353:0:4365 +9354:2:1181 +9355:2:1185 +9356:2:1186 +9357:2:1194 +9358:2:1195 +9359:2:1199 +9360:2:1200 +9361:2:1194 +9362:2:1195 +9363:2:1196 +9364:2:1208 +9365:2:1213 +9366:2:1217 +9367:2:1218 +9368:2:1225 +9369:2:1226 +9370:2:1237 +9371:2:1238 +9372:2:1239 +9373:2:1237 +9374:2:1238 +9375:2:1239 +9376:2:1250 +9377:2:1255 +9378:2:1256 +9379:0:4365 +9380:3:2943 +9381:0:4365 +9382:2:1268 +9383:0:4365 +9384:3:2942 +9385:0:4365 +9386:2:1270 +9387:0:4365 +9388:3:2943 +9389:0:4365 +9390:2:1271 +9391:2:1275 +9392:2:1276 +9393:2:1284 +9394:2:1285 +9395:2:1289 +9396:2:1290 +9397:2:1284 +9398:2:1285 +9399:2:1289 +9400:2:1290 +9401:2:1298 +9402:2:1303 +9403:2:1307 +9404:2:1308 +9405:2:1315 +9406:2:1316 +9407:2:1327 +9408:2:1328 +9409:2:1329 +9410:2:1327 +9411:2:1328 +9412:2:1329 +9413:2:1340 +9414:2:1345 +9415:2:1346 +9416:0:4365 +9417:2:1358 +9418:0:4365 +9419:2:1454 +9420:0:4365 +9421:3:2942 +9422:0:4365 +9423:2:1455 +9424:0:4365 +9425:3:2943 +9426:0:4365 +9427:2:1652 +9428:0:4365 +9429:2:1653 +9430:0:4365 +9431:2:1657 +9432:0:4365 +9433:2:1660 +9434:0:4365 +9435:3:2942 +9436:0:4365 +9437:2:1665 +9438:2:1669 +9439:2:1670 +9440:2:1678 +9441:2:1679 +9442:2:1683 +9443:2:1684 +9444:2:1678 +9445:2:1679 +9446:2:1680 +9447:2:1692 +9448:2:1697 +9449:2:1701 +9450:2:1702 +9451:2:1709 +9452:2:1710 +9453:2:1721 +9454:2:1722 +9455:2:1723 +9456:2:1721 +9457:2:1722 +9458:2:1723 +9459:2:1734 +9460:2:1739 +9461:2:1740 +9462:0:4365 +9463:3:2943 +9464:0:4365 +9465:2:1752 +9466:0:4365 +9467:3:2942 +9468:0:4365 +9469:2:1754 +9470:0:4365 +9471:3:2943 +9472:0:4365 +9473:2:1755 +9474:2:1759 +9475:2:1760 +9476:2:1768 +9477:2:1769 +9478:2:1773 +9479:2:1774 +9480:2:1768 +9481:2:1769 +9482:2:1773 +9483:2:1774 +9484:2:1782 +9485:2:1787 +9486:2:1791 +9487:2:1792 +9488:2:1799 +9489:2:1800 +9490:2:1811 +9491:2:1812 +9492:2:1813 +9493:2:1811 +9494:2:1812 +9495:2:1813 +9496:2:1824 +9497:2:1829 +9498:2:1830 +9499:0:4365 +9500:2:1842 +9501:0:4365 +9502:3:2942 +9503:0:4365 +9504:2:1844 +9505:0:4365 +9506:3:2943 +9507:0:4365 +9508:2:1845 +9509:2:1849 +9510:2:1850 +9511:2:1858 +9512:2:1859 +9513:2:1863 +9514:2:1864 +9515:2:1858 +9516:2:1859 +9517:2:1863 +9518:2:1864 +9519:2:1872 +9520:2:1877 +9521:2:1881 +9522:2:1882 +9523:2:1889 +9524:2:1890 +9525:2:1901 +9526:2:1902 +9527:2:1903 +9528:2:1901 +9529:2:1902 +9530:2:1903 +9531:2:1914 +9532:2:1919 +9533:2:1920 +9534:0:4365 +9535:2:1932 +9536:0:4365 +9537:3:2942 +9538:0:4365 +9539:2:1934 +9540:0:4365 +9541:3:2943 +9542:0:4365 +9543:2:1935 +9544:0:4365 +9545:2:1936 +9546:0:4365 +9547:2:2129 +9548:0:4365 +9549:2:2130 +9550:0:4365 +9551:2:2134 +9552:0:4365 +9553:3:2942 +9554:0:4365 +9555:2:2136 +9556:0:4365 +9557:3:2943 +9558:0:4365 +9559:2:2137 +9560:2:2141 +9561:2:2142 +9562:2:2150 +9563:2:2151 +9564:2:2155 +9565:2:2156 +9566:2:2150 +9567:2:2151 +9568:2:2155 +9569:2:2156 +9570:2:2164 +9571:2:2169 +9572:2:2173 +9573:2:2174 +9574:2:2181 +9575:2:2182 +9576:2:2193 +9577:2:2194 +9578:2:2195 +9579:2:2193 +9580:2:2194 +9581:2:2195 +9582:2:2206 +9583:2:2211 +9584:2:2212 +9585:0:4365 +9586:2:2224 +9587:0:4365 +9588:3:2942 +9589:0:4365 +9590:2:2226 +9591:0:4365 +9592:3:2943 +9593:0:4365 +9594:2:1936 +9595:0:4365 +9596:2:2129 +9597:0:4365 +9598:2:2130 +9599:0:4365 +9600:2:2134 +9601:0:4365 +9602:3:2942 +9603:0:4365 +9604:2:2136 +9605:0:4365 +9606:3:2943 +9607:0:4365 +9608:2:2137 +9609:2:2141 +9610:2:2142 +9611:2:2150 +9612:2:2151 +9613:2:2155 +9614:2:2156 +9615:2:2150 +9616:2:2151 +9617:2:2152 +9618:2:2164 +9619:2:2169 +9620:2:2173 +9621:2:2174 +9622:2:2181 +9623:2:2182 +9624:2:2193 +9625:2:2194 +9626:2:2195 +9627:2:2193 +9628:2:2194 +9629:2:2195 +9630:2:2206 +9631:2:2211 +9632:2:2212 +9633:0:4365 +9634:2:2224 +9635:0:4365 +9636:3:2942 +9637:0:4365 +9638:2:2226 +9639:0:4365 +9640:3:2943 +9641:0:4365 +9642:2:2230 +9643:0:4365 +9644:3:2942 +9645:0:4365 +9646:2:2235 +9647:2:2239 +9648:2:2240 +9649:2:2248 +9650:2:2249 +9651:2:2253 +9652:2:2254 +9653:2:2248 +9654:2:2249 +9655:2:2250 +9656:2:2262 +9657:2:2267 +9658:2:2271 +9659:2:2272 +9660:2:2279 +9661:2:2280 +9662:2:2291 +9663:2:2292 +9664:2:2293 +9665:2:2291 +9666:2:2292 +9667:2:2293 +9668:2:2304 +9669:2:2309 +9670:2:2310 +9671:0:4365 +9672:3:2943 +9673:0:4365 +9674:2:2322 +9675:0:4365 +9676:2:1169 +9677:0:4365 +9678:3:2942 +9679:0:4365 +9680:2:1170 +9681:0:4365 +9682:3:2943 +9683:0:4365 +9684:3:2944 +9685:0:4365 +9686:3:2950 +9687:0:4365 +9688:3:2951 +9689:0:4365 +9690:3:2952 +9691:0:4365 +9692:3:2953 +9693:0:4365 +9694:3:2954 +9695:3:2958 +9696:3:2959 +9697:3:2967 +9698:3:2968 +9699:3:2972 +9700:3:2973 +9701:3:2967 +9702:3:2968 +9703:3:2972 +9704:3:2973 +9705:3:2981 +9706:3:2986 +9707:3:2990 +9708:3:2991 +9709:3:2998 +9710:3:2999 +9711:3:3010 +9712:3:3011 +9713:3:3012 +9714:3:3010 +9715:3:3011 +9716:3:3012 +9717:3:3023 +9718:3:3028 +9719:3:3029 +9720:0:4365 +9721:3:3041 +9722:0:4365 +9723:3:3042 +9724:0:4365 +9725:2:1173 +9726:0:4365 +9727:3:3043 +9728:0:4365 +9729:2:1179 +9730:0:4365 +9731:2:1180 +9732:0:4365 +9733:3:3042 +9734:0:4365 +9735:2:1181 +9736:2:1185 +9737:2:1186 +9738:2:1194 +9739:2:1195 +9740:2:1199 +9741:2:1200 +9742:2:1194 +9743:2:1195 +9744:2:1199 +9745:2:1200 +9746:2:1208 +9747:2:1213 +9748:2:1217 +9749:2:1218 +9750:2:1225 +9751:2:1226 +9752:2:1237 +9753:2:1238 +9754:2:1239 +9755:2:1237 +9756:2:1238 +9757:2:1239 +9758:2:1250 +9759:2:1255 +9760:2:1256 +9761:0:4365 +9762:3:3043 +9763:0:4365 +9764:2:1268 +9765:0:4365 +9766:3:3042 +9767:0:4365 +9768:2:1270 +9769:0:4365 +9770:3:3043 +9771:0:4365 +9772:2:1271 +9773:2:1275 +9774:2:1276 +9775:2:1284 +9776:2:1285 +9777:2:1289 +9778:2:1290 +9779:2:1284 +9780:2:1285 +9781:2:1289 +9782:2:1290 +9783:2:1298 +9784:2:1303 +9785:2:1307 +9786:2:1308 +9787:2:1315 +9788:2:1316 +9789:2:1327 +9790:2:1328 +9791:2:1329 +9792:2:1327 +9793:2:1328 +9794:2:1329 +9795:2:1340 +9796:2:1345 +9797:2:1346 +9798:0:4365 +9799:2:1358 +9800:0:4365 +9801:2:1360 +9802:0:4365 +9803:3:3042 +9804:0:4365 +9805:2:1361 +9806:0:4365 +9807:3:3043 +9808:0:4365 +9809:2:1362 +9810:2:1366 +9811:2:1367 +9812:2:1375 +9813:2:1376 +9814:2:1380 +9815:2:1381 +9816:2:1375 +9817:2:1376 +9818:2:1380 +9819:2:1381 +9820:2:1389 +9821:2:1394 +9822:2:1398 +9823:2:1399 +9824:2:1406 +9825:2:1407 +9826:2:1418 +9827:2:1419 +9828:2:1420 +9829:2:1418 +9830:2:1419 +9831:2:1420 +9832:2:1431 +9833:2:1436 +9834:2:1437 +9835:0:4365 +9836:2:1449 +9837:0:4365 +9838:3:3042 +9839:0:4365 +9840:2:1451 +9841:0:4365 +9842:3:3043 +9843:0:4365 +9844:2:1652 +9845:0:4365 +9846:2:1653 +9847:0:4365 +9848:2:1657 +9849:0:4365 +9850:2:1180 +9851:0:4365 +9852:3:3042 +9853:0:4365 +9854:2:1181 +9855:2:1185 +9856:2:1186 +9857:2:1194 +9858:2:1195 +9859:2:1199 +9860:2:1200 +9861:2:1194 +9862:2:1195 +9863:2:1196 +9864:2:1208 +9865:2:1213 +9866:2:1217 +9867:2:1218 +9868:2:1225 +9869:2:1226 +9870:2:1237 +9871:2:1238 +9872:2:1239 +9873:2:1237 +9874:2:1238 +9875:2:1239 +9876:2:1250 +9877:2:1255 +9878:2:1256 +9879:0:4365 +9880:3:3043 +9881:0:4365 +9882:2:1268 +9883:0:4365 +9884:3:3042 +9885:0:4365 +9886:2:1270 +9887:0:4365 +9888:3:3043 +9889:0:4365 +9890:2:1271 +9891:2:1275 +9892:2:1276 +9893:2:1284 +9894:2:1285 +9895:2:1289 +9896:2:1290 +9897:2:1284 +9898:2:1285 +9899:2:1289 +9900:2:1290 +9901:2:1298 +9902:2:1303 +9903:2:1307 +9904:2:1308 +9905:2:1315 +9906:2:1316 +9907:2:1327 +9908:2:1328 +9909:2:1329 +9910:2:1327 +9911:2:1328 +9912:2:1329 +9913:2:1340 +9914:2:1345 +9915:2:1346 +9916:0:4365 +9917:2:1358 +9918:0:4365 +9919:2:1454 +9920:0:4365 +9921:3:3042 +9922:0:4365 +9923:2:1455 +9924:0:4365 +9925:3:3043 +9926:0:4365 +9927:2:1652 +9928:0:4365 +9929:2:1653 +9930:0:4365 +9931:2:1657 +9932:0:4365 +9933:2:1660 +9934:0:4365 +9935:3:3042 +9936:0:4365 +9937:2:1665 +9938:2:1669 +9939:2:1670 +9940:2:1678 +9941:2:1679 +9942:2:1683 +9943:2:1684 +9944:2:1678 +9945:2:1679 +9946:2:1680 +9947:2:1692 +9948:2:1697 +9949:2:1701 +9950:2:1702 +9951:2:1709 +9952:2:1710 +9953:2:1721 +9954:2:1722 +9955:2:1723 +9956:2:1721 +9957:2:1722 +9958:2:1723 +9959:2:1734 +9960:2:1739 +9961:2:1740 +9962:0:4365 +9963:3:3043 +9964:0:4365 +9965:2:1752 +9966:0:4365 +9967:3:3042 +9968:0:4365 +9969:2:1754 +9970:0:4365 +9971:3:3043 +9972:0:4365 +9973:2:1755 +9974:2:1759 +9975:2:1760 +9976:2:1768 +9977:2:1769 +9978:2:1773 +9979:2:1774 +9980:2:1768 +9981:2:1769 +9982:2:1773 +9983:2:1774 +9984:2:1782 +9985:2:1787 +9986:2:1791 +9987:2:1792 +9988:2:1799 +9989:2:1800 +9990:2:1811 +9991:2:1812 +9992:2:1813 +9993:2:1811 +9994:2:1812 +9995:2:1813 +9996:2:1824 +9997:2:1829 +9998:2:1830 +9999:0:4365 +10000:2:1842 +10001:0:4365 +10002:3:3042 +10003:0:4365 +10004:2:1844 +10005:0:4365 +10006:3:3043 +10007:0:4365 +10008:2:1845 +10009:2:1849 +10010:2:1850 +10011:2:1858 +10012:2:1859 +10013:2:1863 +10014:2:1864 +10015:2:1858 +10016:2:1859 +10017:2:1863 +10018:2:1864 +10019:2:1872 +10020:2:1877 +10021:2:1881 +10022:2:1882 +10023:2:1889 +10024:2:1890 +10025:2:1901 +10026:2:1902 +10027:2:1903 +10028:2:1901 +10029:2:1902 +10030:2:1903 +10031:2:1914 +10032:2:1919 +10033:2:1920 +10034:0:4365 +10035:2:1932 +10036:0:4365 +10037:3:3042 +10038:0:4365 +10039:2:1934 +10040:0:4365 +10041:3:3043 +10042:0:4365 +10043:2:1935 +10044:0:4365 +10045:2:1936 +10046:0:4365 +10047:2:2129 +10048:0:4365 +10049:2:2130 +10050:0:4365 +10051:2:2134 +10052:0:4365 +10053:3:3042 +10054:0:4365 +10055:2:2136 +10056:0:4365 +10057:3:3043 +10058:0:4365 +10059:2:2137 +10060:2:2141 +10061:2:2142 +10062:2:2150 +10063:2:2151 +10064:2:2155 +10065:2:2156 +10066:2:2150 +10067:2:2151 +10068:2:2155 +10069:2:2156 +10070:2:2164 +10071:2:2169 +10072:2:2173 +10073:2:2174 +10074:2:2181 +10075:2:2182 +10076:2:2193 +10077:2:2194 +10078:2:2195 +10079:2:2193 +10080:2:2194 +10081:2:2195 +10082:2:2206 +10083:2:2211 +10084:2:2212 +10085:0:4365 +10086:2:2224 +10087:0:4365 +10088:3:3042 +10089:0:4365 +10090:2:2226 +10091:0:4365 +10092:3:3043 +10093:0:4365 +10094:2:1936 +10095:0:4365 +10096:2:2129 +10097:0:4365 +10098:2:2130 +10099:0:4365 +10100:2:2134 +10101:0:4365 +10102:3:3042 +10103:0:4365 +10104:2:2136 +10105:0:4365 +10106:3:3043 +10107:0:4365 +10108:2:2137 +10109:2:2141 +10110:2:2142 +10111:2:2150 +10112:2:2151 +10113:2:2155 +10114:2:2156 +10115:2:2150 +10116:2:2151 +10117:2:2152 +10118:2:2164 +10119:2:2169 +10120:2:2173 +10121:2:2174 +10122:2:2181 +10123:2:2182 +10124:2:2193 +10125:2:2194 +10126:2:2195 +10127:2:2193 +10128:2:2194 +10129:2:2195 +10130:2:2206 +10131:2:2211 +10132:2:2212 +10133:0:4365 +10134:2:2224 +10135:0:4365 +10136:3:3042 +10137:0:4365 +10138:2:2226 +10139:0:4365 +10140:3:3043 +10141:0:4365 +10142:2:2230 +10143:0:4365 +10144:3:3042 +10145:0:4365 +10146:2:2235 +10147:2:2239 +10148:2:2240 +10149:2:2248 +10150:2:2249 +10151:2:2253 +10152:2:2254 +10153:2:2248 +10154:2:2249 +10155:2:2250 +10156:2:2262 +10157:2:2267 +10158:2:2271 +10159:2:2272 +10160:2:2279 +10161:2:2280 +10162:2:2291 +10163:2:2292 +10164:2:2293 +10165:2:2291 +10166:2:2292 +10167:2:2293 +10168:2:2304 +10169:2:2309 +10170:2:2310 +10171:0:4365 +10172:3:3043 +10173:0:4365 +10174:2:2322 +10175:0:4365 +10176:2:1169 +10177:0:4365 +10178:3:3042 +10179:0:4365 +10180:2:1170 +10181:0:4365 +10182:3:3043 +10183:0:4365 +10184:3:3044 +10185:0:4365 +10186:3:3257 +10187:0:4365 +10188:3:3265 +10189:0:4365 +10190:3:3266 +10191:3:3270 +10192:3:3271 +10193:3:3279 +10194:3:3280 +10195:3:3284 +10196:3:3285 +10197:3:3279 +10198:3:3280 +10199:3:3284 +10200:3:3285 +10201:3:3293 +10202:3:3298 +10203:3:3302 +10204:3:3303 +10205:3:3310 +10206:3:3311 +10207:3:3322 +10208:3:3323 +10209:3:3324 +10210:3:3322 +10211:3:3323 +10212:3:3324 +10213:3:3335 +10214:3:3340 +10215:3:3341 +10216:0:4365 +10217:3:3353 +10218:0:4365 +10219:3:3354 +10220:0:4365 +10221:2:1173 +10222:0:4365 +10223:3:3355 +10224:0:4365 +10225:2:1179 +10226:0:4365 +10227:2:1180 +10228:0:4365 +10229:3:3354 +10230:0:4365 +10231:2:1181 +10232:2:1185 +10233:2:1186 +10234:2:1194 +10235:2:1195 +10236:2:1199 +10237:2:1200 +10238:2:1194 +10239:2:1195 +10240:2:1199 +10241:2:1200 +10242:2:1208 +10243:2:1213 +10244:2:1217 +10245:2:1218 +10246:2:1225 +10247:2:1226 +10248:2:1237 +10249:2:1238 +10250:2:1239 +10251:2:1237 +10252:2:1238 +10253:2:1239 +10254:2:1250 +10255:2:1255 +10256:2:1256 +10257:0:4365 +10258:3:3355 +10259:0:4365 +10260:2:1268 +10261:0:4365 +10262:3:3354 +10263:0:4365 +10264:2:1270 +10265:0:4365 +10266:3:3355 +10267:0:4365 +10268:2:1271 +10269:2:1275 +10270:2:1276 +10271:2:1284 +10272:2:1285 +10273:2:1289 +10274:2:1290 +10275:2:1284 +10276:2:1285 +10277:2:1289 +10278:2:1290 +10279:2:1298 +10280:2:1303 +10281:2:1307 +10282:2:1308 +10283:2:1315 +10284:2:1316 +10285:2:1327 +10286:2:1328 +10287:2:1329 +10288:2:1327 +10289:2:1328 +10290:2:1329 +10291:2:1340 +10292:2:1345 +10293:2:1346 +10294:0:4365 +10295:2:1358 +10296:0:4365 +10297:2:1360 +10298:0:4365 +10299:3:3354 +10300:0:4365 +10301:2:1361 +10302:0:4365 +10303:3:3355 +10304:0:4365 +10305:2:1362 +10306:2:1366 +10307:2:1367 +10308:2:1375 +10309:2:1376 +10310:2:1380 +10311:2:1381 +10312:2:1375 +10313:2:1376 +10314:2:1380 +10315:2:1381 +10316:2:1389 +10317:2:1394 +10318:2:1398 +10319:2:1399 +10320:2:1406 +10321:2:1407 +10322:2:1418 +10323:2:1419 +10324:2:1420 +10325:2:1418 +10326:2:1419 +10327:2:1420 +10328:2:1431 +10329:2:1436 +10330:2:1437 +10331:0:4365 +10332:2:1449 +10333:0:4365 +10334:3:3354 +10335:0:4365 +10336:2:1451 +10337:0:4365 +10338:3:3355 +10339:0:4365 +10340:2:1652 +10341:0:4365 +10342:2:1653 +10343:0:4365 +10344:2:1657 +10345:0:4365 +10346:2:1180 +10347:0:4365 +10348:3:3354 +10349:0:4365 +10350:2:1181 +10351:2:1185 +10352:2:1186 +10353:2:1194 +10354:2:1195 +10355:2:1199 +10356:2:1200 +10357:2:1194 +10358:2:1195 +10359:2:1196 +10360:2:1208 +10361:2:1213 +10362:2:1217 +10363:2:1218 +10364:2:1225 +10365:2:1226 +10366:2:1237 +10367:2:1238 +10368:2:1239 +10369:2:1237 +10370:2:1238 +10371:2:1239 +10372:2:1250 +10373:2:1255 +10374:2:1256 +10375:0:4365 +10376:3:3355 +10377:0:4365 +10378:2:1268 +10379:0:4365 +10380:3:3354 +10381:0:4365 +10382:2:1270 +10383:0:4365 +10384:3:3355 +10385:0:4365 +10386:2:1271 +10387:2:1275 +10388:2:1276 +10389:2:1284 +10390:2:1285 +10391:2:1289 +10392:2:1290 +10393:2:1284 +10394:2:1285 +10395:2:1289 +10396:2:1290 +10397:2:1298 +10398:2:1303 +10399:2:1307 +10400:2:1308 +10401:2:1315 +10402:2:1316 +10403:2:1327 +10404:2:1328 +10405:2:1329 +10406:2:1327 +10407:2:1328 +10408:2:1329 +10409:2:1340 +10410:2:1345 +10411:2:1346 +10412:0:4365 +10413:2:1358 +10414:0:4365 +10415:2:1454 +10416:0:4365 +10417:3:3354 +10418:0:4365 +10419:2:1455 +10420:0:4365 +10421:3:3355 +10422:0:4365 +10423:2:1652 +10424:0:4365 +10425:2:1653 +10426:0:4365 +10427:2:1657 +10428:0:4365 +10429:2:1660 +10430:0:4365 +10431:3:3354 +10432:0:4365 +10433:2:1665 +10434:2:1669 +10435:2:1670 +10436:2:1678 +10437:2:1679 +10438:2:1683 +10439:2:1684 +10440:2:1678 +10441:2:1679 +10442:2:1680 +10443:2:1692 +10444:2:1697 +10445:2:1701 +10446:2:1702 +10447:2:1709 +10448:2:1710 +10449:2:1721 +10450:2:1722 +10451:2:1723 +10452:2:1721 +10453:2:1722 +10454:2:1723 +10455:2:1734 +10456:2:1739 +10457:2:1740 +10458:0:4365 +10459:3:3355 +10460:0:4365 +10461:2:1752 +10462:0:4365 +10463:3:3354 +10464:0:4365 +10465:2:1754 +10466:0:4365 +10467:3:3355 +10468:0:4365 +10469:2:1755 +10470:2:1759 +10471:2:1760 +10472:2:1768 +10473:2:1769 +10474:2:1773 +10475:2:1774 +10476:2:1768 +10477:2:1769 +10478:2:1773 +10479:2:1774 +10480:2:1782 +10481:2:1787 +10482:2:1791 +10483:2:1792 +10484:2:1799 +10485:2:1800 +10486:2:1811 +10487:2:1812 +10488:2:1813 +10489:2:1811 +10490:2:1812 +10491:2:1813 +10492:2:1824 +10493:2:1829 +10494:2:1830 +10495:0:4365 +10496:2:1842 +10497:0:4365 +10498:3:3354 +10499:0:4365 +10500:2:1844 +10501:0:4365 +10502:3:3355 +10503:0:4365 +10504:2:1845 +10505:2:1849 +10506:2:1850 +10507:2:1858 +10508:2:1859 +10509:2:1863 +10510:2:1864 +10511:2:1858 +10512:2:1859 +10513:2:1863 +10514:2:1864 +10515:2:1872 +10516:2:1877 +10517:2:1881 +10518:2:1882 +10519:2:1889 +10520:2:1890 +10521:2:1901 +10522:2:1902 +10523:2:1903 +10524:2:1901 +10525:2:1902 +10526:2:1903 +10527:2:1914 +10528:2:1919 +10529:2:1920 +10530:0:4365 +10531:2:1932 +10532:0:4365 +10533:3:3354 +10534:0:4365 +10535:2:1934 +10536:0:4365 +10537:3:3355 +10538:0:4365 +10539:2:1935 +10540:0:4365 +10541:2:1936 +10542:0:4365 +10543:2:2129 +10544:0:4365 +10545:2:2130 +10546:0:4365 +10547:2:2134 +10548:0:4365 +10549:3:3354 +10550:0:4365 +10551:2:2136 +10552:0:4365 +10553:3:3355 +10554:0:4365 +10555:2:2137 +10556:2:2141 +10557:2:2142 +10558:2:2150 +10559:2:2151 +10560:2:2155 +10561:2:2156 +10562:2:2150 +10563:2:2151 +10564:2:2155 +10565:2:2156 +10566:2:2164 +10567:2:2169 +10568:2:2173 +10569:2:2174 +10570:2:2181 +10571:2:2182 +10572:2:2193 +10573:2:2194 +10574:2:2195 +10575:2:2193 +10576:2:2194 +10577:2:2195 +10578:2:2206 +10579:2:2211 +10580:2:2212 +10581:0:4365 +10582:2:2224 +10583:0:4365 +10584:3:3354 +10585:0:4365 +10586:2:2226 +10587:0:4365 +10588:3:3355 +10589:0:4365 +10590:2:1936 +10591:0:4365 +10592:2:2129 +10593:0:4365 +10594:2:2130 +10595:0:4365 +10596:2:2134 +10597:0:4365 +10598:3:3354 +10599:0:4365 +10600:2:2136 +10601:0:4365 +10602:3:3355 +10603:0:4365 +10604:2:2137 +10605:2:2141 +10606:2:2142 +10607:2:2150 +10608:2:2151 +10609:2:2155 +10610:2:2156 +10611:2:2150 +10612:2:2151 +10613:2:2152 +10614:2:2164 +10615:2:2169 +10616:2:2173 +10617:2:2174 +10618:2:2181 +10619:2:2182 +10620:2:2193 +10621:2:2194 +10622:2:2195 +10623:2:2193 +10624:2:2194 +10625:2:2195 +10626:2:2206 +10627:2:2211 +10628:2:2212 +10629:0:4365 +10630:2:2224 +10631:0:4365 +10632:3:3354 +10633:0:4365 +10634:2:2226 +10635:0:4365 +10636:3:3355 +10637:0:4365 +10638:2:2230 +10639:0:4365 +10640:3:3354 +10641:0:4365 +10642:2:2235 +10643:2:2239 +10644:2:2240 +10645:2:2248 +10646:2:2249 +10647:2:2253 +10648:2:2254 +10649:2:2248 +10650:2:2249 +10651:2:2250 +10652:2:2262 +10653:2:2267 +10654:2:2271 +10655:2:2272 +10656:2:2279 +10657:2:2280 +10658:2:2291 +10659:2:2292 +10660:2:2293 +10661:2:2291 +10662:2:2292 +10663:2:2293 +10664:2:2304 +10665:2:2309 +10666:2:2310 +10667:0:4365 +10668:3:3355 +10669:0:4365 +10670:2:2322 +10671:0:4365 +10672:2:1169 +10673:0:4365 +10674:3:3354 +10675:0:4365 +10676:2:1170 +10677:0:4365 +10678:3:3355 +10679:0:4365 +10680:3:3356 +10681:0:4365 +10682:3:3366 +10683:0:4365 +10684:3:2951 +10685:0:4365 +10686:3:2952 +10687:0:4365 +10688:3:2953 +10689:0:4365 +10690:3:2954 +10691:3:2958 +10692:3:2959 +10693:3:2967 +10694:3:2968 +10695:3:2972 +10696:3:2973 +10697:3:2967 +10698:3:2968 +10699:3:2972 +10700:3:2973 +10701:3:2981 +10702:3:2986 +10703:3:2990 +10704:3:2991 +10705:3:2998 +10706:3:2999 +10707:3:3010 +10708:3:3011 +10709:3:3012 +10710:3:3010 +10711:3:3011 +10712:3:3012 +10713:3:3023 +10714:3:3028 +10715:3:3029 +10716:0:4365 +10717:3:3041 +10718:0:4365 +10719:3:3042 +10720:0:4365 +10721:2:1173 +10722:0:4365 +10723:3:3043 +10724:0:4365 +10725:2:1179 +10726:0:4365 +10727:2:1180 +10728:0:4365 +10729:3:3042 +10730:0:4365 +10731:2:1181 +10732:2:1185 +10733:2:1186 +10734:2:1194 +10735:2:1195 +10736:2:1199 +10737:2:1200 +10738:2:1194 +10739:2:1195 +10740:2:1199 +10741:2:1200 +10742:2:1208 +10743:2:1213 +10744:2:1217 +10745:2:1218 +10746:2:1225 +10747:2:1226 +10748:2:1237 +10749:2:1238 +10750:2:1239 +10751:2:1237 +10752:2:1238 +10753:2:1239 +10754:2:1250 +10755:2:1255 +10756:2:1256 +10757:0:4365 +10758:3:3043 +10759:0:4365 +10760:2:1268 +10761:0:4365 +10762:3:3042 +10763:0:4365 +10764:2:1270 +10765:0:4365 +10766:3:3043 +10767:0:4365 +10768:2:1271 +10769:2:1275 +10770:2:1276 +10771:2:1284 +10772:2:1285 +10773:2:1289 +10774:2:1290 +10775:2:1284 +10776:2:1285 +10777:2:1289 +10778:2:1290 +10779:2:1298 +10780:2:1303 +10781:2:1307 +10782:2:1308 +10783:2:1315 +10784:2:1316 +10785:2:1327 +10786:2:1328 +10787:2:1329 +10788:2:1327 +10789:2:1328 +10790:2:1329 +10791:2:1340 +10792:2:1345 +10793:2:1346 +10794:0:4365 +10795:2:1358 +10796:0:4365 +10797:2:1360 +10798:0:4365 +10799:3:3042 +10800:0:4365 +10801:2:1361 +10802:0:4365 +10803:3:3043 +10804:0:4365 +10805:2:1362 +10806:2:1366 +10807:2:1367 +10808:2:1375 +10809:2:1376 +10810:2:1380 +10811:2:1381 +10812:2:1375 +10813:2:1376 +10814:2:1380 +10815:2:1381 +10816:2:1389 +10817:2:1394 +10818:2:1398 +10819:2:1399 +10820:2:1406 +10821:2:1407 +10822:2:1418 +10823:2:1419 +10824:2:1420 +10825:2:1418 +10826:2:1419 +10827:2:1420 +10828:2:1431 +10829:2:1436 +10830:2:1437 +10831:0:4365 +10832:2:1449 +10833:0:4365 +10834:3:3042 +10835:0:4365 +10836:2:1451 +10837:0:4365 +10838:3:3043 +10839:0:4365 +10840:2:1652 +10841:0:4365 +10842:2:1653 +10843:0:4365 +10844:2:1657 +10845:0:4365 +10846:2:1180 +10847:0:4365 +10848:3:3042 +10849:0:4365 +10850:2:1181 +10851:2:1185 +10852:2:1186 +10853:2:1194 +10854:2:1195 +10855:2:1199 +10856:2:1200 +10857:2:1194 +10858:2:1195 +10859:2:1196 +10860:2:1208 +10861:2:1213 +10862:2:1217 +10863:2:1218 +10864:2:1225 +10865:2:1226 +10866:2:1237 +10867:2:1238 +10868:2:1239 +10869:2:1237 +10870:2:1238 +10871:2:1239 +10872:2:1250 +10873:2:1255 +10874:2:1256 +10875:0:4365 +10876:3:3043 +10877:0:4365 +10878:2:1268 +10879:0:4365 +10880:3:3042 +10881:0:4365 +10882:2:1270 +10883:0:4365 +10884:3:3043 +10885:0:4365 +10886:2:1271 +10887:2:1275 +10888:2:1276 +10889:2:1284 +10890:2:1285 +10891:2:1289 +10892:2:1290 +10893:2:1284 +10894:2:1285 +10895:2:1289 +10896:2:1290 +10897:2:1298 +10898:2:1303 +10899:2:1307 +10900:2:1308 +10901:2:1315 +10902:2:1316 +10903:2:1327 +10904:2:1328 +10905:2:1329 +10906:2:1327 +10907:2:1328 +10908:2:1329 +10909:2:1340 +10910:2:1345 +10911:2:1346 +10912:0:4365 +10913:2:1358 +10914:0:4365 +10915:2:1454 +10916:0:4365 +10917:3:3042 +10918:0:4365 +10919:2:1455 +10920:0:4365 +10921:3:3043 +10922:0:4365 +10923:2:1652 +10924:0:4365 +10925:2:1653 +10926:0:4365 +10927:2:1657 +10928:0:4365 +10929:2:1660 +10930:0:4365 +10931:3:3042 +10932:0:4365 +10933:2:1665 +10934:2:1669 +10935:2:1670 +10936:2:1678 +10937:2:1679 +10938:2:1683 +10939:2:1684 +10940:2:1678 +10941:2:1679 +10942:2:1680 +10943:2:1692 +10944:2:1697 +10945:2:1701 +10946:2:1702 +10947:2:1709 +10948:2:1710 +10949:2:1721 +10950:2:1722 +10951:2:1723 +10952:2:1721 +10953:2:1722 +10954:2:1723 +10955:2:1734 +10956:2:1739 +10957:2:1740 +10958:0:4365 +10959:3:3043 +10960:0:4365 +10961:2:1752 +10962:0:4365 +10963:3:3042 +10964:0:4365 +10965:2:1754 +10966:0:4365 +10967:3:3043 +10968:0:4365 +10969:2:1755 +10970:2:1759 +10971:2:1760 +10972:2:1768 +10973:2:1769 +10974:2:1773 +10975:2:1774 +10976:2:1768 +10977:2:1769 +10978:2:1773 +10979:2:1774 +10980:2:1782 +10981:2:1787 +10982:2:1791 +10983:2:1792 +10984:2:1799 +10985:2:1800 +10986:2:1811 +10987:2:1812 +10988:2:1813 +10989:2:1811 +10990:2:1812 +10991:2:1813 +10992:2:1824 +10993:2:1829 +10994:2:1830 +10995:0:4365 +10996:2:1842 +10997:0:4365 +10998:3:3042 +10999:0:4365 +11000:2:1844 +11001:0:4365 +11002:3:3043 +11003:0:4365 +11004:2:1845 +11005:2:1849 +11006:2:1850 +11007:2:1858 +11008:2:1859 +11009:2:1863 +11010:2:1864 +11011:2:1858 +11012:2:1859 +11013:2:1863 +11014:2:1864 +11015:2:1872 +11016:2:1877 +11017:2:1881 +11018:2:1882 +11019:2:1889 +11020:2:1890 +11021:2:1901 +11022:2:1902 +11023:2:1903 +11024:2:1901 +11025:2:1902 +11026:2:1903 +11027:2:1914 +11028:2:1919 +11029:2:1920 +11030:0:4365 +11031:2:1932 +11032:0:4365 +11033:3:3042 +11034:0:4365 +11035:2:1934 +11036:0:4365 +11037:3:3043 +11038:0:4365 +11039:2:1935 +11040:0:4365 +11041:2:1936 +11042:0:4365 +11043:2:2129 +11044:0:4365 +11045:2:2130 +11046:0:4365 +11047:2:2134 +11048:0:4365 +11049:3:3042 +11050:0:4365 +11051:2:2136 +11052:0:4365 +11053:3:3043 +11054:0:4365 +11055:2:2137 +11056:2:2141 +11057:2:2142 +11058:2:2150 +11059:2:2151 +11060:2:2155 +11061:2:2156 +11062:2:2150 +11063:2:2151 +11064:2:2155 +11065:2:2156 +11066:2:2164 +11067:2:2169 +11068:2:2173 +11069:2:2174 +11070:2:2181 +11071:2:2182 +11072:2:2193 +11073:2:2194 +11074:2:2195 +11075:2:2193 +11076:2:2194 +11077:2:2195 +11078:2:2206 +11079:2:2211 +11080:2:2212 +11081:0:4365 +11082:2:2224 +11083:0:4365 +11084:3:3042 +11085:0:4365 +11086:2:2226 +11087:0:4365 +11088:3:3043 +11089:0:4365 +11090:2:1936 +11091:0:4365 +11092:2:2129 +11093:0:4365 +11094:2:2130 +11095:0:4365 +11096:2:2134 +11097:0:4365 +11098:3:3042 +11099:0:4365 +11100:2:2136 +11101:0:4365 +11102:3:3043 +11103:0:4365 +11104:2:2137 +11105:2:2141 +11106:2:2142 +11107:2:2150 +11108:2:2151 +11109:2:2155 +11110:2:2156 +11111:2:2150 +11112:2:2151 +11113:2:2152 +11114:2:2164 +11115:2:2169 +11116:2:2173 +11117:2:2174 +11118:2:2181 +11119:2:2182 +11120:2:2193 +11121:2:2194 +11122:2:2195 +11123:2:2193 +11124:2:2194 +11125:2:2195 +11126:2:2206 +11127:2:2211 +11128:2:2212 +11129:0:4365 +11130:2:2224 +11131:0:4365 +11132:3:3042 +11133:0:4365 +11134:2:2226 +11135:0:4365 +11136:3:3043 +11137:0:4365 +11138:2:2230 +11139:0:4365 +11140:3:3042 +11141:0:4365 +11142:2:2235 +11143:2:2239 +11144:2:2240 +11145:2:2248 +11146:2:2249 +11147:2:2253 +11148:2:2254 +11149:2:2248 +11150:2:2249 +11151:2:2250 +11152:2:2262 +11153:2:2267 +11154:2:2271 +11155:2:2272 +11156:2:2279 +11157:2:2280 +11158:2:2291 +11159:2:2292 +11160:2:2293 +11161:2:2291 +11162:2:2292 +11163:2:2293 +11164:2:2304 +11165:2:2309 +11166:2:2310 +11167:0:4365 +11168:3:3043 +11169:0:4365 +11170:2:2322 +11171:0:4365 +11172:2:1169 +11173:0:4365 +11174:3:3042 +11175:0:4365 +11176:2:1170 +11177:0:4365 +11178:3:3043 +11179:0:4365 +11180:3:3044 +11181:0:4365 +11182:3:3257 +11183:0:4365 +11184:3:3362 +11185:0:4365 +11186:3:3363 +11187:0:4365 +11188:3:3367 +11189:0:4365 +11190:3:3373 +11191:3:3377 +11192:3:3378 +11193:3:3386 +11194:3:3387 +11195:3:3391 +11196:3:3392 +11197:3:3386 +11198:3:3387 +11199:3:3391 +11200:3:3392 +11201:3:3400 +11202:3:3405 +11203:3:3409 +11204:3:3410 +11205:3:3417 +11206:3:3418 +11207:3:3429 +11208:3:3430 +11209:3:3431 +11210:3:3429 +11211:3:3430 +11212:3:3431 +11213:3:3442 +11214:3:3447 +11215:3:3448 +11216:0:4365 +11217:3:3460 +11218:0:4365 +11219:3:3461 +11220:0:4365 +11221:2:1173 +11222:0:4365 +11223:3:3462 +11224:0:4365 +11225:2:1179 +11226:0:4365 +11227:2:1180 +11228:0:4365 +11229:3:3461 +11230:0:4365 +11231:2:1181 +11232:2:1185 +11233:2:1186 +11234:2:1194 +11235:2:1195 +11236:2:1199 +11237:2:1200 +11238:2:1194 +11239:2:1195 +11240:2:1199 +11241:2:1200 +11242:2:1208 +11243:2:1213 +11244:2:1217 +11245:2:1218 +11246:2:1225 +11247:2:1226 +11248:2:1237 +11249:2:1238 +11250:2:1239 +11251:2:1237 +11252:2:1238 +11253:2:1239 +11254:2:1250 +11255:2:1255 +11256:2:1256 +11257:0:4365 +11258:3:3462 +11259:0:4365 +11260:2:1268 +11261:0:4365 +11262:3:3461 +11263:0:4365 +11264:2:1270 +11265:0:4365 +11266:3:3462 +11267:0:4365 +11268:2:1271 +11269:2:1275 +11270:2:1276 +11271:2:1284 +11272:2:1285 +11273:2:1289 +11274:2:1290 +11275:2:1284 +11276:2:1285 +11277:2:1289 +11278:2:1290 +11279:2:1298 +11280:2:1303 +11281:2:1307 +11282:2:1308 +11283:2:1315 +11284:2:1316 +11285:2:1327 +11286:2:1328 +11287:2:1329 +11288:2:1327 +11289:2:1328 +11290:2:1329 +11291:2:1340 +11292:2:1345 +11293:2:1346 +11294:0:4365 +11295:2:1358 +11296:0:4365 +11297:2:1360 +11298:0:4365 +11299:3:3461 +11300:0:4365 +11301:2:1361 +11302:0:4365 +11303:3:3462 +11304:0:4365 +11305:2:1362 +11306:2:1366 +11307:2:1367 +11308:2:1375 +11309:2:1376 +11310:2:1380 +11311:2:1381 +11312:2:1375 +11313:2:1376 +11314:2:1380 +11315:2:1381 +11316:2:1389 +11317:2:1394 +11318:2:1398 +11319:2:1399 +11320:2:1406 +11321:2:1407 +11322:2:1418 +11323:2:1419 +11324:2:1420 +11325:2:1418 +11326:2:1419 +11327:2:1420 +11328:2:1431 +11329:2:1436 +11330:2:1437 +11331:0:4365 +11332:2:1449 +11333:0:4365 +11334:3:3461 +11335:0:4365 +11336:2:1451 +11337:0:4365 +11338:3:3462 +11339:0:4365 +11340:2:1652 +11341:0:4365 +11342:2:1653 +11343:0:4365 +11344:2:1657 +11345:0:4365 +11346:2:1180 +11347:0:4365 +11348:3:3461 +11349:0:4365 +11350:2:1181 +11351:2:1185 +11352:2:1186 +11353:2:1194 +11354:2:1195 +11355:2:1199 +11356:2:1200 +11357:2:1194 +11358:2:1195 +11359:2:1196 +11360:2:1208 +11361:2:1213 +11362:2:1217 +11363:2:1218 +11364:2:1225 +11365:2:1226 +11366:2:1237 +11367:2:1238 +11368:2:1239 +11369:2:1237 +11370:2:1238 +11371:2:1239 +11372:2:1250 +11373:2:1255 +11374:2:1256 +11375:0:4365 +11376:3:3462 +11377:0:4365 +11378:2:1268 +11379:0:4365 +11380:3:3461 +11381:0:4365 +11382:2:1270 +11383:0:4365 +11384:3:3462 +11385:0:4365 +11386:2:1271 +11387:2:1275 +11388:2:1276 +11389:2:1284 +11390:2:1285 +11391:2:1289 +11392:2:1290 +11393:2:1284 +11394:2:1285 +11395:2:1289 +11396:2:1290 +11397:2:1298 +11398:2:1303 +11399:2:1307 +11400:2:1308 +11401:2:1315 +11402:2:1316 +11403:2:1327 +11404:2:1328 +11405:2:1329 +11406:2:1327 +11407:2:1328 +11408:2:1329 +11409:2:1340 +11410:2:1345 +11411:2:1346 +11412:0:4365 +11413:2:1358 +11414:0:4365 +11415:2:1454 +11416:0:4365 +11417:3:3461 +11418:0:4365 +11419:2:1455 +11420:0:4365 +11421:3:3462 +11422:0:4365 +11423:2:1652 +11424:0:4365 +11425:2:1653 +11426:0:4365 +11427:2:1657 +11428:0:4365 +11429:2:1660 +11430:0:4365 +11431:3:3461 +11432:0:4365 +11433:2:1665 +11434:2:1669 +11435:2:1670 +11436:2:1678 +11437:2:1679 +11438:2:1683 +11439:2:1684 +11440:2:1678 +11441:2:1679 +11442:2:1680 +11443:2:1692 +11444:2:1697 +11445:2:1701 +11446:2:1702 +11447:2:1709 +11448:2:1710 +11449:2:1721 +11450:2:1722 +11451:2:1723 +11452:2:1721 +11453:2:1722 +11454:2:1723 +11455:2:1734 +11456:2:1739 +11457:2:1740 +11458:0:4365 +11459:3:3462 +11460:0:4365 +11461:2:1752 +11462:0:4365 +11463:3:3461 +11464:0:4365 +11465:2:1754 +11466:0:4365 +11467:3:3462 +11468:0:4365 +11469:2:1755 +11470:2:1759 +11471:2:1760 +11472:2:1768 +11473:2:1769 +11474:2:1773 +11475:2:1774 +11476:2:1768 +11477:2:1769 +11478:2:1773 +11479:2:1774 +11480:2:1782 +11481:2:1787 +11482:2:1791 +11483:2:1792 +11484:2:1799 +11485:2:1800 +11486:2:1811 +11487:2:1812 +11488:2:1813 +11489:2:1811 +11490:2:1812 +11491:2:1813 +11492:2:1824 +11493:2:1829 +11494:2:1830 +11495:0:4365 +11496:2:1842 +11497:0:4365 +11498:3:3461 +11499:0:4365 +11500:2:1844 +11501:0:4365 +11502:3:3462 +11503:0:4365 +11504:2:1845 +11505:2:1849 +11506:2:1850 +11507:2:1858 +11508:2:1859 +11509:2:1863 +11510:2:1864 +11511:2:1858 +11512:2:1859 +11513:2:1863 +11514:2:1864 +11515:2:1872 +11516:2:1877 +11517:2:1881 +11518:2:1882 +11519:2:1889 +11520:2:1890 +11521:2:1901 +11522:2:1902 +11523:2:1903 +11524:2:1901 +11525:2:1902 +11526:2:1903 +11527:2:1914 +11528:2:1919 +11529:2:1920 +11530:0:4365 +11531:2:1932 +11532:0:4365 +11533:3:3461 +11534:0:4365 +11535:2:1934 +11536:0:4365 +11537:3:3462 +11538:0:4365 +11539:2:1935 +11540:0:4365 +11541:2:1936 +11542:0:4365 +11543:2:2129 +11544:0:4365 +11545:2:2130 +11546:0:4365 +11547:2:2134 +11548:0:4365 +11549:3:3461 +11550:0:4365 +11551:2:2136 +11552:0:4365 +11553:3:3462 +11554:0:4365 +11555:2:2137 +11556:2:2141 +11557:2:2142 +11558:2:2150 +11559:2:2151 +11560:2:2155 +11561:2:2156 +11562:2:2150 +11563:2:2151 +11564:2:2155 +11565:2:2156 +11566:2:2164 +11567:2:2169 +11568:2:2173 +11569:2:2174 +11570:2:2181 +11571:2:2182 +11572:2:2193 +11573:2:2194 +11574:2:2195 +11575:2:2193 +11576:2:2194 +11577:2:2195 +11578:2:2206 +11579:2:2211 +11580:2:2212 +11581:0:4365 +11582:2:2224 +11583:0:4365 +11584:3:3461 +11585:0:4365 +11586:2:2226 +11587:0:4365 +11588:3:3462 +11589:0:4365 +11590:2:1936 +11591:0:4365 +11592:2:2129 +11593:0:4365 +11594:2:2130 +11595:0:4365 +11596:2:2134 +11597:0:4365 +11598:3:3461 +11599:0:4365 +11600:2:2136 +11601:0:4365 +11602:3:3462 +11603:0:4365 +11604:2:2137 +11605:2:2141 +11606:2:2142 +11607:2:2150 +11608:2:2151 +11609:2:2155 +11610:2:2156 +11611:2:2150 +11612:2:2151 +11613:2:2152 +11614:2:2164 +11615:2:2169 +11616:2:2173 +11617:2:2174 +11618:2:2181 +11619:2:2182 +11620:2:2193 +11621:2:2194 +11622:2:2195 +11623:2:2193 +11624:2:2194 +11625:2:2195 +11626:2:2206 +11627:2:2211 +11628:2:2212 +11629:0:4365 +11630:2:2224 +11631:0:4365 +11632:3:3461 +11633:0:4365 +11634:2:2226 +11635:0:4365 +11636:3:3462 +11637:0:4365 +11638:2:2230 +11639:0:4365 +11640:3:3461 +11641:0:4365 +11642:2:2235 +11643:2:2239 +11644:2:2240 +11645:2:2248 +11646:2:2249 +11647:2:2253 +11648:2:2254 +11649:2:2248 +11650:2:2249 +11651:2:2250 +11652:2:2262 +11653:2:2267 +11654:2:2271 +11655:2:2272 +11656:2:2279 +11657:2:2280 +11658:2:2291 +11659:2:2292 +11660:2:2293 +11661:2:2291 +11662:2:2292 +11663:2:2293 +11664:2:2304 +11665:2:2309 +11666:2:2310 +11667:0:4365 +11668:3:3462 +11669:0:4365 +11670:2:2322 +11671:0:4365 +11672:2:1169 +11673:0:4365 +11674:3:3461 +11675:0:4365 +11676:2:1170 +11677:0:4365 +11678:3:3462 +11679:0:4365 +11680:3:3463 +11681:0:4365 +11682:3:3469 +11683:0:4365 +11684:3:3470 +11685:3:3474 +11686:3:3475 +11687:3:3483 +11688:3:3484 +11689:3:3488 +11690:3:3489 +11691:3:3483 +11692:3:3484 +11693:3:3488 +11694:3:3489 +11695:3:3497 +11696:3:3502 +11697:3:3506 +11698:3:3507 +11699:3:3514 +11700:3:3515 +11701:3:3526 +11702:3:3527 +11703:3:3528 +11704:3:3526 +11705:3:3527 +11706:3:3528 +11707:3:3539 +11708:3:3544 +11709:3:3545 +11710:0:4365 +11711:3:3557 +11712:0:4365 +11713:3:3558 +11714:0:4365 +11715:2:1173 +11716:0:4365 +11717:3:3559 +11718:0:4365 +11719:2:1179 +11720:0:4365 +11721:2:1180 +11722:0:4365 +11723:3:3558 +11724:0:4365 +11725:2:1181 +11726:2:1185 +11727:2:1186 +11728:2:1194 +11729:2:1195 +11730:2:1199 +11731:2:1200 +11732:2:1194 +11733:2:1195 +11734:2:1199 +11735:2:1200 +11736:2:1208 +11737:2:1213 +11738:2:1217 +11739:2:1218 +11740:2:1225 +11741:2:1226 +11742:2:1237 +11743:2:1238 +11744:2:1239 +11745:2:1237 +11746:2:1238 +11747:2:1239 +11748:2:1250 +11749:2:1255 +11750:2:1256 +11751:0:4365 +11752:3:3559 +11753:0:4365 +11754:2:1268 +11755:0:4365 +11756:3:3558 +11757:0:4365 +11758:2:1270 +11759:0:4365 +11760:3:3559 +11761:0:4365 +11762:2:1271 +11763:2:1275 +11764:2:1276 +11765:2:1284 +11766:2:1285 +11767:2:1289 +11768:2:1290 +11769:2:1284 +11770:2:1285 +11771:2:1289 +11772:2:1290 +11773:2:1298 +11774:2:1303 +11775:2:1307 +11776:2:1308 +11777:2:1315 +11778:2:1316 +11779:2:1327 +11780:2:1328 +11781:2:1329 +11782:2:1327 +11783:2:1328 +11784:2:1329 +11785:2:1340 +11786:2:1345 +11787:2:1346 +11788:0:4365 +11789:2:1358 +11790:0:4365 +11791:2:1360 +11792:0:4365 +11793:3:3558 +11794:0:4365 +11795:2:1361 +11796:0:4365 +11797:3:3559 +11798:0:4365 +11799:2:1362 +11800:2:1366 +11801:2:1367 +11802:2:1375 +11803:2:1376 +11804:2:1380 +11805:2:1381 +11806:2:1375 +11807:2:1376 +11808:2:1380 +11809:2:1381 +11810:2:1389 +11811:2:1394 +11812:2:1398 +11813:2:1399 +11814:2:1406 +11815:2:1407 +11816:2:1418 +11817:2:1419 +11818:2:1420 +11819:2:1418 +11820:2:1419 +11821:2:1420 +11822:2:1431 +11823:2:1436 +11824:2:1437 +11825:0:4365 +11826:2:1449 +11827:0:4365 +11828:3:3558 +11829:0:4365 +11830:2:1451 +11831:0:4365 +11832:3:3559 +11833:0:4365 +11834:2:1652 +11835:0:4365 +11836:2:1653 +11837:0:4365 +11838:2:1657 +11839:0:4365 +11840:2:1180 +11841:0:4365 +11842:3:3558 +11843:0:4365 +11844:2:1181 +11845:2:1185 +11846:2:1186 +11847:2:1194 +11848:2:1195 +11849:2:1199 +11850:2:1200 +11851:2:1194 +11852:2:1195 +11853:2:1196 +11854:2:1208 +11855:2:1213 +11856:2:1217 +11857:2:1218 +11858:2:1225 +11859:2:1226 +11860:2:1237 +11861:2:1238 +11862:2:1239 +11863:2:1237 +11864:2:1238 +11865:2:1239 +11866:2:1250 +11867:2:1255 +11868:2:1256 +11869:0:4365 +11870:3:3559 +11871:0:4365 +11872:2:1268 +11873:0:4365 +11874:3:3558 +11875:0:4365 +11876:2:1270 +11877:0:4365 +11878:3:3559 +11879:0:4365 +11880:2:1271 +11881:2:1275 +11882:2:1276 +11883:2:1284 +11884:2:1285 +11885:2:1289 +11886:2:1290 +11887:2:1284 +11888:2:1285 +11889:2:1289 +11890:2:1290 +11891:2:1298 +11892:2:1303 +11893:2:1307 +11894:2:1308 +11895:2:1315 +11896:2:1316 +11897:2:1327 +11898:2:1328 +11899:2:1329 +11900:2:1327 +11901:2:1328 +11902:2:1329 +11903:2:1340 +11904:2:1345 +11905:2:1346 +11906:0:4365 +11907:2:1358 +11908:0:4365 +11909:2:1454 +11910:0:4365 +11911:3:3558 +11912:0:4365 +11913:2:1455 +11914:0:4365 +11915:3:3559 +11916:0:4365 +11917:2:1652 +11918:0:4365 +11919:2:1653 +11920:0:4365 +11921:2:1657 +11922:0:4365 +11923:2:1660 +11924:0:4365 +11925:3:3558 +11926:0:4365 +11927:2:1665 +11928:2:1669 +11929:2:1670 +11930:2:1678 +11931:2:1679 +11932:2:1683 +11933:2:1684 +11934:2:1678 +11935:2:1679 +11936:2:1680 +11937:2:1692 +11938:2:1697 +11939:2:1701 +11940:2:1702 +11941:2:1709 +11942:2:1710 +11943:2:1721 +11944:2:1722 +11945:2:1723 +11946:2:1721 +11947:2:1722 +11948:2:1723 +11949:2:1734 +11950:2:1739 +11951:2:1740 +11952:0:4365 +11953:3:3559 +11954:0:4365 +11955:2:1752 +11956:0:4365 +11957:3:3558 +11958:0:4365 +11959:2:1754 +11960:0:4365 +11961:3:3559 +11962:0:4365 +11963:2:1755 +11964:2:1759 +11965:2:1760 +11966:2:1768 +11967:2:1769 +11968:2:1773 +11969:2:1774 +11970:2:1768 +11971:2:1769 +11972:2:1773 +11973:2:1774 +11974:2:1782 +11975:2:1787 +11976:2:1791 +11977:2:1792 +11978:2:1799 +11979:2:1800 +11980:2:1811 +11981:2:1812 +11982:2:1813 +11983:2:1811 +11984:2:1812 +11985:2:1813 +11986:2:1824 +11987:2:1829 +11988:2:1830 +11989:0:4365 +11990:2:1842 +11991:0:4365 +11992:3:3558 +11993:0:4365 +11994:2:1844 +11995:0:4365 +11996:3:3559 +11997:0:4365 +11998:2:1845 +11999:2:1849 +12000:2:1850 +12001:2:1858 +12002:2:1859 +12003:2:1863 +12004:2:1864 +12005:2:1858 +12006:2:1859 +12007:2:1863 +12008:2:1864 +12009:2:1872 +12010:2:1877 +12011:2:1881 +12012:2:1882 +12013:2:1889 +12014:2:1890 +12015:2:1901 +12016:2:1902 +12017:2:1903 +12018:2:1901 +12019:2:1902 +12020:2:1903 +12021:2:1914 +12022:2:1919 +12023:2:1920 +12024:0:4365 +12025:2:1932 +12026:0:4365 +12027:3:3558 +12028:0:4365 +12029:2:1934 +12030:0:4365 +12031:3:3559 +12032:0:4365 +12033:2:1935 +12034:0:4365 +12035:2:1936 +12036:0:4365 +12037:2:2129 +12038:0:4365 +12039:2:2130 +12040:0:4365 +12041:2:2134 +12042:0:4365 +12043:3:3558 +12044:0:4365 +12045:2:2136 +12046:0:4365 +12047:3:3559 +12048:0:4365 +12049:2:2137 +12050:2:2141 +12051:2:2142 +12052:2:2150 +12053:2:2151 +12054:2:2155 +12055:2:2156 +12056:2:2150 +12057:2:2151 +12058:2:2155 +12059:2:2156 +12060:2:2164 +12061:2:2169 +12062:2:2173 +12063:2:2174 +12064:2:2181 +12065:2:2182 +12066:2:2193 +12067:2:2194 +12068:2:2195 +12069:2:2193 +12070:2:2194 +12071:2:2195 +12072:2:2206 +12073:2:2211 +12074:2:2212 +12075:0:4365 +12076:2:2224 +12077:0:4365 +12078:3:3558 +12079:0:4365 +12080:2:2226 +12081:0:4365 +12082:3:3559 +12083:0:4365 +12084:2:1936 +12085:0:4365 +12086:2:2129 +12087:0:4365 +12088:2:2130 +12089:0:4365 +12090:2:2134 +12091:0:4365 +12092:3:3558 +12093:0:4365 +12094:2:2136 +12095:0:4365 +12096:3:3559 +12097:0:4365 +12098:2:2137 +12099:2:2141 +12100:2:2142 +12101:2:2150 +12102:2:2151 +12103:2:2155 +12104:2:2156 +12105:2:2150 +12106:2:2151 +12107:2:2152 +12108:2:2164 +12109:2:2169 +12110:2:2173 +12111:2:2174 +12112:2:2181 +12113:2:2182 +12114:2:2193 +12115:2:2194 +12116:2:2195 +12117:2:2193 +12118:2:2194 +12119:2:2195 +12120:2:2206 +12121:2:2211 +12122:2:2212 +12123:0:4365 +12124:2:2224 +12125:0:4365 +12126:3:3558 +12127:0:4365 +12128:2:2226 +12129:0:4365 +12130:3:3559 +12131:0:4365 +12132:2:2230 +12133:0:4365 +12134:3:3558 +12135:0:4365 +12136:2:2235 +12137:2:2239 +12138:2:2240 +12139:2:2248 +12140:2:2249 +12141:2:2253 +12142:2:2254 +12143:2:2248 +12144:2:2249 +12145:2:2250 +12146:2:2262 +12147:2:2267 +12148:2:2271 +12149:2:2272 +12150:2:2279 +12151:2:2280 +12152:2:2291 +12153:2:2292 +12154:2:2293 +12155:2:2291 +12156:2:2292 +12157:2:2293 +12158:2:2304 +12159:2:2309 +12160:2:2310 +12161:0:4365 +12162:3:3559 +12163:0:4365 +12164:2:2322 +12165:0:4365 +12166:2:1169 +12167:0:4365 +12168:3:3558 +12169:0:4365 +12170:2:1170 +12171:0:4365 +12172:3:3559 +12173:0:4365 +12174:3:3560 +12175:0:4365 +12176:3:3566 +12177:0:4365 +12178:3:3569 +12179:3:3570 +12180:3:3582 +12181:3:3583 +12182:3:3587 +12183:3:3588 +12184:3:3582 +12185:3:3583 +12186:3:3587 +12187:3:3588 +12188:3:3596 +12189:3:3601 +12190:3:3605 +12191:3:3606 +12192:3:3613 +12193:3:3614 +12194:3:3625 +12195:3:3626 +12196:3:3627 +12197:3:3625 +12198:3:3626 +12199:3:3627 +12200:3:3638 +12201:3:3643 +12202:3:3644 +12203:0:4365 +12204:3:3656 +12205:0:4365 +12206:3:3657 +12207:0:4365 +12208:2:1173 +12209:0:4365 +12210:3:3658 +12211:0:4365 +12212:2:1179 +12213:0:4365 +12214:2:1180 +12215:0:4365 +12216:3:3657 +12217:0:4365 +12218:2:1181 +12219:2:1185 +12220:2:1186 +12221:2:1194 +12222:2:1195 +12223:2:1199 +12224:2:1200 +12225:2:1194 +12226:2:1195 +12227:2:1199 +12228:2:1200 +12229:2:1208 +12230:2:1213 +12231:2:1217 +12232:2:1218 +12233:2:1225 +12234:2:1226 +12235:2:1237 +12236:2:1238 +12237:2:1239 +12238:2:1237 +12239:2:1238 +12240:2:1239 +12241:2:1250 +12242:2:1255 +12243:2:1256 +12244:0:4365 +12245:3:3658 +12246:0:4365 +12247:2:1268 +12248:0:4365 +12249:3:3657 +12250:0:4365 +12251:2:1270 +12252:0:4365 +12253:3:3658 +12254:0:4365 +12255:2:1271 +12256:2:1275 +12257:2:1276 +12258:2:1284 +12259:2:1285 +12260:2:1289 +12261:2:1290 +12262:2:1284 +12263:2:1285 +12264:2:1289 +12265:2:1290 +12266:2:1298 +12267:2:1303 +12268:2:1307 +12269:2:1308 +12270:2:1315 +12271:2:1316 +12272:2:1327 +12273:2:1328 +12274:2:1329 +12275:2:1327 +12276:2:1328 +12277:2:1329 +12278:2:1340 +12279:2:1345 +12280:2:1346 +12281:0:4365 +12282:2:1358 +12283:0:4365 +12284:2:1360 +12285:0:4365 +12286:3:3657 +12287:0:4365 +12288:2:1361 +12289:0:4365 +12290:3:3658 +12291:0:4365 +12292:2:1362 +12293:2:1366 +12294:2:1367 +12295:2:1375 +12296:2:1376 +12297:2:1380 +12298:2:1381 +12299:2:1375 +12300:2:1376 +12301:2:1380 +12302:2:1381 +12303:2:1389 +12304:2:1394 +12305:2:1398 +12306:2:1399 +12307:2:1406 +12308:2:1407 +12309:2:1418 +12310:2:1419 +12311:2:1420 +12312:2:1418 +12313:2:1419 +12314:2:1420 +12315:2:1431 +12316:2:1436 +12317:2:1437 +12318:0:4365 +12319:2:1449 +12320:0:4365 +12321:3:3657 +12322:0:4365 +12323:2:1451 +12324:0:4365 +12325:3:3658 +12326:0:4365 +12327:2:1652 +12328:0:4365 +12329:2:1653 +12330:0:4365 +12331:2:1657 +12332:0:4365 +12333:2:1180 +12334:0:4365 +12335:3:3657 +12336:0:4365 +12337:2:1181 +12338:2:1185 +12339:2:1186 +12340:2:1194 +12341:2:1195 +12342:2:1199 +12343:2:1200 +12344:2:1194 +12345:2:1195 +12346:2:1196 +12347:2:1208 +12348:2:1213 +12349:2:1217 +12350:2:1218 +12351:2:1225 +12352:2:1226 +12353:2:1237 +12354:2:1238 +12355:2:1239 +12356:2:1237 +12357:2:1238 +12358:2:1239 +12359:2:1250 +12360:2:1255 +12361:2:1256 +12362:0:4365 +12363:3:3658 +12364:0:4365 +12365:2:1268 +12366:0:4365 +12367:3:3657 +12368:0:4365 +12369:2:1270 +12370:0:4365 +12371:3:3658 +12372:0:4365 +12373:2:1271 +12374:2:1275 +12375:2:1276 +12376:2:1284 +12377:2:1285 +12378:2:1289 +12379:2:1290 +12380:2:1284 +12381:2:1285 +12382:2:1289 +12383:2:1290 +12384:2:1298 +12385:2:1303 +12386:2:1307 +12387:2:1308 +12388:2:1315 +12389:2:1316 +12390:2:1327 +12391:2:1328 +12392:2:1329 +12393:2:1327 +12394:2:1328 +12395:2:1329 +12396:2:1340 +12397:2:1345 +12398:2:1346 +12399:0:4365 +12400:2:1358 +12401:0:4365 +12402:2:1454 +12403:0:4365 +12404:3:3657 +12405:0:4365 +12406:2:1455 +12407:0:4365 +12408:3:3658 +12409:0:4365 +12410:2:1652 +12411:0:4365 +12412:2:1653 +12413:0:4365 +12414:2:1657 +12415:0:4365 +12416:2:1660 +12417:0:4365 +12418:3:3657 +12419:0:4365 +12420:2:1665 +12421:2:1669 +12422:2:1670 +12423:2:1678 +12424:2:1679 +12425:2:1683 +12426:2:1684 +12427:2:1678 +12428:2:1679 +12429:2:1680 +12430:2:1692 +12431:2:1697 +12432:2:1701 +12433:2:1702 +12434:2:1709 +12435:2:1710 +12436:2:1721 +12437:2:1722 +12438:2:1723 +12439:2:1721 +12440:2:1722 +12441:2:1723 +12442:2:1734 +12443:2:1739 +12444:2:1740 +12445:0:4365 +12446:3:3658 +12447:0:4365 +12448:2:1752 +12449:0:4365 +12450:3:3657 +12451:0:4365 +12452:2:1754 +12453:0:4365 +12454:3:3658 +12455:0:4365 +12456:2:1755 +12457:2:1759 +12458:2:1760 +12459:2:1768 +12460:2:1769 +12461:2:1773 +12462:2:1774 +12463:2:1768 +12464:2:1769 +12465:2:1773 +12466:2:1774 +12467:2:1782 +12468:2:1787 +12469:2:1791 +12470:2:1792 +12471:2:1799 +12472:2:1800 +12473:2:1811 +12474:2:1812 +12475:2:1813 +12476:2:1811 +12477:2:1812 +12478:2:1813 +12479:2:1824 +12480:2:1829 +12481:2:1830 +12482:0:4365 +12483:2:1842 +12484:0:4365 +12485:3:3657 +12486:0:4365 +12487:2:1844 +12488:0:4365 +12489:3:3658 +12490:0:4365 +12491:2:1845 +12492:2:1849 +12493:2:1850 +12494:2:1858 +12495:2:1859 +12496:2:1863 +12497:2:1864 +12498:2:1858 +12499:2:1859 +12500:2:1863 +12501:2:1864 +12502:2:1872 +12503:2:1877 +12504:2:1881 +12505:2:1882 +12506:2:1889 +12507:2:1890 +12508:2:1901 +12509:2:1902 +12510:2:1903 +12511:2:1901 +12512:2:1902 +12513:2:1903 +12514:2:1914 +12515:2:1919 +12516:2:1920 +12517:0:4365 +12518:2:1932 +12519:0:4365 +12520:3:3657 +12521:0:4365 +12522:2:1934 +12523:0:4365 +12524:3:3658 +12525:0:4365 +12526:2:1935 +12527:0:4365 +12528:2:1936 +12529:0:4365 +12530:2:2129 +12531:0:4365 +12532:2:2130 +12533:0:4365 +12534:2:2134 +12535:0:4365 +12536:3:3657 +12537:0:4365 +12538:2:2136 +12539:0:4365 +12540:3:3658 +12541:0:4365 +12542:2:2137 +12543:2:2141 +12544:2:2142 +12545:2:2150 +12546:2:2151 +12547:2:2155 +12548:2:2156 +12549:2:2150 +12550:2:2151 +12551:2:2155 +12552:2:2156 +12553:2:2164 +12554:2:2169 +12555:2:2173 +12556:2:2174 +12557:2:2181 +12558:2:2182 +12559:2:2193 +12560:2:2194 +12561:2:2195 +12562:2:2193 +12563:2:2194 +12564:2:2195 +12565:2:2206 +12566:2:2211 +12567:2:2212 +12568:0:4365 +12569:2:2224 +12570:0:4365 +12571:3:3657 +12572:0:4365 +12573:2:2226 +12574:0:4365 +12575:3:3658 +12576:0:4365 +12577:2:1936 +12578:0:4365 +12579:2:2129 +12580:0:4365 +12581:2:2130 +12582:0:4365 +12583:2:2134 +12584:0:4365 +12585:3:3657 +12586:0:4365 +12587:2:2136 +12588:0:4365 +12589:3:3658 +12590:0:4365 +12591:2:2137 +12592:2:2141 +12593:2:2142 +12594:2:2150 +12595:2:2151 +12596:2:2155 +12597:2:2156 +12598:2:2150 +12599:2:2151 +12600:2:2152 +12601:2:2164 +12602:2:2169 +12603:2:2173 +12604:2:2174 +12605:2:2181 +12606:2:2182 +12607:2:2193 +12608:2:2194 +12609:2:2195 +12610:2:2193 +12611:2:2194 +12612:2:2195 +12613:2:2206 +12614:2:2211 +12615:2:2212 +12616:0:4365 +12617:2:2224 +12618:0:4365 +12619:3:3657 +12620:0:4365 +12621:2:2226 +12622:0:4365 +12623:3:3658 +12624:0:4365 +12625:2:2230 +12626:0:4365 +12627:3:3657 +12628:0:4365 +12629:2:2235 +12630:2:2239 +12631:2:2240 +12632:2:2248 +12633:2:2249 +12634:2:2253 +12635:2:2254 +12636:2:2248 +12637:2:2249 +12638:2:2250 +12639:2:2262 +12640:2:2267 +12641:2:2271 +12642:2:2272 +12643:2:2279 +12644:2:2280 +12645:2:2291 +12646:2:2292 +12647:2:2293 +12648:2:2291 +12649:2:2292 +12650:2:2293 +12651:2:2304 +12652:2:2309 +12653:2:2310 +12654:0:4365 +12655:3:3658 +12656:0:4365 +12657:2:2322 +12658:0:4365 +12659:2:1169 +12660:0:4365 +12661:3:3657 +12662:0:4365 +12663:2:1170 +12664:0:4365 +12665:3:3658 +12666:0:4365 +12667:3:3659 +12668:0:4365 +12669:3:3665 +12670:0:4365 +12671:3:3666 +12672:0:4365 +12673:3:3667 +12674:0:4365 +12675:3:3668 +12676:0:4365 +12677:3:3669 +12678:3:3673 +12679:3:3674 +12680:3:3682 +12681:3:3683 +12682:3:3687 +12683:3:3688 +12684:3:3682 +12685:3:3683 +12686:3:3687 +12687:3:3688 +12688:3:3696 +12689:3:3701 +12690:3:3705 +12691:3:3706 +12692:3:3713 +12693:3:3714 +12694:3:3725 +12695:3:3726 +12696:3:3727 +12697:3:3725 +12698:3:3726 +12699:3:3727 +12700:3:3738 +12701:3:3743 +12702:3:3744 +12703:0:4365 +12704:3:3756 +12705:0:4365 +12706:3:3757 +12707:0:4365 +12708:2:1173 +12709:0:4365 +12710:3:3758 +12711:0:4365 +12712:2:1179 +12713:0:4365 +12714:2:1180 +12715:0:4365 +12716:3:3757 +12717:0:4365 +12718:2:1181 +12719:2:1185 +12720:2:1186 +12721:2:1194 +12722:2:1195 +12723:2:1199 +12724:2:1200 +12725:2:1194 +12726:2:1195 +12727:2:1199 +12728:2:1200 +12729:2:1208 +12730:2:1213 +12731:2:1217 +12732:2:1218 +12733:2:1225 +12734:2:1226 +12735:2:1237 +12736:2:1238 +12737:2:1239 +12738:2:1237 +12739:2:1238 +12740:2:1239 +12741:2:1250 +12742:2:1255 +12743:2:1256 +12744:0:4365 +12745:3:3758 +12746:0:4365 +12747:2:1268 +12748:0:4365 +12749:3:3757 +12750:0:4365 +12751:2:1270 +12752:0:4365 +12753:3:3758 +12754:0:4365 +12755:2:1271 +12756:2:1275 +12757:2:1276 +12758:2:1284 +12759:2:1285 +12760:2:1289 +12761:2:1290 +12762:2:1284 +12763:2:1285 +12764:2:1289 +12765:2:1290 +12766:2:1298 +12767:2:1303 +12768:2:1307 +12769:2:1308 +12770:2:1315 +12771:2:1316 +12772:2:1327 +12773:2:1328 +12774:2:1329 +12775:2:1327 +12776:2:1328 +12777:2:1329 +12778:2:1340 +12779:2:1345 +12780:2:1346 +12781:0:4365 +12782:2:1358 +12783:0:4365 +12784:2:1360 +12785:0:4365 +12786:3:3757 +12787:0:4365 +12788:2:1361 +12789:0:4365 +12790:3:3758 +12791:0:4365 +12792:2:1362 +12793:2:1366 +12794:2:1367 +12795:2:1375 +12796:2:1376 +12797:2:1380 +12798:2:1381 +12799:2:1375 +12800:2:1376 +12801:2:1380 +12802:2:1381 +12803:2:1389 +12804:2:1394 +12805:2:1398 +12806:2:1399 +12807:2:1406 +12808:2:1407 +12809:2:1418 +12810:2:1419 +12811:2:1420 +12812:2:1418 +12813:2:1419 +12814:2:1420 +12815:2:1431 +12816:2:1436 +12817:2:1437 +12818:0:4365 +12819:2:1449 +12820:0:4365 +12821:3:3757 +12822:0:4365 +12823:2:1451 +12824:0:4365 +12825:3:3758 +12826:0:4365 +12827:2:1652 +12828:0:4365 +12829:2:1653 +12830:0:4365 +12831:2:1657 +12832:0:4365 +12833:2:1180 +12834:0:4365 +12835:3:3757 +12836:0:4365 +12837:2:1181 +12838:2:1185 +12839:2:1186 +12840:2:1194 +12841:2:1195 +12842:2:1199 +12843:2:1200 +12844:2:1194 +12845:2:1195 +12846:2:1196 +12847:2:1208 +12848:2:1213 +12849:2:1217 +12850:2:1218 +12851:2:1225 +12852:2:1226 +12853:2:1237 +12854:2:1238 +12855:2:1239 +12856:2:1237 +12857:2:1238 +12858:2:1239 +12859:2:1250 +12860:2:1255 +12861:2:1256 +12862:0:4365 +12863:3:3758 +12864:0:4365 +12865:2:1268 +12866:0:4365 +12867:3:3757 +12868:0:4365 +12869:2:1270 +12870:0:4365 +12871:3:3758 +12872:0:4365 +12873:2:1271 +12874:2:1275 +12875:2:1276 +12876:2:1284 +12877:2:1285 +12878:2:1289 +12879:2:1290 +12880:2:1284 +12881:2:1285 +12882:2:1289 +12883:2:1290 +12884:2:1298 +12885:2:1303 +12886:2:1307 +12887:2:1308 +12888:2:1315 +12889:2:1316 +12890:2:1327 +12891:2:1328 +12892:2:1329 +12893:2:1327 +12894:2:1328 +12895:2:1329 +12896:2:1340 +12897:2:1345 +12898:2:1346 +12899:0:4365 +12900:2:1358 +12901:0:4365 +12902:2:1454 +12903:0:4365 +12904:3:3757 +12905:0:4365 +12906:2:1455 +12907:0:4365 +12908:3:3758 +12909:0:4365 +12910:2:1652 +12911:0:4365 +12912:2:1653 +12913:0:4365 +12914:2:1657 +12915:0:4365 +12916:2:1660 +12917:0:4365 +12918:3:3757 +12919:0:4365 +12920:2:1665 +12921:2:1669 +12922:2:1670 +12923:2:1678 +12924:2:1679 +12925:2:1683 +12926:2:1684 +12927:2:1678 +12928:2:1679 +12929:2:1680 +12930:2:1692 +12931:2:1697 +12932:2:1701 +12933:2:1702 +12934:2:1709 +12935:2:1710 +12936:2:1721 +12937:2:1722 +12938:2:1723 +12939:2:1721 +12940:2:1722 +12941:2:1723 +12942:2:1734 +12943:2:1739 +12944:2:1740 +12945:0:4365 +12946:3:3758 +12947:0:4365 +12948:2:1752 +12949:0:4365 +12950:3:3757 +12951:0:4365 +12952:2:1754 +12953:0:4365 +12954:3:3758 +12955:0:4365 +12956:2:1755 +12957:2:1759 +12958:2:1760 +12959:2:1768 +12960:2:1769 +12961:2:1773 +12962:2:1774 +12963:2:1768 +12964:2:1769 +12965:2:1773 +12966:2:1774 +12967:2:1782 +12968:2:1787 +12969:2:1791 +12970:2:1792 +12971:2:1799 +12972:2:1800 +12973:2:1811 +12974:2:1812 +12975:2:1813 +12976:2:1811 +12977:2:1812 +12978:2:1813 +12979:2:1824 +12980:2:1829 +12981:2:1830 +12982:0:4365 +12983:2:1842 +12984:0:4365 +12985:3:3757 +12986:0:4365 +12987:2:1844 +12988:0:4365 +12989:3:3758 +12990:0:4365 +12991:2:1845 +12992:2:1849 +12993:2:1850 +12994:2:1858 +12995:2:1859 +12996:2:1863 +12997:2:1864 +12998:2:1858 +12999:2:1859 +13000:2:1863 +13001:2:1864 +13002:2:1872 +13003:2:1877 +13004:2:1881 +13005:2:1882 +13006:2:1889 +13007:2:1890 +13008:2:1901 +13009:2:1902 +13010:2:1903 +13011:2:1901 +13012:2:1902 +13013:2:1903 +13014:2:1914 +13015:2:1919 +13016:2:1920 +13017:0:4365 +13018:2:1932 +13019:0:4365 +13020:3:3757 +13021:0:4365 +13022:2:1934 +13023:0:4365 +13024:3:3758 +13025:0:4365 +13026:2:1935 +13027:0:4365 +13028:2:1936 +13029:0:4365 +13030:2:2129 +13031:0:4365 +13032:2:2130 +13033:0:4365 +13034:2:2134 +13035:0:4365 +13036:3:3757 +13037:0:4365 +13038:2:2136 +13039:0:4365 +13040:3:3758 +13041:0:4365 +13042:2:2137 +13043:2:2141 +13044:2:2142 +13045:2:2150 +13046:2:2151 +13047:2:2155 +13048:2:2156 +13049:2:2150 +13050:2:2151 +13051:2:2155 +13052:2:2156 +13053:2:2164 +13054:2:2169 +13055:2:2173 +13056:2:2174 +13057:2:2181 +13058:2:2182 +13059:2:2193 +13060:2:2194 +13061:2:2195 +13062:2:2193 +13063:2:2194 +13064:2:2195 +13065:2:2206 +13066:2:2211 +13067:2:2212 +13068:0:4365 +13069:2:2224 +13070:0:4365 +13071:3:3757 +13072:0:4365 +13073:2:2226 +13074:0:4365 +13075:3:3758 +13076:0:4365 +13077:2:1936 +13078:0:4365 +13079:2:2129 +13080:0:4365 +13081:2:2130 +13082:0:4365 +13083:2:2134 +13084:0:4365 +13085:3:3757 +13086:0:4365 +13087:2:2136 +13088:0:4365 +13089:3:3758 +13090:0:4365 +13091:2:2137 +13092:2:2141 +13093:2:2142 +13094:2:2150 +13095:2:2151 +13096:2:2155 +13097:2:2156 +13098:2:2150 +13099:2:2151 +13100:2:2152 +13101:2:2164 +13102:2:2169 +13103:2:2173 +13104:2:2174 +13105:2:2181 +13106:2:2182 +13107:2:2193 +13108:2:2194 +13109:2:2195 +13110:2:2193 +13111:2:2194 +13112:2:2195 +13113:2:2206 +13114:2:2211 +13115:2:2212 +13116:0:4365 +13117:2:2224 +13118:0:4365 +13119:3:3757 +13120:0:4365 +13121:2:2226 +13122:0:4365 +13123:3:3758 +13124:0:4365 +13125:2:2230 +13126:0:4365 +13127:3:3757 +13128:0:4365 +13129:2:2235 +13130:2:2239 +13131:2:2240 +13132:2:2248 +13133:2:2249 +13134:2:2253 +13135:2:2254 +13136:2:2248 +13137:2:2249 +13138:2:2250 +13139:2:2262 +13140:2:2267 +13141:2:2271 +13142:2:2272 +13143:2:2279 +13144:2:2280 +13145:2:2291 +13146:2:2292 +13147:2:2293 +13148:2:2291 +13149:2:2292 +13150:2:2293 +13151:2:2304 +13152:2:2309 +13153:2:2310 +13154:0:4365 +13155:3:3758 +13156:0:4365 +13157:2:2322 +13158:0:4365 +13159:2:1169 +13160:0:4365 +13161:3:3757 +13162:0:4365 +13163:2:1170 +13164:0:4365 +13165:3:3758 +13166:0:4365 +13167:3:3759 +13168:0:4365 +13169:3:3972 +13170:0:4365 +13171:3:3980 +13172:0:4365 +13173:3:3981 +13174:3:3985 +13175:3:3986 +13176:3:3994 +13177:3:3995 +13178:3:3999 +13179:3:4000 +13180:3:3994 +13181:3:3995 +13182:3:3999 +13183:3:4000 +13184:3:4008 +13185:3:4013 +13186:3:4017 +13187:3:4018 +13188:3:4025 +13189:3:4026 +13190:3:4037 +13191:3:4038 +13192:3:4039 +13193:3:4037 +13194:3:4038 +13195:3:4039 +13196:3:4050 +13197:3:4055 +13198:3:4056 +13199:0:4365 +13200:3:4068 +13201:0:4365 +13202:3:4069 +13203:0:4365 +13204:2:1173 +13205:0:4365 +13206:3:4070 +13207:0:4365 +13208:2:1179 +13209:0:4365 +13210:2:1180 +13211:0:4365 +13212:3:4069 +13213:0:4365 +13214:2:1181 +13215:2:1185 +13216:2:1186 +13217:2:1194 +13218:2:1195 +13219:2:1199 +13220:2:1200 +13221:2:1194 +13222:2:1195 +13223:2:1199 +13224:2:1200 +13225:2:1208 +13226:2:1213 +13227:2:1217 +13228:2:1218 +13229:2:1225 +13230:2:1226 +13231:2:1237 +13232:2:1238 +13233:2:1239 +13234:2:1237 +13235:2:1238 +13236:2:1239 +13237:2:1250 +13238:2:1255 +13239:2:1256 +13240:0:4365 +13241:3:4070 +13242:0:4365 +13243:2:1268 +13244:0:4365 +13245:3:4069 +13246:0:4365 +13247:2:1270 +13248:0:4365 +13249:3:4070 +13250:0:4365 +13251:2:1271 +13252:2:1275 +13253:2:1276 +13254:2:1284 +13255:2:1285 +13256:2:1289 +13257:2:1290 +13258:2:1284 +13259:2:1285 +13260:2:1289 +13261:2:1290 +13262:2:1298 +13263:2:1303 +13264:2:1307 +13265:2:1308 +13266:2:1315 +13267:2:1316 +13268:2:1327 +13269:2:1328 +13270:2:1329 +13271:2:1327 +13272:2:1328 +13273:2:1329 +13274:2:1340 +13275:2:1345 +13276:2:1346 +13277:0:4365 +13278:2:1358 +13279:0:4365 +13280:2:1360 +13281:0:4365 +13282:3:4069 +13283:0:4365 +13284:2:1361 +13285:0:4365 +13286:3:4070 +13287:0:4365 +13288:2:1362 +13289:2:1366 +13290:2:1367 +13291:2:1375 +13292:2:1376 +13293:2:1380 +13294:2:1381 +13295:2:1375 +13296:2:1376 +13297:2:1380 +13298:2:1381 +13299:2:1389 +13300:2:1394 +13301:2:1398 +13302:2:1399 +13303:2:1406 +13304:2:1407 +13305:2:1418 +13306:2:1419 +13307:2:1420 +13308:2:1418 +13309:2:1419 +13310:2:1420 +13311:2:1431 +13312:2:1436 +13313:2:1437 +13314:0:4365 +13315:2:1449 +13316:0:4365 +13317:3:4069 +13318:0:4365 +13319:2:1451 +13320:0:4365 +13321:3:4070 +13322:0:4365 +13323:2:1652 +13324:0:4365 +13325:2:1653 +13326:0:4365 +13327:2:1657 +13328:0:4365 +13329:2:1180 +13330:0:4365 +13331:3:4069 +13332:0:4365 +13333:2:1181 +13334:2:1185 +13335:2:1186 +13336:2:1194 +13337:2:1195 +13338:2:1199 +13339:2:1200 +13340:2:1194 +13341:2:1195 +13342:2:1196 +13343:2:1208 +13344:2:1213 +13345:2:1217 +13346:2:1218 +13347:2:1225 +13348:2:1226 +13349:2:1237 +13350:2:1238 +13351:2:1239 +13352:2:1237 +13353:2:1238 +13354:2:1239 +13355:2:1250 +13356:2:1255 +13357:2:1256 +13358:0:4365 +13359:3:4070 +13360:0:4365 +13361:2:1268 +13362:0:4365 +13363:3:4069 +13364:0:4365 +13365:2:1270 +13366:0:4365 +13367:3:4070 +13368:0:4365 +13369:2:1271 +13370:2:1275 +13371:2:1276 +13372:2:1284 +13373:2:1285 +13374:2:1289 +13375:2:1290 +13376:2:1284 +13377:2:1285 +13378:2:1289 +13379:2:1290 +13380:2:1298 +13381:2:1303 +13382:2:1307 +13383:2:1308 +13384:2:1315 +13385:2:1316 +13386:2:1327 +13387:2:1328 +13388:2:1329 +13389:2:1327 +13390:2:1328 +13391:2:1329 +13392:2:1340 +13393:2:1345 +13394:2:1346 +13395:0:4365 +13396:2:1358 +13397:0:4365 +13398:2:1454 +13399:0:4365 +13400:3:4069 +13401:0:4365 +13402:2:1455 +13403:0:4365 +13404:3:4070 +13405:0:4365 +13406:2:1652 +13407:0:4365 +13408:2:1653 +13409:0:4365 +13410:2:1657 +13411:0:4365 +13412:2:1660 +13413:0:4365 +13414:3:4069 +13415:0:4365 +13416:2:1665 +13417:2:1669 +13418:2:1670 +13419:2:1678 +13420:2:1679 +13421:2:1683 +13422:2:1684 +13423:2:1678 +13424:2:1679 +13425:2:1680 +13426:2:1692 +13427:2:1697 +13428:2:1701 +13429:2:1702 +13430:2:1709 +13431:2:1710 +13432:2:1721 +13433:2:1722 +13434:2:1723 +13435:2:1721 +13436:2:1722 +13437:2:1723 +13438:2:1734 +13439:2:1739 +13440:2:1740 +13441:0:4365 +13442:3:4070 +13443:0:4365 +13444:2:1752 +13445:0:4365 +13446:3:4069 +13447:0:4365 +13448:2:1754 +13449:0:4365 +13450:3:4070 +13451:0:4365 +13452:2:1755 +13453:2:1759 +13454:2:1760 +13455:2:1768 +13456:2:1769 +13457:2:1773 +13458:2:1774 +13459:2:1768 +13460:2:1769 +13461:2:1773 +13462:2:1774 +13463:2:1782 +13464:2:1787 +13465:2:1791 +13466:2:1792 +13467:2:1799 +13468:2:1800 +13469:2:1811 +13470:2:1812 +13471:2:1813 +13472:2:1811 +13473:2:1812 +13474:2:1813 +13475:2:1824 +13476:2:1829 +13477:2:1830 +13478:0:4365 +13479:2:1842 +13480:0:4365 +13481:3:4069 +13482:0:4365 +13483:2:1844 +13484:0:4365 +13485:3:4070 +13486:0:4365 +13487:2:1845 +13488:2:1849 +13489:2:1850 +13490:2:1858 +13491:2:1859 +13492:2:1863 +13493:2:1864 +13494:2:1858 +13495:2:1859 +13496:2:1863 +13497:2:1864 +13498:2:1872 +13499:2:1877 +13500:2:1881 +13501:2:1882 +13502:2:1889 +13503:2:1890 +13504:2:1901 +13505:2:1902 +13506:2:1903 +13507:2:1901 +13508:2:1902 +13509:2:1903 +13510:2:1914 +13511:2:1919 +13512:2:1920 +13513:0:4365 +13514:2:1932 +13515:0:4365 +13516:3:4069 +13517:0:4365 +13518:2:1934 +13519:0:4365 +13520:3:4070 +13521:0:4365 +13522:2:1935 +13523:0:4365 +13524:2:1936 +13525:0:4365 +13526:2:2129 +13527:0:4365 +13528:2:2130 +13529:0:4365 +13530:2:2134 +13531:0:4365 +13532:3:4069 +13533:0:4365 +13534:2:2136 +13535:0:4365 +13536:3:4070 +13537:0:4365 +13538:2:2137 +13539:2:2141 +13540:2:2142 +13541:2:2150 +13542:2:2151 +13543:2:2155 +13544:2:2156 +13545:2:2150 +13546:2:2151 +13547:2:2155 +13548:2:2156 +13549:2:2164 +13550:2:2169 +13551:2:2173 +13552:2:2174 +13553:2:2181 +13554:2:2182 +13555:2:2193 +13556:2:2194 +13557:2:2195 +13558:2:2193 +13559:2:2194 +13560:2:2195 +13561:2:2206 +13562:2:2211 +13563:2:2212 +13564:0:4365 +13565:2:2224 +13566:0:4365 +13567:3:4069 +13568:0:4365 +13569:2:2226 +13570:0:4365 +13571:3:4070 +13572:0:4365 +13573:2:1936 +13574:0:4365 +13575:2:2129 +13576:0:4365 +13577:2:2130 +13578:0:4365 +13579:2:2134 +13580:0:4365 +13581:3:4069 +13582:0:4365 +13583:2:2136 +13584:0:4365 +13585:3:4070 +13586:0:4365 +13587:2:2137 +13588:2:2141 +13589:2:2142 +13590:2:2150 +13591:2:2151 +13592:2:2155 +13593:2:2156 +13594:2:2150 +13595:2:2151 +13596:2:2152 +13597:2:2164 +13598:2:2169 +13599:2:2173 +13600:2:2174 +13601:2:2181 +13602:2:2182 +13603:2:2193 +13604:2:2194 +13605:2:2195 +13606:2:2193 +13607:2:2194 +13608:2:2195 +13609:2:2206 +13610:2:2211 +13611:2:2212 +13612:0:4365 +13613:2:2224 +13614:0:4365 +13615:3:4069 +13616:0:4365 +13617:2:2226 +13618:0:4365 +13619:3:4070 +13620:0:4365 +13621:2:2230 +13622:0:4365 +13623:3:4069 +13624:0:4365 +13625:2:2235 +13626:2:2239 +13627:2:2240 +13628:2:2248 +13629:2:2249 +13630:2:2253 +13631:2:2254 +13632:2:2248 +13633:2:2249 +13634:2:2250 +13635:2:2262 +13636:2:2267 +13637:2:2271 +13638:2:2272 +13639:2:2279 +13640:2:2280 +13641:2:2291 +13642:2:2292 +13643:2:2293 +13644:2:2291 +13645:2:2292 +13646:2:2293 +13647:2:2304 +13648:2:2309 +13649:2:2310 +13650:0:4365 +13651:3:4070 +13652:0:4365 +13653:2:2322 +13654:0:4365 +13655:2:1169 +13656:0:4365 +13657:3:4069 +13658:0:4365 +13659:2:1170 +13660:0:4365 +13661:3:4070 +13662:0:4365 +13663:3:4071 +13664:0:4365 +13665:3:4081 +13666:0:4365 +13667:3:3666 +13668:0:4365 +13669:3:3667 +13670:0:4365 +13671:3:3668 +13672:0:4365 +13673:3:3669 +13674:3:3673 +13675:3:3674 +13676:3:3682 +13677:3:3683 +13678:3:3687 +13679:3:3688 +13680:3:3682 +13681:3:3683 +13682:3:3687 +13683:3:3688 +13684:3:3696 +13685:3:3701 +13686:3:3705 +13687:3:3706 +13688:3:3713 +13689:3:3714 +13690:3:3725 +13691:3:3726 +13692:3:3727 +13693:3:3725 +13694:3:3726 +13695:3:3727 +13696:3:3738 +13697:3:3743 +13698:3:3744 +13699:0:4365 +13700:3:3756 +13701:0:4365 +13702:3:3757 +13703:0:4365 +13704:2:1173 +13705:0:4365 +13706:3:3758 +13707:0:4365 +13708:2:1179 +13709:0:4365 +13710:2:1180 +13711:0:4365 +13712:3:3757 +13713:0:4365 +13714:2:1181 +13715:2:1185 +13716:2:1186 +13717:2:1194 +13718:2:1195 +13719:2:1199 +13720:2:1200 +13721:2:1194 +13722:2:1195 +13723:2:1199 +13724:2:1200 +13725:2:1208 +13726:2:1213 +13727:2:1217 +13728:2:1218 +13729:2:1225 +13730:2:1226 +13731:2:1237 +13732:2:1238 +13733:2:1239 +13734:2:1237 +13735:2:1238 +13736:2:1239 +13737:2:1250 +13738:2:1255 +13739:2:1256 +13740:0:4365 +13741:3:3758 +13742:0:4365 +13743:2:1268 +13744:0:4365 +13745:3:3757 +13746:0:4365 +13747:2:1270 +13748:0:4365 +13749:3:3758 +13750:0:4365 +13751:2:1271 +13752:2:1275 +13753:2:1276 +13754:2:1284 +13755:2:1285 +13756:2:1289 +13757:2:1290 +13758:2:1284 +13759:2:1285 +13760:2:1289 +13761:2:1290 +13762:2:1298 +13763:2:1303 +13764:2:1307 +13765:2:1308 +13766:2:1315 +13767:2:1316 +13768:2:1327 +13769:2:1328 +13770:2:1329 +13771:2:1327 +13772:2:1328 +13773:2:1329 +13774:2:1340 +13775:2:1345 +13776:2:1346 +13777:0:4365 +13778:2:1358 +13779:0:4365 +13780:2:1360 +13781:0:4365 +13782:3:3757 +13783:0:4365 +13784:2:1361 +13785:0:4365 +13786:3:3758 +13787:0:4365 +13788:2:1362 +13789:2:1366 +13790:2:1367 +13791:2:1375 +13792:2:1376 +13793:2:1380 +13794:2:1381 +13795:2:1375 +13796:2:1376 +13797:2:1380 +13798:2:1381 +13799:2:1389 +13800:2:1394 +13801:2:1398 +13802:2:1399 +13803:2:1406 +13804:2:1407 +13805:2:1418 +13806:2:1419 +13807:2:1420 +13808:2:1418 +13809:2:1419 +13810:2:1420 +13811:2:1431 +13812:2:1436 +13813:2:1437 +13814:0:4365 +13815:2:1449 +13816:0:4365 +13817:3:3757 +13818:0:4365 +13819:2:1451 +13820:0:4365 +13821:3:3758 +13822:0:4365 +13823:2:1652 +13824:0:4365 +13825:2:1653 +13826:0:4365 +13827:2:1657 +13828:0:4365 +13829:2:1180 +13830:0:4365 +13831:3:3757 +13832:0:4365 +13833:2:1181 +13834:2:1185 +13835:2:1186 +13836:2:1194 +13837:2:1195 +13838:2:1199 +13839:2:1200 +13840:2:1194 +13841:2:1195 +13842:2:1196 +13843:2:1208 +13844:2:1213 +13845:2:1217 +13846:2:1218 +13847:2:1225 +13848:2:1226 +13849:2:1237 +13850:2:1238 +13851:2:1239 +13852:2:1237 +13853:2:1238 +13854:2:1239 +13855:2:1250 +13856:2:1255 +13857:2:1256 +13858:0:4365 +13859:3:3758 +13860:0:4365 +13861:2:1268 +13862:0:4365 +13863:3:3757 +13864:0:4365 +13865:2:1270 +13866:0:4365 +13867:3:3758 +13868:0:4365 +13869:2:1271 +13870:2:1275 +13871:2:1276 +13872:2:1284 +13873:2:1285 +13874:2:1289 +13875:2:1290 +13876:2:1284 +13877:2:1285 +13878:2:1289 +13879:2:1290 +13880:2:1298 +13881:2:1303 +13882:2:1307 +13883:2:1308 +13884:2:1315 +13885:2:1316 +13886:2:1327 +13887:2:1328 +13888:2:1329 +13889:2:1327 +13890:2:1328 +13891:2:1329 +13892:2:1340 +13893:2:1345 +13894:2:1346 +13895:0:4365 +13896:2:1358 +13897:0:4365 +13898:2:1454 +13899:0:4365 +13900:3:3757 +13901:0:4365 +13902:2:1455 +13903:0:4365 +13904:3:3758 +13905:0:4365 +13906:2:1652 +13907:0:4365 +13908:2:1653 +13909:0:4365 +13910:2:1657 +13911:0:4365 +13912:2:1660 +13913:0:4365 +13914:3:3757 +13915:0:4365 +13916:2:1665 +13917:2:1669 +13918:2:1670 +13919:2:1678 +13920:2:1679 +13921:2:1683 +13922:2:1684 +13923:2:1678 +13924:2:1679 +13925:2:1680 +13926:2:1692 +13927:2:1697 +13928:2:1701 +13929:2:1702 +13930:2:1709 +13931:2:1710 +13932:2:1721 +13933:2:1722 +13934:2:1723 +13935:2:1721 +13936:2:1722 +13937:2:1723 +13938:2:1734 +13939:2:1739 +13940:2:1740 +13941:0:4365 +13942:3:3758 +13943:0:4365 +13944:2:1752 +13945:0:4365 +13946:3:3757 +13947:0:4365 +13948:2:1754 +13949:0:4365 +13950:3:3758 +13951:0:4365 +13952:2:1755 +13953:2:1759 +13954:2:1760 +13955:2:1768 +13956:2:1769 +13957:2:1773 +13958:2:1774 +13959:2:1768 +13960:2:1769 +13961:2:1773 +13962:2:1774 +13963:2:1782 +13964:2:1787 +13965:2:1791 +13966:2:1792 +13967:2:1799 +13968:2:1800 +13969:2:1811 +13970:2:1812 +13971:2:1813 +13972:2:1811 +13973:2:1812 +13974:2:1813 +13975:2:1824 +13976:2:1829 +13977:2:1830 +13978:0:4365 +13979:2:1842 +13980:0:4365 +13981:3:3757 +13982:0:4365 +13983:2:1844 +13984:0:4365 +13985:3:3758 +13986:0:4365 +13987:2:1845 +13988:2:1849 +13989:2:1850 +13990:2:1858 +13991:2:1859 +13992:2:1863 +13993:2:1864 +13994:2:1858 +13995:2:1859 +13996:2:1863 +13997:2:1864 +13998:2:1872 +13999:2:1877 +14000:2:1881 +14001:2:1882 +14002:2:1889 +14003:2:1890 +14004:2:1901 +14005:2:1902 +14006:2:1903 +14007:2:1901 +14008:2:1902 +14009:2:1903 +14010:2:1914 +14011:2:1919 +14012:2:1920 +14013:0:4365 +14014:2:1932 +14015:0:4365 +14016:3:3757 +14017:0:4365 +14018:2:1934 +14019:0:4365 +14020:3:3758 +14021:0:4365 +14022:2:1935 +14023:0:4365 +14024:2:1936 +14025:0:4365 +14026:2:2129 +14027:0:4365 +14028:2:2130 +14029:0:4365 +14030:2:2134 +14031:0:4365 +14032:3:3757 +14033:0:4365 +14034:2:2136 +14035:0:4365 +14036:3:3758 +14037:0:4365 +14038:2:2137 +14039:2:2141 +14040:2:2142 +14041:2:2150 +14042:2:2151 +14043:2:2155 +14044:2:2156 +14045:2:2150 +14046:2:2151 +14047:2:2155 +14048:2:2156 +14049:2:2164 +14050:2:2169 +14051:2:2173 +14052:2:2174 +14053:2:2181 +14054:2:2182 +14055:2:2193 +14056:2:2194 +14057:2:2195 +14058:2:2193 +14059:2:2194 +14060:2:2195 +14061:2:2206 +14062:2:2211 +14063:2:2212 +14064:0:4365 +14065:2:2224 +14066:0:4365 +14067:3:3757 +14068:0:4365 +14069:2:2226 +14070:0:4365 +14071:3:3758 +14072:0:4365 +14073:2:1936 +14074:0:4365 +14075:2:2129 +14076:0:4365 +14077:2:2130 +14078:0:4365 +14079:2:2134 +14080:0:4365 +14081:3:3757 +14082:0:4365 +14083:2:2136 +14084:0:4365 +14085:3:3758 +14086:0:4365 +14087:2:2137 +14088:2:2141 +14089:2:2142 +14090:2:2150 +14091:2:2151 +14092:2:2155 +14093:2:2156 +14094:2:2150 +14095:2:2151 +14096:2:2152 +14097:2:2164 +14098:2:2169 +14099:2:2173 +14100:2:2174 +14101:2:2181 +14102:2:2182 +14103:2:2193 +14104:2:2194 +14105:2:2195 +14106:2:2193 +14107:2:2194 +14108:2:2195 +14109:2:2206 +14110:2:2211 +14111:2:2212 +14112:0:4365 +14113:2:2224 +14114:0:4365 +14115:3:3757 +14116:0:4365 +14117:2:2226 +14118:0:4365 +14119:3:3758 +14120:0:4365 +14121:2:2230 +14122:0:4365 +14123:3:3757 +14124:0:4365 +14125:2:2235 +14126:2:2239 +14127:2:2240 +14128:2:2248 +14129:2:2249 +14130:2:2253 +14131:2:2254 +14132:2:2248 +14133:2:2249 +14134:2:2250 +14135:2:2262 +14136:2:2267 +14137:2:2271 +14138:2:2272 +14139:2:2279 +14140:2:2280 +14141:2:2291 +14142:2:2292 +14143:2:2293 +14144:2:2291 +14145:2:2292 +14146:2:2293 +14147:2:2304 +14148:2:2309 +14149:2:2310 +14150:0:4365 +14151:3:3758 +14152:0:4365 +14153:2:2322 +14154:0:4365 +14155:2:1169 +14156:0:4365 +14157:3:3757 +14158:0:4365 +14159:2:1170 +14160:0:4365 +14161:3:3758 +14162:0:4365 +14163:3:3759 +14164:0:4365 +14165:3:3972 +14166:0:4365 +14167:3:4077 +14168:0:4365 +14169:3:4078 +14170:0:4365 +14171:3:4082 +14172:0:4365 +14173:3:4088 +14174:0:4365 +14175:3:4092 +14176:3:4093 +14177:3:4097 +14178:3:4101 +14179:3:4102 +14180:3:4097 +14181:3:4101 +14182:3:4102 +14183:3:4106 +14184:3:4114 +14185:3:4115 +14186:3:4120 +14187:3:4127 +14188:3:4128 +14189:3:4127 +14190:3:4128 +14191:3:4135 +14192:3:4140 +14193:0:4365 +14194:3:4151 +14195:0:4365 +14196:3:4155 +14197:3:4156 +14198:3:4160 +14199:3:4164 +14200:3:4165 +14201:3:4160 +14202:3:4164 +14203:3:4165 +14204:3:4169 +14205:3:4177 +14206:3:4178 +14207:3:4183 +14208:3:4190 +14209:3:4191 +14210:3:4190 +14211:3:4191 +14212:3:4198 +14213:3:4203 +14214:0:4365 +14215:3:4151 +14216:0:4365 +14217:3:4155 +14218:3:4156 +14219:3:4160 +14220:3:4164 +14221:3:4165 +14222:3:4160 +14223:3:4164 +14224:3:4165 +14225:3:4169 +14226:3:4177 +14227:3:4178 +14228:3:4183 +14229:3:4190 +14230:3:4191 +14231:3:4190 +14232:3:4191 +14233:3:4198 +14234:3:4203 +14235:0:4365 +14236:3:4214 +14237:0:4365 +14238:3:4222 +14239:3:4223 +14240:3:4227 +14241:3:4231 +14242:3:4232 +14243:3:4227 +14244:3:4231 +14245:3:4232 +14246:3:4236 +14247:3:4244 +14248:3:4245 +14249:3:4250 +14250:3:4257 +14251:3:4258 +14252:3:4257 +14253:3:4258 +14254:3:4265 +14255:3:4270 +14256:0:4365 +14257:3:4285 +14258:0:4365 +14259:3:4286 +14260:0:4365 +14261:2:1173 +14262:0:4365 +14263:3:4287 +14264:0:4365 +14265:2:1179 +14266:0:4365 +14267:2:1180 +14268:0:4365 +14269:3:4286 +14270:0:4365 +14271:2:1181 +14272:2:1185 +14273:2:1186 +14274:2:1194 +14275:2:1195 +14276:2:1199 +14277:2:1200 +14278:2:1194 +14279:2:1195 +14280:2:1199 +14281:2:1200 +14282:2:1208 +14283:2:1213 +14284:2:1217 +14285:2:1218 +14286:2:1225 +14287:2:1226 +14288:2:1237 +14289:2:1238 +14290:2:1239 +14291:2:1237 +14292:2:1238 +14293:2:1239 +14294:2:1250 +14295:2:1255 +14296:2:1256 +14297:0:4365 +14298:3:4287 +14299:0:4365 +14300:2:1268 +14301:0:4365 +14302:3:4286 +14303:0:4365 +14304:2:1270 +14305:0:4365 +14306:3:4287 +14307:0:4365 +14308:2:1271 +14309:2:1275 +14310:2:1276 +14311:2:1284 +14312:2:1285 +14313:2:1289 +14314:2:1290 +14315:2:1284 +14316:2:1285 +14317:2:1289 +14318:2:1290 +14319:2:1298 +14320:2:1303 +14321:2:1307 +14322:2:1308 +14323:2:1315 +14324:2:1316 +14325:2:1327 +14326:2:1328 +14327:2:1329 +14328:2:1327 +14329:2:1328 +14330:2:1329 +14331:2:1340 +14332:2:1345 +14333:2:1346 +14334:0:4365 +14335:2:1358 +14336:0:4365 +14337:2:1360 +14338:0:4365 +14339:3:4286 +14340:0:4365 +14341:2:1361 +14342:0:4365 +14343:3:4287 +14344:0:4365 +14345:2:1362 +14346:2:1366 +14347:2:1367 +14348:2:1375 +14349:2:1376 +14350:2:1380 +14351:2:1381 +14352:2:1375 +14353:2:1376 +14354:2:1380 +14355:2:1381 +14356:2:1389 +14357:2:1394 +14358:2:1398 +14359:2:1399 +14360:2:1406 +14361:2:1407 +14362:2:1418 +14363:2:1419 +14364:2:1420 +14365:2:1418 +14366:2:1419 +14367:2:1420 +14368:2:1431 +14369:2:1436 +14370:2:1437 +14371:0:4365 +14372:2:1449 +14373:0:4365 +14374:3:4286 +14375:0:4365 +14376:2:1451 +14377:0:4365 +14378:3:4287 +14379:0:4365 +14380:2:1652 +14381:0:4365 +14382:2:1653 +14383:0:4365 +14384:2:1657 +14385:0:4365 +14386:2:1180 +14387:0:4365 +14388:3:4286 +14389:0:4365 +14390:2:1181 +14391:2:1185 +14392:2:1186 +14393:2:1194 +14394:2:1195 +14395:2:1199 +14396:2:1200 +14397:2:1194 +14398:2:1195 +14399:2:1196 +14400:2:1208 +14401:2:1213 +14402:2:1217 +14403:2:1218 +14404:2:1225 +14405:2:1226 +14406:2:1237 +14407:2:1238 +14408:2:1239 +14409:2:1237 +14410:2:1238 +14411:2:1239 +14412:2:1250 +14413:2:1255 +14414:2:1256 +14415:0:4365 +14416:3:4287 +14417:0:4365 +14418:2:1268 +14419:0:4365 +14420:3:4286 +14421:0:4365 +14422:2:1270 +14423:0:4365 +14424:3:4287 +14425:0:4365 +14426:2:1271 +14427:2:1275 +14428:2:1276 +14429:2:1284 +14430:2:1285 +14431:2:1289 +14432:2:1290 +14433:2:1284 +14434:2:1285 +14435:2:1289 +14436:2:1290 +14437:2:1298 +14438:2:1303 +14439:2:1307 +14440:2:1308 +14441:2:1315 +14442:2:1316 +14443:2:1327 +14444:2:1328 +14445:2:1329 +14446:2:1327 +14447:2:1328 +14448:2:1329 +14449:2:1340 +14450:2:1345 +14451:2:1346 +14452:0:4365 +14453:2:1358 +14454:0:4365 +14455:2:1454 +14456:0:4365 +14457:3:4286 +14458:0:4365 +14459:2:1455 +14460:0:4365 +14461:3:4287 +14462:0:4365 +14463:2:1652 +14464:0:4365 +14465:2:1653 +14466:0:4365 +14467:2:1657 +14468:0:4365 +14469:2:1660 +14470:0:4365 +14471:3:4286 +14472:0:4365 +14473:2:1665 +14474:2:1669 +14475:2:1670 +14476:2:1678 +14477:2:1679 +14478:2:1683 +14479:2:1684 +14480:2:1678 +14481:2:1679 +14482:2:1680 +14483:2:1692 +14484:2:1697 +14485:2:1701 +14486:2:1702 +14487:2:1709 +14488:2:1710 +14489:2:1721 +14490:2:1722 +14491:2:1723 +14492:2:1721 +14493:2:1722 +14494:2:1723 +14495:2:1734 +14496:2:1739 +14497:2:1740 +14498:0:4365 +14499:3:4287 +14500:0:4365 +14501:2:1752 +14502:0:4365 +14503:3:4286 +14504:0:4365 +14505:2:1754 +14506:0:4365 +14507:3:4287 +14508:0:4365 +14509:2:1755 +14510:2:1759 +14511:2:1760 +14512:2:1768 +14513:2:1769 +14514:2:1773 +14515:2:1774 +14516:2:1768 +14517:2:1769 +14518:2:1773 +14519:2:1774 +14520:2:1782 +14521:2:1787 +14522:2:1791 +14523:2:1792 +14524:2:1799 +14525:2:1800 +14526:2:1811 +14527:2:1812 +14528:2:1813 +14529:2:1811 +14530:2:1812 +14531:2:1813 +14532:2:1824 +14533:2:1829 +14534:2:1830 +14535:0:4365 +14536:2:1842 +14537:0:4365 +14538:3:4286 +14539:0:4365 +14540:2:1844 +14541:0:4365 +14542:3:4287 +14543:0:4365 +14544:2:1845 +14545:2:1849 +14546:2:1850 +14547:2:1858 +14548:2:1859 +14549:2:1863 +14550:2:1864 +14551:2:1858 +14552:2:1859 +14553:2:1863 +14554:2:1864 +14555:2:1872 +14556:2:1877 +14557:2:1881 +14558:2:1882 +14559:2:1889 +14560:2:1890 +14561:2:1901 +14562:2:1902 +14563:2:1903 +14564:2:1901 +14565:2:1902 +14566:2:1903 +14567:2:1914 +14568:2:1919 +14569:2:1920 +14570:0:4365 +14571:2:1932 +14572:0:4365 +14573:3:4286 +14574:0:4365 +14575:2:1934 +14576:0:4365 +14577:3:4287 +14578:0:4365 +14579:2:1935 +14580:0:4365 +14581:2:1936 +14582:0:4365 +14583:2:2129 +14584:0:4365 +14585:2:2130 +14586:0:4365 +14587:2:2134 +14588:0:4365 +14589:3:4286 +14590:0:4365 +14591:2:2136 +14592:0:4365 +14593:3:4287 +14594:0:4365 +14595:2:2137 +14596:2:2141 +14597:2:2142 +14598:2:2150 +14599:2:2151 +14600:2:2155 +14601:2:2156 +14602:2:2150 +14603:2:2151 +14604:2:2155 +14605:2:2156 +14606:2:2164 +14607:2:2169 +14608:2:2173 +14609:2:2174 +14610:2:2181 +14611:2:2182 +14612:2:2193 +14613:2:2194 +14614:2:2195 +14615:2:2193 +14616:2:2194 +14617:2:2195 +14618:2:2206 +14619:2:2211 +14620:2:2212 +14621:0:4365 +14622:2:2224 +14623:0:4365 +14624:3:4286 +14625:0:4365 +14626:2:2226 +14627:0:4365 +14628:3:4287 +14629:0:4365 +14630:2:1936 +14631:0:4365 +14632:2:2129 +14633:0:4365 +14634:2:2130 +14635:0:4365 +14636:2:2134 +14637:0:4365 +14638:3:4286 +14639:0:4365 +14640:2:2136 +14641:0:4365 +14642:3:4287 +14643:0:4365 +14644:2:2137 +14645:2:2141 +14646:2:2142 +14647:2:2150 +14648:2:2151 +14649:2:2155 +14650:2:2156 +14651:2:2150 +14652:2:2151 +14653:2:2152 +14654:2:2164 +14655:2:2169 +14656:2:2173 +14657:2:2174 +14658:2:2181 +14659:2:2182 +14660:2:2193 +14661:2:2194 +14662:2:2195 +14663:2:2193 +14664:2:2194 +14665:2:2195 +14666:2:2206 +14667:2:2211 +14668:2:2212 +14669:0:4365 +14670:2:2224 +14671:0:4365 +14672:3:4286 +14673:0:4365 +14674:2:2226 +14675:0:4365 +14676:3:4287 +14677:0:4365 +14678:2:2230 +14679:0:4365 +14680:3:4286 +14681:0:4365 +14682:2:2235 +14683:2:2239 +14684:2:2240 +14685:2:2248 +14686:2:2249 +14687:2:2253 +14688:2:2254 +14689:2:2248 +14690:2:2249 +14691:2:2250 +14692:2:2262 +14693:2:2267 +14694:2:2271 +14695:2:2272 +14696:2:2279 +14697:2:2280 +14698:2:2291 +14699:2:2292 +14700:2:2293 +14701:2:2291 +14702:2:2292 +14703:2:2293 +14704:2:2304 +14705:2:2309 +14706:2:2310 +14707:0:4365 +14708:3:4287 +14709:0:4365 +14710:2:2322 +14711:0:4365 +14712:2:1169 +14713:0:4365 +14714:3:4286 +14715:0:4365 +14716:2:1170 +14717:0:4365 +14718:3:4287 +14719:0:4365 +14720:3:4288 +14721:0:4365 +14722:3:4294 +14723:0:4365 +14724:3:4295 +14725:0:4365 +14726:3:2338 +14727:0:4365 +14728:3:2339 +14729:3:2343 +14730:3:2344 +14731:3:2352 +14732:3:2353 +14733:3:2357 +14734:3:2358 +14735:3:2352 +14736:3:2353 +14737:3:2357 +14738:3:2358 +14739:3:2366 +14740:3:2371 +14741:3:2375 +14742:3:2376 +14743:3:2383 +14744:3:2384 +14745:3:2395 +14746:3:2396 +14747:3:2397 +14748:3:2395 +14749:3:2396 +14750:3:2397 +14751:3:2408 +14752:3:2413 +14753:3:2414 +14754:0:4365 +14755:3:2426 +14756:0:4365 +14757:3:2427 +14758:0:4365 +14759:2:1173 +14760:0:4365 +14761:3:2428 +14762:0:4365 +14763:2:1179 +14764:0:4365 +14765:2:1180 +14766:0:4365 +14767:3:2427 +14768:0:4365 +14769:2:1181 +14770:2:1185 +14771:2:1186 +14772:2:1194 +14773:2:1195 +14774:2:1199 +14775:2:1200 +14776:2:1194 +14777:2:1195 +14778:2:1199 +14779:2:1200 +14780:2:1208 +14781:2:1213 +14782:2:1217 +14783:2:1218 +14784:2:1225 +14785:2:1226 +14786:2:1237 +14787:2:1238 +14788:2:1239 +14789:2:1237 +14790:2:1238 +14791:2:1239 +14792:2:1250 +14793:2:1255 +14794:2:1256 +14795:0:4365 +14796:3:2428 +14797:0:4365 +14798:2:1268 +14799:0:4365 +14800:3:2427 +14801:0:4365 +14802:2:1270 +14803:0:4365 +14804:3:2428 +14805:0:4365 +14806:2:1271 +14807:2:1275 +14808:2:1276 +14809:2:1284 +14810:2:1285 +14811:2:1289 +14812:2:1290 +14813:2:1284 +14814:2:1285 +14815:2:1289 +14816:2:1290 +14817:2:1298 +14818:2:1303 +14819:2:1307 +14820:2:1308 +14821:2:1315 +14822:2:1316 +14823:2:1327 +14824:2:1328 +14825:2:1329 +14826:2:1327 +14827:2:1328 +14828:2:1329 +14829:2:1340 +14830:2:1345 +14831:2:1346 +14832:0:4365 +14833:2:1358 +14834:0:4365 +14835:2:1360 +14836:0:4365 +14837:3:2427 +14838:0:4365 +14839:2:1361 +14840:0:4365 +14841:3:2428 +14842:0:4365 +14843:2:1362 +14844:2:1366 +14845:2:1367 +14846:2:1375 +14847:2:1376 +14848:2:1380 +14849:2:1381 +14850:2:1375 +14851:2:1376 +14852:2:1380 +14853:2:1381 +14854:2:1389 +14855:2:1394 +14856:2:1398 +14857:2:1399 +14858:2:1406 +14859:2:1407 +14860:2:1418 +14861:2:1419 +14862:2:1420 +14863:2:1418 +14864:2:1419 +14865:2:1420 +14866:2:1431 +14867:2:1436 +14868:2:1437 +14869:0:4365 +14870:2:1449 +14871:0:4365 +14872:3:2427 +14873:0:4365 +14874:2:1451 +14875:0:4365 +14876:3:2428 +14877:0:4365 +14878:2:1652 +14879:0:4365 +14880:2:1653 +14881:0:4365 +14882:2:1657 +14883:0:4365 +14884:2:1180 +14885:0:4365 +14886:3:2427 +14887:0:4365 +14888:2:1181 +14889:2:1185 +14890:2:1186 +14891:2:1194 +14892:2:1195 +14893:2:1199 +14894:2:1200 +14895:2:1194 +14896:2:1195 +14897:2:1196 +14898:2:1208 +14899:2:1213 +14900:2:1217 +14901:2:1218 +14902:2:1225 +14903:2:1226 +14904:2:1237 +14905:2:1238 +14906:2:1239 +14907:2:1237 +14908:2:1238 +14909:2:1239 +14910:2:1250 +14911:2:1255 +14912:2:1256 +14913:0:4365 +14914:3:2428 +14915:0:4365 +14916:2:1268 +14917:0:4365 +14918:3:2427 +14919:0:4365 +14920:2:1270 +14921:0:4365 +14922:3:2428 +14923:0:4365 +14924:2:1271 +14925:2:1275 +14926:2:1276 +14927:2:1284 +14928:2:1285 +14929:2:1289 +14930:2:1290 +14931:2:1284 +14932:2:1285 +14933:2:1289 +14934:2:1290 +14935:2:1298 +14936:2:1303 +14937:2:1307 +14938:2:1308 +14939:2:1315 +14940:2:1316 +14941:2:1327 +14942:2:1328 +14943:2:1329 +14944:2:1327 +14945:2:1328 +14946:2:1329 +14947:2:1340 +14948:2:1345 +14949:2:1346 +14950:0:4365 +14951:2:1358 +14952:0:4365 +14953:2:1454 +14954:0:4365 +14955:3:2427 +14956:0:4365 +14957:2:1455 +14958:0:4365 +14959:3:2428 +14960:0:4365 +14961:2:1652 +14962:0:4365 +14963:2:1653 +14964:0:4365 +14965:2:1657 +14966:0:4365 +14967:2:1660 +14968:0:4365 +14969:3:2427 +14970:0:4365 +14971:2:1665 +14972:2:1669 +14973:2:1670 +14974:2:1678 +14975:2:1679 +14976:2:1683 +14977:2:1684 +14978:2:1678 +14979:2:1679 +14980:2:1680 +14981:2:1692 +14982:2:1697 +14983:2:1701 +14984:2:1702 +14985:2:1709 +14986:2:1710 +14987:2:1721 +14988:2:1722 +14989:2:1723 +14990:2:1721 +14991:2:1722 +14992:2:1723 +14993:2:1734 +14994:2:1739 +14995:2:1740 +14996:0:4365 +14997:3:2428 +14998:0:4365 +14999:2:1752 +15000:0:4365 +15001:3:2427 +15002:0:4365 +15003:2:1754 +15004:0:4365 +15005:3:2428 +15006:0:4365 +15007:2:1755 +15008:2:1759 +15009:2:1760 +15010:2:1768 +15011:2:1769 +15012:2:1773 +15013:2:1774 +15014:2:1768 +15015:2:1769 +15016:2:1773 +15017:2:1774 +15018:2:1782 +15019:2:1787 +15020:2:1791 +15021:2:1792 +15022:2:1799 +15023:2:1800 +15024:2:1811 +15025:2:1812 +15026:2:1813 +15027:2:1811 +15028:2:1812 +15029:2:1813 +15030:2:1824 +15031:2:1829 +15032:2:1830 +15033:0:4365 +15034:2:1842 +15035:0:4365 +15036:3:2427 +15037:0:4365 +15038:2:1844 +15039:0:4363 +15040:3:2428 +15041:0:4369 diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.define b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.define new file mode 100644 index 0000000..136ef67 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.define @@ -0,0 +1,2 @@ +#define NO_RMB +#define NO_WMB diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.log b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.log new file mode 100644 index 0000000..27a963a --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.log @@ -0,0 +1,267 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_free_no_mb.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 745) +Depth= 11386 States= 1e+06 Transitions= 1.56e+07 Memory= 527.287 t= 12.8 R= 8e+04 +pan: claim violated! (at depth 2146) +pan: wrote .input.spin.trail + +(Spin Version 5.1.7 -- 23 December 2008) +Warning: Search not completed + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 72 byte, depth reached 11386, errors: 1 + 1223588 states, stored + 17987399 states, matched + 19210987 transitions (= stored+matched) + 70012127 atomic steps +hash conflicts: 4173157 (resolved) + +Stats on memory usage (in Megabytes): + 116.690 equivalent memory usage for states (stored*(State-vector + overhead)) + 75.177 actual memory usage for states (compression: 64.42%) + state-vector as stored = 36 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 540.861 total actual memory usage + +unreached in proctype urcu_reader + line 400, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 61, "(1)" + line 419, "pan.___", state 91, "(1)" + line 400, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 151, "(1)" + line 419, "pan.___", state 181, "(1)" + line 400, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 242, "(1)" + line 419, "pan.___", state 272, "(1)" + line 400, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 331, "(1)" + line 409, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 360, "(1)" + line 419, "pan.___", state 390, "(1)" + line 541, "pan.___", state 414, "-end-" + (18 of 414 states) +unreached in proctype urcu_writer + line 400, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 20, "(1)" + line 404, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 34, "(1)" + line 404, "pan.___", state 35, "(1)" + line 404, "pan.___", state 35, "(1)" + line 402, "pan.___", state 40, "((i<1))" + line 402, "pan.___", state 40, "((i>=1))" + line 409, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 59, "(1)" + line 410, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 60, "else" + line 410, "pan.___", state 63, "(1)" + line 410, "pan.___", state 64, "(1)" + line 410, "pan.___", state 64, "(1)" + line 414, "pan.___", state 72, "(1)" + line 414, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 73, "else" + line 414, "pan.___", state 76, "(1)" + line 414, "pan.___", state 77, "(1)" + line 414, "pan.___", state 77, "(1)" + line 412, "pan.___", state 82, "((i<1))" + line 412, "pan.___", state 82, "((i>=1))" + line 419, "pan.___", state 89, "(1)" + line 419, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 90, "else" + line 419, "pan.___", state 93, "(1)" + line 419, "pan.___", state 94, "(1)" + line 419, "pan.___", state 94, "(1)" + line 421, "pan.___", state 97, "(1)" + line 421, "pan.___", state 97, "(1)" + line 370, "pan.___", state 99, "(1)" + line 640, "pan.___", state 103, "cached_generation_ptr.val[_pid] = (old_gen+1)" + line 638, "pan.___", state 104, "old_gen = cached_generation_ptr.val[_pid]" + line 400, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 114, "(1)" + line 404, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 128, "(1)" + line 404, "pan.___", state 129, "(1)" + line 404, "pan.___", state 129, "(1)" + line 410, "pan.___", state 153, "(1)" + line 414, "pan.___", state 166, "(1)" + line 421, "pan.___", state 191, "(1)" + line 421, "pan.___", state 191, "(1)" + line 653, "pan.___", state 199, "(1)" + line 400, "pan.___", state 209, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 223, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 254, "(1)" + line 414, "pan.___", state 267, "(1)" + line 400, "pan.___", state 300, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 314, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 345, "(1)" + line 414, "pan.___", state 358, "(1)" + line 400, "pan.___", state 395, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 409, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 440, "(1)" + line 414, "pan.___", state 453, "(1)" + line 400, "pan.___", state 488, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 502, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 533, "(1)" + line 414, "pan.___", state 546, "(1)" + line 400, "pan.___", state 582, "(1)" + line 404, "pan.___", state 594, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 638, "(1)" + line 404, "pan.___", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 731, "(1)" + line 404, "pan.___", state 777, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 795, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 821, "(1)" + line 419, "pan.___", state 838, "(1)" + line 404, "pan.___", state 868, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 886, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 912, "(1)" + line 419, "pan.___", state 929, "(1)" + line 404, "pan.___", state 963, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 981, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 1007, "(1)" + line 419, "pan.___", state 1024, "(1)" + line 400, "pan.___", state 1050, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 1052, "(1)" + line 400, "pan.___", state 1053, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 400, "pan.___", state 1053, "else" + line 400, "pan.___", state 1056, "(1)" + line 404, "pan.___", state 1064, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 1066, "(1)" + line 404, "pan.___", state 1067, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 404, "pan.___", state 1067, "else" + line 404, "pan.___", state 1070, "(1)" + line 404, "pan.___", state 1071, "(1)" + line 404, "pan.___", state 1071, "(1)" + line 402, "pan.___", state 1076, "((i<1))" + line 402, "pan.___", state 1076, "((i>=1))" + line 409, "pan.___", state 1082, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 1095, "(1)" + line 410, "pan.___", state 1096, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 1096, "else" + line 410, "pan.___", state 1099, "(1)" + line 410, "pan.___", state 1100, "(1)" + line 410, "pan.___", state 1100, "(1)" + line 414, "pan.___", state 1108, "(1)" + line 414, "pan.___", state 1109, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 1109, "else" + line 414, "pan.___", state 1112, "(1)" + line 414, "pan.___", state 1113, "(1)" + line 414, "pan.___", state 1113, "(1)" + line 412, "pan.___", state 1118, "((i<1))" + line 412, "pan.___", state 1118, "((i>=1))" + line 419, "pan.___", state 1125, "(1)" + line 419, "pan.___", state 1126, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 1126, "else" + line 419, "pan.___", state 1129, "(1)" + line 419, "pan.___", state 1130, "(1)" + line 419, "pan.___", state 1130, "(1)" + line 421, "pan.___", state 1133, "(1)" + line 421, "pan.___", state 1133, "(1)" + line 404, "pan.___", state 1164, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 1208, "(1)" + line 404, "pan.___", state 1254, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 1298, "(1)" + line 400, "pan.___", state 1334, "(1)" + line 404, "pan.___", state 1346, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 1390, "(1)" + line 404, "pan.___", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 1483, "(1)" + line 404, "pan.___", state 1529, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 1547, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 1573, "(1)" + line 419, "pan.___", state 1590, "(1)" + line 404, "pan.___", state 1620, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 1638, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 1664, "(1)" + line 419, "pan.___", state 1681, "(1)" + line 404, "pan.___", state 1715, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 1733, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 1759, "(1)" + line 419, "pan.___", state 1776, "(1)" + line 400, "pan.___", state 1802, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 1804, "(1)" + line 400, "pan.___", state 1805, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 400, "pan.___", state 1805, "else" + line 400, "pan.___", state 1808, "(1)" + line 404, "pan.___", state 1816, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 1818, "(1)" + line 404, "pan.___", state 1819, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 404, "pan.___", state 1819, "else" + line 404, "pan.___", state 1822, "(1)" + line 404, "pan.___", state 1823, "(1)" + line 404, "pan.___", state 1823, "(1)" + line 402, "pan.___", state 1828, "((i<1))" + line 402, "pan.___", state 1828, "((i>=1))" + line 409, "pan.___", state 1834, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 1847, "(1)" + line 410, "pan.___", state 1848, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 1848, "else" + line 410, "pan.___", state 1851, "(1)" + line 410, "pan.___", state 1852, "(1)" + line 410, "pan.___", state 1852, "(1)" + line 414, "pan.___", state 1860, "(1)" + line 414, "pan.___", state 1861, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 1861, "else" + line 414, "pan.___", state 1864, "(1)" + line 414, "pan.___", state 1865, "(1)" + line 414, "pan.___", state 1865, "(1)" + line 412, "pan.___", state 1870, "((i<1))" + line 412, "pan.___", state 1870, "((i>=1))" + line 419, "pan.___", state 1877, "(1)" + line 419, "pan.___", state 1878, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 1878, "else" + line 419, "pan.___", state 1881, "(1)" + line 419, "pan.___", state 1882, "(1)" + line 419, "pan.___", state 1882, "(1)" + line 421, "pan.___", state 1885, "(1)" + line 421, "pan.___", state 1885, "(1)" + line 404, "pan.___", state 1916, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 1960, "(1)" + line 404, "pan.___", state 2007, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 2051, "(1)" + line 404, "pan.___", state 2102, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 2146, "(1)" + line 703, "pan.___", state 2192, "-end-" + (144 of 2192 states) +unreached in proctype :init: + line 710, "pan.___", state 9, "((j<2))" + line 710, "pan.___", state 9, "((j>=2))" + line 711, "pan.___", state 20, "((j<2))" + line 711, "pan.___", state 20, "((j>=2))" + line 716, "pan.___", state 33, "((j<2))" + line 716, "pan.___", state 33, "((j>=2))" + (3 of 46 states) +unreached in proctype :never: + line 750, "pan.___", state 8, "-end-" + (1 of 8 states) + +pan: elapsed time 15.9 seconds +pan: rate 77100.693 states/second +pan: avg transition delay 8.2609e-07 usec +cp .input.spin urcu_free_no_mb.spin.input +cp .input.spin.trail urcu_free_no_mb.spin.input.trail +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.spin.input b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.spin.input new file mode 100644 index 0000000..927df3f --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.spin.input @@ -0,0 +1,724 @@ +#define NO_RMB +#define NO_WMB + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +//#define TEST_SIGNAL +//#define TEST_SIGNAL_ON_READ +//#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +//#define READER_NEST_LEVEL 1 +#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.spin.input.trail b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.spin.input.trail new file mode 100644 index 0000000..04e7425 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.spin.input.trail @@ -0,0 +1,2149 @@ +-2:3:-2 +-4:-4:-4 +1:0:2654 +2:3:2606 +3:3:2609 +4:3:2609 +5:3:2612 +6:3:2620 +7:3:2620 +8:3:2623 +9:3:2629 +10:3:2633 +11:3:2633 +12:3:2636 +13:3:2644 +14:3:2648 +15:3:2649 +16:0:2654 +17:3:2651 +18:0:2654 +19:2:416 +20:0:2654 +21:2:422 +22:0:2654 +23:2:423 +24:0:2654 +25:2:424 +26:2:428 +27:2:429 +28:2:437 +29:2:438 +30:2:442 +31:2:443 +32:2:451 +33:2:456 +34:2:460 +35:2:461 +36:2:468 +37:2:469 +38:2:480 +39:2:481 +40:2:482 +41:2:493 +42:2:498 +43:2:499 +44:0:2654 +45:2:511 +46:0:2654 +47:2:513 +48:2:514 +49:0:2654 +50:2:518 +51:2:522 +52:2:523 +53:2:531 +54:2:532 +55:2:536 +56:2:537 +57:2:545 +58:2:550 +59:2:551 +60:2:562 +61:2:563 +62:2:574 +63:2:575 +64:2:576 +65:2:587 +66:2:592 +67:2:593 +68:0:2654 +69:2:605 +70:0:2654 +71:2:607 +72:0:2654 +73:2:608 +74:0:2654 +75:2:618 +76:0:2654 +77:2:619 +78:2:623 +79:2:624 +80:2:632 +81:2:633 +82:2:637 +83:2:638 +84:2:646 +85:2:651 +86:2:655 +87:2:656 +88:2:663 +89:2:664 +90:2:675 +91:2:676 +92:2:677 +93:2:688 +94:2:693 +95:2:694 +96:0:2654 +97:2:709 +98:0:2654 +99:2:710 +100:2:714 +101:2:715 +102:2:723 +103:2:724 +104:2:728 +105:2:729 +106:2:737 +107:2:742 +108:2:746 +109:2:747 +110:2:754 +111:2:755 +112:2:766 +113:2:767 +114:2:768 +115:2:779 +116:2:784 +117:2:785 +118:0:2654 +119:2:800 +120:0:2654 +121:2:805 +122:2:809 +123:2:810 +124:2:818 +125:2:819 +126:2:823 +127:2:824 +128:2:832 +129:2:837 +130:2:841 +131:2:842 +132:2:849 +133:2:850 +134:2:861 +135:2:862 +136:2:863 +137:2:874 +138:2:879 +139:2:880 +140:0:2654 +141:2:895 +142:0:2654 +143:2:897 +144:0:2654 +145:2:898 +146:2:902 +147:2:903 +148:2:911 +149:2:912 +150:2:916 +151:2:917 +152:2:925 +153:2:930 +154:2:934 +155:2:935 +156:2:942 +157:2:943 +158:2:954 +159:2:955 +160:2:956 +161:2:967 +162:2:972 +163:2:973 +164:0:2654 +165:2:985 +166:0:2654 +167:2:987 +168:0:2654 +169:2:990 +170:2:991 +171:2:1003 +172:2:1004 +173:2:1008 +174:2:1009 +175:2:1017 +176:2:1022 +177:2:1026 +178:2:1027 +179:2:1034 +180:2:1035 +181:2:1046 +182:2:1047 +183:2:1048 +184:2:1059 +185:2:1064 +186:2:1065 +187:0:2654 +188:2:1077 +189:0:2654 +190:2:1079 +191:0:2654 +192:2:1080 +193:0:2654 +194:2:1081 +195:0:2654 +196:2:1082 +197:0:2654 +198:2:1083 +199:2:1087 +200:2:1088 +201:2:1096 +202:2:1097 +203:2:1101 +204:2:1102 +205:2:1110 +206:2:1115 +207:2:1119 +208:2:1120 +209:2:1127 +210:2:1128 +211:2:1139 +212:2:1140 +213:2:1141 +214:2:1152 +215:2:1157 +216:2:1158 +217:0:2654 +218:2:1170 +219:0:2654 +220:2:1451 +221:0:2654 +222:2:1549 +223:0:2654 +224:2:1550 +225:0:2654 +226:2:1554 +227:0:2654 +228:2:1560 +229:2:1564 +230:2:1565 +231:2:1573 +232:2:1574 +233:2:1578 +234:2:1579 +235:2:1587 +236:2:1592 +237:2:1596 +238:2:1597 +239:2:1604 +240:2:1605 +241:2:1616 +242:2:1617 +243:2:1618 +244:2:1629 +245:2:1634 +246:2:1635 +247:0:2654 +248:2:1647 +249:0:2654 +250:2:1649 +251:0:2654 +252:2:1650 +253:2:1654 +254:2:1655 +255:2:1663 +256:2:1664 +257:2:1668 +258:2:1669 +259:2:1677 +260:2:1682 +261:2:1686 +262:2:1687 +263:2:1694 +264:2:1695 +265:2:1706 +266:2:1707 +267:2:1708 +268:2:1719 +269:2:1724 +270:2:1725 +271:0:2654 +272:2:1737 +273:0:2654 +274:2:1739 +275:0:2654 +276:2:1742 +277:2:1743 +278:2:1755 +279:2:1756 +280:2:1760 +281:2:1761 +282:2:1769 +283:2:1774 +284:2:1778 +285:2:1779 +286:2:1786 +287:2:1787 +288:2:1798 +289:2:1799 +290:2:1800 +291:2:1811 +292:2:1816 +293:2:1817 +294:0:2654 +295:2:1829 +296:0:2654 +297:2:1831 +298:0:2654 +299:2:1832 +300:0:2654 +301:2:1833 +302:0:2654 +303:2:1834 +304:0:2654 +305:2:1835 +306:2:1839 +307:2:1840 +308:2:1848 +309:2:1849 +310:2:1853 +311:2:1854 +312:2:1862 +313:2:1867 +314:2:1871 +315:2:1872 +316:2:1879 +317:2:1880 +318:2:1891 +319:2:1892 +320:2:1893 +321:2:1904 +322:2:1909 +323:2:1910 +324:0:2654 +325:2:1922 +326:0:2654 +327:2:2203 +328:0:2654 +329:2:2301 +330:0:2654 +331:2:2302 +332:0:2654 +333:2:2306 +334:0:2654 +335:2:2312 +336:2:2316 +337:2:2317 +338:2:2325 +339:2:2326 +340:2:2330 +341:2:2331 +342:2:2339 +343:2:2344 +344:2:2348 +345:2:2349 +346:2:2356 +347:2:2357 +348:2:2368 +349:2:2369 +350:2:2370 +351:2:2381 +352:2:2386 +353:2:2387 +354:0:2654 +355:2:2402 +356:0:2654 +357:2:2403 +358:2:2407 +359:2:2408 +360:2:2416 +361:2:2417 +362:2:2421 +363:2:2422 +364:2:2430 +365:2:2435 +366:2:2439 +367:2:2440 +368:2:2447 +369:2:2448 +370:2:2459 +371:2:2460 +372:2:2461 +373:2:2472 +374:2:2477 +375:2:2478 +376:0:2654 +377:2:2493 +378:0:2654 +379:2:2498 +380:2:2502 +381:2:2503 +382:2:2511 +383:2:2512 +384:2:2516 +385:2:2517 +386:2:2525 +387:2:2530 +388:2:2534 +389:2:2535 +390:2:2542 +391:2:2543 +392:2:2554 +393:2:2555 +394:2:2556 +395:2:2567 +396:2:2572 +397:2:2573 +398:0:2654 +399:2:2588 +400:0:2654 +401:2:2590 +402:0:2654 +403:2:2591 +404:0:2654 +405:2:423 +406:0:2654 +407:2:424 +408:2:428 +409:2:429 +410:2:437 +411:2:438 +412:2:442 +413:2:443 +414:2:451 +415:2:456 +416:2:460 +417:2:461 +418:2:468 +419:2:469 +420:2:480 +421:2:481 +422:2:482 +423:2:493 +424:2:498 +425:2:499 +426:0:2654 +427:2:511 +428:0:2654 +429:2:513 +430:2:514 +431:0:2654 +432:2:518 +433:2:522 +434:2:523 +435:2:531 +436:2:532 +437:2:536 +438:2:537 +439:2:545 +440:2:550 +441:2:551 +442:2:562 +443:2:563 +444:2:574 +445:2:575 +446:2:576 +447:2:587 +448:2:592 +449:2:593 +450:0:2654 +451:2:605 +452:0:2654 +453:2:607 +454:0:2654 +455:2:608 +456:0:2654 +457:2:618 +458:0:2654 +459:2:619 +460:2:623 +461:2:624 +462:2:632 +463:2:633 +464:2:637 +465:2:638 +466:2:646 +467:2:651 +468:2:655 +469:2:656 +470:2:663 +471:2:664 +472:2:675 +473:2:676 +474:2:677 +475:2:688 +476:2:693 +477:2:694 +478:0:2654 +479:2:709 +480:0:2654 +481:2:710 +482:2:714 +483:2:715 +484:2:723 +485:2:724 +486:2:728 +487:2:729 +488:2:737 +489:2:742 +490:2:746 +491:2:747 +492:2:754 +493:2:755 +494:2:766 +495:2:767 +496:2:768 +497:2:779 +498:2:784 +499:2:785 +500:0:2654 +501:2:800 +502:0:2654 +503:2:805 +504:2:809 +505:2:810 +506:2:818 +507:2:819 +508:2:823 +509:2:824 +510:2:832 +511:2:837 +512:2:841 +513:2:842 +514:2:849 +515:2:850 +516:2:861 +517:2:862 +518:2:863 +519:2:874 +520:2:879 +521:2:880 +522:0:2654 +523:2:895 +524:0:2654 +525:2:897 +526:0:2654 +527:2:898 +528:2:902 +529:2:903 +530:2:911 +531:2:912 +532:2:916 +533:2:917 +534:2:925 +535:2:930 +536:2:934 +537:2:935 +538:2:942 +539:2:943 +540:2:954 +541:2:955 +542:2:956 +543:2:967 +544:2:972 +545:2:973 +546:0:2654 +547:2:985 +548:0:2654 +549:2:987 +550:0:2654 +551:2:990 +552:2:991 +553:2:1003 +554:2:1004 +555:2:1008 +556:2:1009 +557:2:1017 +558:2:1022 +559:2:1026 +560:2:1027 +561:2:1034 +562:2:1035 +563:2:1046 +564:2:1047 +565:2:1048 +566:2:1059 +567:2:1064 +568:2:1065 +569:0:2654 +570:2:1077 +571:0:2654 +572:2:1079 +573:0:2654 +574:2:1080 +575:0:2654 +576:2:1081 +577:0:2654 +578:2:1082 +579:0:2654 +580:2:1083 +581:2:1087 +582:2:1088 +583:2:1096 +584:2:1097 +585:2:1101 +586:2:1102 +587:2:1110 +588:2:1115 +589:2:1119 +590:2:1120 +591:2:1127 +592:2:1128 +593:2:1139 +594:2:1140 +595:2:1141 +596:2:1152 +597:2:1157 +598:2:1158 +599:0:2654 +600:2:1170 +601:0:2654 +602:2:1451 +603:0:2654 +604:2:1549 +605:0:2654 +606:2:1550 +607:0:2654 +608:2:1554 +609:0:2654 +610:2:1560 +611:2:1564 +612:2:1565 +613:2:1573 +614:2:1574 +615:2:1578 +616:2:1579 +617:2:1587 +618:2:1592 +619:2:1596 +620:2:1597 +621:2:1604 +622:2:1605 +623:2:1616 +624:2:1617 +625:2:1618 +626:2:1629 +627:2:1634 +628:2:1635 +629:0:2654 +630:2:1647 +631:0:2654 +632:2:1649 +633:0:2654 +634:2:1650 +635:2:1654 +636:2:1655 +637:2:1663 +638:2:1664 +639:2:1668 +640:2:1669 +641:2:1677 +642:2:1682 +643:2:1686 +644:2:1687 +645:2:1694 +646:2:1695 +647:2:1706 +648:2:1707 +649:2:1708 +650:2:1719 +651:2:1724 +652:2:1725 +653:0:2654 +654:2:1737 +655:0:2654 +656:2:1739 +657:0:2654 +658:2:1742 +659:2:1743 +660:2:1755 +661:2:1756 +662:2:1760 +663:2:1761 +664:2:1769 +665:2:1774 +666:2:1778 +667:2:1779 +668:2:1786 +669:2:1787 +670:2:1798 +671:2:1799 +672:2:1800 +673:2:1811 +674:2:1816 +675:2:1817 +676:0:2654 +677:2:1829 +678:0:2654 +679:2:1831 +680:0:2654 +681:2:1832 +682:0:2654 +683:2:1833 +684:0:2654 +685:2:1834 +686:0:2654 +687:2:1835 +688:2:1839 +689:2:1840 +690:2:1848 +691:2:1849 +692:2:1853 +693:2:1854 +694:2:1862 +695:2:1867 +696:2:1871 +697:2:1872 +698:2:1879 +699:2:1880 +700:2:1891 +701:2:1892 +702:2:1893 +703:2:1904 +704:2:1909 +705:2:1910 +706:0:2654 +707:2:1922 +708:0:2654 +709:2:2203 +710:0:2654 +711:2:2301 +712:0:2654 +713:2:2302 +714:0:2654 +715:2:2306 +716:0:2654 +717:2:2312 +718:2:2316 +719:2:2317 +720:2:2325 +721:2:2326 +722:2:2330 +723:2:2331 +724:2:2339 +725:2:2344 +726:2:2348 +727:2:2349 +728:2:2356 +729:2:2357 +730:2:2368 +731:2:2369 +732:2:2370 +733:2:2381 +734:2:2386 +735:2:2387 +736:0:2654 +737:2:2402 +738:0:2654 +739:2:2403 +740:2:2407 +741:2:2408 +742:2:2416 +743:2:2417 +744:2:2421 +745:2:2422 +746:2:2430 +747:2:2435 +748:2:2439 +749:2:2440 +750:2:2447 +751:2:2448 +752:2:2459 +753:2:2460 +754:2:2461 +755:2:2472 +756:2:2477 +757:2:2478 +758:0:2654 +759:2:2493 +760:0:2654 +761:2:2498 +762:2:2502 +763:2:2503 +764:2:2511 +765:2:2512 +766:2:2516 +767:2:2517 +768:2:2525 +769:2:2530 +770:2:2534 +771:2:2535 +772:2:2542 +773:2:2543 +774:2:2554 +775:2:2555 +776:2:2556 +777:2:2567 +778:2:2572 +779:2:2573 +780:0:2654 +781:2:2588 +782:0:2654 +783:2:2590 +784:0:2654 +785:2:2591 +786:0:2654 +787:2:423 +788:0:2654 +789:2:424 +790:2:428 +791:2:429 +792:2:437 +793:2:438 +794:2:442 +795:2:443 +796:2:451 +797:2:456 +798:2:460 +799:2:461 +800:2:468 +801:2:469 +802:2:480 +803:2:481 +804:2:482 +805:2:493 +806:2:498 +807:2:499 +808:0:2654 +809:2:511 +810:0:2654 +811:2:513 +812:2:514 +813:0:2654 +814:2:518 +815:2:522 +816:2:523 +817:2:531 +818:2:532 +819:2:536 +820:2:537 +821:2:545 +822:2:550 +823:2:551 +824:2:562 +825:2:563 +826:2:574 +827:2:575 +828:2:576 +829:2:587 +830:2:592 +831:2:593 +832:0:2654 +833:2:605 +834:0:2654 +835:2:607 +836:0:2654 +837:2:608 +838:0:2654 +839:2:618 +840:0:2654 +841:2:619 +842:2:623 +843:2:624 +844:2:632 +845:2:633 +846:2:637 +847:2:638 +848:2:646 +849:2:651 +850:2:655 +851:2:656 +852:2:663 +853:2:664 +854:2:675 +855:2:676 +856:2:677 +857:2:688 +858:2:693 +859:2:694 +860:0:2654 +861:2:709 +862:0:2654 +863:2:710 +864:2:714 +865:2:715 +866:2:723 +867:2:724 +868:2:728 +869:2:729 +870:2:737 +871:2:742 +872:2:746 +873:2:747 +874:2:754 +875:2:755 +876:2:766 +877:2:767 +878:2:768 +879:2:779 +880:2:784 +881:2:785 +882:0:2654 +883:2:800 +884:0:2654 +885:2:805 +886:2:809 +887:2:810 +888:2:818 +889:2:819 +890:2:823 +891:2:824 +892:2:832 +893:2:837 +894:2:841 +895:2:842 +896:2:849 +897:2:850 +898:2:861 +899:2:862 +900:2:863 +901:2:874 +902:2:879 +903:2:880 +904:0:2654 +905:2:895 +906:0:2654 +907:2:897 +908:0:2654 +909:2:898 +910:2:902 +911:2:903 +912:2:911 +913:2:912 +914:2:916 +915:2:917 +916:2:925 +917:2:930 +918:2:934 +919:2:935 +920:2:942 +921:2:943 +922:2:954 +923:2:955 +924:2:956 +925:2:967 +926:2:972 +927:2:973 +928:0:2654 +929:2:985 +930:0:2654 +931:2:987 +932:0:2654 +933:2:990 +934:2:991 +935:2:1003 +936:2:1004 +937:2:1008 +938:2:1009 +939:2:1017 +940:2:1022 +941:2:1026 +942:2:1027 +943:2:1034 +944:2:1035 +945:2:1046 +946:2:1047 +947:2:1048 +948:2:1059 +949:2:1064 +950:2:1065 +951:0:2654 +952:2:1077 +953:0:2654 +954:2:1079 +955:0:2654 +956:2:1080 +957:0:2654 +958:2:1081 +959:0:2654 +960:2:1082 +961:0:2654 +962:2:1083 +963:2:1087 +964:2:1088 +965:2:1096 +966:2:1097 +967:2:1101 +968:2:1102 +969:2:1110 +970:2:1115 +971:2:1119 +972:2:1120 +973:2:1127 +974:2:1128 +975:2:1139 +976:2:1140 +977:2:1141 +978:2:1152 +979:2:1157 +980:2:1158 +981:0:2654 +982:2:1170 +983:0:2654 +984:2:1451 +985:0:2654 +986:2:1549 +987:0:2654 +988:2:1550 +989:0:2654 +990:2:1554 +991:0:2654 +992:2:1560 +993:2:1564 +994:2:1565 +995:2:1573 +996:2:1574 +997:2:1578 +998:2:1579 +999:2:1587 +1000:2:1592 +1001:2:1596 +1002:2:1597 +1003:2:1604 +1004:2:1605 +1005:2:1616 +1006:2:1617 +1007:2:1618 +1008:2:1629 +1009:2:1634 +1010:2:1635 +1011:0:2654 +1012:2:1647 +1013:0:2654 +1014:2:1649 +1015:0:2654 +1016:2:1650 +1017:2:1654 +1018:2:1655 +1019:2:1663 +1020:2:1664 +1021:2:1668 +1022:2:1669 +1023:2:1677 +1024:2:1682 +1025:2:1686 +1026:2:1687 +1027:2:1694 +1028:2:1695 +1029:2:1706 +1030:2:1707 +1031:2:1708 +1032:2:1719 +1033:2:1724 +1034:2:1725 +1035:0:2654 +1036:2:1737 +1037:0:2654 +1038:2:1739 +1039:0:2654 +1040:2:1742 +1041:2:1743 +1042:2:1755 +1043:2:1756 +1044:2:1760 +1045:2:1761 +1046:2:1769 +1047:2:1774 +1048:2:1778 +1049:2:1779 +1050:2:1786 +1051:2:1787 +1052:2:1798 +1053:2:1799 +1054:2:1800 +1055:2:1811 +1056:2:1816 +1057:2:1817 +1058:0:2654 +1059:2:1829 +1060:0:2654 +1061:2:1831 +1062:0:2654 +1063:2:1832 +1064:0:2654 +1065:2:1833 +1066:0:2654 +1067:2:1834 +1068:0:2654 +1069:2:1835 +1070:2:1839 +1071:2:1840 +1072:2:1848 +1073:2:1849 +1074:2:1853 +1075:2:1854 +1076:2:1862 +1077:2:1867 +1078:2:1871 +1079:2:1872 +1080:2:1879 +1081:2:1880 +1082:2:1891 +1083:2:1892 +1084:2:1893 +1085:2:1904 +1086:2:1909 +1087:2:1910 +1088:0:2654 +1089:2:1922 +1090:0:2654 +1091:2:2203 +1092:0:2654 +1093:2:2301 +1094:0:2654 +1095:2:2302 +1096:0:2654 +1097:2:2306 +1098:0:2654 +1099:2:2312 +1100:2:2316 +1101:2:2317 +1102:2:2325 +1103:2:2326 +1104:2:2330 +1105:2:2331 +1106:2:2339 +1107:2:2344 +1108:2:2348 +1109:2:2349 +1110:2:2356 +1111:2:2357 +1112:2:2368 +1113:2:2369 +1114:2:2370 +1115:2:2381 +1116:2:2386 +1117:2:2387 +1118:0:2654 +1119:2:2402 +1120:0:2654 +1121:2:2403 +1122:2:2407 +1123:2:2408 +1124:2:2416 +1125:2:2417 +1126:2:2421 +1127:2:2422 +1128:2:2430 +1129:2:2435 +1130:2:2439 +1131:2:2440 +1132:2:2447 +1133:2:2448 +1134:2:2459 +1135:2:2460 +1136:2:2461 +1137:2:2472 +1138:2:2477 +1139:2:2478 +1140:0:2654 +1141:2:2493 +1142:0:2654 +1143:2:2498 +1144:2:2502 +1145:2:2503 +1146:2:2511 +1147:2:2512 +1148:2:2516 +1149:2:2517 +1150:2:2525 +1151:2:2530 +1152:2:2534 +1153:2:2535 +1154:2:2542 +1155:2:2543 +1156:2:2554 +1157:2:2555 +1158:2:2556 +1159:2:2567 +1160:2:2572 +1161:2:2573 +1162:0:2654 +1163:2:2588 +1164:0:2654 +1165:2:2590 +1166:0:2654 +1167:2:2591 +1168:0:2654 +1169:2:423 +1170:0:2654 +1171:2:424 +1172:2:428 +1173:2:429 +1174:2:437 +1175:2:438 +1176:2:442 +1177:2:443 +1178:2:451 +1179:2:456 +1180:2:460 +1181:2:461 +1182:2:468 +1183:2:469 +1184:2:480 +1185:2:481 +1186:2:482 +1187:2:493 +1188:2:498 +1189:2:499 +1190:0:2654 +1191:2:511 +1192:0:2654 +1193:2:513 +1194:2:514 +1195:0:2654 +1196:2:518 +1197:2:522 +1198:2:523 +1199:2:531 +1200:2:532 +1201:2:536 +1202:2:537 +1203:2:545 +1204:2:550 +1205:2:551 +1206:2:562 +1207:2:563 +1208:2:574 +1209:2:575 +1210:2:576 +1211:2:587 +1212:2:592 +1213:2:593 +1214:0:2654 +1215:2:605 +1216:0:2654 +1217:2:607 +1218:0:2654 +1219:2:608 +1220:0:2654 +1221:2:618 +1222:0:2654 +1223:2:619 +1224:2:623 +1225:2:624 +1226:2:632 +1227:2:633 +1228:2:637 +1229:2:638 +1230:2:646 +1231:2:651 +1232:2:655 +1233:2:656 +1234:2:663 +1235:2:664 +1236:2:675 +1237:2:676 +1238:2:677 +1239:2:688 +1240:2:693 +1241:2:694 +1242:0:2654 +1243:2:709 +1244:0:2654 +1245:2:710 +1246:2:714 +1247:2:715 +1248:2:723 +1249:2:724 +1250:2:728 +1251:2:729 +1252:2:737 +1253:2:742 +1254:2:746 +1255:2:747 +1256:2:754 +1257:2:755 +1258:2:766 +1259:2:767 +1260:2:768 +1261:2:779 +1262:2:784 +1263:2:785 +1264:0:2654 +1265:2:800 +1266:0:2654 +1267:2:805 +1268:2:809 +1269:2:810 +1270:2:818 +1271:2:819 +1272:2:823 +1273:2:824 +1274:2:832 +1275:2:837 +1276:2:841 +1277:2:842 +1278:2:849 +1279:2:850 +1280:2:861 +1281:2:862 +1282:2:863 +1283:2:874 +1284:2:879 +1285:2:880 +1286:0:2654 +1287:2:895 +1288:0:2654 +1289:2:897 +1290:0:2654 +1291:2:898 +1292:2:902 +1293:2:903 +1294:2:911 +1295:2:912 +1296:2:916 +1297:2:917 +1298:2:925 +1299:2:930 +1300:2:934 +1301:2:935 +1302:2:942 +1303:2:943 +1304:2:954 +1305:2:955 +1306:2:956 +1307:2:967 +1308:2:972 +1309:2:973 +1310:0:2654 +1311:2:985 +1312:0:2654 +1313:2:987 +1314:0:2654 +1315:2:990 +1316:2:991 +1317:2:1003 +1318:2:1004 +1319:2:1008 +1320:2:1009 +1321:2:1017 +1322:2:1022 +1323:2:1026 +1324:2:1027 +1325:2:1034 +1326:2:1035 +1327:2:1046 +1328:2:1047 +1329:2:1048 +1330:2:1059 +1331:2:1064 +1332:2:1065 +1333:0:2654 +1334:2:1077 +1335:0:2654 +1336:2:1079 +1337:0:2654 +1338:2:1080 +1339:0:2654 +1340:2:1081 +1341:0:2654 +1342:2:1082 +1343:0:2654 +1344:2:1083 +1345:2:1087 +1346:2:1088 +1347:2:1096 +1348:2:1097 +1349:2:1101 +1350:2:1102 +1351:2:1110 +1352:2:1115 +1353:2:1119 +1354:2:1120 +1355:2:1127 +1356:2:1128 +1357:2:1139 +1358:2:1140 +1359:2:1141 +1360:2:1152 +1361:2:1157 +1362:2:1158 +1363:0:2654 +1364:2:1170 +1365:0:2654 +1366:2:1451 +1367:0:2654 +1368:2:1549 +1369:0:2654 +1370:2:1550 +1371:0:2654 +1372:2:1554 +1373:0:2654 +1374:2:1560 +1375:2:1564 +1376:2:1565 +1377:2:1573 +1378:2:1574 +1379:2:1578 +1380:2:1579 +1381:2:1587 +1382:2:1592 +1383:2:1596 +1384:2:1597 +1385:2:1604 +1386:2:1605 +1387:2:1616 +1388:2:1617 +1389:2:1618 +1390:2:1629 +1391:2:1634 +1392:2:1635 +1393:0:2654 +1394:2:1647 +1395:0:2654 +1396:2:1649 +1397:0:2654 +1398:2:1650 +1399:2:1654 +1400:2:1655 +1401:2:1663 +1402:2:1664 +1403:2:1668 +1404:2:1669 +1405:2:1677 +1406:2:1682 +1407:2:1686 +1408:2:1687 +1409:2:1694 +1410:2:1695 +1411:2:1706 +1412:2:1707 +1413:2:1708 +1414:2:1719 +1415:2:1724 +1416:2:1725 +1417:0:2654 +1418:2:1737 +1419:0:2654 +1420:2:1739 +1421:0:2654 +1422:2:1742 +1423:2:1743 +1424:2:1755 +1425:2:1756 +1426:2:1760 +1427:2:1761 +1428:2:1769 +1429:2:1774 +1430:2:1778 +1431:2:1779 +1432:2:1786 +1433:2:1787 +1434:2:1798 +1435:2:1799 +1436:2:1800 +1437:2:1811 +1438:2:1816 +1439:2:1817 +1440:0:2654 +1441:2:1829 +1442:0:2654 +1443:2:1831 +1444:0:2654 +1445:2:1832 +1446:0:2654 +1447:2:1833 +1448:0:2654 +1449:2:1834 +1450:0:2654 +1451:2:1835 +1452:2:1839 +1453:2:1840 +1454:2:1848 +1455:2:1849 +1456:2:1853 +1457:2:1854 +1458:2:1862 +1459:2:1867 +1460:2:1871 +1461:2:1872 +1462:2:1879 +1463:2:1880 +1464:2:1891 +1465:2:1892 +1466:2:1893 +1467:2:1904 +1468:2:1909 +1469:2:1910 +1470:0:2654 +1471:2:1922 +1472:0:2654 +1473:2:2203 +1474:0:2654 +1475:2:2301 +1476:0:2654 +1477:2:2302 +1478:0:2654 +1479:2:2306 +1480:0:2654 +1481:2:2312 +1482:2:2316 +1483:2:2317 +1484:2:2325 +1485:2:2326 +1486:2:2330 +1487:2:2331 +1488:2:2339 +1489:2:2344 +1490:2:2348 +1491:2:2349 +1492:2:2356 +1493:2:2357 +1494:2:2368 +1495:2:2369 +1496:2:2370 +1497:2:2381 +1498:2:2386 +1499:2:2387 +1500:0:2654 +1501:2:2402 +1502:0:2654 +1503:2:2403 +1504:2:2407 +1505:2:2408 +1506:2:2416 +1507:2:2417 +1508:2:2421 +1509:2:2422 +1510:2:2430 +1511:2:2435 +1512:2:2439 +1513:2:2440 +1514:2:2447 +1515:2:2448 +1516:2:2459 +1517:2:2460 +1518:2:2461 +1519:2:2472 +1520:2:2477 +1521:2:2478 +1522:0:2654 +1523:2:2493 +1524:0:2654 +1525:2:2498 +1526:2:2502 +1527:2:2503 +1528:2:2511 +1529:2:2512 +1530:2:2516 +1531:2:2517 +1532:2:2525 +1533:2:2530 +1534:2:2534 +1535:2:2535 +1536:2:2542 +1537:2:2543 +1538:2:2554 +1539:2:2555 +1540:2:2556 +1541:2:2567 +1542:2:2572 +1543:2:2573 +1544:0:2654 +1545:2:2588 +1546:0:2654 +1547:2:2590 +1548:0:2654 +1549:2:2591 +1550:0:2654 +1551:2:423 +1552:0:2654 +1553:2:424 +1554:2:428 +1555:2:429 +1556:2:437 +1557:2:438 +1558:2:442 +1559:2:443 +1560:2:451 +1561:2:456 +1562:2:460 +1563:2:461 +1564:2:468 +1565:2:469 +1566:2:480 +1567:2:481 +1568:2:482 +1569:2:493 +1570:2:498 +1571:2:499 +1572:0:2654 +1573:2:511 +1574:0:2654 +1575:2:513 +1576:2:514 +1577:0:2654 +1578:2:518 +1579:2:522 +1580:2:523 +1581:2:531 +1582:2:532 +1583:2:536 +1584:2:537 +1585:2:545 +1586:2:558 +1587:2:559 +1588:2:562 +1589:2:563 +1590:2:574 +1591:2:575 +1592:2:576 +1593:2:587 +1594:2:592 +1595:2:595 +1596:2:596 +1597:0:2654 +1598:2:605 +1599:0:2654 +1600:2:607 +1601:0:2654 +1602:2:608 +1603:0:2654 +1604:2:618 +1605:0:2654 +1606:2:619 +1607:2:623 +1608:2:624 +1609:2:632 +1610:2:633 +1611:2:637 +1612:2:638 +1613:2:646 +1614:2:659 +1615:2:660 +1616:2:663 +1617:2:664 +1618:2:675 +1619:2:676 +1620:2:677 +1621:2:688 +1622:2:693 +1623:2:696 +1624:2:697 +1625:0:2654 +1626:2:709 +1627:0:2654 +1628:2:710 +1629:2:714 +1630:2:715 +1631:2:723 +1632:2:724 +1633:2:728 +1634:2:729 +1635:2:737 +1636:2:750 +1637:2:751 +1638:2:754 +1639:2:755 +1640:2:766 +1641:2:767 +1642:2:768 +1643:2:779 +1644:2:784 +1645:2:787 +1646:2:788 +1647:0:2654 +1648:2:800 +1649:0:2654 +1650:2:805 +1651:2:809 +1652:2:810 +1653:2:818 +1654:2:819 +1655:2:823 +1656:2:824 +1657:2:832 +1658:2:845 +1659:2:846 +1660:2:849 +1661:2:850 +1662:2:861 +1663:2:862 +1664:2:863 +1665:2:874 +1666:2:879 +1667:2:882 +1668:2:883 +1669:0:2654 +1670:2:895 +1671:0:2654 +1672:2:897 +1673:0:2654 +1674:2:898 +1675:2:902 +1676:2:903 +1677:2:911 +1678:2:912 +1679:2:916 +1680:2:917 +1681:2:925 +1682:2:938 +1683:2:939 +1684:2:942 +1685:2:943 +1686:2:954 +1687:2:955 +1688:2:956 +1689:2:967 +1690:2:972 +1691:2:975 +1692:2:976 +1693:0:2654 +1694:2:985 +1695:0:2654 +1696:2:987 +1697:0:2654 +1698:2:990 +1699:2:991 +1700:2:1003 +1701:2:1004 +1702:2:1008 +1703:2:1009 +1704:2:1017 +1705:2:1030 +1706:2:1031 +1707:2:1034 +1708:2:1035 +1709:2:1046 +1710:2:1047 +1711:2:1048 +1712:2:1059 +1713:2:1064 +1714:2:1067 +1715:2:1068 +1716:0:2654 +1717:2:1077 +1718:0:2654 +1719:2:1079 +1720:0:2654 +1721:2:1080 +1722:0:2654 +1723:2:1081 +1724:0:2654 +1725:2:1082 +1726:0:2654 +1727:2:1083 +1728:2:1087 +1729:2:1088 +1730:2:1096 +1731:2:1097 +1732:2:1101 +1733:2:1102 +1734:2:1110 +1735:2:1123 +1736:2:1124 +1737:2:1127 +1738:2:1128 +1739:2:1139 +1740:2:1140 +1741:2:1141 +1742:2:1152 +1743:2:1157 +1744:2:1160 +1745:2:1161 +1746:0:2654 +1747:2:1170 +1748:0:2654 +1749:2:1451 +1750:0:2654 +1751:2:1549 +1752:0:2654 +1753:2:1550 +1754:0:2654 +1755:2:1554 +1756:0:2654 +1757:2:1560 +1758:2:1564 +1759:2:1565 +1760:2:1573 +1761:2:1574 +1762:2:1578 +1763:2:1579 +1764:2:1587 +1765:2:1600 +1766:2:1601 +1767:2:1604 +1768:2:1605 +1769:2:1616 +1770:2:1617 +1771:2:1618 +1772:2:1629 +1773:2:1634 +1774:2:1637 +1775:2:1638 +1776:0:2654 +1777:2:1647 +1778:0:2654 +1779:2:1649 +1780:0:2654 +1781:2:1650 +1782:2:1654 +1783:2:1655 +1784:2:1663 +1785:2:1664 +1786:2:1668 +1787:2:1669 +1788:2:1677 +1789:2:1690 +1790:2:1691 +1791:2:1694 +1792:2:1695 +1793:2:1706 +1794:2:1707 +1795:2:1708 +1796:2:1719 +1797:2:1724 +1798:2:1727 +1799:2:1728 +1800:0:2654 +1801:2:1737 +1802:0:2654 +1803:2:1739 +1804:0:2654 +1805:2:1742 +1806:2:1743 +1807:2:1755 +1808:2:1756 +1809:2:1760 +1810:2:1761 +1811:2:1769 +1812:2:1782 +1813:2:1783 +1814:2:1786 +1815:2:1787 +1816:2:1798 +1817:2:1799 +1818:2:1800 +1819:2:1811 +1820:2:1816 +1821:2:1819 +1822:2:1820 +1823:0:2654 +1824:2:1829 +1825:0:2654 +1826:2:1831 +1827:0:2654 +1828:2:1832 +1829:0:2654 +1830:2:1833 +1831:0:2654 +1832:2:1834 +1833:0:2654 +1834:2:1835 +1835:2:1839 +1836:2:1840 +1837:2:1848 +1838:2:1849 +1839:2:1853 +1840:2:1854 +1841:2:1862 +1842:2:1875 +1843:2:1876 +1844:2:1879 +1845:2:1880 +1846:2:1891 +1847:2:1892 +1848:2:1893 +1849:2:1904 +1850:2:1909 +1851:2:1912 +1852:2:1913 +1853:0:2654 +1854:2:1922 +1855:0:2654 +1856:2:2203 +1857:0:2654 +1858:2:2301 +1859:0:2654 +1860:2:2302 +1861:0:2654 +1862:2:2306 +1863:0:2654 +1864:2:2312 +1865:2:2316 +1866:2:2317 +1867:2:2325 +1868:2:2326 +1869:2:2330 +1870:2:2331 +1871:2:2339 +1872:2:2352 +1873:2:2353 +1874:2:2356 +1875:2:2357 +1876:2:2368 +1877:2:2369 +1878:2:2370 +1879:2:2381 +1880:2:2386 +1881:2:2389 +1882:2:2390 +1883:0:2654 +1884:2:2402 +1885:0:2654 +1886:2:2403 +1887:2:2407 +1888:2:2408 +1889:2:2416 +1890:2:2417 +1891:2:2421 +1892:2:2422 +1893:2:2430 +1894:2:2443 +1895:2:2444 +1896:2:2447 +1897:2:2448 +1898:2:2459 +1899:2:2460 +1900:2:2461 +1901:2:2472 +1902:2:2477 +1903:2:2480 +1904:2:2481 +1905:0:2654 +1906:2:2493 +1907:0:2654 +1908:2:2498 +1909:2:2502 +1910:2:2503 +1911:2:2511 +1912:2:2512 +1913:2:2516 +1914:2:2517 +1915:2:2525 +1916:2:2538 +1917:2:2539 +1918:2:2542 +1919:2:2543 +1920:2:2554 +1921:2:2555 +1922:2:2556 +1923:2:2567 +1924:2:2572 +1925:2:2575 +1926:2:2576 +1927:0:2654 +1928:2:2588 +1929:0:2654 +1930:2:2590 +1931:0:2654 +1932:2:2591 +1933:0:2654 +1934:2:2594 +1935:0:2654 +1936:2:2599 +1937:0:2654 +1938:1:2 +1939:0:2654 +1940:2:2600 +1941:0:2654 +1942:1:8 +1943:0:2654 +1944:2:2599 +1945:0:2654 +1946:1:9 +1947:0:2654 +1948:2:2600 +1949:0:2654 +1950:1:10 +1951:0:2654 +1952:2:2599 +1953:0:2654 +1954:1:11 +1955:0:2654 +1956:2:2600 +1957:0:2654 +1958:1:12 +1959:1:16 +1960:1:17 +1961:1:25 +1962:1:26 +1963:1:30 +1964:1:31 +1965:1:39 +1966:1:44 +1967:1:48 +1968:1:49 +1969:1:56 +1970:1:57 +1971:1:68 +1972:1:69 +1973:1:70 +1974:1:81 +1975:1:86 +1976:1:87 +1977:0:2654 +1978:2:2599 +1979:0:2654 +1980:1:99 +1981:0:2654 +1982:2:2600 +1983:0:2654 +1984:1:101 +1985:0:2654 +1986:2:2599 +1987:0:2654 +1988:1:102 +1989:1:106 +1990:1:107 +1991:1:115 +1992:1:116 +1993:1:120 +1994:1:121 +1995:1:129 +1996:1:134 +1997:1:138 +1998:1:139 +1999:1:146 +2000:1:147 +2001:1:158 +2002:1:159 +2003:1:160 +2004:1:171 +2005:1:176 +2006:1:177 +2007:0:2654 +2008:2:2600 +2009:0:2654 +2010:1:189 +2011:0:2654 +2012:2:2599 +2013:0:2654 +2014:1:191 +2015:0:2654 +2016:2:2600 +2017:0:2654 +2018:1:192 +2019:0:2654 +2020:2:2599 +2021:0:2654 +2022:1:193 +2023:1:197 +2024:1:198 +2025:1:206 +2026:1:207 +2027:1:211 +2028:1:212 +2029:1:220 +2030:1:225 +2031:1:229 +2032:1:230 +2033:1:237 +2034:1:238 +2035:1:249 +2036:1:250 +2037:1:251 +2038:1:262 +2039:1:267 +2040:1:268 +2041:0:2654 +2042:2:2600 +2043:0:2654 +2044:1:280 +2045:0:2654 +2046:2:2599 +2047:0:2654 +2048:1:282 +2049:0:2654 +2050:2:2600 +2051:0:2654 +2052:1:291 +2053:0:2654 +2054:2:2599 +2055:0:2654 +2056:1:293 +2057:0:2654 +2058:2:2600 +2059:0:2654 +2060:1:11 +2061:0:2654 +2062:2:2599 +2063:0:2654 +2064:1:12 +2065:1:16 +2066:1:17 +2067:1:25 +2068:1:26 +2069:1:27 +2070:1:39 +2071:1:44 +2072:1:48 +2073:1:49 +2074:1:56 +2075:1:57 +2076:1:68 +2077:1:69 +2078:1:70 +2079:1:81 +2080:1:86 +2081:1:87 +2082:0:2654 +2083:2:2600 +2084:0:2654 +2085:1:99 +2086:0:2654 +2087:2:2599 +2088:0:2654 +2089:1:101 +2090:0:2654 +2091:2:2600 +2092:0:2654 +2093:1:102 +2094:1:106 +2095:1:107 +2096:1:115 +2097:1:116 +2098:1:120 +2099:1:121 +2100:1:129 +2101:1:134 +2102:1:138 +2103:1:139 +2104:1:146 +2105:1:147 +2106:1:158 +2107:1:159 +2108:1:160 +2109:1:171 +2110:1:176 +2111:1:177 +2112:0:2654 +2113:2:2599 +2114:0:2654 +2115:1:189 +2116:0:2654 +2117:2:2600 +2118:0:2654 +2119:1:285 +2120:0:2654 +2121:2:2599 +2122:0:2654 +2123:1:286 +2124:0:2654 +2125:2:2600 +2126:0:2654 +2127:1:291 +2128:0:2654 +2129:2:2599 +2130:0:2654 +2131:1:293 +2132:0:2654 +2133:2:2600 +2134:0:2654 +2135:1:296 +2136:0:2654 +2137:2:2599 +2138:0:2654 +2139:1:301 +2140:0:2654 +2141:2:2600 +2142:0:2654 +2143:1:302 +2144:0:2652 +2145:2:2599 +2146:0:2658 +2147:2:779 diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.define b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.define new file mode 100644 index 0000000..73e61a4 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.define @@ -0,0 +1 @@ +#define NO_RMB diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.log b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.log new file mode 100644 index 0000000..b7f3b80 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.log @@ -0,0 +1,266 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_free_no_rmb.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 744) +Depth= 5439 States= 1e+06 Transitions= 1.03e+07 Memory= 527.190 t= 8.16 R= 1e+05 +pan: claim violated! (at depth 1801) +pan: wrote .input.spin.trail + +(Spin Version 5.1.7 -- 23 December 2008) +Warning: Search not completed + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 5439, errors: 1 + 1006552 states, stored + 9396280 states, matched + 10402832 transitions (= stored+matched) + 36844262 atomic steps +hash conflicts: 1832712 (resolved) + +Stats on memory usage (in Megabytes): + 80.634 equivalent memory usage for states (stored*(State-vector + overhead)) + 61.871 actual memory usage for states (compression: 76.73%) + state-vector as stored = 36 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 527.580 total actual memory usage + +unreached in proctype urcu_reader + line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 61, "(1)" + line 418, "pan.___", state 91, "(1)" + line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 151, "(1)" + line 418, "pan.___", state 181, "(1)" + line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 242, "(1)" + line 418, "pan.___", state 272, "(1)" + line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 360, "(1)" + line 418, "pan.___", state 390, "(1)" + line 540, "pan.___", state 414, "-end-" + (17 of 414 states) +unreached in proctype urcu_writer + line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 399, "pan.___", state 20, "(1)" + line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 34, "(1)" + line 403, "pan.___", state 35, "(1)" + line 403, "pan.___", state 35, "(1)" + line 401, "pan.___", state 40, "((i<1))" + line 401, "pan.___", state 40, "((i>=1))" + line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 59, "(1)" + line 409, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 60, "else" + line 409, "pan.___", state 63, "(1)" + line 409, "pan.___", state 64, "(1)" + line 409, "pan.___", state 64, "(1)" + line 413, "pan.___", state 72, "(1)" + line 413, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 73, "else" + line 413, "pan.___", state 76, "(1)" + line 413, "pan.___", state 77, "(1)" + line 413, "pan.___", state 77, "(1)" + line 411, "pan.___", state 82, "((i<1))" + line 411, "pan.___", state 82, "((i>=1))" + line 418, "pan.___", state 89, "(1)" + line 418, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 90, "else" + line 418, "pan.___", state 93, "(1)" + line 418, "pan.___", state 94, "(1)" + line 418, "pan.___", state 94, "(1)" + line 420, "pan.___", state 97, "(1)" + line 420, "pan.___", state 97, "(1)" + line 369, "pan.___", state 99, "(1)" + line 639, "pan.___", state 103, "cached_generation_ptr.val[_pid] = (old_gen+1)" + line 637, "pan.___", state 104, "old_gen = cached_generation_ptr.val[_pid]" + line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 399, "pan.___", state 114, "(1)" + line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 128, "(1)" + line 403, "pan.___", state 129, "(1)" + line 403, "pan.___", state 129, "(1)" + line 409, "pan.___", state 153, "(1)" + line 413, "pan.___", state 166, "(1)" + line 420, "pan.___", state 191, "(1)" + line 420, "pan.___", state 191, "(1)" + line 652, "pan.___", state 199, "(1)" + line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 175, "pan.___", state 243, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 408, "pan.___", state 746, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 759, "(1)" + line 409, "pan.___", state 760, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 760, "else" + line 409, "pan.___", state 763, "(1)" + line 409, "pan.___", state 764, "(1)" + line 409, "pan.___", state 764, "(1)" + line 413, "pan.___", state 772, "(1)" + line 413, "pan.___", state 773, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 773, "else" + line 413, "pan.___", state 776, "(1)" + line 413, "pan.___", state 777, "(1)" + line 413, "pan.___", state 777, "(1)" + line 411, "pan.___", state 782, "((i<1))" + line 411, "pan.___", state 782, "((i>=1))" + line 418, "pan.___", state 789, "(1)" + line 418, "pan.___", state 790, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 790, "else" + line 418, "pan.___", state 793, "(1)" + line 418, "pan.___", state 794, "(1)" + line 418, "pan.___", state 794, "(1)" + line 420, "pan.___", state 797, "(1)" + line 420, "pan.___", state 797, "(1)" + line 403, "pan.___", state 828, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 846, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 872, "(1)" + line 418, "pan.___", state 889, "(1)" + line 403, "pan.___", state 918, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 936, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 962, "(1)" + line 418, "pan.___", state 979, "(1)" + line 399, "pan.___", state 998, "(1)" + line 403, "pan.___", state 1010, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1028, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1054, "(1)" + line 418, "pan.___", state 1071, "(1)" + line 403, "pan.___", state 1103, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1121, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1147, "(1)" + line 418, "pan.___", state 1164, "(1)" + line 179, "pan.___", state 1187, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 183, "pan.___", state 1200, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 175, "pan.___", state 1213, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 408, "pan.___", state 1330, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 1343, "(1)" + line 409, "pan.___", state 1344, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 1344, "else" + line 409, "pan.___", state 1347, "(1)" + line 409, "pan.___", state 1348, "(1)" + line 409, "pan.___", state 1348, "(1)" + line 413, "pan.___", state 1356, "(1)" + line 413, "pan.___", state 1357, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 1357, "else" + line 413, "pan.___", state 1360, "(1)" + line 413, "pan.___", state 1361, "(1)" + line 413, "pan.___", state 1361, "(1)" + line 411, "pan.___", state 1366, "((i<1))" + line 411, "pan.___", state 1366, "((i>=1))" + line 418, "pan.___", state 1373, "(1)" + line 418, "pan.___", state 1374, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 1374, "else" + line 418, "pan.___", state 1377, "(1)" + line 418, "pan.___", state 1378, "(1)" + line 418, "pan.___", state 1378, "(1)" + line 420, "pan.___", state 1381, "(1)" + line 420, "pan.___", state 1381, "(1)" + line 179, "pan.___", state 1406, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 183, "pan.___", state 1419, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 175, "pan.___", state 1432, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=2))" + line 710, "pan.___", state 20, "((j<2))" + line 710, "pan.___", state 20, "((j>=2))" + line 715, "pan.___", state 33, "((j<2))" + line 715, "pan.___", state 33, "((j>=2))" + (3 of 46 states) +unreached in proctype :never: + line 749, "pan.___", state 8, "-end-" + (1 of 8 states) + +pan: elapsed time 8.24 seconds +pan: rate 122154.37 states/second +pan: avg transition delay 7.9209e-07 usec +cp .input.spin urcu_free_no_rmb.spin.input +cp .input.spin.trail urcu_free_no_rmb.spin.input.trail +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.spin.input b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.spin.input new file mode 100644 index 0000000..6dea6e1 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.spin.input @@ -0,0 +1,723 @@ +#define NO_RMB + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +//#define TEST_SIGNAL +//#define TEST_SIGNAL_ON_READ +//#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +//#define READER_NEST_LEVEL 1 +#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.spin.input.trail b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.spin.input.trail new file mode 100644 index 0000000..071a19e --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.spin.input.trail @@ -0,0 +1,1804 @@ +-2:3:-2 +-4:-4:-4 +1:0:1982 +2:3:1934 +3:3:1937 +4:3:1937 +5:3:1940 +6:3:1948 +7:3:1948 +8:3:1951 +9:3:1957 +10:3:1961 +11:3:1961 +12:3:1964 +13:3:1972 +14:3:1976 +15:3:1977 +16:0:1982 +17:3:1979 +18:0:1982 +19:2:416 +20:0:1982 +21:2:422 +22:0:1982 +23:2:423 +24:0:1982 +25:2:424 +26:2:428 +27:2:429 +28:2:437 +29:2:438 +30:2:442 +31:2:443 +32:2:451 +33:2:456 +34:2:460 +35:2:461 +36:2:468 +37:2:469 +38:2:480 +39:2:481 +40:2:482 +41:2:493 +42:2:498 +43:2:499 +44:0:1982 +45:2:511 +46:0:1982 +47:2:513 +48:2:514 +49:0:1982 +50:2:518 +51:2:522 +52:2:523 +53:2:531 +54:2:532 +55:2:536 +56:2:537 +57:2:545 +58:2:550 +59:2:551 +60:2:562 +61:2:563 +62:2:574 +63:2:575 +64:2:576 +65:2:587 +66:2:592 +67:2:593 +68:0:1982 +69:2:605 +70:0:1982 +71:2:607 +72:0:1982 +73:2:608 +74:0:1982 +75:2:618 +76:0:1982 +77:2:622 +78:2:623 +79:2:627 +80:2:631 +81:2:632 +82:2:636 +83:2:644 +84:2:645 +85:0:1982 +86:2:653 +87:0:1982 +88:2:657 +89:2:658 +90:2:662 +91:2:666 +92:2:667 +93:2:671 +94:2:679 +95:2:680 +96:0:1982 +97:2:688 +98:0:1982 +99:2:696 +100:2:697 +101:2:701 +102:2:705 +103:2:706 +104:2:710 +105:2:718 +106:2:719 +107:0:1982 +108:2:727 +109:0:1982 +110:2:729 +111:0:1982 +112:2:730 +113:2:734 +114:2:735 +115:2:743 +116:2:744 +117:2:748 +118:2:749 +119:2:757 +120:2:762 +121:2:766 +122:2:767 +123:2:774 +124:2:775 +125:2:786 +126:2:787 +127:2:788 +128:2:799 +129:2:804 +130:2:805 +131:0:1982 +132:2:817 +133:0:1982 +134:2:819 +135:0:1982 +136:2:822 +137:2:823 +138:2:835 +139:2:836 +140:2:840 +141:2:841 +142:2:849 +143:2:854 +144:2:858 +145:2:859 +146:2:866 +147:2:867 +148:2:878 +149:2:879 +150:2:880 +151:2:891 +152:2:896 +153:2:897 +154:0:1982 +155:2:909 +156:0:1982 +157:2:911 +158:0:1982 +159:2:912 +160:0:1982 +161:2:913 +162:0:1982 +163:2:914 +164:0:1982 +165:2:915 +166:2:919 +167:2:920 +168:2:928 +169:2:929 +170:2:933 +171:2:934 +172:2:942 +173:2:947 +174:2:951 +175:2:952 +176:2:959 +177:2:960 +178:2:971 +179:2:972 +180:2:973 +181:2:984 +182:2:989 +183:2:990 +184:0:1982 +185:2:1002 +186:0:1982 +187:2:1115 +188:0:1982 +189:2:1213 +190:0:1982 +191:2:1214 +192:0:1982 +193:2:1218 +194:0:1982 +195:2:1224 +196:2:1228 +197:2:1229 +198:2:1237 +199:2:1238 +200:2:1242 +201:2:1243 +202:2:1251 +203:2:1256 +204:2:1260 +205:2:1261 +206:2:1268 +207:2:1269 +208:2:1280 +209:2:1281 +210:2:1282 +211:2:1293 +212:2:1298 +213:2:1299 +214:0:1982 +215:2:1311 +216:0:1982 +217:2:1313 +218:0:1982 +219:2:1314 +220:2:1318 +221:2:1319 +222:2:1327 +223:2:1328 +224:2:1332 +225:2:1333 +226:2:1341 +227:2:1346 +228:2:1350 +229:2:1351 +230:2:1358 +231:2:1359 +232:2:1370 +233:2:1371 +234:2:1372 +235:2:1383 +236:2:1388 +237:2:1389 +238:0:1982 +239:2:1401 +240:0:1982 +241:2:1403 +242:0:1982 +243:2:1406 +244:2:1407 +245:2:1419 +246:2:1420 +247:2:1424 +248:2:1425 +249:2:1433 +250:2:1438 +251:2:1442 +252:2:1443 +253:2:1450 +254:2:1451 +255:2:1462 +256:2:1463 +257:2:1464 +258:2:1475 +259:2:1480 +260:2:1481 +261:0:1982 +262:2:1493 +263:0:1982 +264:2:1495 +265:0:1982 +266:2:1496 +267:0:1982 +268:2:1497 +269:0:1982 +270:2:1498 +271:0:1982 +272:2:1499 +273:2:1503 +274:2:1504 +275:2:1512 +276:2:1513 +277:2:1517 +278:2:1518 +279:2:1526 +280:2:1531 +281:2:1535 +282:2:1536 +283:2:1543 +284:2:1544 +285:2:1555 +286:2:1556 +287:2:1557 +288:2:1568 +289:2:1573 +290:2:1574 +291:0:1982 +292:2:1586 +293:0:1982 +294:2:1699 +295:0:1982 +296:2:1797 +297:0:1982 +298:2:1798 +299:0:1982 +300:2:1802 +301:0:1982 +302:2:1811 +303:2:1812 +304:2:1816 +305:2:1820 +306:2:1821 +307:2:1825 +308:2:1833 +309:2:1834 +310:0:1982 +311:2:1842 +312:0:1982 +313:2:1846 +314:2:1847 +315:2:1851 +316:2:1855 +317:2:1856 +318:2:1860 +319:2:1868 +320:2:1869 +321:0:1982 +322:2:1877 +323:0:1982 +324:2:1885 +325:2:1886 +326:2:1890 +327:2:1894 +328:2:1895 +329:2:1899 +330:2:1907 +331:2:1908 +332:0:1982 +333:2:1916 +334:0:1982 +335:2:1918 +336:0:1982 +337:2:1919 +338:0:1982 +339:2:423 +340:0:1982 +341:2:424 +342:2:428 +343:2:429 +344:2:437 +345:2:438 +346:2:442 +347:2:443 +348:2:451 +349:2:456 +350:2:460 +351:2:461 +352:2:468 +353:2:469 +354:2:480 +355:2:481 +356:2:482 +357:2:493 +358:2:498 +359:2:499 +360:0:1982 +361:2:511 +362:0:1982 +363:2:513 +364:2:514 +365:0:1982 +366:2:518 +367:2:522 +368:2:523 +369:2:531 +370:2:532 +371:2:536 +372:2:537 +373:2:545 +374:2:550 +375:2:551 +376:2:562 +377:2:563 +378:2:574 +379:2:575 +380:2:576 +381:2:587 +382:2:592 +383:2:593 +384:0:1982 +385:2:605 +386:0:1982 +387:2:607 +388:0:1982 +389:2:608 +390:0:1982 +391:2:618 +392:0:1982 +393:2:622 +394:2:623 +395:2:627 +396:2:631 +397:2:632 +398:2:636 +399:2:644 +400:2:645 +401:0:1982 +402:2:653 +403:0:1982 +404:2:657 +405:2:658 +406:2:662 +407:2:666 +408:2:667 +409:2:671 +410:2:679 +411:2:680 +412:0:1982 +413:2:688 +414:0:1982 +415:2:696 +416:2:697 +417:2:701 +418:2:705 +419:2:706 +420:2:710 +421:2:718 +422:2:719 +423:0:1982 +424:2:727 +425:0:1982 +426:2:729 +427:0:1982 +428:2:730 +429:2:734 +430:2:735 +431:2:743 +432:2:744 +433:2:748 +434:2:749 +435:2:757 +436:2:762 +437:2:766 +438:2:767 +439:2:774 +440:2:775 +441:2:786 +442:2:787 +443:2:788 +444:2:799 +445:2:804 +446:2:805 +447:0:1982 +448:2:817 +449:0:1982 +450:2:819 +451:0:1982 +452:2:822 +453:2:823 +454:2:835 +455:2:836 +456:2:840 +457:2:841 +458:2:849 +459:2:854 +460:2:858 +461:2:859 +462:2:866 +463:2:867 +464:2:878 +465:2:879 +466:2:880 +467:2:891 +468:2:896 +469:2:897 +470:0:1982 +471:2:909 +472:0:1982 +473:2:911 +474:0:1982 +475:2:912 +476:0:1982 +477:2:913 +478:0:1982 +479:2:914 +480:0:1982 +481:2:915 +482:2:919 +483:2:920 +484:2:928 +485:2:929 +486:2:933 +487:2:934 +488:2:942 +489:2:947 +490:2:951 +491:2:952 +492:2:959 +493:2:960 +494:2:971 +495:2:972 +496:2:973 +497:2:984 +498:2:989 +499:2:990 +500:0:1982 +501:2:1002 +502:0:1982 +503:2:1115 +504:0:1982 +505:2:1213 +506:0:1982 +507:2:1214 +508:0:1982 +509:2:1218 +510:0:1982 +511:2:1224 +512:2:1228 +513:2:1229 +514:2:1237 +515:2:1238 +516:2:1242 +517:2:1243 +518:2:1251 +519:2:1256 +520:2:1260 +521:2:1261 +522:2:1268 +523:2:1269 +524:2:1280 +525:2:1281 +526:2:1282 +527:2:1293 +528:2:1298 +529:2:1299 +530:0:1982 +531:2:1311 +532:0:1982 +533:2:1313 +534:0:1982 +535:2:1314 +536:2:1318 +537:2:1319 +538:2:1327 +539:2:1328 +540:2:1332 +541:2:1333 +542:2:1341 +543:2:1346 +544:2:1350 +545:2:1351 +546:2:1358 +547:2:1359 +548:2:1370 +549:2:1371 +550:2:1372 +551:2:1383 +552:2:1388 +553:2:1389 +554:0:1982 +555:2:1401 +556:0:1982 +557:2:1403 +558:0:1982 +559:2:1406 +560:2:1407 +561:2:1419 +562:2:1420 +563:2:1424 +564:2:1425 +565:2:1433 +566:2:1438 +567:2:1442 +568:2:1443 +569:2:1450 +570:2:1451 +571:2:1462 +572:2:1463 +573:2:1464 +574:2:1475 +575:2:1480 +576:2:1481 +577:0:1982 +578:2:1493 +579:0:1982 +580:2:1495 +581:0:1982 +582:2:1496 +583:0:1982 +584:2:1497 +585:0:1982 +586:2:1498 +587:0:1982 +588:2:1499 +589:2:1503 +590:2:1504 +591:2:1512 +592:2:1513 +593:2:1517 +594:2:1518 +595:2:1526 +596:2:1531 +597:2:1535 +598:2:1536 +599:2:1543 +600:2:1544 +601:2:1555 +602:2:1556 +603:2:1557 +604:2:1568 +605:2:1573 +606:2:1574 +607:0:1982 +608:2:1586 +609:0:1982 +610:2:1699 +611:0:1982 +612:2:1797 +613:0:1982 +614:2:1798 +615:0:1982 +616:2:1802 +617:0:1982 +618:2:1811 +619:2:1812 +620:2:1816 +621:2:1820 +622:2:1821 +623:2:1825 +624:2:1833 +625:2:1834 +626:0:1982 +627:2:1842 +628:0:1982 +629:2:1846 +630:2:1847 +631:2:1851 +632:2:1855 +633:2:1856 +634:2:1860 +635:2:1868 +636:2:1869 +637:0:1982 +638:2:1877 +639:0:1982 +640:2:1885 +641:2:1886 +642:2:1890 +643:2:1894 +644:2:1895 +645:2:1899 +646:2:1907 +647:2:1908 +648:0:1982 +649:2:1916 +650:0:1982 +651:2:1918 +652:0:1982 +653:2:1919 +654:0:1982 +655:2:423 +656:0:1982 +657:2:424 +658:2:428 +659:2:429 +660:2:437 +661:2:438 +662:2:442 +663:2:443 +664:2:451 +665:2:456 +666:2:460 +667:2:461 +668:2:468 +669:2:469 +670:2:480 +671:2:481 +672:2:482 +673:2:493 +674:2:498 +675:2:499 +676:0:1982 +677:2:511 +678:0:1982 +679:2:513 +680:2:514 +681:0:1982 +682:2:518 +683:2:522 +684:2:523 +685:2:531 +686:2:532 +687:2:536 +688:2:537 +689:2:545 +690:2:550 +691:2:551 +692:2:562 +693:2:563 +694:2:574 +695:2:575 +696:2:576 +697:2:587 +698:2:592 +699:2:593 +700:0:1982 +701:2:605 +702:0:1982 +703:2:607 +704:0:1982 +705:2:608 +706:0:1982 +707:2:618 +708:0:1982 +709:2:622 +710:2:623 +711:2:627 +712:2:631 +713:2:632 +714:2:636 +715:2:644 +716:2:645 +717:0:1982 +718:2:653 +719:0:1982 +720:2:657 +721:2:658 +722:2:662 +723:2:666 +724:2:667 +725:2:671 +726:2:679 +727:2:680 +728:0:1982 +729:2:688 +730:0:1982 +731:2:696 +732:2:697 +733:2:701 +734:2:705 +735:2:706 +736:2:710 +737:2:718 +738:2:719 +739:0:1982 +740:2:727 +741:0:1982 +742:2:729 +743:0:1982 +744:2:730 +745:2:734 +746:2:735 +747:2:743 +748:2:744 +749:2:748 +750:2:749 +751:2:757 +752:2:762 +753:2:766 +754:2:767 +755:2:774 +756:2:775 +757:2:786 +758:2:787 +759:2:788 +760:2:799 +761:2:804 +762:2:805 +763:0:1982 +764:2:817 +765:0:1982 +766:2:819 +767:0:1982 +768:2:822 +769:2:823 +770:2:835 +771:2:836 +772:2:840 +773:2:841 +774:2:849 +775:2:854 +776:2:858 +777:2:859 +778:2:866 +779:2:867 +780:2:878 +781:2:879 +782:2:880 +783:2:891 +784:2:896 +785:2:897 +786:0:1982 +787:2:909 +788:0:1982 +789:2:911 +790:0:1982 +791:2:912 +792:0:1982 +793:2:913 +794:0:1982 +795:2:914 +796:0:1982 +797:2:915 +798:2:919 +799:2:920 +800:2:928 +801:2:929 +802:2:933 +803:2:934 +804:2:942 +805:2:947 +806:2:951 +807:2:952 +808:2:959 +809:2:960 +810:2:971 +811:2:972 +812:2:973 +813:2:984 +814:2:989 +815:2:990 +816:0:1982 +817:2:1002 +818:0:1982 +819:2:1115 +820:0:1982 +821:2:1213 +822:0:1982 +823:2:1214 +824:0:1982 +825:2:1218 +826:0:1982 +827:2:1224 +828:2:1228 +829:2:1229 +830:2:1237 +831:2:1238 +832:2:1242 +833:2:1243 +834:2:1251 +835:2:1256 +836:2:1260 +837:2:1261 +838:2:1268 +839:2:1269 +840:2:1280 +841:2:1281 +842:2:1282 +843:2:1293 +844:2:1298 +845:2:1299 +846:0:1982 +847:2:1311 +848:0:1982 +849:2:1313 +850:0:1982 +851:2:1314 +852:2:1318 +853:2:1319 +854:2:1327 +855:2:1328 +856:2:1332 +857:2:1333 +858:2:1341 +859:2:1346 +860:2:1350 +861:2:1351 +862:2:1358 +863:2:1359 +864:2:1370 +865:2:1371 +866:2:1372 +867:2:1383 +868:2:1388 +869:2:1389 +870:0:1982 +871:2:1401 +872:0:1982 +873:2:1403 +874:0:1982 +875:2:1406 +876:2:1407 +877:2:1419 +878:2:1420 +879:2:1424 +880:2:1425 +881:2:1433 +882:2:1438 +883:2:1442 +884:2:1443 +885:2:1450 +886:2:1451 +887:2:1462 +888:2:1463 +889:2:1464 +890:2:1475 +891:2:1480 +892:2:1481 +893:0:1982 +894:2:1493 +895:0:1982 +896:2:1495 +897:0:1982 +898:2:1496 +899:0:1982 +900:2:1497 +901:0:1982 +902:2:1498 +903:0:1982 +904:2:1499 +905:2:1503 +906:2:1504 +907:2:1512 +908:2:1513 +909:2:1517 +910:2:1518 +911:2:1526 +912:2:1531 +913:2:1535 +914:2:1536 +915:2:1543 +916:2:1544 +917:2:1555 +918:2:1556 +919:2:1557 +920:2:1568 +921:2:1573 +922:2:1574 +923:0:1982 +924:2:1586 +925:0:1982 +926:2:1699 +927:0:1982 +928:2:1797 +929:0:1982 +930:2:1798 +931:0:1982 +932:2:1802 +933:0:1982 +934:2:1811 +935:2:1812 +936:2:1816 +937:2:1820 +938:2:1821 +939:2:1825 +940:2:1833 +941:2:1834 +942:0:1982 +943:2:1842 +944:0:1982 +945:2:1846 +946:2:1847 +947:2:1851 +948:2:1855 +949:2:1856 +950:2:1860 +951:2:1868 +952:2:1869 +953:0:1982 +954:2:1877 +955:0:1982 +956:2:1885 +957:2:1886 +958:2:1890 +959:2:1894 +960:2:1895 +961:2:1899 +962:2:1907 +963:2:1908 +964:0:1982 +965:2:1916 +966:0:1982 +967:2:1918 +968:0:1982 +969:2:1919 +970:0:1982 +971:2:423 +972:0:1982 +973:2:424 +974:2:428 +975:2:429 +976:2:437 +977:2:438 +978:2:442 +979:2:443 +980:2:451 +981:2:456 +982:2:460 +983:2:461 +984:2:468 +985:2:469 +986:2:480 +987:2:481 +988:2:482 +989:2:493 +990:2:498 +991:2:499 +992:0:1982 +993:2:511 +994:0:1982 +995:2:513 +996:2:514 +997:0:1982 +998:2:518 +999:2:522 +1000:2:523 +1001:2:531 +1002:2:532 +1003:2:536 +1004:2:537 +1005:2:545 +1006:2:550 +1007:2:551 +1008:2:562 +1009:2:563 +1010:2:574 +1011:2:575 +1012:2:576 +1013:2:587 +1014:2:592 +1015:2:593 +1016:0:1982 +1017:2:605 +1018:0:1982 +1019:2:607 +1020:0:1982 +1021:2:608 +1022:0:1982 +1023:2:618 +1024:0:1982 +1025:2:622 +1026:2:623 +1027:2:627 +1028:2:631 +1029:2:632 +1030:2:636 +1031:2:644 +1032:2:645 +1033:0:1982 +1034:2:653 +1035:0:1982 +1036:2:657 +1037:2:658 +1038:2:662 +1039:2:666 +1040:2:667 +1041:2:671 +1042:2:679 +1043:2:680 +1044:0:1982 +1045:2:688 +1046:0:1982 +1047:2:696 +1048:2:697 +1049:2:701 +1050:2:705 +1051:2:706 +1052:2:710 +1053:2:718 +1054:2:719 +1055:0:1982 +1056:2:727 +1057:0:1982 +1058:2:729 +1059:0:1982 +1060:2:730 +1061:2:734 +1062:2:735 +1063:2:743 +1064:2:744 +1065:2:748 +1066:2:749 +1067:2:757 +1068:2:762 +1069:2:766 +1070:2:767 +1071:2:774 +1072:2:775 +1073:2:786 +1074:2:787 +1075:2:788 +1076:2:799 +1077:2:804 +1078:2:805 +1079:0:1982 +1080:2:817 +1081:0:1982 +1082:2:819 +1083:0:1982 +1084:2:822 +1085:2:823 +1086:2:835 +1087:2:836 +1088:2:840 +1089:2:841 +1090:2:849 +1091:2:854 +1092:2:858 +1093:2:859 +1094:2:866 +1095:2:867 +1096:2:878 +1097:2:879 +1098:2:880 +1099:2:891 +1100:2:896 +1101:2:897 +1102:0:1982 +1103:2:909 +1104:0:1982 +1105:2:911 +1106:0:1982 +1107:2:912 +1108:0:1982 +1109:2:913 +1110:0:1982 +1111:2:914 +1112:0:1982 +1113:2:915 +1114:2:919 +1115:2:920 +1116:2:928 +1117:2:929 +1118:2:933 +1119:2:934 +1120:2:942 +1121:2:947 +1122:2:951 +1123:2:952 +1124:2:959 +1125:2:960 +1126:2:971 +1127:2:972 +1128:2:973 +1129:2:984 +1130:2:989 +1131:2:990 +1132:0:1982 +1133:2:1002 +1134:0:1982 +1135:2:1115 +1136:0:1982 +1137:2:1213 +1138:0:1982 +1139:2:1214 +1140:0:1982 +1141:2:1218 +1142:0:1982 +1143:2:1224 +1144:2:1228 +1145:2:1229 +1146:2:1237 +1147:2:1238 +1148:2:1242 +1149:2:1243 +1150:2:1251 +1151:2:1256 +1152:2:1260 +1153:2:1261 +1154:2:1268 +1155:2:1269 +1156:2:1280 +1157:2:1281 +1158:2:1282 +1159:2:1293 +1160:2:1298 +1161:2:1299 +1162:0:1982 +1163:2:1311 +1164:0:1982 +1165:2:1313 +1166:0:1982 +1167:2:1314 +1168:2:1318 +1169:2:1319 +1170:2:1327 +1171:2:1328 +1172:2:1332 +1173:2:1333 +1174:2:1341 +1175:2:1346 +1176:2:1350 +1177:2:1351 +1178:2:1358 +1179:2:1359 +1180:2:1370 +1181:2:1371 +1182:2:1372 +1183:2:1383 +1184:2:1388 +1185:2:1389 +1186:0:1982 +1187:2:1401 +1188:0:1982 +1189:2:1403 +1190:0:1982 +1191:2:1406 +1192:2:1407 +1193:2:1419 +1194:2:1420 +1195:2:1424 +1196:2:1425 +1197:2:1433 +1198:2:1438 +1199:2:1442 +1200:2:1443 +1201:2:1450 +1202:2:1451 +1203:2:1462 +1204:2:1463 +1205:2:1464 +1206:2:1475 +1207:2:1480 +1208:2:1481 +1209:0:1982 +1210:2:1493 +1211:0:1982 +1212:2:1495 +1213:0:1982 +1214:2:1496 +1215:0:1982 +1216:2:1497 +1217:0:1982 +1218:2:1498 +1219:0:1982 +1220:2:1499 +1221:2:1503 +1222:2:1504 +1223:2:1512 +1224:2:1513 +1225:2:1517 +1226:2:1518 +1227:2:1526 +1228:2:1531 +1229:2:1535 +1230:2:1536 +1231:2:1543 +1232:2:1544 +1233:2:1555 +1234:2:1556 +1235:2:1557 +1236:2:1568 +1237:2:1573 +1238:2:1574 +1239:0:1982 +1240:2:1586 +1241:0:1982 +1242:2:1699 +1243:0:1982 +1244:2:1797 +1245:0:1982 +1246:2:1798 +1247:0:1982 +1248:2:1802 +1249:0:1982 +1250:2:1811 +1251:2:1812 +1252:2:1816 +1253:2:1820 +1254:2:1821 +1255:2:1825 +1256:2:1833 +1257:2:1834 +1258:0:1982 +1259:2:1842 +1260:0:1982 +1261:2:1846 +1262:2:1847 +1263:2:1851 +1264:2:1855 +1265:2:1856 +1266:2:1860 +1267:2:1868 +1268:2:1869 +1269:0:1982 +1270:2:1877 +1271:0:1982 +1272:2:1885 +1273:2:1886 +1274:2:1890 +1275:2:1894 +1276:2:1895 +1277:2:1899 +1278:2:1907 +1279:2:1908 +1280:0:1982 +1281:2:1916 +1282:0:1982 +1283:2:1918 +1284:0:1982 +1285:2:1919 +1286:0:1982 +1287:2:423 +1288:0:1982 +1289:2:424 +1290:2:428 +1291:2:429 +1292:2:437 +1293:2:438 +1294:2:442 +1295:2:443 +1296:2:451 +1297:2:456 +1298:2:460 +1299:2:461 +1300:2:468 +1301:2:469 +1302:2:480 +1303:2:481 +1304:2:482 +1305:2:493 +1306:2:498 +1307:2:499 +1308:0:1982 +1309:2:511 +1310:0:1982 +1311:2:513 +1312:2:514 +1313:0:1982 +1314:2:518 +1315:2:522 +1316:2:523 +1317:2:531 +1318:2:532 +1319:2:536 +1320:2:537 +1321:2:545 +1322:2:558 +1323:2:559 +1324:2:562 +1325:2:563 +1326:2:574 +1327:2:575 +1328:2:576 +1329:2:587 +1330:2:592 +1331:2:595 +1332:2:596 +1333:0:1982 +1334:2:605 +1335:0:1982 +1336:2:607 +1337:0:1982 +1338:2:608 +1339:0:1982 +1340:2:618 +1341:0:1982 +1342:1:2 +1343:0:1982 +1344:1:8 +1345:0:1982 +1346:1:9 +1347:0:1982 +1348:1:10 +1349:0:1982 +1350:1:11 +1351:0:1982 +1352:1:12 +1353:1:16 +1354:1:17 +1355:1:25 +1356:1:26 +1357:1:30 +1358:1:31 +1359:1:39 +1360:1:44 +1361:1:48 +1362:1:49 +1363:1:56 +1364:1:57 +1365:1:68 +1366:1:69 +1367:1:70 +1368:1:81 +1369:1:86 +1370:1:87 +1371:0:1982 +1372:1:99 +1373:0:1982 +1374:2:622 +1375:2:623 +1376:2:627 +1377:2:631 +1378:2:632 +1379:2:636 +1380:2:641 +1381:0:1982 +1382:2:653 +1383:0:1982 +1384:2:657 +1385:2:658 +1386:2:662 +1387:2:666 +1388:2:667 +1389:2:671 +1390:2:679 +1391:2:680 +1392:0:1982 +1393:2:688 +1394:0:1982 +1395:2:696 +1396:2:697 +1397:2:701 +1398:2:705 +1399:2:706 +1400:2:710 +1401:2:718 +1402:2:719 +1403:0:1982 +1404:2:727 +1405:0:1982 +1406:2:729 +1407:0:1982 +1408:2:730 +1409:2:734 +1410:2:735 +1411:2:743 +1412:2:744 +1413:2:748 +1414:2:749 +1415:2:757 +1416:2:762 +1417:2:766 +1418:2:767 +1419:2:774 +1420:2:775 +1421:2:786 +1422:2:787 +1423:2:788 +1424:2:799 +1425:2:804 +1426:2:805 +1427:0:1982 +1428:2:817 +1429:0:1982 +1430:2:819 +1431:0:1982 +1432:2:822 +1433:2:823 +1434:2:835 +1435:2:836 +1436:2:840 +1437:2:841 +1438:2:849 +1439:2:854 +1440:2:858 +1441:2:859 +1442:2:866 +1443:2:867 +1444:2:878 +1445:2:879 +1446:2:880 +1447:2:891 +1448:2:896 +1449:2:897 +1450:0:1982 +1451:2:909 +1452:0:1982 +1453:2:911 +1454:0:1982 +1455:2:912 +1456:0:1982 +1457:2:913 +1458:0:1982 +1459:2:914 +1460:0:1982 +1461:2:915 +1462:2:919 +1463:2:920 +1464:2:928 +1465:2:929 +1466:2:933 +1467:2:934 +1468:2:942 +1469:2:947 +1470:2:951 +1471:2:952 +1472:2:959 +1473:2:960 +1474:2:971 +1475:2:972 +1476:2:973 +1477:2:984 +1478:2:989 +1479:2:990 +1480:0:1982 +1481:2:1002 +1482:0:1982 +1483:2:1115 +1484:0:1982 +1485:2:1213 +1486:0:1982 +1487:2:1214 +1488:0:1982 +1489:2:1218 +1490:0:1982 +1491:2:1224 +1492:2:1228 +1493:2:1229 +1494:2:1237 +1495:2:1238 +1496:2:1242 +1497:2:1243 +1498:2:1251 +1499:2:1256 +1500:2:1260 +1501:2:1261 +1502:2:1268 +1503:2:1269 +1504:2:1280 +1505:2:1281 +1506:2:1282 +1507:2:1293 +1508:2:1298 +1509:2:1299 +1510:0:1982 +1511:2:1311 +1512:0:1982 +1513:2:1313 +1514:0:1982 +1515:2:1314 +1516:2:1318 +1517:2:1319 +1518:2:1327 +1519:2:1328 +1520:2:1332 +1521:2:1333 +1522:2:1341 +1523:2:1346 +1524:2:1350 +1525:2:1351 +1526:2:1358 +1527:2:1359 +1528:2:1370 +1529:2:1371 +1530:2:1372 +1531:2:1383 +1532:2:1388 +1533:2:1389 +1534:0:1982 +1535:2:1401 +1536:0:1982 +1537:2:1403 +1538:0:1982 +1539:2:1406 +1540:2:1407 +1541:2:1419 +1542:2:1420 +1543:2:1424 +1544:2:1425 +1545:2:1433 +1546:2:1438 +1547:2:1442 +1548:2:1443 +1549:2:1450 +1550:2:1451 +1551:2:1462 +1552:2:1463 +1553:2:1464 +1554:2:1475 +1555:2:1480 +1556:2:1481 +1557:0:1982 +1558:2:1493 +1559:0:1982 +1560:2:1495 +1561:0:1982 +1562:2:1496 +1563:0:1982 +1564:2:1497 +1565:0:1982 +1566:2:1498 +1567:0:1982 +1568:2:1499 +1569:2:1503 +1570:2:1504 +1571:2:1512 +1572:2:1513 +1573:2:1517 +1574:2:1518 +1575:2:1526 +1576:2:1531 +1577:2:1535 +1578:2:1536 +1579:2:1543 +1580:2:1544 +1581:2:1555 +1582:2:1556 +1583:2:1557 +1584:2:1568 +1585:2:1573 +1586:2:1574 +1587:0:1982 +1588:2:1586 +1589:0:1982 +1590:2:1699 +1591:0:1982 +1592:2:1797 +1593:0:1982 +1594:2:1798 +1595:0:1982 +1596:2:1802 +1597:0:1982 +1598:2:1811 +1599:2:1812 +1600:2:1816 +1601:2:1820 +1602:2:1821 +1603:2:1825 +1604:2:1833 +1605:2:1834 +1606:0:1982 +1607:2:1842 +1608:0:1982 +1609:2:1846 +1610:2:1847 +1611:2:1851 +1612:2:1855 +1613:2:1856 +1614:2:1860 +1615:2:1868 +1616:2:1869 +1617:0:1982 +1618:2:1877 +1619:0:1982 +1620:2:1885 +1621:2:1886 +1622:2:1890 +1623:2:1894 +1624:2:1895 +1625:2:1899 +1626:2:1907 +1627:2:1908 +1628:0:1982 +1629:2:1916 +1630:0:1982 +1631:2:1918 +1632:0:1982 +1633:2:1919 +1634:0:1982 +1635:2:1922 +1636:0:1982 +1637:2:1927 +1638:0:1982 +1639:1:101 +1640:0:1982 +1641:2:1928 +1642:0:1982 +1643:1:102 +1644:1:106 +1645:1:107 +1646:1:115 +1647:1:116 +1648:1:120 +1649:1:121 +1650:1:129 +1651:1:134 +1652:1:138 +1653:1:139 +1654:1:146 +1655:1:147 +1656:1:158 +1657:1:159 +1658:1:160 +1659:1:171 +1660:1:183 +1661:1:184 +1662:0:1982 +1663:2:1927 +1664:0:1982 +1665:1:189 +1666:0:1982 +1667:2:1928 +1668:0:1982 +1669:1:191 +1670:0:1982 +1671:2:1927 +1672:0:1982 +1673:1:192 +1674:0:1982 +1675:2:1928 +1676:0:1982 +1677:1:193 +1678:1:197 +1679:1:198 +1680:1:206 +1681:1:207 +1682:1:211 +1683:1:212 +1684:1:220 +1685:1:225 +1686:1:229 +1687:1:230 +1688:1:237 +1689:1:238 +1690:1:249 +1691:1:250 +1692:1:251 +1693:1:262 +1694:1:274 +1695:1:275 +1696:0:1982 +1697:2:1927 +1698:0:1982 +1699:1:280 +1700:0:1982 +1701:2:1928 +1702:0:1982 +1703:1:282 +1704:0:1982 +1705:2:1927 +1706:0:1982 +1707:1:291 +1708:0:1982 +1709:2:1928 +1710:0:1982 +1711:1:293 +1712:0:1982 +1713:2:1927 +1714:0:1982 +1715:1:11 +1716:0:1982 +1717:2:1928 +1718:0:1982 +1719:1:12 +1720:1:16 +1721:1:17 +1722:1:25 +1723:1:26 +1724:1:27 +1725:1:39 +1726:1:44 +1727:1:48 +1728:1:49 +1729:1:56 +1730:1:57 +1731:1:68 +1732:1:69 +1733:1:70 +1734:1:81 +1735:1:93 +1736:1:94 +1737:0:1982 +1738:2:1927 +1739:0:1982 +1740:1:99 +1741:0:1982 +1742:2:1928 +1743:0:1982 +1744:1:101 +1745:0:1982 +1746:2:1927 +1747:0:1982 +1748:1:102 +1749:1:106 +1750:1:107 +1751:1:115 +1752:1:116 +1753:1:120 +1754:1:121 +1755:1:129 +1756:1:134 +1757:1:138 +1758:1:139 +1759:1:146 +1760:1:147 +1761:1:158 +1762:1:159 +1763:1:160 +1764:1:171 +1765:1:183 +1766:1:184 +1767:0:1982 +1768:2:1928 +1769:0:1982 +1770:1:189 +1771:0:1982 +1772:2:1927 +1773:0:1982 +1774:1:285 +1775:0:1982 +1776:2:1928 +1777:0:1982 +1778:1:286 +1779:0:1982 +1780:2:1927 +1781:0:1982 +1782:1:291 +1783:0:1982 +1784:2:1928 +1785:0:1982 +1786:1:293 +1787:0:1982 +1788:2:1927 +1789:0:1982 +1790:1:296 +1791:0:1982 +1792:2:1928 +1793:0:1982 +1794:1:301 +1795:0:1982 +1796:2:1927 +1797:0:1982 +1798:1:302 +1799:0:1980 +1800:2:1928 +1801:0:1986 +1802:1:124 diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.define b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.define new file mode 100644 index 0000000..710f29d --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.define @@ -0,0 +1 @@ +#define NO_WMB diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.log b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.log new file mode 100644 index 0000000..4dd3892 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.log @@ -0,0 +1,294 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_free_no_wmb.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 744) +pan: claim violated! (at depth 1882) +pan: wrote .input.spin.trail + +(Spin Version 5.1.7 -- 23 December 2008) +Warning: Search not completed + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 4174, errors: 1 + 367189 states, stored + 3431533 states, matched + 3798722 transitions (= stored+matched) + 13407384 atomic steps +hash conflicts: 253700 (resolved) + +Stats on memory usage (in Megabytes): + 29.415 equivalent memory usage for states (stored*(State-vector + overhead)) + 22.811 actual memory usage for states (compression: 77.55%) + state-vector as stored = 37 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 488.518 total actual memory usage + +unreached in proctype urcu_reader + line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 61, "(1)" + line 418, "pan.___", state 91, "(1)" + line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 151, "(1)" + line 418, "pan.___", state 181, "(1)" + line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 242, "(1)" + line 418, "pan.___", state 272, "(1)" + line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 331, "(1)" + line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 360, "(1)" + line 418, "pan.___", state 390, "(1)" + line 540, "pan.___", state 414, "-end-" + (18 of 414 states) +unreached in proctype urcu_writer + line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 399, "pan.___", state 20, "(1)" + line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 34, "(1)" + line 403, "pan.___", state 35, "(1)" + line 403, "pan.___", state 35, "(1)" + line 401, "pan.___", state 40, "((i<1))" + line 401, "pan.___", state 40, "((i>=1))" + line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 59, "(1)" + line 409, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 60, "else" + line 409, "pan.___", state 63, "(1)" + line 409, "pan.___", state 64, "(1)" + line 409, "pan.___", state 64, "(1)" + line 413, "pan.___", state 72, "(1)" + line 413, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 73, "else" + line 413, "pan.___", state 76, "(1)" + line 413, "pan.___", state 77, "(1)" + line 413, "pan.___", state 77, "(1)" + line 411, "pan.___", state 82, "((i<1))" + line 411, "pan.___", state 82, "((i>=1))" + line 418, "pan.___", state 89, "(1)" + line 418, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 90, "else" + line 418, "pan.___", state 93, "(1)" + line 418, "pan.___", state 94, "(1)" + line 418, "pan.___", state 94, "(1)" + line 420, "pan.___", state 97, "(1)" + line 420, "pan.___", state 97, "(1)" + line 369, "pan.___", state 99, "(1)" + line 639, "pan.___", state 103, "cached_generation_ptr.val[_pid] = (old_gen+1)" + line 637, "pan.___", state 104, "old_gen = cached_generation_ptr.val[_pid]" + line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 399, "pan.___", state 114, "(1)" + line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 128, "(1)" + line 403, "pan.___", state 129, "(1)" + line 403, "pan.___", state 129, "(1)" + line 401, "pan.___", state 134, "((i<1))" + line 401, "pan.___", state 134, "((i>=1))" + line 409, "pan.___", state 153, "(1)" + line 409, "pan.___", state 154, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 154, "else" + line 409, "pan.___", state 157, "(1)" + line 409, "pan.___", state 158, "(1)" + line 409, "pan.___", state 158, "(1)" + line 413, "pan.___", state 166, "(1)" + line 413, "pan.___", state 167, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 167, "else" + line 413, "pan.___", state 170, "(1)" + line 413, "pan.___", state 171, "(1)" + line 413, "pan.___", state 171, "(1)" + line 411, "pan.___", state 176, "((i<1))" + line 411, "pan.___", state 176, "((i>=1))" + line 418, "pan.___", state 183, "(1)" + line 418, "pan.___", state 184, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 184, "else" + line 418, "pan.___", state 187, "(1)" + line 418, "pan.___", state 188, "(1)" + line 418, "pan.___", state 188, "(1)" + line 420, "pan.___", state 191, "(1)" + line 420, "pan.___", state 191, "(1)" + line 369, "pan.___", state 193, "(1)" + line 652, "pan.___", state 199, "(1)" + line 646, "pan.___", state 202, "((write_lock==0))" + line 646, "pan.___", state 202, "else" + line 644, "pan.___", state 203, "(1)" + line 160, "pan.___", state 209, "(1)" + line 164, "pan.___", state 217, "(1)" + line 164, "pan.___", state 218, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 164, "pan.___", state 218, "else" + line 162, "pan.___", state 223, "((j<1))" + line 162, "pan.___", state 223, "((j>=1))" + line 168, "pan.___", state 229, "(1)" + line 168, "pan.___", state 230, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 168, "pan.___", state 230, "else" + line 160, "pan.___", state 241, "(1)" + line 168, "pan.___", state 261, "(1)" + line 160, "pan.___", state 277, "(1)" + line 164, "pan.___", state 285, "(1)" + line 168, "pan.___", state 297, "(1)" + line 399, "pan.___", state 311, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 325, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 343, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 356, "(1)" + line 413, "pan.___", state 369, "(1)" + line 418, "pan.___", state 386, "(1)" + line 399, "pan.___", state 405, "(1)" + line 403, "pan.___", state 417, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 435, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 461, "(1)" + line 418, "pan.___", state 478, "(1)" + line 403, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 554, "(1)" + line 418, "pan.___", state 571, "(1)" + line 164, "pan.___", state 594, "(1)" + line 168, "pan.___", state 606, "(1)" + line 160, "pan.___", state 618, "(1)" + line 168, "pan.___", state 638, "(1)" + line 164, "pan.___", state 662, "(1)" + line 168, "pan.___", state 674, "(1)" + line 399, "pan.___", state 696, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 399, "pan.___", state 698, "(1)" + line 399, "pan.___", state 699, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 399, "pan.___", state 699, "else" + line 399, "pan.___", state 702, "(1)" + line 403, "pan.___", state 710, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 712, "(1)" + line 403, "pan.___", state 713, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 403, "pan.___", state 713, "else" + line 403, "pan.___", state 716, "(1)" + line 403, "pan.___", state 717, "(1)" + line 403, "pan.___", state 717, "(1)" + line 401, "pan.___", state 722, "((i<1))" + line 401, "pan.___", state 722, "((i>=1))" + line 408, "pan.___", state 728, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 741, "(1)" + line 409, "pan.___", state 742, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 742, "else" + line 409, "pan.___", state 745, "(1)" + line 409, "pan.___", state 746, "(1)" + line 409, "pan.___", state 746, "(1)" + line 413, "pan.___", state 754, "(1)" + line 413, "pan.___", state 755, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 755, "else" + line 413, "pan.___", state 758, "(1)" + line 413, "pan.___", state 759, "(1)" + line 413, "pan.___", state 759, "(1)" + line 411, "pan.___", state 764, "((i<1))" + line 411, "pan.___", state 764, "((i>=1))" + line 418, "pan.___", state 771, "(1)" + line 418, "pan.___", state 772, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 772, "else" + line 418, "pan.___", state 775, "(1)" + line 418, "pan.___", state 776, "(1)" + line 418, "pan.___", state 776, "(1)" + line 420, "pan.___", state 779, "(1)" + line 420, "pan.___", state 779, "(1)" + line 403, "pan.___", state 810, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 828, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 854, "(1)" + line 418, "pan.___", state 871, "(1)" + line 403, "pan.___", state 900, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 918, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 944, "(1)" + line 418, "pan.___", state 961, "(1)" + line 399, "pan.___", state 980, "(1)" + line 403, "pan.___", state 992, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1010, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1036, "(1)" + line 418, "pan.___", state 1053, "(1)" + line 403, "pan.___", state 1085, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1103, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1129, "(1)" + line 418, "pan.___", state 1146, "(1)" + line 164, "pan.___", state 1169, "(1)" + line 168, "pan.___", state 1181, "(1)" + line 160, "pan.___", state 1193, "(1)" + line 168, "pan.___", state 1213, "(1)" + line 164, "pan.___", state 1237, "(1)" + line 168, "pan.___", state 1249, "(1)" + line 399, "pan.___", state 1271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 399, "pan.___", state 1273, "(1)" + line 399, "pan.___", state 1274, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 399, "pan.___", state 1274, "else" + line 399, "pan.___", state 1277, "(1)" + line 403, "pan.___", state 1285, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 1287, "(1)" + line 403, "pan.___", state 1288, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 403, "pan.___", state 1288, "else" + line 403, "pan.___", state 1291, "(1)" + line 403, "pan.___", state 1292, "(1)" + line 403, "pan.___", state 1292, "(1)" + line 401, "pan.___", state 1297, "((i<1))" + line 401, "pan.___", state 1297, "((i>=1))" + line 408, "pan.___", state 1303, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 1316, "(1)" + line 409, "pan.___", state 1317, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 1317, "else" + line 409, "pan.___", state 1320, "(1)" + line 409, "pan.___", state 1321, "(1)" + line 409, "pan.___", state 1321, "(1)" + line 413, "pan.___", state 1329, "(1)" + line 413, "pan.___", state 1330, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 1330, "else" + line 413, "pan.___", state 1333, "(1)" + line 413, "pan.___", state 1334, "(1)" + line 413, "pan.___", state 1334, "(1)" + line 411, "pan.___", state 1339, "((i<1))" + line 411, "pan.___", state 1339, "((i>=1))" + line 418, "pan.___", state 1346, "(1)" + line 418, "pan.___", state 1347, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 1347, "else" + line 418, "pan.___", state 1350, "(1)" + line 418, "pan.___", state 1351, "(1)" + line 418, "pan.___", state 1351, "(1)" + line 420, "pan.___", state 1354, "(1)" + line 420, "pan.___", state 1354, "(1)" + line 164, "pan.___", state 1379, "(1)" + line 168, "pan.___", state 1391, "(1)" + line 160, "pan.___", state 1403, "(1)" + line 168, "pan.___", state 1423, "(1)" + line 164, "pan.___", state 1447, "(1)" + line 168, "pan.___", state 1459, "(1)" + line 702, "pan.___", state 1484, "-end-" + (160 of 1484 states) +unreached in proctype :init: + line 709, "pan.___", state 9, "((j<2))" + line 709, "pan.___", state 9, "((j>=2))" + line 710, "pan.___", state 20, "((j<2))" + line 710, "pan.___", state 20, "((j>=2))" + line 715, "pan.___", state 33, "((j<2))" + line 715, "pan.___", state 33, "((j>=2))" + (3 of 46 states) +unreached in proctype :never: + line 749, "pan.___", state 8, "-end-" + (1 of 8 states) + +pan: elapsed time 2.96 seconds +pan: rate 124050.34 states/second +pan: avg transition delay 7.7921e-07 usec +cp .input.spin urcu_free_no_wmb.spin.input +cp .input.spin.trail urcu_free_no_wmb.spin.input.trail +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.spin.input b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.spin.input new file mode 100644 index 0000000..f4d8acb --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.spin.input @@ -0,0 +1,723 @@ +#define NO_WMB + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +//#define TEST_SIGNAL +//#define TEST_SIGNAL_ON_READ +//#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +//#define READER_NEST_LEVEL 1 +#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.spin.input.trail b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.spin.input.trail new file mode 100644 index 0000000..f73a838 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.spin.input.trail @@ -0,0 +1,1885 @@ +-2:3:-2 +-4:-4:-4 +1:0:1946 +2:3:1898 +3:3:1901 +4:3:1901 +5:3:1904 +6:3:1912 +7:3:1912 +8:3:1915 +9:3:1921 +10:3:1925 +11:3:1925 +12:3:1928 +13:3:1936 +14:3:1940 +15:3:1941 +16:0:1946 +17:3:1943 +18:0:1946 +19:2:416 +20:0:1946 +21:2:422 +22:0:1946 +23:2:423 +24:0:1946 +25:2:424 +26:2:428 +27:2:429 +28:2:437 +29:2:438 +30:2:442 +31:2:443 +32:2:451 +33:2:456 +34:2:460 +35:2:461 +36:2:468 +37:2:469 +38:2:480 +39:2:481 +40:2:482 +41:2:493 +42:2:498 +43:2:499 +44:0:1946 +45:2:511 +46:0:1946 +47:2:513 +48:2:514 +49:0:1946 +50:2:518 +51:2:522 +52:2:523 +53:2:531 +54:2:532 +55:2:536 +56:2:537 +57:2:545 +58:2:550 +59:2:551 +60:2:562 +61:2:563 +62:2:574 +63:2:575 +64:2:576 +65:2:587 +66:2:592 +67:2:593 +68:0:1946 +69:2:605 +70:0:1946 +71:2:607 +72:0:1946 +73:2:608 +74:0:1946 +75:2:618 +76:0:1946 +77:2:619 +78:2:626 +79:2:627 +80:2:634 +81:2:639 +82:0:1946 +83:2:650 +84:0:1946 +85:2:651 +86:2:658 +87:2:659 +88:2:666 +89:2:671 +90:0:1946 +91:2:682 +92:0:1946 +93:2:687 +94:2:694 +95:2:695 +96:2:702 +97:2:707 +98:0:1946 +99:2:718 +100:0:1946 +101:2:720 +102:0:1946 +103:2:721 +104:2:725 +105:2:726 +106:2:734 +107:2:735 +108:2:739 +109:2:740 +110:2:748 +111:2:753 +112:2:757 +113:2:758 +114:2:765 +115:2:766 +116:2:777 +117:2:778 +118:2:779 +119:2:790 +120:2:795 +121:2:796 +122:0:1946 +123:2:808 +124:0:1946 +125:2:810 +126:0:1946 +127:2:813 +128:2:814 +129:2:826 +130:2:827 +131:2:831 +132:2:832 +133:2:840 +134:2:845 +135:2:849 +136:2:850 +137:2:857 +138:2:858 +139:2:869 +140:2:870 +141:2:871 +142:2:882 +143:2:887 +144:2:888 +145:0:1946 +146:2:900 +147:0:1946 +148:2:902 +149:0:1946 +150:2:903 +151:0:1946 +152:2:904 +153:0:1946 +154:2:905 +155:0:1946 +156:2:906 +157:2:910 +158:2:911 +159:2:919 +160:2:920 +161:2:924 +162:2:925 +163:2:933 +164:2:938 +165:2:942 +166:2:943 +167:2:950 +168:2:951 +169:2:962 +170:2:963 +171:2:964 +172:2:975 +173:2:980 +174:2:981 +175:0:1946 +176:2:993 +177:0:1946 +178:2:1097 +179:0:1946 +180:2:1195 +181:0:1946 +182:2:1196 +183:0:1946 +184:2:1200 +185:0:1946 +186:2:1206 +187:2:1210 +188:2:1211 +189:2:1219 +190:2:1220 +191:2:1224 +192:2:1225 +193:2:1233 +194:2:1238 +195:2:1242 +196:2:1243 +197:2:1250 +198:2:1251 +199:2:1262 +200:2:1263 +201:2:1264 +202:2:1275 +203:2:1280 +204:2:1281 +205:0:1946 +206:2:1293 +207:0:1946 +208:2:1295 +209:0:1946 +210:2:1296 +211:2:1300 +212:2:1301 +213:2:1309 +214:2:1310 +215:2:1314 +216:2:1315 +217:2:1323 +218:2:1328 +219:2:1332 +220:2:1333 +221:2:1340 +222:2:1341 +223:2:1352 +224:2:1353 +225:2:1354 +226:2:1365 +227:2:1370 +228:2:1371 +229:0:1946 +230:2:1383 +231:0:1946 +232:2:1385 +233:0:1946 +234:2:1388 +235:2:1389 +236:2:1401 +237:2:1402 +238:2:1406 +239:2:1407 +240:2:1415 +241:2:1420 +242:2:1424 +243:2:1425 +244:2:1432 +245:2:1433 +246:2:1444 +247:2:1445 +248:2:1446 +249:2:1457 +250:2:1462 +251:2:1463 +252:0:1946 +253:2:1475 +254:0:1946 +255:2:1477 +256:0:1946 +257:2:1478 +258:0:1946 +259:2:1479 +260:0:1946 +261:2:1480 +262:0:1946 +263:2:1481 +264:2:1485 +265:2:1486 +266:2:1494 +267:2:1495 +268:2:1499 +269:2:1500 +270:2:1508 +271:2:1513 +272:2:1517 +273:2:1518 +274:2:1525 +275:2:1526 +276:2:1537 +277:2:1538 +278:2:1539 +279:2:1550 +280:2:1555 +281:2:1556 +282:0:1946 +283:2:1568 +284:0:1946 +285:2:1672 +286:0:1946 +287:2:1770 +288:0:1946 +289:2:1771 +290:0:1946 +291:2:1775 +292:0:1946 +293:2:1781 +294:2:1788 +295:2:1789 +296:2:1796 +297:2:1801 +298:0:1946 +299:2:1812 +300:0:1946 +301:2:1813 +302:2:1820 +303:2:1821 +304:2:1828 +305:2:1833 +306:0:1946 +307:2:1844 +308:0:1946 +309:2:1849 +310:2:1856 +311:2:1857 +312:2:1864 +313:2:1869 +314:0:1946 +315:2:1880 +316:0:1946 +317:2:1882 +318:0:1946 +319:2:1883 +320:0:1946 +321:2:423 +322:0:1946 +323:2:424 +324:2:428 +325:2:429 +326:2:437 +327:2:438 +328:2:442 +329:2:443 +330:2:451 +331:2:456 +332:2:460 +333:2:461 +334:2:468 +335:2:469 +336:2:480 +337:2:481 +338:2:482 +339:2:493 +340:2:498 +341:2:499 +342:0:1946 +343:2:511 +344:0:1946 +345:2:513 +346:2:514 +347:0:1946 +348:2:518 +349:2:522 +350:2:523 +351:2:531 +352:2:532 +353:2:536 +354:2:537 +355:2:545 +356:2:550 +357:2:551 +358:2:562 +359:2:563 +360:2:574 +361:2:575 +362:2:576 +363:2:587 +364:2:592 +365:2:593 +366:0:1946 +367:2:605 +368:0:1946 +369:2:607 +370:0:1946 +371:2:608 +372:0:1946 +373:2:618 +374:0:1946 +375:2:619 +376:2:626 +377:2:627 +378:2:634 +379:2:639 +380:0:1946 +381:2:650 +382:0:1946 +383:2:651 +384:2:658 +385:2:659 +386:2:666 +387:2:671 +388:0:1946 +389:2:682 +390:0:1946 +391:2:687 +392:2:694 +393:2:695 +394:2:702 +395:2:707 +396:0:1946 +397:2:718 +398:0:1946 +399:2:720 +400:0:1946 +401:2:721 +402:2:725 +403:2:726 +404:2:734 +405:2:735 +406:2:739 +407:2:740 +408:2:748 +409:2:753 +410:2:757 +411:2:758 +412:2:765 +413:2:766 +414:2:777 +415:2:778 +416:2:779 +417:2:790 +418:2:795 +419:2:796 +420:0:1946 +421:2:808 +422:0:1946 +423:2:810 +424:0:1946 +425:2:813 +426:2:814 +427:2:826 +428:2:827 +429:2:831 +430:2:832 +431:2:840 +432:2:845 +433:2:849 +434:2:850 +435:2:857 +436:2:858 +437:2:869 +438:2:870 +439:2:871 +440:2:882 +441:2:887 +442:2:888 +443:0:1946 +444:2:900 +445:0:1946 +446:2:902 +447:0:1946 +448:2:903 +449:0:1946 +450:2:904 +451:0:1946 +452:2:905 +453:0:1946 +454:2:906 +455:2:910 +456:2:911 +457:2:919 +458:2:920 +459:2:924 +460:2:925 +461:2:933 +462:2:938 +463:2:942 +464:2:943 +465:2:950 +466:2:951 +467:2:962 +468:2:963 +469:2:964 +470:2:975 +471:2:980 +472:2:981 +473:0:1946 +474:2:993 +475:0:1946 +476:2:1097 +477:0:1946 +478:2:1195 +479:0:1946 +480:2:1196 +481:0:1946 +482:2:1200 +483:0:1946 +484:2:1206 +485:2:1210 +486:2:1211 +487:2:1219 +488:2:1220 +489:2:1224 +490:2:1225 +491:2:1233 +492:2:1238 +493:2:1242 +494:2:1243 +495:2:1250 +496:2:1251 +497:2:1262 +498:2:1263 +499:2:1264 +500:2:1275 +501:2:1280 +502:2:1281 +503:0:1946 +504:2:1293 +505:0:1946 +506:2:1295 +507:0:1946 +508:2:1296 +509:2:1300 +510:2:1301 +511:2:1309 +512:2:1310 +513:2:1314 +514:2:1315 +515:2:1323 +516:2:1328 +517:2:1332 +518:2:1333 +519:2:1340 +520:2:1341 +521:2:1352 +522:2:1353 +523:2:1354 +524:2:1365 +525:2:1370 +526:2:1371 +527:0:1946 +528:2:1383 +529:0:1946 +530:2:1385 +531:0:1946 +532:2:1388 +533:2:1389 +534:2:1401 +535:2:1402 +536:2:1406 +537:2:1407 +538:2:1415 +539:2:1420 +540:2:1424 +541:2:1425 +542:2:1432 +543:2:1433 +544:2:1444 +545:2:1445 +546:2:1446 +547:2:1457 +548:2:1462 +549:2:1463 +550:0:1946 +551:2:1475 +552:0:1946 +553:2:1477 +554:0:1946 +555:2:1478 +556:0:1946 +557:2:1479 +558:0:1946 +559:2:1480 +560:0:1946 +561:2:1481 +562:2:1485 +563:2:1486 +564:2:1494 +565:2:1495 +566:2:1499 +567:2:1500 +568:2:1508 +569:2:1513 +570:2:1517 +571:2:1518 +572:2:1525 +573:2:1526 +574:2:1537 +575:2:1538 +576:2:1539 +577:2:1550 +578:2:1555 +579:2:1556 +580:0:1946 +581:2:1568 +582:0:1946 +583:2:1672 +584:0:1946 +585:2:1770 +586:0:1946 +587:2:1771 +588:0:1946 +589:2:1775 +590:0:1946 +591:2:1781 +592:2:1788 +593:2:1789 +594:2:1796 +595:2:1801 +596:0:1946 +597:2:1812 +598:0:1946 +599:2:1813 +600:2:1820 +601:2:1821 +602:2:1828 +603:2:1833 +604:0:1946 +605:2:1844 +606:0:1946 +607:2:1849 +608:2:1856 +609:2:1857 +610:2:1864 +611:2:1869 +612:0:1946 +613:2:1880 +614:0:1946 +615:2:1882 +616:0:1946 +617:2:1883 +618:0:1946 +619:2:423 +620:0:1946 +621:2:424 +622:2:428 +623:2:429 +624:2:437 +625:2:438 +626:2:442 +627:2:443 +628:2:451 +629:2:456 +630:2:460 +631:2:461 +632:2:468 +633:2:469 +634:2:480 +635:2:481 +636:2:482 +637:2:493 +638:2:498 +639:2:499 +640:0:1946 +641:2:511 +642:0:1946 +643:2:513 +644:2:514 +645:0:1946 +646:2:518 +647:2:522 +648:2:523 +649:2:531 +650:2:532 +651:2:536 +652:2:537 +653:2:545 +654:2:550 +655:2:551 +656:2:562 +657:2:563 +658:2:574 +659:2:575 +660:2:576 +661:2:587 +662:2:592 +663:2:593 +664:0:1946 +665:2:605 +666:0:1946 +667:2:607 +668:0:1946 +669:2:608 +670:0:1946 +671:2:618 +672:0:1946 +673:2:619 +674:2:626 +675:2:627 +676:2:634 +677:2:639 +678:0:1946 +679:2:650 +680:0:1946 +681:2:651 +682:2:658 +683:2:659 +684:2:666 +685:2:671 +686:0:1946 +687:2:682 +688:0:1946 +689:2:687 +690:2:694 +691:2:695 +692:2:702 +693:2:707 +694:0:1946 +695:2:718 +696:0:1946 +697:2:720 +698:0:1946 +699:2:721 +700:2:725 +701:2:726 +702:2:734 +703:2:735 +704:2:739 +705:2:740 +706:2:748 +707:2:753 +708:2:757 +709:2:758 +710:2:765 +711:2:766 +712:2:777 +713:2:778 +714:2:779 +715:2:790 +716:2:795 +717:2:796 +718:0:1946 +719:2:808 +720:0:1946 +721:2:810 +722:0:1946 +723:2:813 +724:2:814 +725:2:826 +726:2:827 +727:2:831 +728:2:832 +729:2:840 +730:2:845 +731:2:849 +732:2:850 +733:2:857 +734:2:858 +735:2:869 +736:2:870 +737:2:871 +738:2:882 +739:2:887 +740:2:888 +741:0:1946 +742:2:900 +743:0:1946 +744:2:902 +745:0:1946 +746:2:903 +747:0:1946 +748:2:904 +749:0:1946 +750:2:905 +751:0:1946 +752:2:906 +753:2:910 +754:2:911 +755:2:919 +756:2:920 +757:2:924 +758:2:925 +759:2:933 +760:2:938 +761:2:942 +762:2:943 +763:2:950 +764:2:951 +765:2:962 +766:2:963 +767:2:964 +768:2:975 +769:2:980 +770:2:981 +771:0:1946 +772:2:993 +773:0:1946 +774:2:1097 +775:0:1946 +776:2:1195 +777:0:1946 +778:2:1196 +779:0:1946 +780:2:1200 +781:0:1946 +782:2:1206 +783:2:1210 +784:2:1211 +785:2:1219 +786:2:1220 +787:2:1224 +788:2:1225 +789:2:1233 +790:2:1238 +791:2:1242 +792:2:1243 +793:2:1250 +794:2:1251 +795:2:1262 +796:2:1263 +797:2:1264 +798:2:1275 +799:2:1280 +800:2:1281 +801:0:1946 +802:2:1293 +803:0:1946 +804:2:1295 +805:0:1946 +806:2:1296 +807:2:1300 +808:2:1301 +809:2:1309 +810:2:1310 +811:2:1314 +812:2:1315 +813:2:1323 +814:2:1328 +815:2:1332 +816:2:1333 +817:2:1340 +818:2:1341 +819:2:1352 +820:2:1353 +821:2:1354 +822:2:1365 +823:2:1370 +824:2:1371 +825:0:1946 +826:2:1383 +827:0:1946 +828:2:1385 +829:0:1946 +830:2:1388 +831:2:1389 +832:2:1401 +833:2:1402 +834:2:1406 +835:2:1407 +836:2:1415 +837:2:1420 +838:2:1424 +839:2:1425 +840:2:1432 +841:2:1433 +842:2:1444 +843:2:1445 +844:2:1446 +845:2:1457 +846:2:1462 +847:2:1463 +848:0:1946 +849:2:1475 +850:0:1946 +851:2:1477 +852:0:1946 +853:2:1478 +854:0:1946 +855:2:1479 +856:0:1946 +857:2:1480 +858:0:1946 +859:2:1481 +860:2:1485 +861:2:1486 +862:2:1494 +863:2:1495 +864:2:1499 +865:2:1500 +866:2:1508 +867:2:1513 +868:2:1517 +869:2:1518 +870:2:1525 +871:2:1526 +872:2:1537 +873:2:1538 +874:2:1539 +875:2:1550 +876:2:1555 +877:2:1556 +878:0:1946 +879:2:1568 +880:0:1946 +881:2:1672 +882:0:1946 +883:2:1770 +884:0:1946 +885:2:1771 +886:0:1946 +887:2:1775 +888:0:1946 +889:2:1781 +890:2:1788 +891:2:1789 +892:2:1796 +893:2:1801 +894:0:1946 +895:2:1812 +896:0:1946 +897:2:1813 +898:2:1820 +899:2:1821 +900:2:1828 +901:2:1833 +902:0:1946 +903:2:1844 +904:0:1946 +905:2:1849 +906:2:1856 +907:2:1857 +908:2:1864 +909:2:1869 +910:0:1946 +911:2:1880 +912:0:1946 +913:2:1882 +914:0:1946 +915:2:1883 +916:0:1946 +917:2:423 +918:0:1946 +919:2:424 +920:2:428 +921:2:429 +922:2:437 +923:2:438 +924:2:442 +925:2:443 +926:2:451 +927:2:456 +928:2:460 +929:2:461 +930:2:468 +931:2:469 +932:2:480 +933:2:481 +934:2:482 +935:2:493 +936:2:498 +937:2:499 +938:0:1946 +939:2:511 +940:0:1946 +941:2:513 +942:2:514 +943:0:1946 +944:2:518 +945:2:522 +946:2:523 +947:2:531 +948:2:532 +949:2:536 +950:2:537 +951:2:545 +952:2:550 +953:2:551 +954:2:562 +955:2:563 +956:2:574 +957:2:575 +958:2:576 +959:2:587 +960:2:592 +961:2:593 +962:0:1946 +963:2:605 +964:0:1946 +965:2:607 +966:0:1946 +967:2:608 +968:0:1946 +969:2:618 +970:0:1946 +971:2:619 +972:2:626 +973:2:627 +974:2:634 +975:2:639 +976:0:1946 +977:2:650 +978:0:1946 +979:2:651 +980:2:658 +981:2:659 +982:2:666 +983:2:671 +984:0:1946 +985:2:682 +986:0:1946 +987:2:687 +988:2:694 +989:2:695 +990:2:702 +991:2:707 +992:0:1946 +993:2:718 +994:0:1946 +995:2:720 +996:0:1946 +997:2:721 +998:2:725 +999:2:726 +1000:2:734 +1001:2:735 +1002:2:739 +1003:2:740 +1004:2:748 +1005:2:753 +1006:2:757 +1007:2:758 +1008:2:765 +1009:2:766 +1010:2:777 +1011:2:778 +1012:2:779 +1013:2:790 +1014:2:795 +1015:2:796 +1016:0:1946 +1017:2:808 +1018:0:1946 +1019:2:810 +1020:0:1946 +1021:2:813 +1022:2:814 +1023:2:826 +1024:2:827 +1025:2:831 +1026:2:832 +1027:2:840 +1028:2:845 +1029:2:849 +1030:2:850 +1031:2:857 +1032:2:858 +1033:2:869 +1034:2:870 +1035:2:871 +1036:2:882 +1037:2:887 +1038:2:888 +1039:0:1946 +1040:2:900 +1041:0:1946 +1042:2:902 +1043:0:1946 +1044:2:903 +1045:0:1946 +1046:2:904 +1047:0:1946 +1048:2:905 +1049:0:1946 +1050:2:906 +1051:2:910 +1052:2:911 +1053:2:919 +1054:2:920 +1055:2:924 +1056:2:925 +1057:2:933 +1058:2:938 +1059:2:942 +1060:2:943 +1061:2:950 +1062:2:951 +1063:2:962 +1064:2:963 +1065:2:964 +1066:2:975 +1067:2:980 +1068:2:981 +1069:0:1946 +1070:2:993 +1071:0:1946 +1072:2:1097 +1073:0:1946 +1074:2:1195 +1075:0:1946 +1076:2:1196 +1077:0:1946 +1078:2:1200 +1079:0:1946 +1080:2:1206 +1081:2:1210 +1082:2:1211 +1083:2:1219 +1084:2:1220 +1085:2:1224 +1086:2:1225 +1087:2:1233 +1088:2:1238 +1089:2:1242 +1090:2:1243 +1091:2:1250 +1092:2:1251 +1093:2:1262 +1094:2:1263 +1095:2:1264 +1096:2:1275 +1097:2:1280 +1098:2:1281 +1099:0:1946 +1100:2:1293 +1101:0:1946 +1102:2:1295 +1103:0:1946 +1104:2:1296 +1105:2:1300 +1106:2:1301 +1107:2:1309 +1108:2:1310 +1109:2:1314 +1110:2:1315 +1111:2:1323 +1112:2:1328 +1113:2:1332 +1114:2:1333 +1115:2:1340 +1116:2:1341 +1117:2:1352 +1118:2:1353 +1119:2:1354 +1120:2:1365 +1121:2:1370 +1122:2:1371 +1123:0:1946 +1124:2:1383 +1125:0:1946 +1126:2:1385 +1127:0:1946 +1128:2:1388 +1129:2:1389 +1130:2:1401 +1131:2:1402 +1132:2:1406 +1133:2:1407 +1134:2:1415 +1135:2:1420 +1136:2:1424 +1137:2:1425 +1138:2:1432 +1139:2:1433 +1140:2:1444 +1141:2:1445 +1142:2:1446 +1143:2:1457 +1144:2:1462 +1145:2:1463 +1146:0:1946 +1147:2:1475 +1148:0:1946 +1149:2:1477 +1150:0:1946 +1151:2:1478 +1152:0:1946 +1153:2:1479 +1154:0:1946 +1155:2:1480 +1156:0:1946 +1157:2:1481 +1158:2:1485 +1159:2:1486 +1160:2:1494 +1161:2:1495 +1162:2:1499 +1163:2:1500 +1164:2:1508 +1165:2:1513 +1166:2:1517 +1167:2:1518 +1168:2:1525 +1169:2:1526 +1170:2:1537 +1171:2:1538 +1172:2:1539 +1173:2:1550 +1174:2:1555 +1175:2:1556 +1176:0:1946 +1177:2:1568 +1178:0:1946 +1179:2:1672 +1180:0:1946 +1181:2:1770 +1182:0:1946 +1183:2:1771 +1184:0:1946 +1185:2:1775 +1186:0:1946 +1187:2:1781 +1188:2:1788 +1189:2:1789 +1190:2:1796 +1191:2:1801 +1192:0:1946 +1193:2:1812 +1194:0:1946 +1195:2:1813 +1196:2:1820 +1197:2:1821 +1198:2:1828 +1199:2:1833 +1200:0:1946 +1201:2:1844 +1202:0:1946 +1203:2:1849 +1204:2:1856 +1205:2:1857 +1206:2:1864 +1207:2:1869 +1208:0:1946 +1209:2:1880 +1210:0:1946 +1211:2:1882 +1212:0:1946 +1213:2:1883 +1214:0:1946 +1215:2:423 +1216:0:1946 +1217:2:424 +1218:2:428 +1219:2:429 +1220:2:437 +1221:2:438 +1222:2:442 +1223:2:443 +1224:2:451 +1225:2:456 +1226:2:460 +1227:2:461 +1228:2:468 +1229:2:469 +1230:2:480 +1231:2:481 +1232:2:482 +1233:2:493 +1234:2:498 +1235:2:499 +1236:0:1946 +1237:2:511 +1238:0:1946 +1239:2:513 +1240:2:514 +1241:0:1946 +1242:2:518 +1243:2:522 +1244:2:523 +1245:2:531 +1246:2:532 +1247:2:536 +1248:2:537 +1249:2:545 +1250:2:550 +1251:2:551 +1252:2:562 +1253:2:563 +1254:2:574 +1255:2:575 +1256:2:576 +1257:2:587 +1258:2:592 +1259:2:593 +1260:0:1946 +1261:2:605 +1262:0:1946 +1263:2:607 +1264:0:1946 +1265:2:608 +1266:0:1946 +1267:2:618 +1268:0:1946 +1269:2:619 +1270:2:626 +1271:2:627 +1272:2:634 +1273:2:639 +1274:0:1946 +1275:2:650 +1276:0:1946 +1277:1:2 +1278:0:1946 +1279:1:8 +1280:0:1946 +1281:1:9 +1282:0:1946 +1283:1:10 +1284:0:1946 +1285:1:11 +1286:0:1946 +1287:1:12 +1288:1:16 +1289:1:17 +1290:1:25 +1291:1:26 +1292:1:30 +1293:1:31 +1294:1:39 +1295:1:44 +1296:1:48 +1297:1:49 +1298:1:56 +1299:1:57 +1300:1:68 +1301:1:69 +1302:1:70 +1303:1:81 +1304:1:93 +1305:1:94 +1306:0:1946 +1307:1:99 +1308:0:1946 +1309:1:101 +1310:0:1946 +1311:1:102 +1312:1:106 +1313:1:107 +1314:1:115 +1315:1:116 +1316:1:120 +1317:1:121 +1318:1:129 +1319:1:134 +1320:1:138 +1321:1:139 +1322:1:146 +1323:1:147 +1324:1:158 +1325:1:159 +1326:1:160 +1327:1:171 +1328:1:183 +1329:1:184 +1330:0:1946 +1331:1:189 +1332:0:1946 +1333:1:191 +1334:0:1946 +1335:1:192 +1336:0:1946 +1337:1:193 +1338:1:197 +1339:1:198 +1340:1:206 +1341:1:207 +1342:1:211 +1343:1:212 +1344:1:220 +1345:1:225 +1346:1:229 +1347:1:230 +1348:1:237 +1349:1:238 +1350:1:249 +1351:1:250 +1352:1:251 +1353:1:262 +1354:1:274 +1355:1:275 +1356:0:1946 +1357:1:280 +1358:0:1946 +1359:1:282 +1360:0:1946 +1361:1:291 +1362:0:1946 +1363:1:293 +1364:0:1946 +1365:1:11 +1366:0:1946 +1367:1:12 +1368:1:16 +1369:1:17 +1370:1:25 +1371:1:26 +1372:1:27 +1373:1:39 +1374:1:44 +1375:1:48 +1376:1:49 +1377:1:56 +1378:1:57 +1379:1:68 +1380:1:69 +1381:1:70 +1382:1:81 +1383:1:93 +1384:1:94 +1385:0:1946 +1386:1:99 +1387:0:1946 +1388:1:101 +1389:0:1946 +1390:1:102 +1391:1:106 +1392:1:107 +1393:1:115 +1394:1:116 +1395:1:120 +1396:1:121 +1397:1:129 +1398:1:134 +1399:1:138 +1400:1:139 +1401:1:146 +1402:1:147 +1403:1:158 +1404:1:159 +1405:1:160 +1406:1:171 +1407:1:183 +1408:1:184 +1409:0:1946 +1410:1:189 +1411:0:1946 +1412:1:285 +1413:0:1946 +1414:1:286 +1415:0:1946 +1416:1:291 +1417:0:1946 +1418:1:293 +1419:0:1946 +1420:1:296 +1421:0:1946 +1422:1:301 +1423:0:1946 +1424:1:302 +1425:0:1946 +1426:1:303 +1427:0:1946 +1428:1:304 +1429:0:1946 +1430:1:305 +1431:0:1946 +1432:1:306 +1433:0:1946 +1434:1:308 +1435:0:1946 +1436:1:310 +1437:0:1946 +1438:1:311 +1439:1:315 +1440:1:316 +1441:1:324 +1442:1:325 +1443:1:326 +1444:1:338 +1445:1:343 +1446:1:347 +1447:1:348 +1448:1:355 +1449:1:356 +1450:1:367 +1451:1:368 +1452:1:369 +1453:1:380 +1454:1:392 +1455:1:393 +1456:0:1946 +1457:1:398 +1458:0:1946 +1459:1:400 +1460:0:1946 +1461:1:305 +1462:0:1946 +1463:1:306 +1464:0:1946 +1465:1:308 +1466:0:1946 +1467:1:310 +1468:0:1946 +1469:1:311 +1470:1:315 +1471:1:316 +1472:1:324 +1473:1:325 +1474:1:326 +1475:1:338 +1476:1:343 +1477:1:347 +1478:1:348 +1479:1:355 +1480:1:356 +1481:1:367 +1482:1:368 +1483:1:369 +1484:1:380 +1485:1:392 +1486:1:393 +1487:0:1946 +1488:1:398 +1489:0:1946 +1490:1:400 +1491:0:1946 +1492:1:404 +1493:0:1946 +1494:1:9 +1495:0:1946 +1496:1:10 +1497:0:1946 +1498:1:11 +1499:0:1946 +1500:1:12 +1501:1:16 +1502:1:17 +1503:1:25 +1504:1:26 +1505:1:27 +1506:1:39 +1507:1:44 +1508:1:48 +1509:1:49 +1510:1:56 +1511:1:57 +1512:1:68 +1513:1:69 +1514:1:70 +1515:1:81 +1516:1:93 +1517:1:94 +1518:0:1946 +1519:1:99 +1520:0:1946 +1521:1:101 +1522:0:1946 +1523:1:102 +1524:1:106 +1525:1:107 +1526:1:115 +1527:1:116 +1528:1:120 +1529:1:121 +1530:1:129 +1531:1:134 +1532:1:138 +1533:1:139 +1534:1:146 +1535:1:147 +1536:1:158 +1537:1:159 +1538:1:160 +1539:1:171 +1540:1:183 +1541:1:184 +1542:0:1946 +1543:1:189 +1544:0:1946 +1545:1:191 +1546:0:1946 +1547:1:192 +1548:0:1946 +1549:1:193 +1550:1:197 +1551:1:198 +1552:1:206 +1553:1:207 +1554:1:211 +1555:1:212 +1556:1:220 +1557:1:225 +1558:1:229 +1559:1:230 +1560:1:237 +1561:1:238 +1562:1:249 +1563:1:250 +1564:1:251 +1565:1:262 +1566:1:274 +1567:1:275 +1568:0:1946 +1569:1:280 +1570:0:1946 +1571:1:282 +1572:0:1946 +1573:1:291 +1574:0:1946 +1575:1:293 +1576:0:1946 +1577:1:11 +1578:0:1946 +1579:1:12 +1580:1:16 +1581:1:17 +1582:1:25 +1583:1:34 +1584:1:35 +1585:1:39 +1586:1:44 +1587:1:48 +1588:1:49 +1589:1:56 +1590:1:57 +1591:1:68 +1592:1:69 +1593:1:72 +1594:1:73 +1595:1:81 +1596:1:93 +1597:1:94 +1598:0:1946 +1599:1:99 +1600:0:1946 +1601:1:101 +1602:0:1946 +1603:1:102 +1604:1:106 +1605:1:107 +1606:1:115 +1607:1:124 +1608:1:125 +1609:1:129 +1610:1:134 +1611:1:138 +1612:1:139 +1613:1:146 +1614:1:147 +1615:1:158 +1616:1:159 +1617:1:162 +1618:1:163 +1619:1:171 +1620:1:183 +1621:1:184 +1622:0:1946 +1623:1:189 +1624:0:1946 +1625:1:285 +1626:0:1946 +1627:1:286 +1628:0:1946 +1629:1:291 +1630:0:1946 +1631:1:293 +1632:0:1946 +1633:1:296 +1634:0:1946 +1635:1:301 +1636:0:1946 +1637:2:651 +1638:2:658 +1639:2:661 +1640:2:662 +1641:2:666 +1642:2:671 +1643:0:1946 +1644:2:682 +1645:0:1946 +1646:2:687 +1647:2:694 +1648:2:695 +1649:2:702 +1650:2:707 +1651:0:1946 +1652:2:718 +1653:0:1946 +1654:2:720 +1655:0:1946 +1656:2:721 +1657:2:725 +1658:2:726 +1659:2:734 +1660:2:735 +1661:2:739 +1662:2:740 +1663:2:748 +1664:2:753 +1665:2:757 +1666:2:758 +1667:2:765 +1668:2:766 +1669:2:777 +1670:2:778 +1671:2:779 +1672:2:790 +1673:2:795 +1674:2:796 +1675:0:1946 +1676:2:808 +1677:0:1946 +1678:2:810 +1679:0:1946 +1680:2:813 +1681:2:814 +1682:2:826 +1683:2:827 +1684:2:831 +1685:2:832 +1686:2:840 +1687:2:845 +1688:2:849 +1689:2:850 +1690:2:857 +1691:2:858 +1692:2:869 +1693:2:870 +1694:2:871 +1695:2:882 +1696:2:887 +1697:2:888 +1698:0:1946 +1699:2:900 +1700:0:1946 +1701:2:902 +1702:0:1946 +1703:2:903 +1704:0:1946 +1705:2:904 +1706:0:1946 +1707:2:905 +1708:0:1946 +1709:2:906 +1710:2:910 +1711:2:911 +1712:2:919 +1713:2:920 +1714:2:924 +1715:2:925 +1716:2:933 +1717:2:938 +1718:2:942 +1719:2:943 +1720:2:950 +1721:2:951 +1722:2:962 +1723:2:963 +1724:2:964 +1725:2:975 +1726:2:980 +1727:2:981 +1728:0:1946 +1729:2:993 +1730:0:1946 +1731:2:1097 +1732:0:1946 +1733:2:1195 +1734:0:1946 +1735:2:1196 +1736:0:1946 +1737:2:1200 +1738:0:1946 +1739:2:1206 +1740:2:1210 +1741:2:1211 +1742:2:1219 +1743:2:1220 +1744:2:1224 +1745:2:1225 +1746:2:1233 +1747:2:1238 +1748:2:1242 +1749:2:1243 +1750:2:1250 +1751:2:1251 +1752:2:1262 +1753:2:1263 +1754:2:1264 +1755:2:1275 +1756:2:1280 +1757:2:1281 +1758:0:1946 +1759:2:1293 +1760:0:1946 +1761:2:1295 +1762:0:1946 +1763:2:1296 +1764:2:1300 +1765:2:1301 +1766:2:1309 +1767:2:1310 +1768:2:1314 +1769:2:1315 +1770:2:1323 +1771:2:1328 +1772:2:1332 +1773:2:1333 +1774:2:1340 +1775:2:1341 +1776:2:1352 +1777:2:1353 +1778:2:1354 +1779:2:1365 +1780:2:1370 +1781:2:1371 +1782:0:1946 +1783:2:1383 +1784:0:1946 +1785:2:1385 +1786:0:1946 +1787:2:1388 +1788:2:1389 +1789:2:1401 +1790:2:1402 +1791:2:1406 +1792:2:1407 +1793:2:1415 +1794:2:1420 +1795:2:1424 +1796:2:1425 +1797:2:1432 +1798:2:1433 +1799:2:1444 +1800:2:1445 +1801:2:1446 +1802:2:1457 +1803:2:1462 +1804:2:1463 +1805:0:1946 +1806:2:1475 +1807:0:1946 +1808:2:1477 +1809:0:1946 +1810:2:1478 +1811:0:1946 +1812:2:1479 +1813:0:1946 +1814:2:1480 +1815:0:1946 +1816:2:1481 +1817:2:1485 +1818:2:1486 +1819:2:1494 +1820:2:1495 +1821:2:1499 +1822:2:1500 +1823:2:1508 +1824:2:1513 +1825:2:1517 +1826:2:1518 +1827:2:1525 +1828:2:1526 +1829:2:1537 +1830:2:1538 +1831:2:1539 +1832:2:1550 +1833:2:1555 +1834:2:1556 +1835:0:1946 +1836:2:1568 +1837:0:1946 +1838:2:1672 +1839:0:1946 +1840:2:1770 +1841:0:1946 +1842:2:1771 +1843:0:1946 +1844:2:1775 +1845:0:1946 +1846:2:1781 +1847:2:1788 +1848:2:1789 +1849:2:1796 +1850:2:1801 +1851:0:1946 +1852:2:1812 +1853:0:1946 +1854:2:1813 +1855:2:1820 +1856:2:1823 +1857:2:1824 +1858:2:1828 +1859:2:1833 +1860:0:1946 +1861:2:1844 +1862:0:1946 +1863:2:1849 +1864:2:1856 +1865:2:1857 +1866:2:1864 +1867:2:1869 +1868:0:1946 +1869:2:1880 +1870:0:1946 +1871:2:1882 +1872:0:1946 +1873:2:1883 +1874:0:1946 +1875:2:1886 +1876:0:1946 +1877:2:1891 +1878:0:1946 +1879:1:302 +1880:0:1944 +1881:2:1892 +1882:0:1950 +1883:1:143 diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.define b/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.define new file mode 100644 index 0000000..5e642ef --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.define @@ -0,0 +1 @@ +#define SINGLE_FLIP diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.log b/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.log new file mode 100644 index 0000000..2a80112 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.log @@ -0,0 +1,197 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_free_single_flip.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 744) +pan: claim violated! (at depth 1371) +pan: wrote .input.spin.trail + +(Spin Version 5.1.7 -- 23 December 2008) +Warning: Search not completed + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 3387, errors: 1 + 206295 states, stored + 1902753 states, matched + 2109048 transitions (= stored+matched) + 7663223 atomic steps +hash conflicts: 101109 (resolved) + +Stats on memory usage (in Megabytes): + 16.526 equivalent memory usage for states (stored*(State-vector + overhead)) + 13.080 actual memory usage for states (compression: 79.15%) + state-vector as stored = 38 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 478.752 total actual memory usage + +unreached in proctype urcu_reader + line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 61, "(1)" + line 418, "pan.___", state 91, "(1)" + line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 151, "(1)" + line 418, "pan.___", state 181, "(1)" + line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 242, "(1)" + line 418, "pan.___", state 272, "(1)" + line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 360, "(1)" + line 418, "pan.___", state 390, "(1)" + line 540, "pan.___", state 414, "-end-" + (17 of 414 states) +unreached in proctype urcu_writer + line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 59, "(1)" + line 413, "pan.___", state 72, "(1)" + line 418, "pan.___", state 89, "(1)" + line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 153, "(1)" + line 413, "pan.___", state 166, "(1)" + line 652, "pan.___", state 199, "(1)" + line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 160, "pan.___", state 240, "(1)" + line 164, "pan.___", state 248, "(1)" + line 168, "pan.___", state 260, "(1)" + line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 927, "(1)" + line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 928, "else" + line 409, "pan.___", state 931, "(1)" + line 409, "pan.___", state 932, "(1)" + line 409, "pan.___", state 932, "(1)" + line 413, "pan.___", state 940, "(1)" + line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 941, "else" + line 413, "pan.___", state 944, "(1)" + line 413, "pan.___", state 945, "(1)" + line 413, "pan.___", state 945, "(1)" + line 411, "pan.___", state 950, "((i<1))" + line 411, "pan.___", state 950, "((i>=1))" + line 418, "pan.___", state 957, "(1)" + line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 958, "else" + line 418, "pan.___", state 961, "(1)" + line 418, "pan.___", state 962, "(1)" + line 418, "pan.___", state 962, "(1)" + line 420, "pan.___", state 965, "(1)" + line 420, "pan.___", state 965, "(1)" + line 179, "pan.___", state 990, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 183, "pan.___", state 1003, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 160, "pan.___", state 1013, "(1)" + line 164, "pan.___", state 1021, "(1)" + line 168, "pan.___", state 1033, "(1)" + line 175, "pan.___", state 1044, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=2))" + line 710, "pan.___", state 20, "((j<2))" + line 710, "pan.___", state 20, "((j>=2))" + line 715, "pan.___", state 33, "((j<2))" + line 715, "pan.___", state 33, "((j>=2))" + (3 of 46 states) +unreached in proctype :never: + line 749, "pan.___", state 8, "-end-" + (1 of 8 states) + +pan: elapsed time 1.66 seconds +pan: rate 124274.1 states/second +pan: avg transition delay 7.8708e-07 usec +cp .input.spin urcu_free_single_flip.spin.input +cp .input.spin.trail urcu_free_single_flip.spin.input.trail +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.spin.input b/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.spin.input new file mode 100644 index 0000000..93aae44 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.spin.input @@ -0,0 +1,723 @@ +#define SINGLE_FLIP + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +//#define TEST_SIGNAL +//#define TEST_SIGNAL_ON_READ +//#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +//#define READER_NEST_LEVEL 1 +#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.spin.input.trail b/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.spin.input.trail new file mode 100644 index 0000000..73c1400 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.spin.input.trail @@ -0,0 +1,1374 @@ +-2:3:-2 +-4:-4:-4 +1:0:1650 +2:3:1602 +3:3:1605 +4:3:1605 +5:3:1608 +6:3:1616 +7:3:1616 +8:3:1619 +9:3:1625 +10:3:1629 +11:3:1629 +12:3:1632 +13:3:1640 +14:3:1644 +15:3:1645 +16:0:1650 +17:3:1647 +18:0:1650 +19:2:416 +20:0:1650 +21:2:422 +22:0:1650 +23:2:423 +24:0:1650 +25:2:424 +26:2:428 +27:2:429 +28:2:437 +29:2:438 +30:2:442 +31:2:443 +32:2:451 +33:2:456 +34:2:460 +35:2:461 +36:2:468 +37:2:469 +38:2:480 +39:2:481 +40:2:482 +41:2:493 +42:2:498 +43:2:499 +44:0:1650 +45:2:511 +46:0:1650 +47:2:513 +48:2:514 +49:0:1650 +50:2:518 +51:2:522 +52:2:523 +53:2:531 +54:2:532 +55:2:536 +56:2:537 +57:2:545 +58:2:550 +59:2:551 +60:2:562 +61:2:563 +62:2:574 +63:2:575 +64:2:576 +65:2:587 +66:2:592 +67:2:593 +68:0:1650 +69:2:605 +70:0:1650 +71:2:607 +72:0:1650 +73:2:608 +74:0:1650 +75:2:618 +76:0:1650 +77:2:622 +78:2:623 +79:2:627 +80:2:631 +81:2:632 +82:2:636 +83:2:644 +84:2:645 +85:2:650 +86:2:657 +87:2:658 +88:2:665 +89:2:670 +90:0:1650 +91:2:681 +92:0:1650 +93:2:685 +94:2:686 +95:2:690 +96:2:694 +97:2:695 +98:2:699 +99:2:707 +100:2:708 +101:2:713 +102:2:720 +103:2:721 +104:2:728 +105:2:733 +106:0:1650 +107:2:744 +108:0:1650 +109:2:752 +110:2:753 +111:2:757 +112:2:761 +113:2:762 +114:2:766 +115:2:774 +116:2:775 +117:2:780 +118:2:787 +119:2:788 +120:2:795 +121:2:800 +122:0:1650 +123:2:811 +124:0:1650 +125:2:813 +126:0:1650 +127:2:814 +128:2:818 +129:2:819 +130:2:827 +131:2:828 +132:2:832 +133:2:833 +134:2:841 +135:2:846 +136:2:850 +137:2:851 +138:2:858 +139:2:859 +140:2:870 +141:2:871 +142:2:872 +143:2:883 +144:2:888 +145:2:889 +146:0:1650 +147:2:901 +148:0:1650 +149:2:903 +150:0:1650 +151:2:906 +152:2:907 +153:2:919 +154:2:920 +155:2:924 +156:2:925 +157:2:933 +158:2:938 +159:2:942 +160:2:943 +161:2:950 +162:2:951 +163:2:962 +164:2:963 +165:2:964 +166:2:975 +167:2:980 +168:2:981 +169:0:1650 +170:2:993 +171:0:1650 +172:2:995 +173:0:1650 +174:2:996 +175:0:1650 +176:2:997 +177:0:1650 +178:2:998 +179:0:1650 +180:2:999 +181:2:1003 +182:2:1004 +183:2:1012 +184:2:1013 +185:2:1017 +186:2:1018 +187:2:1026 +188:2:1031 +189:2:1035 +190:2:1036 +191:2:1043 +192:2:1044 +193:2:1055 +194:2:1056 +195:2:1057 +196:2:1068 +197:2:1073 +198:2:1074 +199:0:1650 +200:2:1086 +201:0:1650 +202:2:1283 +203:0:1650 +204:2:1381 +205:0:1650 +206:2:1382 +207:0:1650 +208:2:1386 +209:0:1650 +210:2:1395 +211:2:1396 +212:2:1400 +213:2:1404 +214:2:1405 +215:2:1409 +216:2:1417 +217:2:1418 +218:2:1423 +219:2:1430 +220:2:1431 +221:2:1438 +222:2:1443 +223:0:1650 +224:2:1454 +225:0:1650 +226:2:1458 +227:2:1459 +228:2:1463 +229:2:1467 +230:2:1468 +231:2:1472 +232:2:1480 +233:2:1481 +234:2:1486 +235:2:1493 +236:2:1494 +237:2:1501 +238:2:1506 +239:0:1650 +240:2:1517 +241:0:1650 +242:2:1525 +243:2:1526 +244:2:1530 +245:2:1534 +246:2:1535 +247:2:1539 +248:2:1547 +249:2:1548 +250:2:1553 +251:2:1560 +252:2:1561 +253:2:1568 +254:2:1573 +255:0:1650 +256:2:1584 +257:0:1650 +258:2:1586 +259:0:1650 +260:2:1587 +261:0:1650 +262:2:423 +263:0:1650 +264:2:424 +265:2:428 +266:2:429 +267:2:437 +268:2:438 +269:2:442 +270:2:443 +271:2:451 +272:2:456 +273:2:460 +274:2:461 +275:2:468 +276:2:469 +277:2:480 +278:2:481 +279:2:482 +280:2:493 +281:2:498 +282:2:499 +283:0:1650 +284:2:511 +285:0:1650 +286:2:513 +287:2:514 +288:0:1650 +289:2:518 +290:2:522 +291:2:523 +292:2:531 +293:2:532 +294:2:536 +295:2:537 +296:2:545 +297:2:550 +298:2:551 +299:2:562 +300:2:563 +301:2:574 +302:2:575 +303:2:576 +304:2:587 +305:2:592 +306:2:593 +307:0:1650 +308:2:605 +309:0:1650 +310:2:607 +311:0:1650 +312:2:608 +313:0:1650 +314:2:618 +315:0:1650 +316:2:622 +317:2:623 +318:2:627 +319:2:631 +320:2:632 +321:2:636 +322:2:644 +323:2:645 +324:2:650 +325:2:657 +326:2:658 +327:2:665 +328:2:670 +329:0:1650 +330:2:681 +331:0:1650 +332:2:685 +333:2:686 +334:2:690 +335:2:694 +336:2:695 +337:2:699 +338:2:707 +339:2:708 +340:2:713 +341:2:720 +342:2:721 +343:2:728 +344:2:733 +345:0:1650 +346:2:744 +347:0:1650 +348:2:752 +349:2:753 +350:2:757 +351:2:761 +352:2:762 +353:2:766 +354:2:774 +355:2:775 +356:2:780 +357:2:787 +358:2:788 +359:2:795 +360:2:800 +361:0:1650 +362:2:811 +363:0:1650 +364:2:813 +365:0:1650 +366:2:814 +367:2:818 +368:2:819 +369:2:827 +370:2:828 +371:2:832 +372:2:833 +373:2:841 +374:2:846 +375:2:850 +376:2:851 +377:2:858 +378:2:859 +379:2:870 +380:2:871 +381:2:872 +382:2:883 +383:2:888 +384:2:889 +385:0:1650 +386:2:901 +387:0:1650 +388:2:903 +389:0:1650 +390:2:906 +391:2:907 +392:2:919 +393:2:920 +394:2:924 +395:2:925 +396:2:933 +397:2:938 +398:2:942 +399:2:943 +400:2:950 +401:2:951 +402:2:962 +403:2:963 +404:2:964 +405:2:975 +406:2:980 +407:2:981 +408:0:1650 +409:2:993 +410:0:1650 +411:2:995 +412:0:1650 +413:2:996 +414:0:1650 +415:2:997 +416:0:1650 +417:2:998 +418:0:1650 +419:2:999 +420:2:1003 +421:2:1004 +422:2:1012 +423:2:1013 +424:2:1017 +425:2:1018 +426:2:1026 +427:2:1031 +428:2:1035 +429:2:1036 +430:2:1043 +431:2:1044 +432:2:1055 +433:2:1056 +434:2:1057 +435:2:1068 +436:2:1073 +437:2:1074 +438:0:1650 +439:2:1086 +440:0:1650 +441:2:1283 +442:0:1650 +443:2:1381 +444:0:1650 +445:2:1382 +446:0:1650 +447:2:1386 +448:0:1650 +449:2:1395 +450:2:1396 +451:2:1400 +452:2:1404 +453:2:1405 +454:2:1409 +455:2:1417 +456:2:1418 +457:2:1423 +458:2:1430 +459:2:1431 +460:2:1438 +461:2:1443 +462:0:1650 +463:2:1454 +464:0:1650 +465:2:1458 +466:2:1459 +467:2:1463 +468:2:1467 +469:2:1468 +470:2:1472 +471:2:1480 +472:2:1481 +473:2:1486 +474:2:1493 +475:2:1494 +476:2:1501 +477:2:1506 +478:0:1650 +479:2:1517 +480:0:1650 +481:2:1525 +482:2:1526 +483:2:1530 +484:2:1534 +485:2:1535 +486:2:1539 +487:2:1547 +488:2:1548 +489:2:1553 +490:2:1560 +491:2:1561 +492:2:1568 +493:2:1573 +494:0:1650 +495:2:1584 +496:0:1650 +497:2:1586 +498:0:1650 +499:2:1587 +500:0:1650 +501:2:423 +502:0:1650 +503:2:424 +504:2:428 +505:2:429 +506:2:437 +507:2:438 +508:2:442 +509:2:443 +510:2:451 +511:2:456 +512:2:460 +513:2:461 +514:2:468 +515:2:469 +516:2:480 +517:2:481 +518:2:482 +519:2:493 +520:2:498 +521:2:499 +522:0:1650 +523:2:511 +524:0:1650 +525:2:513 +526:2:514 +527:0:1650 +528:2:518 +529:2:522 +530:2:523 +531:2:531 +532:2:532 +533:2:536 +534:2:537 +535:2:545 +536:2:550 +537:2:551 +538:2:562 +539:2:563 +540:2:574 +541:2:575 +542:2:576 +543:2:587 +544:2:592 +545:2:593 +546:0:1650 +547:2:605 +548:0:1650 +549:2:607 +550:0:1650 +551:2:608 +552:0:1650 +553:2:618 +554:0:1650 +555:2:622 +556:2:623 +557:2:627 +558:2:631 +559:2:632 +560:2:636 +561:2:644 +562:2:645 +563:2:650 +564:2:657 +565:2:658 +566:2:665 +567:2:670 +568:0:1650 +569:2:681 +570:0:1650 +571:2:685 +572:2:686 +573:2:690 +574:2:694 +575:2:695 +576:2:699 +577:2:707 +578:2:708 +579:2:713 +580:2:720 +581:2:721 +582:2:728 +583:2:733 +584:0:1650 +585:2:744 +586:0:1650 +587:2:752 +588:2:753 +589:2:757 +590:2:761 +591:2:762 +592:2:766 +593:2:774 +594:2:775 +595:2:780 +596:2:787 +597:2:788 +598:2:795 +599:2:800 +600:0:1650 +601:2:811 +602:0:1650 +603:2:813 +604:0:1650 +605:2:814 +606:2:818 +607:2:819 +608:2:827 +609:2:828 +610:2:832 +611:2:833 +612:2:841 +613:2:846 +614:2:850 +615:2:851 +616:2:858 +617:2:859 +618:2:870 +619:2:871 +620:2:872 +621:2:883 +622:2:888 +623:2:889 +624:0:1650 +625:2:901 +626:0:1650 +627:2:903 +628:0:1650 +629:2:906 +630:2:907 +631:2:919 +632:2:920 +633:2:924 +634:2:925 +635:2:933 +636:2:938 +637:2:942 +638:2:943 +639:2:950 +640:2:951 +641:2:962 +642:2:963 +643:2:964 +644:2:975 +645:2:980 +646:2:981 +647:0:1650 +648:2:993 +649:0:1650 +650:2:995 +651:0:1650 +652:2:996 +653:0:1650 +654:2:997 +655:0:1650 +656:2:998 +657:0:1650 +658:2:999 +659:2:1003 +660:2:1004 +661:2:1012 +662:2:1013 +663:2:1017 +664:2:1018 +665:2:1026 +666:2:1031 +667:2:1035 +668:2:1036 +669:2:1043 +670:2:1044 +671:2:1055 +672:2:1056 +673:2:1057 +674:2:1068 +675:2:1073 +676:2:1074 +677:0:1650 +678:2:1086 +679:0:1650 +680:2:1283 +681:0:1650 +682:2:1381 +683:0:1650 +684:2:1382 +685:0:1650 +686:2:1386 +687:0:1650 +688:2:1395 +689:2:1396 +690:2:1400 +691:2:1404 +692:2:1405 +693:2:1409 +694:2:1417 +695:2:1418 +696:2:1423 +697:2:1430 +698:2:1431 +699:2:1438 +700:2:1443 +701:0:1650 +702:2:1454 +703:0:1650 +704:2:1458 +705:2:1459 +706:2:1463 +707:2:1467 +708:2:1468 +709:2:1472 +710:2:1480 +711:2:1481 +712:2:1486 +713:2:1493 +714:2:1494 +715:2:1501 +716:2:1506 +717:0:1650 +718:2:1517 +719:0:1650 +720:2:1525 +721:2:1526 +722:2:1530 +723:2:1534 +724:2:1535 +725:2:1539 +726:2:1547 +727:2:1548 +728:2:1553 +729:2:1560 +730:2:1561 +731:2:1568 +732:2:1573 +733:0:1650 +734:2:1584 +735:0:1650 +736:2:1586 +737:0:1650 +738:2:1587 +739:0:1650 +740:2:423 +741:0:1650 +742:2:424 +743:2:428 +744:2:429 +745:2:437 +746:2:438 +747:2:442 +748:2:443 +749:2:451 +750:2:456 +751:2:460 +752:2:461 +753:2:468 +754:2:469 +755:2:480 +756:2:481 +757:2:482 +758:2:493 +759:2:498 +760:2:499 +761:0:1650 +762:2:511 +763:0:1650 +764:2:513 +765:2:514 +766:0:1650 +767:2:518 +768:2:522 +769:2:523 +770:2:531 +771:2:532 +772:2:536 +773:2:537 +774:2:545 +775:2:550 +776:2:551 +777:2:562 +778:2:563 +779:2:574 +780:2:575 +781:2:576 +782:2:587 +783:2:592 +784:2:593 +785:0:1650 +786:2:605 +787:0:1650 +788:2:607 +789:0:1650 +790:2:608 +791:0:1650 +792:2:618 +793:0:1650 +794:2:622 +795:2:623 +796:2:627 +797:2:631 +798:2:632 +799:2:636 +800:2:644 +801:2:645 +802:2:650 +803:2:657 +804:2:658 +805:2:665 +806:2:670 +807:0:1650 +808:2:681 +809:0:1650 +810:2:685 +811:2:686 +812:2:690 +813:2:694 +814:2:695 +815:2:699 +816:2:707 +817:2:708 +818:2:713 +819:2:720 +820:2:721 +821:2:728 +822:2:733 +823:0:1650 +824:2:744 +825:0:1650 +826:2:752 +827:2:753 +828:2:757 +829:2:761 +830:2:762 +831:2:766 +832:2:774 +833:2:775 +834:2:780 +835:2:787 +836:2:788 +837:2:795 +838:2:800 +839:0:1650 +840:2:811 +841:0:1650 +842:2:813 +843:0:1650 +844:2:814 +845:2:818 +846:2:819 +847:2:827 +848:2:828 +849:2:832 +850:2:833 +851:2:841 +852:2:846 +853:2:850 +854:2:851 +855:2:858 +856:2:859 +857:2:870 +858:2:871 +859:2:872 +860:2:883 +861:2:888 +862:2:889 +863:0:1650 +864:2:901 +865:0:1650 +866:2:903 +867:0:1650 +868:2:906 +869:2:907 +870:2:919 +871:2:920 +872:2:924 +873:2:925 +874:2:933 +875:2:938 +876:2:942 +877:2:943 +878:2:950 +879:2:951 +880:2:962 +881:2:963 +882:2:964 +883:2:975 +884:2:980 +885:2:981 +886:0:1650 +887:2:993 +888:0:1650 +889:2:995 +890:0:1650 +891:2:996 +892:0:1650 +893:2:997 +894:0:1650 +895:2:998 +896:0:1650 +897:2:999 +898:2:1003 +899:2:1004 +900:2:1012 +901:2:1013 +902:2:1017 +903:2:1018 +904:2:1026 +905:2:1031 +906:2:1035 +907:2:1036 +908:2:1043 +909:2:1044 +910:2:1055 +911:2:1056 +912:2:1057 +913:2:1068 +914:2:1073 +915:2:1074 +916:0:1650 +917:2:1086 +918:0:1650 +919:2:1283 +920:0:1650 +921:2:1381 +922:0:1650 +923:2:1382 +924:0:1650 +925:2:1386 +926:0:1650 +927:2:1395 +928:2:1396 +929:2:1400 +930:2:1404 +931:2:1405 +932:2:1409 +933:2:1417 +934:2:1418 +935:2:1423 +936:2:1430 +937:2:1431 +938:2:1438 +939:2:1443 +940:0:1650 +941:2:1454 +942:0:1650 +943:1:2 +944:0:1650 +945:1:8 +946:0:1650 +947:1:9 +948:0:1650 +949:1:10 +950:0:1650 +951:1:11 +952:0:1650 +953:1:12 +954:1:16 +955:1:17 +956:1:25 +957:1:26 +958:1:30 +959:1:31 +960:1:39 +961:1:44 +962:1:48 +963:1:49 +964:1:63 +965:1:64 +966:1:68 +967:1:69 +968:1:70 +969:1:81 +970:1:86 +971:1:87 +972:0:1650 +973:1:99 +974:0:1650 +975:1:101 +976:0:1650 +977:1:102 +978:1:106 +979:1:107 +980:1:115 +981:1:116 +982:1:120 +983:1:121 +984:1:129 +985:1:134 +986:1:138 +987:1:139 +988:1:153 +989:1:154 +990:1:158 +991:1:159 +992:1:160 +993:1:171 +994:1:176 +995:1:177 +996:0:1650 +997:1:189 +998:0:1650 +999:1:191 +1000:0:1650 +1001:1:192 +1002:0:1650 +1003:2:1458 +1004:2:1459 +1005:2:1463 +1006:2:1467 +1007:2:1468 +1008:2:1472 +1009:2:1480 +1010:2:1481 +1011:2:1486 +1012:2:1493 +1013:2:1494 +1014:2:1501 +1015:2:1506 +1016:0:1650 +1017:2:1517 +1018:0:1650 +1019:2:1525 +1020:2:1526 +1021:2:1530 +1022:2:1534 +1023:2:1535 +1024:2:1539 +1025:2:1547 +1026:2:1548 +1027:2:1553 +1028:2:1560 +1029:2:1561 +1030:2:1568 +1031:2:1573 +1032:0:1650 +1033:2:1584 +1034:0:1650 +1035:2:1586 +1036:0:1650 +1037:2:1587 +1038:0:1650 +1039:2:423 +1040:0:1650 +1041:2:424 +1042:2:428 +1043:2:429 +1044:2:437 +1045:2:438 +1046:2:442 +1047:2:443 +1048:2:451 +1049:2:456 +1050:2:460 +1051:2:461 +1052:2:468 +1053:2:469 +1054:2:480 +1055:2:481 +1056:2:482 +1057:2:493 +1058:2:498 +1059:2:499 +1060:0:1650 +1061:2:511 +1062:0:1650 +1063:2:513 +1064:2:514 +1065:0:1650 +1066:2:518 +1067:2:522 +1068:2:523 +1069:2:531 +1070:2:532 +1071:2:536 +1072:2:537 +1073:2:545 +1074:2:550 +1075:2:551 +1076:2:562 +1077:2:563 +1078:2:574 +1079:2:575 +1080:2:576 +1081:2:587 +1082:2:592 +1083:2:593 +1084:0:1650 +1085:2:605 +1086:0:1650 +1087:2:607 +1088:0:1650 +1089:2:608 +1090:0:1650 +1091:2:618 +1092:0:1650 +1093:2:622 +1094:2:623 +1095:2:627 +1096:2:631 +1097:2:632 +1098:2:636 +1099:2:644 +1100:2:645 +1101:2:650 +1102:2:657 +1103:2:658 +1104:2:665 +1105:2:670 +1106:0:1650 +1107:2:681 +1108:0:1650 +1109:1:193 +1110:1:197 +1111:1:198 +1112:1:206 +1113:1:207 +1114:1:211 +1115:1:212 +1116:1:220 +1117:1:225 +1118:1:229 +1119:1:230 +1120:1:237 +1121:1:238 +1122:1:249 +1123:1:250 +1124:1:251 +1125:1:262 +1126:1:274 +1127:1:275 +1128:0:1650 +1129:1:280 +1130:0:1650 +1131:1:282 +1132:0:1650 +1133:1:291 +1134:0:1650 +1135:1:293 +1136:0:1650 +1137:1:11 +1138:0:1650 +1139:1:12 +1140:1:16 +1141:1:17 +1142:1:25 +1143:1:26 +1144:1:27 +1145:1:39 +1146:1:44 +1147:1:48 +1148:1:49 +1149:1:56 +1150:1:57 +1151:1:68 +1152:1:69 +1153:1:70 +1154:1:81 +1155:1:93 +1156:1:94 +1157:0:1650 +1158:1:99 +1159:0:1650 +1160:1:101 +1161:0:1650 +1162:1:102 +1163:1:106 +1164:1:107 +1165:1:115 +1166:1:116 +1167:1:120 +1168:1:121 +1169:1:129 +1170:1:134 +1171:1:138 +1172:1:139 +1173:1:146 +1174:1:147 +1175:1:158 +1176:1:159 +1177:1:160 +1178:1:171 +1179:1:183 +1180:1:184 +1181:0:1650 +1182:1:189 +1183:0:1650 +1184:1:285 +1185:0:1650 +1186:1:286 +1187:0:1650 +1188:1:291 +1189:0:1650 +1190:1:293 +1191:0:1650 +1192:1:296 +1193:0:1650 +1194:1:301 +1195:0:1650 +1196:2:685 +1197:2:686 +1198:2:690 +1199:2:691 +1200:2:699 +1201:2:707 +1202:2:708 +1203:2:713 +1204:2:720 +1205:2:721 +1206:2:728 +1207:2:733 +1208:0:1650 +1209:2:744 +1210:0:1650 +1211:2:752 +1212:2:753 +1213:2:757 +1214:2:761 +1215:2:762 +1216:2:766 +1217:2:774 +1218:2:775 +1219:2:780 +1220:2:787 +1221:2:788 +1222:2:795 +1223:2:800 +1224:0:1650 +1225:2:811 +1226:0:1650 +1227:2:813 +1228:0:1650 +1229:2:814 +1230:2:818 +1231:2:819 +1232:2:827 +1233:2:828 +1234:2:832 +1235:2:833 +1236:2:841 +1237:2:846 +1238:2:850 +1239:2:851 +1240:2:858 +1241:2:859 +1242:2:870 +1243:2:871 +1244:2:872 +1245:2:883 +1246:2:888 +1247:2:889 +1248:0:1650 +1249:2:901 +1250:0:1650 +1251:2:903 +1252:0:1650 +1253:2:906 +1254:2:907 +1255:2:919 +1256:2:920 +1257:2:924 +1258:2:925 +1259:2:933 +1260:2:938 +1261:2:942 +1262:2:943 +1263:2:950 +1264:2:951 +1265:2:962 +1266:2:963 +1267:2:964 +1268:2:975 +1269:2:980 +1270:2:981 +1271:0:1650 +1272:2:993 +1273:0:1650 +1274:2:995 +1275:0:1650 +1276:2:996 +1277:0:1650 +1278:2:997 +1279:0:1650 +1280:2:998 +1281:0:1650 +1282:2:999 +1283:2:1003 +1284:2:1004 +1285:2:1012 +1286:2:1013 +1287:2:1017 +1288:2:1018 +1289:2:1026 +1290:2:1031 +1291:2:1035 +1292:2:1036 +1293:2:1043 +1294:2:1044 +1295:2:1055 +1296:2:1056 +1297:2:1057 +1298:2:1068 +1299:2:1073 +1300:2:1074 +1301:0:1650 +1302:2:1086 +1303:0:1650 +1304:2:1283 +1305:0:1650 +1306:2:1381 +1307:0:1650 +1308:2:1382 +1309:0:1650 +1310:2:1386 +1311:0:1650 +1312:2:1395 +1313:2:1396 +1314:2:1400 +1315:2:1404 +1316:2:1405 +1317:2:1409 +1318:2:1417 +1319:2:1418 +1320:2:1423 +1321:2:1430 +1322:2:1431 +1323:2:1438 +1324:2:1443 +1325:0:1650 +1326:2:1454 +1327:0:1650 +1328:2:1458 +1329:2:1459 +1330:2:1463 +1331:2:1467 +1332:2:1468 +1333:2:1472 +1334:2:1480 +1335:2:1481 +1336:2:1486 +1337:2:1493 +1338:2:1494 +1339:2:1501 +1340:2:1506 +1341:0:1650 +1342:2:1517 +1343:0:1650 +1344:2:1525 +1345:2:1526 +1346:2:1530 +1347:2:1534 +1348:2:1535 +1349:2:1539 +1350:2:1547 +1351:2:1548 +1352:2:1553 +1353:2:1560 +1354:2:1561 +1355:2:1568 +1356:2:1573 +1357:0:1650 +1358:2:1584 +1359:0:1650 +1360:2:1586 +1361:0:1650 +1362:2:1587 +1363:0:1650 +1364:2:1590 +1365:0:1650 +1366:2:1595 +1367:0:1650 +1368:1:302 +1369:0:1648 +1370:2:1596 +1371:0:1654 +1372:0:1650 diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_progress.ltl b/formal-model/urcu/result-standard-execution-nest/urcu_progress.ltl new file mode 100644 index 0000000..8718641 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_progress.ltl @@ -0,0 +1 @@ +([] <> !np_) diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_progress_reader.define b/formal-model/urcu/result-standard-execution-nest/urcu_progress_reader.define new file mode 100644 index 0000000..ff3f783 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_progress_reader.define @@ -0,0 +1 @@ +#define READER_PROGRESS diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_progress_reader.log b/formal-model/urcu/result-standard-execution-nest/urcu_progress_reader.log new file mode 100644 index 0000000..9e98b9f --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_progress_reader.log @@ -0,0 +1,275 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define > pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_progress_reader.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -f -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 744) +depth 15: Claim reached state 9 (line 749) +depth 1767: Claim reached state 9 (line 748) +Depth= 3880 States= 1e+06 Transitions= 1.71e+07 Memory= 499.651 t= 14.5 R= 7e+04 +Depth= 3880 States= 2e+06 Transitions= 3.79e+07 Memory= 532.365 t= 32.3 R= 6e+04 +Depth= 3880 States= 3e+06 Transitions= 5.83e+07 Memory= 564.983 t= 50.2 R= 6e+04 +pan: resizing hashtable to -w22.. done +Depth= 3880 States= 4e+06 Transitions= 7.76e+07 Memory= 629.307 t= 67 R= 6e+04 +Depth= 3880 States= 5e+06 Transitions= 9.78e+07 Memory= 662.315 t= 84.2 R= 6e+04 +Depth= 3880 States= 6e+06 Transitions= 1.19e+08 Memory= 694.736 t= 102 R= 6e+04 +Depth= 3880 States= 7e+06 Transitions= 1.38e+08 Memory= 727.842 t= 119 R= 6e+04 +Depth= 3880 States= 8e+06 Transitions= 1.59e+08 Memory= 760.752 t= 137 R= 6e+04 +Depth= 3880 States= 9e+06 Transitions= 1.79e+08 Memory= 793.174 t= 155 R= 6e+04 +pan: resizing hashtable to -w24.. done +Depth= 3880 States= 1e+07 Transitions= 1.98e+08 Memory= 950.568 t= 172 R= 6e+04 +Depth= 3880 States= 1.1e+07 Transitions= 2.19e+08 Memory= 983.479 t= 189 R= 6e+04 +Depth= 3880 States= 1.2e+07 Transitions= 2.4e+08 Memory= 1015.901 t= 207 R= 6e+04 +Depth= 3880 States= 1.3e+07 Transitions= 2.58e+08 Memory= 1049.397 t= 223 R= 6e+04 + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness enabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 3880, errors: 0 + 7197860 states, stored (1.33457e+07 visited) +2.5266654e+08 states, matched +2.6601223e+08 transitions (= visited+matched) +9.9067284e+08 atomic steps +hash conflicts: 87783920 (resolved) + +Stats on memory usage (in Megabytes): + 576.611 equivalent memory usage for states (stored*(State-vector + overhead)) + 474.839 actual memory usage for states (compression: 82.35%) + state-vector as stored = 41 byte + 28 byte overhead + 128.000 memory used for hash table (-w24) + 457.764 memory used for DFS stack (-m10000000) + 1060.529 total actual memory usage + +unreached in proctype urcu_reader + line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 61, "(1)" + line 418, "pan.___", state 91, "(1)" + line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 151, "(1)" + line 418, "pan.___", state 181, "(1)" + line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 242, "(1)" + line 418, "pan.___", state 272, "(1)" + line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 360, "(1)" + line 418, "pan.___", state 390, "(1)" + line 540, "pan.___", state 414, "-end-" + (17 of 414 states) +unreached in proctype urcu_writer + line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 59, "(1)" + line 413, "pan.___", state 72, "(1)" + line 418, "pan.___", state 89, "(1)" + line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 153, "(1)" + line 413, "pan.___", state 166, "(1)" + line 652, "pan.___", state 199, "(1)" + line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 160, "pan.___", state 240, "(1)" + line 164, "pan.___", state 248, "(1)" + line 168, "pan.___", state 260, "(1)" + line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 927, "(1)" + line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 928, "else" + line 409, "pan.___", state 931, "(1)" + line 409, "pan.___", state 932, "(1)" + line 409, "pan.___", state 932, "(1)" + line 413, "pan.___", state 940, "(1)" + line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 941, "else" + line 413, "pan.___", state 944, "(1)" + line 413, "pan.___", state 945, "(1)" + line 413, "pan.___", state 945, "(1)" + line 411, "pan.___", state 950, "((i<1))" + line 411, "pan.___", state 950, "((i>=1))" + line 418, "pan.___", state 957, "(1)" + line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 958, "else" + line 418, "pan.___", state 961, "(1)" + line 418, "pan.___", state 962, "(1)" + line 418, "pan.___", state 962, "(1)" + line 420, "pan.___", state 965, "(1)" + line 420, "pan.___", state 965, "(1)" + line 403, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1040, "(1)" + line 418, "pan.___", state 1057, "(1)" + line 403, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1130, "(1)" + line 418, "pan.___", state 1147, "(1)" + line 399, "pan.___", state 1166, "(1)" + line 403, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1222, "(1)" + line 418, "pan.___", state 1239, "(1)" + line 403, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1315, "(1)" + line 418, "pan.___", state 1332, "(1)" + line 179, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 183, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 160, "pan.___", state 1378, "(1)" + line 164, "pan.___", state 1386, "(1)" + line 168, "pan.___", state 1398, "(1)" + line 175, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 408, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 1595, "(1)" + line 409, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 1596, "else" + line 409, "pan.___", state 1599, "(1)" + line 409, "pan.___", state 1600, "(1)" + line 409, "pan.___", state 1600, "(1)" + line 413, "pan.___", state 1608, "(1)" + line 413, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 1609, "else" + line 413, "pan.___", state 1612, "(1)" + line 413, "pan.___", state 1613, "(1)" + line 413, "pan.___", state 1613, "(1)" + line 411, "pan.___", state 1618, "((i<1))" + line 411, "pan.___", state 1618, "((i>=1))" + line 418, "pan.___", state 1625, "(1)" + line 418, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 1626, "else" + line 418, "pan.___", state 1629, "(1)" + line 418, "pan.___", state 1630, "(1)" + line 418, "pan.___", state 1630, "(1)" + line 420, "pan.___", state 1633, "(1)" + line 420, "pan.___", state 1633, "(1)" + line 179, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 183, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 160, "pan.___", state 1681, "(1)" + line 164, "pan.___", state 1689, "(1)" + line 168, "pan.___", state 1701, "(1)" + line 175, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_progress_reader.spin.input.trail b/formal-model/urcu/result-standard-execution-nest/urcu_progress_reader.spin.input.trail new file mode 100644 index 0000000..7c42af1 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_progress_reader.spin.input.trail @@ -0,0 +1,1270 @@ +-2:4:-2 +-4:-4:-4 +1:0:4401 +2:4:4353 +3:4:4356 +4:4:4356 +5:4:4359 +6:4:4367 +7:4:4367 +8:4:4370 +9:4:4376 +10:4:4380 +11:4:4380 +12:4:4383 +13:4:4391 +14:4:4395 +15:4:4396 +16:0:4401 +17:4:4398 +18:0:4401 +19:3:2479 +20:0:4401 +21:3:2485 +22:0:4401 +23:3:2486 +24:0:4401 +25:3:2487 +26:3:2491 +27:3:2492 +28:3:2500 +29:3:2501 +30:3:2505 +31:3:2506 +32:3:2514 +33:3:2519 +34:3:2523 +35:3:2524 +36:3:2531 +37:3:2532 +38:3:2543 +39:3:2544 +40:3:2545 +41:3:2556 +42:3:2561 +43:3:2562 +44:0:4401 +45:3:2574 +46:0:4401 +47:3:2576 +48:3:2577 +49:0:4401 +50:3:2581 +51:3:2585 +52:3:2586 +53:3:2594 +54:3:2595 +55:3:2599 +56:3:2600 +57:3:2608 +58:3:2613 +59:3:2614 +60:3:2625 +61:3:2626 +62:3:2637 +63:3:2638 +64:3:2639 +65:3:2650 +66:3:2655 +67:3:2656 +68:0:4401 +69:3:2668 +70:0:4401 +71:3:2670 +72:0:4401 +73:3:2671 +74:0:4401 +75:3:2681 +76:0:4401 +77:3:2682 +78:0:4401 +79:3:2686 +80:3:2687 +81:3:2691 +82:3:2695 +83:3:2696 +84:3:2700 +85:3:2708 +86:3:2709 +87:3:2714 +88:3:2721 +89:3:2722 +90:3:2729 +91:3:2734 +92:0:4401 +93:3:2745 +94:0:4401 +95:3:2749 +96:3:2750 +97:3:2754 +98:3:2758 +99:3:2759 +100:3:2763 +101:3:2771 +102:3:2772 +103:3:2777 +104:3:2784 +105:3:2785 +106:3:2792 +107:3:2797 +108:0:4401 +109:3:2808 +110:0:4401 +111:3:2816 +112:3:2817 +113:3:2821 +114:3:2825 +115:3:2826 +116:3:2830 +117:3:2838 +118:3:2839 +119:3:2844 +120:3:2851 +121:3:2852 +122:3:2859 +123:3:2864 +124:0:4401 +125:3:2879 +126:0:4401 +127:3:2881 +128:0:4401 +129:3:2882 +130:3:2886 +131:3:2887 +132:3:2895 +133:3:2896 +134:3:2900 +135:3:2901 +136:3:2909 +137:3:2914 +138:3:2918 +139:3:2919 +140:3:2926 +141:3:2927 +142:3:2938 +143:3:2939 +144:3:2940 +145:3:2951 +146:3:2956 +147:3:2957 +148:0:4401 +149:3:2969 +150:0:4401 +151:3:2971 +152:0:4401 +153:3:2974 +154:3:2975 +155:3:2987 +156:3:2988 +157:3:2992 +158:3:2993 +159:3:3001 +160:3:3006 +161:3:3010 +162:3:3011 +163:3:3018 +164:3:3019 +165:3:3030 +166:3:3031 +167:3:3032 +168:3:3043 +169:3:3048 +170:3:3049 +171:0:4401 +172:3:3061 +173:0:4401 +174:3:3063 +175:0:4401 +176:3:3064 +177:0:4401 +178:3:3065 +179:0:4401 +180:3:3066 +181:0:4401 +182:3:3067 +183:3:3071 +184:3:3072 +185:3:3080 +186:3:3081 +187:3:3085 +188:3:3086 +189:3:3094 +190:3:3099 +191:3:3103 +192:3:3104 +193:3:3111 +194:3:3112 +195:3:3123 +196:3:3124 +197:3:3125 +198:3:3136 +199:3:3141 +200:3:3142 +201:0:4401 +202:3:3154 +203:0:4401 +204:3:3356 +205:0:4401 +206:3:3454 +207:0:4401 +208:3:3455 +209:0:4401 +210:3:3459 +211:0:4401 +212:3:3465 +213:3:3469 +214:3:3470 +215:3:3478 +216:3:3479 +217:3:3483 +218:3:3484 +219:3:3492 +220:3:3497 +221:3:3501 +222:3:3502 +223:3:3509 +224:3:3510 +225:3:3521 +226:3:3522 +227:3:3523 +228:3:3534 +229:3:3539 +230:3:3540 +231:0:4401 +232:3:3552 +233:0:4401 +234:3:3554 +235:0:4401 +236:3:3555 +237:3:3559 +238:3:3560 +239:3:3568 +240:3:3569 +241:3:3573 +242:3:3574 +243:3:3582 +244:3:3587 +245:3:3591 +246:3:3592 +247:3:3599 +248:3:3600 +249:3:3611 +250:3:3612 +251:3:3613 +252:3:3624 +253:3:3629 +254:3:3630 +255:0:4401 +256:3:3642 +257:0:4401 +258:3:3644 +259:0:4401 +260:3:3647 +261:3:3648 +262:3:3660 +263:3:3661 +264:3:3665 +265:3:3666 +266:3:3674 +267:3:3679 +268:3:3683 +269:3:3684 +270:3:3691 +271:3:3692 +272:3:3703 +273:3:3704 +274:3:3705 +275:3:3716 +276:3:3721 +277:3:3722 +278:0:4401 +279:3:3734 +280:0:4401 +281:3:3736 +282:0:4401 +283:3:3737 +284:0:4401 +285:3:3738 +286:0:4401 +287:3:3739 +288:0:4401 +289:3:3740 +290:3:3744 +291:3:3745 +292:3:3753 +293:3:3754 +294:3:3758 +295:3:3759 +296:3:3767 +297:3:3772 +298:3:3776 +299:3:3777 +300:3:3784 +301:3:3785 +302:3:3796 +303:3:3797 +304:3:3798 +305:3:3809 +306:3:3814 +307:3:3815 +308:0:4401 +309:3:3827 +310:0:4401 +311:3:4029 +312:0:4401 +313:3:4127 +314:0:4401 +315:3:4128 +316:0:4401 +317:3:4132 +318:0:4401 +319:3:4138 +320:0:4401 +321:3:4142 +322:3:4143 +323:3:4147 +324:3:4151 +325:3:4152 +326:3:4156 +327:3:4164 +328:3:4165 +329:3:4170 +330:3:4177 +331:3:4178 +332:3:4185 +333:3:4190 +334:0:4401 +335:3:4201 +336:0:4401 +337:3:4205 +338:3:4206 +339:3:4210 +340:3:4214 +341:3:4215 +342:3:4219 +343:3:4227 +344:3:4228 +345:3:4233 +346:3:4240 +347:3:4241 +348:3:4248 +349:3:4253 +350:0:4401 +351:3:4264 +352:0:4401 +353:3:4272 +354:3:4273 +355:3:4277 +356:3:4281 +357:3:4282 +358:3:4286 +359:3:4294 +360:3:4295 +361:3:4300 +362:3:4307 +363:3:4308 +364:3:4315 +365:3:4320 +366:0:4401 +367:3:4335 +368:0:4401 +369:3:4337 +370:0:4401 +371:3:4338 +372:0:4401 +373:3:2486 +374:0:4401 +375:3:2487 +376:3:2491 +377:3:2492 +378:3:2500 +379:3:2501 +380:3:2505 +381:3:2506 +382:3:2514 +383:3:2519 +384:3:2523 +385:3:2524 +386:3:2531 +387:3:2532 +388:3:2543 +389:3:2544 +390:3:2545 +391:3:2556 +392:3:2561 +393:3:2562 +394:0:4401 +395:3:2574 +396:0:4401 +397:3:2576 +398:3:2577 +399:0:4401 +400:3:2581 +401:3:2585 +402:3:2586 +403:3:2594 +404:3:2595 +405:3:2599 +406:3:2600 +407:3:2608 +408:3:2613 +409:3:2614 +410:3:2625 +411:3:2626 +412:3:2637 +413:3:2638 +414:3:2639 +415:3:2650 +416:3:2655 +417:3:2656 +418:0:4401 +419:3:2668 +420:0:4401 +421:3:2670 +422:0:4401 +423:3:2671 +424:0:4401 +425:3:2681 +426:0:4401 +427:3:2682 +428:0:4401 +429:3:2686 +430:3:2687 +431:3:2691 +432:3:2695 +433:3:2696 +434:3:2700 +435:3:2708 +436:3:2709 +437:3:2714 +438:3:2721 +439:3:2722 +440:3:2729 +441:3:2734 +442:0:4401 +443:3:2745 +444:0:4401 +445:3:2749 +446:3:2750 +447:3:2754 +448:3:2758 +449:3:2759 +450:3:2763 +451:3:2771 +452:3:2772 +453:3:2777 +454:3:2784 +455:3:2785 +456:3:2792 +457:3:2797 +458:0:4401 +459:3:2808 +460:0:4401 +461:3:2816 +462:3:2817 +463:3:2821 +464:3:2825 +465:3:2826 +466:3:2830 +467:3:2838 +468:3:2839 +469:3:2844 +470:3:2851 +471:3:2852 +472:3:2859 +473:3:2864 +474:0:4401 +475:3:2879 +476:0:4401 +477:3:2881 +478:0:4401 +479:3:2882 +480:3:2886 +481:3:2887 +482:3:2895 +483:3:2896 +484:3:2900 +485:3:2901 +486:3:2909 +487:3:2914 +488:3:2918 +489:3:2919 +490:3:2926 +491:3:2927 +492:3:2938 +493:3:2939 +494:3:2940 +495:3:2951 +496:3:2956 +497:3:2957 +498:0:4401 +499:3:2969 +500:0:4401 +501:3:2971 +502:0:4401 +503:3:2974 +504:3:2975 +505:3:2987 +506:3:2988 +507:3:2992 +508:3:2993 +509:3:3001 +510:3:3006 +511:3:3010 +512:3:3011 +513:3:3018 +514:3:3019 +515:3:3030 +516:3:3031 +517:3:3032 +518:3:3043 +519:3:3048 +520:3:3049 +521:0:4401 +522:3:3061 +523:0:4401 +524:3:3063 +525:0:4401 +526:3:3064 +527:0:4401 +528:3:3065 +529:0:4401 +530:3:3066 +531:0:4401 +532:3:3067 +533:3:3071 +534:3:3072 +535:3:3080 +536:3:3081 +537:3:3085 +538:3:3086 +539:3:3094 +540:3:3099 +541:3:3103 +542:3:3104 +543:3:3111 +544:3:3112 +545:3:3123 +546:3:3124 +547:3:3125 +548:3:3136 +549:3:3141 +550:3:3142 +551:0:4401 +552:3:3154 +553:0:4401 +554:3:3356 +555:0:4401 +556:3:3454 +557:0:4401 +558:3:3455 +559:0:4401 +560:3:3459 +561:0:4401 +562:3:3465 +563:3:3469 +564:3:3470 +565:3:3478 +566:3:3479 +567:3:3483 +568:3:3484 +569:3:3492 +570:3:3497 +571:3:3501 +572:3:3502 +573:3:3509 +574:3:3510 +575:3:3521 +576:3:3522 +577:3:3523 +578:3:3534 +579:3:3539 +580:3:3540 +581:0:4401 +582:3:3552 +583:0:4401 +584:3:3554 +585:0:4401 +586:3:3555 +587:3:3559 +588:3:3560 +589:3:3568 +590:3:3569 +591:3:3573 +592:3:3574 +593:3:3582 +594:3:3587 +595:3:3591 +596:3:3592 +597:3:3599 +598:3:3600 +599:3:3611 +600:3:3612 +601:3:3613 +602:3:3624 +603:3:3629 +604:3:3630 +605:0:4401 +606:3:3642 +607:0:4401 +608:3:3644 +609:0:4401 +610:3:3647 +611:3:3648 +612:3:3660 +613:3:3661 +614:3:3665 +615:3:3666 +616:3:3674 +617:3:3679 +618:3:3683 +619:3:3684 +620:3:3691 +621:3:3692 +622:3:3703 +623:3:3704 +624:3:3705 +625:3:3716 +626:3:3721 +627:3:3722 +628:0:4401 +629:3:3734 +630:0:4401 +631:3:3736 +632:0:4401 +633:3:3737 +634:0:4401 +635:3:3738 +636:0:4401 +637:3:3739 +638:0:4401 +639:3:3740 +640:3:3744 +641:3:3745 +642:3:3753 +643:3:3754 +644:3:3758 +645:3:3759 +646:3:3767 +647:3:3772 +648:3:3776 +649:3:3777 +650:3:3784 +651:3:3785 +652:3:3796 +653:3:3797 +654:3:3798 +655:3:3809 +656:3:3814 +657:3:3815 +658:0:4401 +659:3:3827 +660:0:4401 +661:3:4029 +662:0:4401 +663:3:4127 +664:0:4401 +665:3:4128 +666:0:4401 +667:3:4132 +668:0:4401 +669:3:4138 +670:0:4401 +671:3:4142 +672:3:4143 +673:3:4147 +674:3:4151 +675:3:4152 +676:3:4156 +677:3:4164 +678:3:4165 +679:3:4170 +680:3:4177 +681:3:4178 +682:3:4185 +683:3:4190 +684:0:4401 +685:3:4201 +686:0:4401 +687:3:4205 +688:3:4206 +689:3:4210 +690:3:4214 +691:3:4215 +692:3:4219 +693:3:4227 +694:3:4228 +695:3:4233 +696:3:4240 +697:3:4241 +698:3:4248 +699:3:4253 +700:0:4401 +701:3:4264 +702:0:4401 +703:3:4272 +704:3:4273 +705:3:4277 +706:3:4281 +707:3:4282 +708:3:4286 +709:3:4294 +710:3:4295 +711:3:4300 +712:3:4307 +713:3:4308 +714:3:4315 +715:3:4320 +716:0:4401 +717:3:4335 +718:0:4401 +719:3:4337 +720:0:4401 +721:3:4338 +722:0:4401 +723:3:2486 +724:0:4401 +725:3:2487 +726:3:2491 +727:3:2492 +728:3:2500 +729:3:2501 +730:3:2505 +731:3:2506 +732:3:2514 +733:3:2519 +734:3:2523 +735:3:2524 +736:3:2531 +737:3:2532 +738:3:2543 +739:3:2544 +740:3:2545 +741:3:2556 +742:3:2561 +743:3:2562 +744:0:4401 +745:3:2574 +746:0:4401 +747:3:2576 +748:3:2577 +749:0:4401 +750:3:2581 +751:3:2585 +752:3:2586 +753:3:2594 +754:3:2595 +755:3:2599 +756:3:2600 +757:3:2608 +758:3:2613 +759:3:2614 +760:3:2625 +761:3:2626 +762:3:2637 +763:3:2638 +764:3:2639 +765:3:2650 +766:3:2655 +767:3:2656 +768:0:4401 +769:3:2668 +770:0:4401 +771:3:2670 +772:0:4401 +773:3:2671 +774:0:4401 +775:3:2681 +776:0:4401 +777:3:2682 +778:0:4401 +779:3:2686 +780:3:2687 +781:3:2691 +782:3:2695 +783:3:2696 +784:3:2700 +785:3:2708 +786:3:2709 +787:3:2714 +788:3:2721 +789:3:2722 +790:3:2729 +791:3:2734 +792:0:4401 +793:3:2745 +794:0:4401 +795:3:2749 +796:3:2750 +797:3:2754 +798:3:2758 +799:3:2759 +800:3:2763 +801:3:2771 +802:3:2772 +803:3:2777 +804:3:2784 +805:3:2785 +806:3:2792 +807:3:2797 +808:0:4401 +809:3:2808 +810:0:4401 +811:3:2816 +812:3:2817 +813:3:2821 +814:3:2825 +815:3:2826 +816:3:2830 +817:3:2838 +818:3:2839 +819:3:2844 +820:3:2851 +821:3:2852 +822:3:2859 +823:3:2864 +824:0:4401 +825:3:2879 +826:0:4401 +827:3:2881 +828:0:4401 +829:3:2882 +830:3:2886 +831:3:2887 +832:3:2895 +833:3:2896 +834:3:2900 +835:3:2901 +836:3:2909 +837:3:2914 +838:3:2918 +839:3:2919 +840:3:2926 +841:3:2927 +842:3:2938 +843:3:2939 +844:3:2940 +845:3:2951 +846:3:2956 +847:3:2957 +848:0:4401 +849:3:2969 +850:0:4401 +851:3:2971 +852:0:4401 +853:3:2974 +854:3:2975 +855:3:2987 +856:3:2988 +857:3:2992 +858:3:2993 +859:3:3001 +860:3:3006 +861:3:3010 +862:3:3011 +863:3:3018 +864:3:3019 +865:3:3030 +866:3:3031 +867:3:3032 +868:3:3043 +869:3:3048 +870:3:3049 +871:0:4401 +872:3:3061 +873:0:4401 +874:3:3063 +875:0:4401 +876:3:3064 +877:0:4401 +878:3:3065 +879:0:4401 +880:3:3066 +881:0:4401 +882:3:3067 +883:3:3071 +884:3:3072 +885:3:3080 +886:3:3081 +887:3:3085 +888:3:3086 +889:3:3094 +890:3:3099 +891:3:3103 +892:3:3104 +893:3:3111 +894:3:3112 +895:3:3123 +896:3:3124 +897:3:3125 +898:3:3136 +899:3:3141 +900:3:3142 +901:0:4401 +902:3:3154 +903:0:4401 +904:3:3356 +905:0:4401 +906:3:3454 +907:0:4401 +908:3:3455 +909:0:4401 +910:3:3459 +911:0:4401 +912:3:3465 +913:3:3469 +914:3:3470 +915:3:3478 +916:3:3479 +917:3:3483 +918:3:3484 +919:3:3492 +920:3:3497 +921:3:3501 +922:3:3502 +923:3:3509 +924:3:3510 +925:3:3521 +926:3:3522 +927:3:3523 +928:3:3534 +929:3:3539 +930:3:3540 +931:0:4401 +932:3:3552 +933:0:4401 +934:3:3554 +935:0:4401 +936:3:3555 +937:3:3559 +938:3:3560 +939:3:3568 +940:3:3569 +941:3:3573 +942:3:3574 +943:3:3582 +944:3:3587 +945:3:3591 +946:3:3592 +947:3:3599 +948:3:3600 +949:3:3611 +950:3:3612 +951:3:3613 +952:3:3624 +953:3:3629 +954:3:3630 +955:0:4401 +956:3:3642 +957:0:4401 +958:3:3644 +959:0:4401 +960:3:3647 +961:3:3648 +962:3:3660 +963:3:3661 +964:3:3665 +965:3:3666 +966:3:3674 +967:3:3679 +968:3:3683 +969:3:3684 +970:3:3691 +971:3:3692 +972:3:3703 +973:3:3704 +974:3:3705 +975:3:3716 +976:3:3721 +977:3:3722 +978:0:4401 +979:3:3734 +980:0:4401 +981:3:3736 +982:0:4401 +983:3:3737 +984:0:4401 +985:3:3738 +986:0:4401 +987:3:3739 +988:0:4401 +989:3:3740 +990:3:3744 +991:3:3745 +992:3:3753 +993:3:3754 +994:3:3758 +995:3:3759 +996:3:3767 +997:3:3772 +998:3:3776 +999:3:3777 +1000:3:3784 +1001:3:3785 +1002:3:3796 +1003:3:3797 +1004:3:3798 +1005:3:3809 +1006:3:3814 +1007:3:3815 +1008:0:4401 +1009:3:3827 +1010:0:4401 +1011:3:4029 +1012:0:4401 +1013:3:4127 +1014:0:4401 +1015:3:4128 +1016:0:4401 +1017:3:4132 +1018:0:4401 +1019:3:4138 +1020:0:4401 +1021:3:4142 +1022:3:4143 +1023:3:4147 +1024:3:4151 +1025:3:4152 +1026:3:4156 +1027:3:4164 +1028:3:4165 +1029:3:4170 +1030:3:4177 +1031:3:4178 +1032:3:4185 +1033:3:4190 +1034:0:4401 +1035:3:4201 +1036:0:4401 +1037:3:4205 +1038:3:4206 +1039:3:4210 +1040:3:4214 +1041:3:4215 +1042:3:4219 +1043:3:4227 +1044:3:4228 +1045:3:4233 +1046:3:4240 +1047:3:4241 +1048:3:4248 +1049:3:4253 +1050:0:4401 +1051:3:4264 +1052:0:4401 +1053:3:4272 +1054:3:4273 +1055:3:4277 +1056:3:4281 +1057:3:4282 +1058:3:4286 +1059:3:4294 +1060:3:4295 +1061:3:4300 +1062:3:4307 +1063:3:4308 +1064:3:4315 +1065:3:4320 +1066:0:4401 +1067:3:4335 +1068:0:4401 +1069:3:4337 +1070:0:4401 +1071:3:4338 +1072:0:4401 +1073:3:4341 +1074:0:4401 +1075:3:4346 +1076:0:4401 +1077:2:1236 +1078:0:4401 +1079:3:4347 +1080:0:4401 +1081:2:1242 +1082:0:4401 +1083:3:4346 +1084:0:4401 +1085:2:1243 +1086:0:4401 +1087:3:4347 +1088:0:4401 +1089:2:1244 +1090:0:4401 +1091:3:4346 +1092:0:4401 +1093:2:1245 +1094:0:4401 +1095:3:4347 +1096:0:4401 +1097:1:2 +1098:0:4401 +1099:3:4346 +1100:0:4401 +1101:2:1246 +1102:0:4401 +1103:3:4347 +1104:0:4401 +1105:1:8 +1106:0:4401 +1107:3:4346 +1108:0:4401 +1109:2:1245 +1110:0:4401 +1111:3:4347 +1112:0:4401 +1113:1:9 +1114:0:4401 +1115:3:4346 +1116:0:4401 +1117:2:1246 +1118:0:4401 +1119:3:4347 +1120:0:4401 +1121:1:10 +1122:0:4401 +1123:3:4346 +1124:0:4401 +1125:2:1245 +1126:0:4401 +1127:3:4347 +1128:0:4401 +1129:1:11 +1130:0:4401 +1131:3:4346 +1132:0:4401 +1133:2:1246 +1134:0:4401 +1135:3:4347 +1136:0:4401 +1137:1:14 +1138:0:4401 +1139:3:4346 +1140:0:4401 +1141:2:1245 +1142:0:4401 +1143:3:4347 +1144:0:4401 +1145:1:15 +1146:0:4401 +1147:3:4346 +1148:0:4401 +1149:2:1246 +1150:0:4401 +1151:3:4347 +1152:0:4401 +1153:1:16 +1154:1:20 +1155:1:21 +1156:1:29 +1157:1:30 +1158:1:34 +1159:1:35 +1160:1:43 +1161:1:48 +1162:1:52 +1163:1:53 +1164:1:60 +1165:1:61 +1166:1:72 +1167:1:73 +1168:1:74 +1169:1:85 +1170:1:90 +1171:1:91 +1172:0:4401 +1173:3:4346 +1174:0:4401 +1175:2:1245 +1176:0:4401 +1177:3:4347 +1178:0:4401 +1179:1:103 +1180:0:4401 +1181:3:4346 +1182:0:4401 +1183:2:1246 +1184:0:4401 +1185:3:4347 +1186:0:4401 +1187:2:1247 +1188:0:4401 +1189:3:4346 +1190:0:4401 +1191:2:1253 +1192:0:4401 +1193:3:4347 +1194:0:4401 +1195:2:1254 +1196:0:4399 +1197:3:4346 +1198:0:4405 +1199:3:4347 +1200:0:4405 +1201:2:1257 +1202:0:4405 +1203:3:4346 +1204:0:4405 +1205:2:1258 +1206:0:4405 +1207:3:4347 +1208:0:4405 +1209:2:1259 +1210:2:1263 +1211:2:1264 +1212:2:1272 +1213:2:1273 +1214:2:1277 +1215:2:1278 +1216:2:1286 +1217:2:1291 +1218:2:1295 +1219:2:1296 +1220:2:1303 +1221:2:1304 +1222:2:1315 +1223:2:1316 +1224:2:1317 +1225:2:1328 +1226:2:1333 +1227:2:1334 +1228:0:4405 +1229:3:4346 +1230:0:4405 +1231:2:1346 +1232:0:4405 +1233:3:4347 +1234:0:4405 +1235:2:1347 +1236:0:4405 +1237:3:4346 +1238:0:4405 +1239:1:104 +-1:-1:-1 +1240:0:4405 +1241:3:4347 +1242:0:4405 +1243:3:4346 +1244:0:4405 +1245:2:1348 +1246:0:4405 +1247:3:4347 +1248:0:4405 +1249:2:1347 +1250:0:4405 +1251:3:4346 +1252:0:4405 +1253:1:105 +1254:0:4405 +1255:3:4347 +1256:0:4405 +1257:3:4346 +1258:0:4405 +1259:2:1348 +1260:0:4405 +1261:3:4347 +1262:0:4405 +1263:2:1347 +1264:0:4405 +1265:3:4346 +1266:0:4405 +1267:1:104 diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer.define b/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer.define new file mode 100644 index 0000000..1e4417f --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer.define @@ -0,0 +1 @@ +#define WRITER_PROGRESS diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer.log b/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer.log new file mode 100644 index 0000000..434151a --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer.log @@ -0,0 +1,275 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define > pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_progress_writer.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -f -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 744) +depth 15: Claim reached state 9 (line 749) +depth 291: Claim reached state 9 (line 748) +Depth= 2677 States= 1e+06 Transitions= 1.57e+07 Memory= 487.932 t= 13.4 R= 7e+04 +Depth= 3023 States= 2e+06 Transitions= 3.19e+07 Memory= 509.709 t= 27.3 R= 7e+04 +Depth= 3610 States= 3e+06 Transitions= 4.84e+07 Memory= 531.486 t= 41.6 R= 7e+04 +pan: resizing hashtable to -w22.. done +Depth= 3956 States= 4e+06 Transitions= 6.63e+07 Memory= 595.029 t= 57 R= 7e+04 +Depth= 3956 States= 5e+06 Transitions= 8.67e+07 Memory= 617.783 t= 74.5 R= 7e+04 +Depth= 3956 States= 6e+06 Transitions= 1.08e+08 Memory= 660.850 t= 93 R= 6e+04 +Depth= 3956 States= 7e+06 Transitions= 1.28e+08 Memory= 690.928 t= 110 R= 6e+04 +Depth= 3956 States= 8e+06 Transitions= 1.51e+08 Memory= 729.600 t= 129 R= 6e+04 +Depth= 3956 States= 9e+06 Transitions= 1.7e+08 Memory= 765.830 t= 146 R= 6e+04 +pan: resizing hashtable to -w24.. done +Depth= 3956 States= 1e+07 Transitions= 1.92e+08 Memory= 919.611 t= 166 R= 6e+04 +Depth= 3956 States= 1.1e+07 Transitions= 2.13e+08 Memory= 958.576 t= 183 R= 6e+04 +Depth= 3956 States= 1.2e+07 Transitions= 2.33e+08 Memory= 985.627 t= 201 R= 6e+04 +Depth= 3956 States= 1.3e+07 Transitions= 2.55e+08 Memory= 1027.033 t= 220 R= 6e+04 + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness enabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 3956, errors: 0 + 7045896 states, stored (1.35792e+07 visited) +2.5326206e+08 states, matched +2.668413e+08 transitions (= visited+matched) +9.9425626e+08 atomic steps +hash conflicts: 65494104 (resolved) + +Stats on memory usage (in Megabytes): + 564.437 equivalent memory usage for states (stored*(State-vector + overhead)) + 465.758 actual memory usage for states (compression: 82.52%) + state-vector as stored = 41 byte + 28 byte overhead + 128.000 memory used for hash table (-w24) + 457.764 memory used for DFS stack (-m10000000) + 1051.350 total actual memory usage + +unreached in proctype urcu_reader + line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 61, "(1)" + line 418, "pan.___", state 91, "(1)" + line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 151, "(1)" + line 418, "pan.___", state 181, "(1)" + line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 242, "(1)" + line 418, "pan.___", state 272, "(1)" + line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 360, "(1)" + line 418, "pan.___", state 390, "(1)" + line 540, "pan.___", state 414, "-end-" + (17 of 414 states) +unreached in proctype urcu_writer + line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 59, "(1)" + line 413, "pan.___", state 72, "(1)" + line 418, "pan.___", state 89, "(1)" + line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 153, "(1)" + line 413, "pan.___", state 166, "(1)" + line 652, "pan.___", state 199, "(1)" + line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 160, "pan.___", state 240, "(1)" + line 164, "pan.___", state 248, "(1)" + line 168, "pan.___", state 260, "(1)" + line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 927, "(1)" + line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 928, "else" + line 409, "pan.___", state 931, "(1)" + line 409, "pan.___", state 932, "(1)" + line 409, "pan.___", state 932, "(1)" + line 413, "pan.___", state 940, "(1)" + line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 941, "else" + line 413, "pan.___", state 944, "(1)" + line 413, "pan.___", state 945, "(1)" + line 413, "pan.___", state 945, "(1)" + line 411, "pan.___", state 950, "((i<1))" + line 411, "pan.___", state 950, "((i>=1))" + line 418, "pan.___", state 957, "(1)" + line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 958, "else" + line 418, "pan.___", state 961, "(1)" + line 418, "pan.___", state 962, "(1)" + line 418, "pan.___", state 962, "(1)" + line 420, "pan.___", state 965, "(1)" + line 420, "pan.___", state 965, "(1)" + line 403, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1040, "(1)" + line 418, "pan.___", state 1057, "(1)" + line 403, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1130, "(1)" + line 418, "pan.___", state 1147, "(1)" + line 399, "pan.___", state 1166, "(1)" + line 403, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1222, "(1)" + line 418, "pan.___", state 1239, "(1)" + line 403, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1315, "(1)" + line 418, "pan.___", state 1332, "(1)" + line 179, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 183, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 160, "pan.___", state 1378, "(1)" + line 164, "pan.___", state 1386, "(1)" + line 168, "pan.___", state 1398, "(1)" + line 175, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 408, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 1595, "(1)" + line 409, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 1596, "else" + line 409, "pan.___", state 1599, "(1)" + line 409, "pan.___", state 1600, "(1)" + line 409, "pan.___", state 1600, "(1)" + line 413, "pan.___", state 1608, "(1)" + line 413, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 1609, "else" + line 413, "pan.___", state 1612, "(1)" + line 413, "pan.___", state 1613, "(1)" + line 413, "pan.___", state 1613, "(1)" + line 411, "pan.___", state 1618, "((i<1))" + line 411, "pan.___", state 1618, "((i>=1))" + line 418, "pan.___", state 1625, "(1)" + line 418, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 1626, "else" + line 418, "pan.___", state 1629, "(1)" + line 418, "pan.___", state 1630, "(1)" + line 418, "pan.___", state 1630, "(1)" + line 420, "pan.___", state 1633, "(1)" + line 420, "pan.___", state 1633, "(1)" + line 179, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 183, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 160, "pan.___", state 1681, "(1)" + line 164, "pan.___", state 1689, "(1)" + line 168, "pan.___", state 1701, "(1)" + line 175, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer.spin.input.trail b/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer.spin.input.trail new file mode 100644 index 0000000..e65d663 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer.spin.input.trail @@ -0,0 +1,9 @@ +-2:3:-2 +-4:-4:-4 +1:0:2679 +2:1:2673 +3:1:2674 +4:1:2675 +5:1:2676 +6:0:2685 +7:5:1129 diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer_error.define b/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer_error.define new file mode 100644 index 0000000..8d304f5 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer_error.define @@ -0,0 +1,2 @@ +#define WRITER_PROGRESS +#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer_error.log b/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer_error.log new file mode 100644 index 0000000..7fafb9e --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer_error.log @@ -0,0 +1,514 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define > pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_progress_writer_error.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -f -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 745) +depth 15: Claim reached state 9 (line 750) +depth 291: Claim reached state 9 (line 749) +pan: acceptance cycle (at depth 4308) +pan: wrote .input.spin.trail + +(Spin Version 5.1.7 -- 23 December 2008) +Warning: Search not completed + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness enabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 4820, errors: 1 + 62091 states, stored (169917 visited) + 2179326 states, matched + 2349243 transitions (= visited+matched) + 8805349 atomic steps +hash conflicts: 50953 (resolved) + +Stats on memory usage (in Megabytes): + 4.974 equivalent memory usage for states (stored*(State-vector + overhead)) + 4.145 actual memory usage for states (compression: 83.33%) + state-vector as stored = 42 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 469.865 total actual memory usage + +unreached in proctype urcu_reader + line 400, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 61, "(1)" + line 419, "pan.___", state 91, "(1)" + line 400, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 151, "(1)" + line 419, "pan.___", state 181, "(1)" + line 400, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 242, "(1)" + line 419, "pan.___", state 272, "(1)" + line 400, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 360, "(1)" + line 419, "pan.___", state 390, "(1)" + line 541, "pan.___", state 414, "-end-" + (17 of 414 states) +unreached in proctype urcu_writer + line 400, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 20, "(1)" + line 404, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 34, "(1)" + line 404, "pan.___", state 35, "(1)" + line 404, "pan.___", state 35, "(1)" + line 402, "pan.___", state 40, "((i<1))" + line 402, "pan.___", state 40, "((i>=1))" + line 409, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 59, "(1)" + line 410, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 60, "else" + line 410, "pan.___", state 63, "(1)" + line 410, "pan.___", state 64, "(1)" + line 410, "pan.___", state 64, "(1)" + line 414, "pan.___", state 72, "(1)" + line 414, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 73, "else" + line 414, "pan.___", state 76, "(1)" + line 414, "pan.___", state 77, "(1)" + line 414, "pan.___", state 77, "(1)" + line 412, "pan.___", state 82, "((i<1))" + line 412, "pan.___", state 82, "((i>=1))" + line 419, "pan.___", state 89, "(1)" + line 419, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 90, "else" + line 419, "pan.___", state 93, "(1)" + line 419, "pan.___", state 94, "(1)" + line 419, "pan.___", state 94, "(1)" + line 370, "pan.___", state 99, "(1)" + line 640, "pan.___", state 103, "cached_generation_ptr.val[_pid] = (old_gen+1)" + line 638, "pan.___", state 104, "old_gen = cached_generation_ptr.val[_pid]" + line 400, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 114, "(1)" + line 404, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 128, "(1)" + line 404, "pan.___", state 129, "(1)" + line 404, "pan.___", state 129, "(1)" + line 402, "pan.___", state 134, "((i<1))" + line 402, "pan.___", state 134, "((i>=1))" + line 410, "pan.___", state 153, "(1)" + line 410, "pan.___", state 154, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 154, "else" + line 410, "pan.___", state 157, "(1)" + line 410, "pan.___", state 158, "(1)" + line 410, "pan.___", state 158, "(1)" + line 414, "pan.___", state 166, "(1)" + line 414, "pan.___", state 167, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 167, "else" + line 414, "pan.___", state 170, "(1)" + line 414, "pan.___", state 171, "(1)" + line 414, "pan.___", state 171, "(1)" + line 412, "pan.___", state 176, "((i<1))" + line 412, "pan.___", state 176, "((i>=1))" + line 419, "pan.___", state 183, "(1)" + line 419, "pan.___", state 184, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 184, "else" + line 419, "pan.___", state 187, "(1)" + line 419, "pan.___", state 188, "(1)" + line 419, "pan.___", state 188, "(1)" + line 421, "pan.___", state 191, "(1)" + line 421, "pan.___", state 191, "(1)" + line 370, "pan.___", state 193, "(1)" + line 653, "pan.___", state 199, "(1)" + line 647, "pan.___", state 202, "((write_lock==0))" + line 647, "pan.___", state 202, "else" + line 645, "pan.___", state 203, "(1)" + line 176, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 180, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 178, "pan.___", state 225, "((j<1))" + line 178, "pan.___", state 225, "((j>=1))" + line 184, "pan.___", state 230, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 161, "pan.___", state 240, "(1)" + line 165, "pan.___", state 248, "(1)" + line 165, "pan.___", state 249, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 165, "pan.___", state 249, "else" + line 163, "pan.___", state 254, "((j<1))" + line 163, "pan.___", state 254, "((j>=1))" + line 169, "pan.___", state 260, "(1)" + line 169, "pan.___", state 261, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 169, "pan.___", state 261, "else" + line 171, "pan.___", state 264, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 171, "pan.___", state 264, "else" + line 176, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 184, "pan.___", state 293, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 169, "pan.___", state 323, "(1)" + line 169, "pan.___", state 324, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 176, "pan.___", state 338, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 180, "pan.___", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 178, "pan.___", state 355, "((j<1))" + line 178, "pan.___", state 355, "((j>=1))" + line 184, "pan.___", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 161, "pan.___", state 370, "(1)" + line 165, "pan.___", state 378, "(1)" + line 165, "pan.___", state 379, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 165, "pan.___", state 379, "else" + line 163, "pan.___", state 384, "((j<1))" + line 163, "pan.___", state 384, "((j>=1))" + line 169, "pan.___", state 390, "(1)" + line 169, "pan.___", state 391, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 169, "pan.___", state 391, "else" + line 171, "pan.___", state 394, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 171, "pan.___", state 394, "else" + line 400, "pan.___", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 410, "(1)" + line 404, "pan.___", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 424, "(1)" + line 404, "pan.___", state 425, "(1)" + line 404, "pan.___", state 425, "(1)" + line 402, "pan.___", state 430, "((i<1))" + line 402, "pan.___", state 430, "((i>=1))" + line 409, "pan.___", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 449, "(1)" + line 410, "pan.___", state 450, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 450, "else" + line 410, "pan.___", state 453, "(1)" + line 410, "pan.___", state 454, "(1)" + line 410, "pan.___", state 454, "(1)" + line 414, "pan.___", state 462, "(1)" + line 414, "pan.___", state 463, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 463, "else" + line 414, "pan.___", state 466, "(1)" + line 414, "pan.___", state 467, "(1)" + line 414, "pan.___", state 467, "(1)" + line 412, "pan.___", state 472, "((i<1))" + line 412, "pan.___", state 472, "((i>=1))" + line 419, "pan.___", state 479, "(1)" + line 419, "pan.___", state 480, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 480, "else" + line 419, "pan.___", state 483, "(1)" + line 419, "pan.___", state 484, "(1)" + line 419, "pan.___", state 484, "(1)" + line 421, "pan.___", state 487, "(1)" + line 421, "pan.___", state 487, "(1)" + line 370, "pan.___", state 489, "(1)" + line 662, "pan.___", state 492, "cached_urcu_gp_ctr.val[_pid] = (tmp^(1<<7))" + line 400, "pan.___", state 498, "(1)" + line 400, "pan.___", state 499, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 400, "pan.___", state 499, "else" + line 400, "pan.___", state 502, "(1)" + line 404, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 516, "(1)" + line 404, "pan.___", state 517, "(1)" + line 404, "pan.___", state 517, "(1)" + line 402, "pan.___", state 522, "((i<1))" + line 402, "pan.___", state 522, "((i>=1))" + line 409, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 541, "(1)" + line 410, "pan.___", state 542, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 542, "else" + line 410, "pan.___", state 545, "(1)" + line 410, "pan.___", state 546, "(1)" + line 410, "pan.___", state 546, "(1)" + line 414, "pan.___", state 554, "(1)" + line 414, "pan.___", state 555, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 555, "else" + line 414, "pan.___", state 558, "(1)" + line 414, "pan.___", state 559, "(1)" + line 414, "pan.___", state 559, "(1)" + line 412, "pan.___", state 564, "((i<1))" + line 412, "pan.___", state 564, "((i>=1))" + line 419, "pan.___", state 571, "(1)" + line 419, "pan.___", state 572, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 572, "else" + line 419, "pan.___", state 575, "(1)" + line 419, "pan.___", state 576, "(1)" + line 419, "pan.___", state 576, "(1)" + line 421, "pan.___", state 579, "(1)" + line 421, "pan.___", state 579, "(1)" + line 370, "pan.___", state 581, "(1)" + line 400, "pan.___", state 589, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 595, "(1)" + line 404, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 609, "(1)" + line 404, "pan.___", state 610, "(1)" + line 404, "pan.___", state 610, "(1)" + line 402, "pan.___", state 615, "((i<1))" + line 402, "pan.___", state 615, "((i>=1))" + line 409, "pan.___", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 634, "(1)" + line 410, "pan.___", state 635, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 635, "else" + line 410, "pan.___", state 638, "(1)" + line 410, "pan.___", state 639, "(1)" + line 410, "pan.___", state 639, "(1)" + line 414, "pan.___", state 647, "(1)" + line 414, "pan.___", state 648, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 648, "else" + line 414, "pan.___", state 651, "(1)" + line 414, "pan.___", state 652, "(1)" + line 414, "pan.___", state 652, "(1)" + line 412, "pan.___", state 657, "((i<1))" + line 412, "pan.___", state 657, "((i>=1))" + line 419, "pan.___", state 664, "(1)" + line 419, "pan.___", state 665, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 665, "else" + line 419, "pan.___", state 668, "(1)" + line 419, "pan.___", state 669, "(1)" + line 419, "pan.___", state 669, "(1)" + line 421, "pan.___", state 672, "(1)" + line 421, "pan.___", state 672, "(1)" + line 370, "pan.___", state 674, "(1)" + line 400, "pan.___", state 679, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 681, "(1)" + line 400, "pan.___", state 682, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 400, "pan.___", state 682, "else" + line 400, "pan.___", state 685, "(1)" + line 404, "pan.___", state 693, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 695, "(1)" + line 404, "pan.___", state 696, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 404, "pan.___", state 696, "else" + line 404, "pan.___", state 699, "(1)" + line 404, "pan.___", state 700, "(1)" + line 404, "pan.___", state 700, "(1)" + line 402, "pan.___", state 705, "((i<1))" + line 402, "pan.___", state 705, "((i>=1))" + line 409, "pan.___", state 711, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 724, "(1)" + line 410, "pan.___", state 725, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 725, "else" + line 410, "pan.___", state 728, "(1)" + line 410, "pan.___", state 729, "(1)" + line 410, "pan.___", state 729, "(1)" + line 414, "pan.___", state 737, "(1)" + line 414, "pan.___", state 738, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 738, "else" + line 414, "pan.___", state 741, "(1)" + line 414, "pan.___", state 742, "(1)" + line 414, "pan.___", state 742, "(1)" + line 412, "pan.___", state 747, "((i<1))" + line 412, "pan.___", state 747, "((i>=1))" + line 419, "pan.___", state 754, "(1)" + line 419, "pan.___", state 755, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 755, "else" + line 419, "pan.___", state 758, "(1)" + line 419, "pan.___", state 759, "(1)" + line 419, "pan.___", state 759, "(1)" + line 421, "pan.___", state 762, "(1)" + line 421, "pan.___", state 762, "(1)" + line 370, "pan.___", state 764, "(1)" + line 430, "pan.___", state 767, "(((tmp2&((1<<7)-1))&&((tmp2^cached_urcu_gp_ctr.val[_pid])&(1<<7))))" + line 430, "pan.___", state 767, "else" + line 400, "pan.___", state 777, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 779, "(1)" + line 400, "pan.___", state 780, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 400, "pan.___", state 780, "else" + line 400, "pan.___", state 783, "(1)" + line 404, "pan.___", state 791, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 793, "(1)" + line 404, "pan.___", state 794, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 404, "pan.___", state 794, "else" + line 404, "pan.___", state 797, "(1)" + line 404, "pan.___", state 798, "(1)" + line 404, "pan.___", state 798, "(1)" + line 402, "pan.___", state 803, "((i<1))" + line 402, "pan.___", state 803, "((i>=1))" + line 409, "pan.___", state 809, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 822, "(1)" + line 410, "pan.___", state 823, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 823, "else" + line 410, "pan.___", state 826, "(1)" + line 410, "pan.___", state 827, "(1)" + line 410, "pan.___", state 827, "(1)" + line 414, "pan.___", state 835, "(1)" + line 414, "pan.___", state 836, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 836, "else" + line 414, "pan.___", state 839, "(1)" + line 414, "pan.___", state 840, "(1)" + line 414, "pan.___", state 840, "(1)" + line 412, "pan.___", state 845, "((i<1))" + line 412, "pan.___", state 845, "((i>=1))" + line 419, "pan.___", state 852, "(1)" + line 419, "pan.___", state 853, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 853, "else" + line 419, "pan.___", state 856, "(1)" + line 419, "pan.___", state 857, "(1)" + line 419, "pan.___", state 857, "(1)" + line 421, "pan.___", state 860, "(1)" + line 421, "pan.___", state 860, "(1)" + line 370, "pan.___", state 862, "(1)" + line 449, "pan.___", state 870, "((tmp<1))" + line 449, "pan.___", state 870, "((tmp>=1))" + line 462, "pan.___", state 873, "tmp = 0" + line 400, "pan.___", state 877, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 883, "(1)" + line 404, "pan.___", state 891, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 897, "(1)" + line 404, "pan.___", state 898, "(1)" + line 404, "pan.___", state 898, "(1)" + line 402, "pan.___", state 903, "((i<1))" + line 402, "pan.___", state 903, "((i>=1))" + line 409, "pan.___", state 909, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 922, "(1)" + line 410, "pan.___", state 923, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 923, "else" + line 410, "pan.___", state 926, "(1)" + line 410, "pan.___", state 927, "(1)" + line 410, "pan.___", state 927, "(1)" + line 414, "pan.___", state 935, "(1)" + line 414, "pan.___", state 936, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 936, "else" + line 414, "pan.___", state 939, "(1)" + line 414, "pan.___", state 940, "(1)" + line 414, "pan.___", state 940, "(1)" + line 412, "pan.___", state 945, "((i<1))" + line 412, "pan.___", state 945, "((i>=1))" + line 419, "pan.___", state 952, "(1)" + line 419, "pan.___", state 953, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 953, "else" + line 419, "pan.___", state 956, "(1)" + line 419, "pan.___", state 957, "(1)" + line 419, "pan.___", state 957, "(1)" + line 421, "pan.___", state 960, "(1)" + line 421, "pan.___", state 960, "(1)" + line 370, "pan.___", state 962, "(1)" + line 671, "pan.___", state 963, "tmp = cached_urcu_gp_ctr.val[_pid]" + line 400, "pan.___", state 967, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 973, "(1)" + line 404, "pan.___", state 981, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 987, "(1)" + line 404, "pan.___", state 988, "(1)" + line 404, "pan.___", state 988, "(1)" + line 402, "pan.___", state 993, "((i<1))" + line 402, "pan.___", state 993, "((i>=1))" + line 409, "pan.___", state 999, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 1012, "(1)" + line 410, "pan.___", state 1013, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 1013, "else" + line 410, "pan.___", state 1016, "(1)" + line 410, "pan.___", state 1017, "(1)" + line 410, "pan.___", state 1017, "(1)" + line 414, "pan.___", state 1025, "(1)" + line 414, "pan.___", state 1026, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 1026, "else" + line 414, "pan.___", state 1029, "(1)" + line 414, "pan.___", state 1030, "(1)" + line 414, "pan.___", state 1030, "(1)" + line 412, "pan.___", state 1035, "((i<1))" + line 412, "pan.___", state 1035, "((i>=1))" + line 419, "pan.___", state 1042, "(1)" + line 419, "pan.___", state 1043, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 1043, "else" + line 419, "pan.___", state 1046, "(1)" + line 419, "pan.___", state 1047, "(1)" + line 419, "pan.___", state 1047, "(1)" + line 421, "pan.___", state 1050, "(1)" + line 421, "pan.___", state 1050, "(1)" + line 370, "pan.___", state 1052, "(1)" + line 400, "pan.___", state 1061, "(1)" + line 404, "pan.___", state 1073, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 1091, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 1117, "(1)" + line 419, "pan.___", state 1134, "(1)" + line 404, "pan.___", state 1166, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 1184, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 1210, "(1)" + line 419, "pan.___", state 1227, "(1)" + line 400, "pan.___", state 1242, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 1256, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 1274, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 1287, "(1)" + line 414, "pan.___", state 1300, "(1)" + line 419, "pan.___", state 1317, "(1)" + line 400, "pan.___", state 1340, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 1342, "(1)" + line 400, "pan.___", state 1343, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 400, "pan.___", state 1343, "else" + line 400, "pan.___", state 1346, "(1)" + line 404, "pan.___", state 1354, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 1356, "(1)" + line 404, "pan.___", state 1357, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 404, "pan.___", state 1357, "else" + line 404, "pan.___", state 1360, "(1)" + line 404, "pan.___", state 1361, "(1)" + line 404, "pan.___", state 1361, "(1)" + line 402, "pan.___", state 1366, "((i<1))" + line 402, "pan.___", state 1366, "((i>=1))" + line 409, "pan.___", state 1372, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 1385, "(1)" + line 410, "pan.___", state 1386, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 1386, "else" + line 410, "pan.___", state 1389, "(1)" + line 410, "pan.___", state 1390, "(1)" + line 410, "pan.___", state 1390, "(1)" + line 414, "pan.___", state 1398, "(1)" + line 414, "pan.___", state 1399, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 1399, "else" + line 414, "pan.___", state 1402, "(1)" + line 414, "pan.___", state 1403, "(1)" + line 414, "pan.___", state 1403, "(1)" + line 412, "pan.___", state 1408, "((i<1))" + line 412, "pan.___", state 1408, "((i>=1))" + line 419, "pan.___", state 1415, "(1)" + line 419, "pan.___", state 1416, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 1416, "else" + line 419, "pan.___", state 1419, "(1)" + line 419, "pan.___", state 1420, "(1)" + line 419, "pan.___", state 1420, "(1)" + line 421, "pan.___", state 1423, "(1)" + line 421, "pan.___", state 1423, "(1)" + line 180, "pan.___", state 1448, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 184, "pan.___", state 1461, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 161, "pan.___", state 1471, "(1)" + line 165, "pan.___", state 1479, "(1)" + line 169, "pan.___", state 1491, "(1)" + line 176, "pan.___", state 1502, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer_error.spin.input.trail b/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer_error.spin.input.trail new file mode 100644 index 0000000..5bb8316 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer_error.spin.input.trail @@ -0,0 +1,4823 @@ +-2:3:-2 +-4:-4:-4 +1:0:2108 +2:3:2060 +3:3:2063 +4:3:2063 +5:3:2066 +6:3:2074 +7:3:2074 +8:3:2077 +9:3:2083 +10:3:2087 +11:3:2087 +12:3:2090 +13:3:2098 +14:3:2102 +15:3:2103 +16:0:2108 +17:3:2105 +18:0:2108 +19:2:416 +20:0:2108 +21:2:422 +22:0:2108 +23:2:423 +24:0:2108 +25:2:424 +26:2:428 +27:2:429 +28:2:437 +29:2:438 +30:2:442 +31:2:443 +32:2:451 +33:2:456 +34:2:460 +35:2:461 +36:2:468 +37:2:469 +38:2:480 +39:2:481 +40:2:482 +41:2:493 +42:2:498 +43:2:499 +44:0:2106 +45:2:511 +46:0:2112 +47:2:513 +48:2:514 +49:0:2112 +50:2:518 +51:2:522 +52:2:523 +53:2:531 +54:2:532 +55:2:536 +56:2:537 +57:2:545 +58:2:550 +59:2:551 +60:2:562 +61:2:563 +62:2:574 +63:2:575 +64:2:576 +65:2:587 +66:2:592 +67:2:593 +68:0:2112 +69:2:605 +70:0:2112 +71:2:607 +72:0:2112 +73:2:608 +74:0:2112 +75:2:618 +76:0:2112 +77:2:622 +78:2:623 +79:2:627 +80:2:631 +81:2:632 +82:2:636 +83:2:644 +84:2:645 +85:2:650 +86:2:657 +87:2:658 +88:2:665 +89:2:670 +90:0:2112 +91:2:681 +92:0:2112 +93:2:685 +94:2:686 +95:2:690 +96:2:694 +97:2:695 +98:2:699 +99:2:707 +100:2:708 +101:2:713 +102:2:720 +103:2:721 +104:2:728 +105:2:733 +106:0:2112 +107:2:744 +108:0:2112 +109:2:752 +110:2:753 +111:2:757 +112:2:761 +113:2:762 +114:2:766 +115:2:774 +116:2:775 +117:2:780 +118:2:787 +119:2:788 +120:2:795 +121:2:800 +122:0:2112 +123:2:811 +124:0:2112 +125:2:813 +126:0:2112 +127:2:814 +128:2:818 +129:2:819 +130:2:827 +131:2:828 +132:2:832 +133:2:833 +134:2:841 +135:2:846 +136:2:850 +137:2:851 +138:2:858 +139:2:859 +140:2:870 +141:2:871 +142:2:872 +143:2:883 +144:2:888 +145:2:889 +146:0:2112 +147:2:901 +148:0:2112 +149:2:903 +150:0:2112 +151:2:906 +152:2:907 +153:2:919 +154:2:920 +155:2:924 +156:2:925 +157:2:933 +158:2:938 +159:2:942 +160:2:943 +161:2:950 +162:2:951 +163:2:962 +164:2:963 +165:2:964 +166:2:975 +167:2:980 +168:2:981 +169:0:2112 +170:2:993 +171:0:2112 +172:2:995 +173:0:2112 +174:2:996 +175:0:2112 +176:2:997 +177:0:2112 +178:2:998 +179:0:2112 +180:2:999 +181:2:1003 +182:2:1004 +183:2:1012 +184:2:1013 +185:2:1017 +186:2:1018 +187:2:1026 +188:2:1031 +189:2:1035 +190:2:1036 +191:2:1043 +192:2:1044 +193:2:1055 +194:2:1056 +195:2:1057 +196:2:1068 +197:2:1073 +198:2:1074 +199:0:2112 +200:2:1086 +201:0:2112 +202:2:1178 +203:0:2112 +204:2:1276 +205:0:2112 +206:2:1277 +207:0:2112 +208:2:1281 +209:0:2112 +210:2:1287 +211:2:1291 +212:2:1292 +213:2:1300 +214:2:1301 +215:2:1305 +216:2:1306 +217:2:1314 +218:2:1319 +219:2:1323 +220:2:1324 +221:2:1331 +222:2:1332 +223:2:1343 +224:2:1344 +225:2:1345 +226:2:1356 +227:2:1361 +228:2:1362 +229:0:2112 +230:2:1374 +231:0:2112 +232:2:1376 +233:0:2112 +234:2:1377 +235:2:1381 +236:2:1382 +237:2:1390 +238:2:1391 +239:2:1395 +240:2:1396 +241:2:1404 +242:2:1409 +243:2:1413 +244:2:1414 +245:2:1421 +246:2:1422 +247:2:1433 +248:2:1434 +249:2:1435 +250:2:1446 +251:2:1451 +252:2:1452 +253:0:2112 +254:2:1464 +255:0:2112 +256:2:1466 +257:0:2112 +258:1:2 +259:0:2112 +260:1:8 +261:0:2112 +262:1:9 +263:0:2112 +264:1:10 +265:0:2112 +266:1:11 +267:0:2112 +268:1:12 +269:1:16 +270:1:17 +271:1:25 +272:1:26 +273:1:30 +274:1:31 +275:1:39 +276:1:44 +277:1:48 +278:1:49 +279:1:56 +280:1:57 +281:1:68 +282:1:69 +283:1:70 +284:1:81 +285:1:86 +286:1:87 +287:0:2112 +288:1:99 +289:0:2112 +290:1:101 +291:0:2112 +292:1:102 +293:1:106 +294:1:107 +295:1:115 +296:1:116 +297:1:120 +298:1:121 +299:1:129 +300:1:134 +301:1:138 +302:1:139 +303:1:146 +304:1:147 +305:1:158 +306:1:159 +307:1:160 +308:1:171 +309:1:176 +310:1:177 +311:0:2112 +312:1:189 +313:0:2112 +314:1:191 +315:0:2112 +316:1:192 +317:0:2112 +318:1:193 +319:1:197 +320:1:198 +321:1:206 +322:1:207 +323:1:211 +324:1:212 +325:1:220 +326:1:225 +327:1:229 +328:1:230 +329:1:237 +330:1:238 +331:1:249 +332:1:250 +333:1:251 +334:1:262 +335:1:267 +336:1:268 +337:0:2112 +338:1:280 +339:0:2112 +340:1:282 +341:0:2112 +342:1:291 +343:0:2112 +344:1:293 +345:0:2112 +346:1:11 +347:0:2112 +348:1:12 +349:1:16 +350:1:17 +351:1:25 +352:1:26 +353:1:27 +354:1:39 +355:1:44 +356:1:48 +357:1:49 +358:1:56 +359:1:57 +360:1:68 +361:1:69 +362:1:70 +363:1:81 +364:1:86 +365:1:87 +366:0:2112 +367:1:99 +368:0:2112 +369:2:1469 +370:2:1470 +371:2:1482 +372:2:1483 +373:2:1487 +374:2:1488 +375:2:1496 +376:2:1501 +377:2:1505 +378:2:1506 +379:2:1513 +380:2:1514 +381:2:1525 +382:2:1526 +383:2:1527 +384:2:1538 +385:2:1543 +386:2:1544 +387:0:2112 +388:2:1556 +389:0:2112 +390:2:1558 +391:0:2112 +392:2:1559 +393:0:2112 +394:2:1560 +395:0:2112 +396:2:1561 +397:0:2112 +398:2:1562 +399:2:1566 +400:2:1567 +401:2:1575 +402:2:1576 +403:2:1580 +404:2:1581 +405:2:1589 +406:2:1594 +407:2:1598 +408:2:1599 +409:2:1606 +410:2:1607 +411:2:1618 +412:2:1619 +413:2:1620 +414:2:1631 +415:2:1636 +416:2:1637 +417:0:2112 +418:2:1649 +419:0:2112 +420:2:1651 +421:0:2112 +422:2:1652 +423:2:1656 +424:2:1657 +425:2:1665 +426:2:1666 +427:2:1670 +428:2:1671 +429:2:1679 +430:2:1684 +431:2:1688 +432:2:1689 +433:2:1696 +434:2:1697 +435:2:1708 +436:2:1709 +437:2:1710 +438:2:1721 +439:2:1726 +440:2:1727 +441:0:2112 +442:2:1739 +443:0:2112 +444:1:101 +445:0:2112 +446:2:1560 +447:0:2112 +448:2:1561 +449:0:2112 +450:2:1562 +451:2:1566 +452:2:1567 +453:2:1575 +454:2:1576 +455:2:1580 +456:2:1581 +457:2:1589 +458:2:1594 +459:2:1598 +460:2:1599 +461:2:1606 +462:2:1607 +463:2:1618 +464:2:1619 +465:2:1620 +466:2:1631 +467:2:1636 +468:2:1637 +469:0:2112 +470:2:1649 +471:0:2112 +472:2:1651 +473:0:2112 +474:2:1652 +475:2:1656 +476:2:1657 +477:2:1665 +478:2:1666 +479:2:1670 +480:2:1671 +481:2:1679 +482:2:1684 +483:2:1688 +484:2:1689 +485:2:1696 +486:2:1697 +487:2:1708 +488:2:1709 +489:2:1710 +490:2:1721 +491:2:1726 +492:2:1727 +493:0:2112 +494:2:1739 +495:0:2112 +496:1:102 +497:1:106 +498:1:107 +499:1:115 +500:1:116 +501:1:120 +502:1:121 +503:1:129 +504:1:134 +505:1:138 +506:1:139 +507:1:146 +508:1:147 +509:1:158 +510:1:159 +511:1:160 +512:1:171 +513:1:176 +514:1:177 +515:0:2112 +516:2:1560 +517:0:2112 +518:1:189 +519:0:2112 +520:1:285 +521:0:2112 +522:2:1561 +523:0:2112 +524:2:1562 +525:2:1566 +526:2:1567 +527:2:1575 +528:2:1576 +529:2:1580 +530:2:1581 +531:2:1589 +532:2:1594 +533:2:1598 +534:2:1599 +535:2:1606 +536:2:1607 +537:2:1618 +538:2:1619 +539:2:1620 +540:2:1631 +541:2:1636 +542:2:1637 +543:0:2112 +544:2:1649 +545:0:2112 +546:2:1651 +547:0:2112 +548:2:1652 +549:2:1656 +550:2:1657 +551:2:1665 +552:2:1666 +553:2:1670 +554:2:1671 +555:2:1679 +556:2:1684 +557:2:1688 +558:2:1689 +559:2:1696 +560:2:1697 +561:2:1708 +562:2:1709 +563:2:1710 +564:2:1721 +565:2:1726 +566:2:1727 +567:0:2112 +568:2:1739 +569:0:2112 +570:2:1560 +571:0:2112 +572:1:286 +573:0:2112 +574:1:291 +575:0:2112 +576:1:293 +577:0:2112 +578:1:296 +579:0:2112 +580:2:1561 +581:0:2112 +582:2:1562 +583:2:1566 +584:2:1567 +585:2:1575 +586:2:1576 +587:2:1580 +588:2:1581 +589:2:1589 +590:2:1594 +591:2:1598 +592:2:1599 +593:2:1606 +594:2:1607 +595:2:1618 +596:2:1619 +597:2:1620 +598:2:1631 +599:2:1636 +600:2:1637 +601:0:2112 +602:2:1649 +603:0:2112 +604:2:1651 +605:0:2112 +606:2:1652 +607:2:1656 +608:2:1657 +609:2:1665 +610:2:1666 +611:2:1670 +612:2:1671 +613:2:1679 +614:2:1684 +615:2:1688 +616:2:1689 +617:2:1696 +618:2:1697 +619:2:1708 +620:2:1709 +621:2:1710 +622:2:1721 +623:2:1726 +624:2:1727 +625:0:2112 +626:2:1739 +627:0:2112 +628:2:1560 +629:0:2112 +630:1:301 +631:0:2112 +632:2:1561 +633:0:2112 +634:2:1562 +635:2:1566 +636:2:1567 +637:2:1575 +638:2:1576 +639:2:1580 +640:2:1581 +641:2:1589 +642:2:1594 +643:2:1598 +644:2:1599 +645:2:1606 +646:2:1607 +647:2:1618 +648:2:1619 +649:2:1620 +650:2:1631 +651:2:1636 +652:2:1637 +653:0:2112 +654:2:1649 +655:0:2112 +656:2:1651 +657:0:2112 +658:2:1652 +659:2:1656 +660:2:1657 +661:2:1665 +662:2:1666 +663:2:1670 +664:2:1671 +665:2:1679 +666:2:1684 +667:2:1688 +668:2:1689 +669:2:1696 +670:2:1697 +671:2:1708 +672:2:1709 +673:2:1710 +674:2:1721 +675:2:1726 +676:2:1727 +677:0:2112 +678:2:1739 +679:0:2112 +680:2:1560 +681:0:2112 +682:1:302 +683:0:2112 +684:2:1561 +685:0:2112 +686:2:1562 +687:2:1566 +688:2:1567 +689:2:1575 +690:2:1576 +691:2:1580 +692:2:1581 +693:2:1589 +694:2:1594 +695:2:1598 +696:2:1599 +697:2:1606 +698:2:1607 +699:2:1618 +700:2:1619 +701:2:1620 +702:2:1631 +703:2:1636 +704:2:1637 +705:0:2112 +706:2:1649 +707:0:2112 +708:2:1651 +709:0:2112 +710:2:1652 +711:2:1656 +712:2:1657 +713:2:1665 +714:2:1666 +715:2:1670 +716:2:1671 +717:2:1679 +718:2:1684 +719:2:1688 +720:2:1689 +721:2:1696 +722:2:1697 +723:2:1708 +724:2:1709 +725:2:1710 +726:2:1721 +727:2:1726 +728:2:1727 +729:0:2112 +730:2:1739 +731:0:2112 +732:2:1560 +733:0:2112 +734:1:303 +735:0:2112 +736:1:304 +737:0:2112 +738:1:305 +739:0:2112 +740:1:306 +741:0:2112 +742:1:308 +743:0:2112 +744:2:1561 +745:0:2112 +746:2:1562 +747:2:1566 +748:2:1567 +749:2:1575 +750:2:1576 +751:2:1580 +752:2:1581 +753:2:1589 +754:2:1594 +755:2:1598 +756:2:1599 +757:2:1606 +758:2:1607 +759:2:1618 +760:2:1619 +761:2:1620 +762:2:1631 +763:2:1636 +764:2:1637 +765:0:2112 +766:2:1649 +767:0:2112 +768:2:1651 +769:0:2112 +770:2:1652 +771:2:1656 +772:2:1657 +773:2:1665 +774:2:1666 +775:2:1670 +776:2:1671 +777:2:1679 +778:2:1684 +779:2:1688 +780:2:1689 +781:2:1696 +782:2:1697 +783:2:1708 +784:2:1709 +785:2:1710 +786:2:1721 +787:2:1726 +788:2:1727 +789:0:2112 +790:2:1739 +791:0:2112 +792:2:1560 +793:0:2112 +794:1:310 +795:0:2112 +796:2:1561 +797:0:2112 +798:2:1562 +799:2:1566 +800:2:1567 +801:2:1575 +802:2:1576 +803:2:1580 +804:2:1581 +805:2:1589 +806:2:1594 +807:2:1598 +808:2:1599 +809:2:1606 +810:2:1607 +811:2:1618 +812:2:1619 +813:2:1620 +814:2:1631 +815:2:1636 +816:2:1637 +817:0:2112 +818:2:1649 +819:0:2112 +820:2:1651 +821:0:2112 +822:2:1652 +823:2:1656 +824:2:1657 +825:2:1665 +826:2:1666 +827:2:1670 +828:2:1671 +829:2:1679 +830:2:1684 +831:2:1688 +832:2:1689 +833:2:1696 +834:2:1697 +835:2:1708 +836:2:1709 +837:2:1710 +838:2:1721 +839:2:1726 +840:2:1727 +841:0:2112 +842:2:1739 +843:0:2112 +844:2:1560 +845:0:2112 +846:1:311 +847:1:315 +848:1:316 +849:1:324 +850:1:325 +851:1:326 +852:1:338 +853:1:343 +854:1:347 +855:1:348 +856:1:355 +857:1:356 +858:1:367 +859:1:368 +860:1:369 +861:1:380 +862:1:385 +863:1:386 +864:0:2112 +865:1:398 +866:0:2112 +867:2:1561 +868:0:2112 +869:2:1562 +870:2:1566 +871:2:1567 +872:2:1575 +873:2:1576 +874:2:1580 +875:2:1581 +876:2:1589 +877:2:1594 +878:2:1598 +879:2:1599 +880:2:1606 +881:2:1607 +882:2:1618 +883:2:1619 +884:2:1620 +885:2:1631 +886:2:1636 +887:2:1637 +888:0:2112 +889:2:1649 +890:0:2112 +891:2:1651 +892:0:2112 +893:2:1652 +894:2:1656 +895:2:1657 +896:2:1665 +897:2:1666 +898:2:1670 +899:2:1671 +900:2:1679 +901:2:1684 +902:2:1688 +903:2:1689 +904:2:1696 +905:2:1697 +906:2:1708 +907:2:1709 +908:2:1710 +909:2:1721 +910:2:1726 +911:2:1727 +912:0:2112 +913:2:1739 +914:0:2112 +915:2:1560 +916:0:2112 +917:2:1561 +918:0:2112 +919:2:1562 +920:2:1566 +921:2:1567 +922:2:1575 +923:2:1576 +924:2:1580 +925:2:1581 +926:2:1589 +927:2:1594 +928:2:1598 +929:2:1599 +930:2:1606 +931:2:1607 +932:2:1618 +933:2:1619 +934:2:1620 +935:2:1631 +936:2:1636 +937:2:1637 +938:0:2112 +939:2:1649 +940:0:2112 +941:1:400 +942:0:2112 +943:1:305 +944:0:2112 +945:1:306 +946:0:2112 +947:1:308 +948:0:2112 +949:2:1651 +950:0:2112 +951:2:1652 +952:2:1656 +953:2:1657 +954:2:1665 +955:2:1666 +956:2:1670 +957:2:1671 +958:2:1679 +959:2:1684 +960:2:1688 +961:2:1689 +962:2:1696 +963:2:1697 +964:2:1708 +965:2:1709 +966:2:1710 +967:2:1721 +968:2:1726 +969:2:1727 +970:0:2112 +971:2:1739 +972:0:2112 +973:2:1560 +974:0:2112 +975:2:1561 +976:0:2112 +977:2:1562 +978:2:1566 +979:2:1567 +980:2:1575 +981:2:1576 +982:2:1580 +983:2:1581 +984:2:1589 +985:2:1594 +986:2:1598 +987:2:1599 +988:2:1606 +989:2:1607 +990:2:1618 +991:2:1619 +992:2:1620 +993:2:1631 +994:2:1636 +995:2:1637 +996:0:2112 +997:2:1649 +998:0:2112 +999:1:310 +1000:0:2112 +1001:2:1651 +1002:0:2112 +1003:2:1652 +1004:2:1656 +1005:2:1657 +1006:2:1665 +1007:2:1666 +1008:2:1670 +1009:2:1671 +1010:2:1679 +1011:2:1684 +1012:2:1688 +1013:2:1689 +1014:2:1696 +1015:2:1697 +1016:2:1708 +1017:2:1709 +1018:2:1710 +1019:2:1721 +1020:2:1726 +1021:2:1727 +1022:0:2112 +1023:2:1739 +1024:0:2112 +1025:2:1560 +1026:0:2112 +1027:2:1561 +1028:0:2112 +1029:2:1562 +1030:2:1566 +1031:2:1567 +1032:2:1575 +1033:2:1576 +1034:2:1580 +1035:2:1581 +1036:2:1589 +1037:2:1594 +1038:2:1598 +1039:2:1599 +1040:2:1606 +1041:2:1607 +1042:2:1618 +1043:2:1619 +1044:2:1620 +1045:2:1631 +1046:2:1636 +1047:2:1637 +1048:0:2112 +1049:2:1649 +1050:0:2112 +1051:1:311 +1052:1:315 +1053:1:316 +1054:1:324 +1055:1:325 +1056:1:326 +1057:1:338 +1058:1:343 +1059:1:347 +1060:1:348 +1061:1:355 +1062:1:356 +1063:1:367 +1064:1:368 +1065:1:369 +1066:1:380 +1067:1:385 +1068:1:386 +1069:0:2112 +1070:1:398 +1071:0:2112 +1072:2:1651 +1073:0:2112 +1074:2:1652 +1075:2:1656 +1076:2:1657 +1077:2:1665 +1078:2:1666 +1079:2:1670 +1080:2:1671 +1081:2:1679 +1082:2:1684 +1083:2:1688 +1084:2:1689 +1085:2:1696 +1086:2:1697 +1087:2:1708 +1088:2:1709 +1089:2:1710 +1090:2:1721 +1091:2:1726 +1092:2:1727 +1093:0:2112 +1094:2:1739 +1095:0:2112 +1096:2:1560 +1097:0:2112 +1098:2:1561 +1099:0:2112 +1100:2:1562 +1101:2:1566 +1102:2:1567 +1103:2:1575 +1104:2:1576 +1105:2:1580 +1106:2:1581 +1107:2:1589 +1108:2:1594 +1109:2:1598 +1110:2:1599 +1111:2:1606 +1112:2:1607 +1113:2:1618 +1114:2:1619 +1115:2:1620 +1116:2:1631 +1117:2:1636 +1118:2:1637 +1119:0:2112 +1120:2:1649 +1121:0:2112 +1122:2:1651 +1123:0:2112 +1124:1:400 +1125:0:2112 +1126:1:404 +1127:0:2112 +1128:1:9 +1129:0:2112 +1130:1:10 +1131:0:2112 +1132:1:11 +1133:0:2112 +1134:2:1652 +1135:2:1656 +1136:2:1657 +1137:2:1665 +1138:2:1666 +1139:2:1670 +1140:2:1671 +1141:2:1679 +1142:2:1684 +1143:2:1688 +1144:2:1689 +1145:2:1696 +1146:2:1697 +1147:2:1708 +1148:2:1709 +1149:2:1710 +1150:2:1721 +1151:2:1726 +1152:2:1727 +1153:0:2112 +1154:2:1739 +1155:0:2112 +1156:2:1560 +1157:0:2112 +1158:2:1561 +1159:0:2112 +1160:2:1562 +1161:2:1566 +1162:2:1567 +1163:2:1575 +1164:2:1576 +1165:2:1580 +1166:2:1581 +1167:2:1589 +1168:2:1594 +1169:2:1598 +1170:2:1599 +1171:2:1606 +1172:2:1607 +1173:2:1618 +1174:2:1619 +1175:2:1620 +1176:2:1631 +1177:2:1636 +1178:2:1637 +1179:0:2112 +1180:2:1649 +1181:0:2112 +1182:2:1651 +1183:0:2112 +1184:1:12 +1185:1:16 +1186:1:17 +1187:1:25 +1188:1:26 +1189:1:27 +1190:1:39 +1191:1:44 +1192:1:48 +1193:1:49 +1194:1:56 +1195:1:57 +1196:1:68 +1197:1:69 +1198:1:70 +1199:1:81 +1200:1:86 +1201:1:87 +1202:0:2112 +1203:1:99 +1204:0:2112 +1205:2:1652 +1206:2:1656 +1207:2:1657 +1208:2:1665 +1209:2:1666 +1210:2:1670 +1211:2:1671 +1212:2:1679 +1213:2:1684 +1214:2:1688 +1215:2:1689 +1216:2:1696 +1217:2:1697 +1218:2:1708 +1219:2:1716 +1220:2:1717 +1221:2:1721 +1222:2:1726 +1223:2:1727 +1224:0:2112 +1225:2:1739 +1226:0:2112 +1227:2:1560 +1228:0:2112 +1229:2:1561 +1230:0:2112 +1231:2:1562 +1232:2:1566 +1233:2:1567 +1234:2:1575 +1235:2:1576 +1236:2:1580 +1237:2:1581 +1238:2:1589 +1239:2:1594 +1240:2:1598 +1241:2:1599 +1242:2:1606 +1243:2:1607 +1244:2:1618 +1245:2:1626 +1246:2:1627 +1247:2:1631 +1248:2:1636 +1249:2:1637 +1250:0:2112 +1251:2:1649 +1252:0:2112 +1253:2:1651 +1254:0:2112 +1255:1:101 +1256:0:2112 +1257:2:1652 +1258:2:1656 +1259:2:1657 +1260:2:1665 +1261:2:1666 +1262:2:1670 +1263:2:1671 +1264:2:1679 +1265:2:1684 +1266:2:1688 +1267:2:1689 +1268:2:1696 +1269:2:1697 +1270:2:1708 +1271:2:1716 +1272:2:1717 +1273:2:1721 +1274:2:1726 +1275:2:1727 +1276:0:2112 +1277:2:1739 +1278:0:2112 +1279:2:1560 +1280:0:2112 +1281:2:1561 +1282:0:2112 +1283:2:1562 +1284:2:1566 +1285:2:1567 +1286:2:1575 +1287:2:1576 +1288:2:1580 +1289:2:1581 +1290:2:1589 +1291:2:1594 +1292:2:1598 +1293:2:1599 +1294:2:1606 +1295:2:1607 +1296:2:1618 +1297:2:1626 +1298:2:1627 +1299:2:1631 +1300:2:1636 +1301:2:1637 +1302:0:2112 +1303:2:1649 +1304:0:2112 +1305:2:1651 +1306:0:2112 +1307:1:102 +1308:1:106 +1309:1:107 +1310:1:115 +1311:1:116 +1312:1:120 +1313:1:121 +1314:1:129 +1315:1:134 +1316:1:138 +1317:1:139 +1318:1:146 +1319:1:147 +1320:1:158 +1321:1:159 +1322:1:160 +1323:1:171 +1324:1:176 +1325:1:177 +1326:0:2112 +1327:1:189 +1328:0:2112 +1329:1:191 +1330:0:2112 +1331:2:1652 +1332:2:1656 +1333:2:1657 +1334:2:1665 +1335:2:1666 +1336:2:1670 +1337:2:1671 +1338:2:1679 +1339:2:1684 +1340:2:1688 +1341:2:1689 +1342:2:1696 +1343:2:1697 +1344:2:1708 +1345:2:1716 +1346:2:1717 +1347:2:1721 +1348:2:1726 +1349:2:1727 +1350:0:2112 +1351:2:1739 +1352:0:2112 +1353:2:1560 +1354:0:2112 +1355:2:1561 +1356:0:2112 +1357:2:1562 +1358:2:1566 +1359:2:1567 +1360:2:1575 +1361:2:1576 +1362:2:1580 +1363:2:1581 +1364:2:1589 +1365:2:1594 +1366:2:1598 +1367:2:1599 +1368:2:1606 +1369:2:1607 +1370:2:1618 +1371:2:1626 +1372:2:1627 +1373:2:1631 +1374:2:1636 +1375:2:1637 +1376:0:2112 +1377:2:1649 +1378:0:2112 +1379:2:1651 +1380:0:2112 +1381:1:192 +1382:0:2112 +1383:2:1652 +1384:2:1656 +1385:2:1657 +1386:2:1665 +1387:2:1666 +1388:2:1670 +1389:2:1671 +1390:2:1679 +1391:2:1684 +1392:2:1688 +1393:2:1689 +1394:2:1696 +1395:2:1697 +1396:2:1708 +1397:2:1716 +1398:2:1717 +1399:2:1721 +1400:2:1726 +1401:2:1727 +1402:0:2112 +1403:2:1739 +1404:0:2112 +1405:2:1560 +1406:0:2112 +1407:2:1561 +1408:0:2112 +1409:2:1562 +1410:2:1566 +1411:2:1567 +1412:2:1575 +1413:2:1576 +1414:2:1580 +1415:2:1581 +1416:2:1589 +1417:2:1594 +1418:2:1598 +1419:2:1599 +1420:2:1606 +1421:2:1607 +1422:2:1618 +1423:2:1626 +1424:2:1627 +1425:2:1631 +1426:2:1636 +1427:2:1637 +1428:0:2112 +1429:2:1649 +1430:0:2112 +1431:2:1651 +1432:0:2112 +1433:1:193 +1434:1:197 +1435:1:198 +1436:1:206 +1437:1:207 +1438:1:211 +1439:1:212 +1440:1:220 +1441:1:225 +1442:1:229 +1443:1:230 +1444:1:237 +1445:1:238 +1446:1:249 +1447:1:250 +1448:1:251 +1449:1:262 +1450:1:267 +1451:1:268 +1452:0:2112 +1453:1:280 +1454:0:2112 +1455:2:1652 +1456:2:1656 +1457:2:1657 +1458:2:1665 +1459:2:1666 +1460:2:1670 +1461:2:1671 +1462:2:1679 +1463:2:1684 +1464:2:1688 +1465:2:1689 +1466:2:1696 +1467:2:1697 +1468:2:1708 +1469:2:1716 +1470:2:1717 +1471:2:1721 +1472:2:1726 +1473:2:1727 +1474:0:2112 +1475:2:1739 +1476:0:2112 +1477:2:1560 +1478:0:2112 +1479:2:1561 +1480:0:2112 +1481:2:1562 +1482:2:1566 +1483:2:1567 +1484:2:1575 +1485:2:1576 +1486:2:1580 +1487:2:1581 +1488:2:1589 +1489:2:1594 +1490:2:1598 +1491:2:1599 +1492:2:1606 +1493:2:1607 +1494:2:1618 +1495:2:1626 +1496:2:1627 +1497:2:1631 +1498:2:1636 +1499:2:1637 +1500:0:2112 +1501:2:1649 +1502:0:2112 +1503:2:1651 +1504:0:2112 +1505:1:282 +1506:0:2112 +1507:1:291 +1508:0:2112 +1509:1:293 +1510:0:2112 +1511:1:11 +1512:0:2112 +1513:2:1652 +1514:2:1656 +1515:2:1657 +1516:2:1665 +1517:2:1666 +1518:2:1670 +1519:2:1671 +1520:2:1679 +1521:2:1684 +1522:2:1688 +1523:2:1689 +1524:2:1696 +1525:2:1697 +1526:2:1708 +1527:2:1716 +1528:2:1717 +1529:2:1721 +1530:2:1726 +1531:2:1727 +1532:0:2112 +1533:2:1739 +1534:0:2112 +1535:2:1560 +1536:0:2112 +1537:2:1561 +1538:0:2112 +1539:2:1562 +1540:2:1566 +1541:2:1567 +1542:2:1575 +1543:2:1576 +1544:2:1580 +1545:2:1581 +1546:2:1589 +1547:2:1594 +1548:2:1598 +1549:2:1599 +1550:2:1606 +1551:2:1607 +1552:2:1618 +1553:2:1626 +1554:2:1627 +1555:2:1631 +1556:2:1636 +1557:2:1637 +1558:0:2112 +1559:2:1649 +1560:0:2112 +1561:2:1651 +1562:0:2112 +1563:1:12 +1564:1:16 +1565:1:17 +1566:1:25 +1567:1:26 +1568:1:27 +1569:1:39 +1570:1:44 +1571:1:48 +1572:1:49 +1573:1:56 +1574:1:57 +1575:1:68 +1576:1:69 +1577:1:70 +1578:1:81 +1579:1:86 +1580:1:87 +1581:0:2112 +1582:1:99 +1583:0:2112 +1584:2:1652 +1585:2:1656 +1586:2:1657 +1587:2:1665 +1588:2:1666 +1589:2:1670 +1590:2:1671 +1591:2:1679 +1592:2:1684 +1593:2:1688 +1594:2:1689 +1595:2:1696 +1596:2:1697 +1597:2:1708 +1598:2:1716 +1599:2:1717 +1600:2:1721 +1601:2:1726 +1602:2:1727 +1603:0:2112 +1604:2:1739 +1605:0:2112 +1606:2:1560 +1607:0:2112 +1608:2:1561 +1609:0:2112 +1610:2:1562 +1611:2:1566 +1612:2:1567 +1613:2:1575 +1614:2:1576 +1615:2:1580 +1616:2:1581 +1617:2:1589 +1618:2:1594 +1619:2:1598 +1620:2:1599 +1621:2:1606 +1622:2:1607 +1623:2:1618 +1624:2:1626 +1625:2:1627 +1626:2:1631 +1627:2:1636 +1628:2:1637 +1629:0:2112 +1630:2:1649 +1631:0:2112 +1632:2:1651 +1633:0:2112 +1634:1:101 +1635:0:2112 +1636:2:1652 +1637:2:1656 +1638:2:1657 +1639:2:1665 +1640:2:1666 +1641:2:1670 +1642:2:1671 +1643:2:1679 +1644:2:1684 +1645:2:1688 +1646:2:1689 +1647:2:1696 +1648:2:1697 +1649:2:1708 +1650:2:1716 +1651:2:1717 +1652:2:1721 +1653:2:1726 +1654:2:1727 +1655:0:2112 +1656:2:1739 +1657:0:2112 +1658:2:1560 +1659:0:2112 +1660:2:1561 +1661:0:2112 +1662:2:1562 +1663:2:1566 +1664:2:1567 +1665:2:1575 +1666:2:1576 +1667:2:1580 +1668:2:1581 +1669:2:1589 +1670:2:1594 +1671:2:1598 +1672:2:1599 +1673:2:1606 +1674:2:1607 +1675:2:1618 +1676:2:1626 +1677:2:1627 +1678:2:1631 +1679:2:1636 +1680:2:1637 +1681:0:2112 +1682:2:1649 +1683:0:2112 +1684:2:1651 +1685:0:2112 +1686:1:102 +1687:1:106 +1688:1:107 +1689:1:115 +1690:1:116 +1691:1:120 +1692:1:121 +1693:1:129 +1694:1:134 +1695:1:138 +1696:1:139 +1697:1:146 +1698:1:147 +1699:1:158 +1700:1:159 +1701:1:160 +1702:1:171 +1703:1:176 +1704:1:177 +1705:0:2112 +1706:1:189 +1707:0:2112 +1708:1:285 +1709:0:2112 +1710:2:1652 +1711:2:1656 +1712:2:1657 +1713:2:1665 +1714:2:1666 +1715:2:1670 +1716:2:1671 +1717:2:1679 +1718:2:1684 +1719:2:1688 +1720:2:1689 +1721:2:1696 +1722:2:1697 +1723:2:1708 +1724:2:1716 +1725:2:1717 +1726:2:1721 +1727:2:1726 +1728:2:1727 +1729:0:2112 +1730:2:1739 +1731:0:2112 +1732:2:1560 +1733:0:2112 +1734:2:1561 +1735:0:2112 +1736:2:1562 +1737:2:1566 +1738:2:1567 +1739:2:1575 +1740:2:1576 +1741:2:1580 +1742:2:1581 +1743:2:1589 +1744:2:1594 +1745:2:1598 +1746:2:1599 +1747:2:1606 +1748:2:1607 +1749:2:1618 +1750:2:1626 +1751:2:1627 +1752:2:1631 +1753:2:1636 +1754:2:1637 +1755:0:2112 +1756:2:1649 +1757:0:2112 +1758:2:1651 +1759:0:2112 +1760:1:286 +1761:0:2112 +1762:1:291 +1763:0:2112 +1764:1:293 +1765:0:2112 +1766:1:296 +1767:0:2112 +1768:2:1652 +1769:2:1656 +1770:2:1657 +1771:2:1665 +1772:2:1666 +1773:2:1670 +1774:2:1671 +1775:2:1679 +1776:2:1684 +1777:2:1688 +1778:2:1689 +1779:2:1696 +1780:2:1697 +1781:2:1708 +1782:2:1716 +1783:2:1717 +1784:2:1721 +1785:2:1726 +1786:2:1727 +1787:0:2112 +1788:2:1739 +1789:0:2112 +1790:2:1560 +1791:0:2112 +1792:2:1561 +1793:0:2112 +1794:2:1562 +1795:2:1566 +1796:2:1567 +1797:2:1575 +1798:2:1576 +1799:2:1580 +1800:2:1581 +1801:2:1589 +1802:2:1594 +1803:2:1598 +1804:2:1599 +1805:2:1606 +1806:2:1607 +1807:2:1618 +1808:2:1626 +1809:2:1627 +1810:2:1631 +1811:2:1636 +1812:2:1637 +1813:0:2112 +1814:2:1649 +1815:0:2112 +1816:2:1651 +1817:0:2112 +1818:1:301 +1819:0:2112 +1820:2:1652 +1821:2:1656 +1822:2:1657 +1823:2:1665 +1824:2:1666 +1825:2:1670 +1826:2:1671 +1827:2:1679 +1828:2:1684 +1829:2:1688 +1830:2:1689 +1831:2:1696 +1832:2:1697 +1833:2:1708 +1834:2:1716 +1835:2:1717 +1836:2:1721 +1837:2:1726 +1838:2:1727 +1839:0:2112 +1840:2:1739 +1841:0:2112 +1842:2:1560 +1843:0:2112 +1844:2:1561 +1845:0:2112 +1846:2:1562 +1847:2:1566 +1848:2:1567 +1849:2:1575 +1850:2:1576 +1851:2:1580 +1852:2:1581 +1853:2:1589 +1854:2:1594 +1855:2:1598 +1856:2:1599 +1857:2:1606 +1858:2:1607 +1859:2:1618 +1860:2:1626 +1861:2:1627 +1862:2:1631 +1863:2:1636 +1864:2:1637 +1865:0:2112 +1866:2:1649 +1867:0:2112 +1868:2:1651 +1869:0:2112 +1870:1:302 +1871:0:2112 +1872:2:1652 +1873:2:1656 +1874:2:1657 +1875:2:1665 +1876:2:1666 +1877:2:1670 +1878:2:1671 +1879:2:1679 +1880:2:1684 +1881:2:1688 +1882:2:1689 +1883:2:1696 +1884:2:1697 +1885:2:1708 +1886:2:1716 +1887:2:1717 +1888:2:1721 +1889:2:1726 +1890:2:1727 +1891:0:2112 +1892:2:1739 +1893:0:2112 +1894:2:1560 +1895:0:2112 +1896:2:1561 +1897:0:2112 +1898:2:1562 +1899:2:1566 +1900:2:1567 +1901:2:1575 +1902:2:1576 +1903:2:1580 +1904:2:1581 +1905:2:1589 +1906:2:1594 +1907:2:1598 +1908:2:1599 +1909:2:1606 +1910:2:1607 +1911:2:1618 +1912:2:1626 +1913:2:1627 +1914:2:1631 +1915:2:1636 +1916:2:1637 +1917:0:2112 +1918:2:1649 +1919:0:2112 +1920:2:1651 +1921:0:2112 +1922:1:303 +1923:0:2112 +1924:1:304 +1925:0:2112 +1926:1:305 +1927:0:2112 +1928:1:306 +1929:0:2112 +1930:1:308 +1931:0:2112 +1932:2:1652 +1933:2:1656 +1934:2:1657 +1935:2:1665 +1936:2:1666 +1937:2:1670 +1938:2:1671 +1939:2:1679 +1940:2:1684 +1941:2:1688 +1942:2:1689 +1943:2:1696 +1944:2:1697 +1945:2:1708 +1946:2:1716 +1947:2:1717 +1948:2:1721 +1949:2:1726 +1950:2:1727 +1951:0:2112 +1952:2:1739 +1953:0:2112 +1954:2:1560 +1955:0:2112 +1956:2:1561 +1957:0:2112 +1958:2:1562 +1959:2:1566 +1960:2:1567 +1961:2:1575 +1962:2:1576 +1963:2:1580 +1964:2:1581 +1965:2:1589 +1966:2:1594 +1967:2:1598 +1968:2:1599 +1969:2:1606 +1970:2:1607 +1971:2:1618 +1972:2:1626 +1973:2:1627 +1974:2:1631 +1975:2:1636 +1976:2:1637 +1977:0:2112 +1978:2:1649 +1979:0:2112 +1980:2:1651 +1981:0:2112 +1982:1:310 +1983:0:2112 +1984:2:1652 +1985:2:1656 +1986:2:1657 +1987:2:1665 +1988:2:1666 +1989:2:1670 +1990:2:1671 +1991:2:1679 +1992:2:1684 +1993:2:1688 +1994:2:1689 +1995:2:1696 +1996:2:1697 +1997:2:1708 +1998:2:1716 +1999:2:1717 +2000:2:1721 +2001:2:1726 +2002:2:1727 +2003:0:2112 +2004:2:1739 +2005:0:2112 +2006:2:1560 +2007:0:2112 +2008:2:1561 +2009:0:2112 +2010:2:1562 +2011:2:1566 +2012:2:1567 +2013:2:1575 +2014:2:1576 +2015:2:1580 +2016:2:1581 +2017:2:1589 +2018:2:1594 +2019:2:1598 +2020:2:1599 +2021:2:1606 +2022:2:1607 +2023:2:1618 +2024:2:1626 +2025:2:1627 +2026:2:1631 +2027:2:1636 +2028:2:1637 +2029:0:2112 +2030:2:1649 +2031:0:2112 +2032:2:1651 +2033:0:2112 +2034:1:311 +2035:1:315 +2036:1:316 +2037:1:324 +2038:1:325 +2039:1:326 +2040:1:338 +2041:1:343 +2042:1:347 +2043:1:348 +2044:1:355 +2045:1:356 +2046:1:367 +2047:1:368 +2048:1:369 +2049:1:380 +2050:1:385 +2051:1:386 +2052:0:2112 +2053:1:398 +2054:0:2112 +2055:2:1652 +2056:2:1656 +2057:2:1657 +2058:2:1665 +2059:2:1666 +2060:2:1670 +2061:2:1671 +2062:2:1679 +2063:2:1684 +2064:2:1688 +2065:2:1689 +2066:2:1696 +2067:2:1697 +2068:2:1708 +2069:2:1716 +2070:2:1717 +2071:2:1721 +2072:2:1726 +2073:2:1727 +2074:0:2112 +2075:2:1739 +2076:0:2112 +2077:2:1560 +2078:0:2112 +2079:2:1561 +2080:0:2112 +2081:2:1562 +2082:2:1566 +2083:2:1567 +2084:2:1575 +2085:2:1576 +2086:2:1580 +2087:2:1581 +2088:2:1589 +2089:2:1594 +2090:2:1598 +2091:2:1599 +2092:2:1606 +2093:2:1607 +2094:2:1618 +2095:2:1626 +2096:2:1627 +2097:2:1631 +2098:2:1636 +2099:2:1637 +2100:0:2112 +2101:2:1649 +2102:0:2112 +2103:2:1651 +2104:0:2112 +2105:1:400 +2106:0:2112 +2107:1:305 +2108:0:2112 +2109:1:306 +2110:0:2112 +2111:1:308 +2112:0:2112 +2113:2:1652 +2114:2:1656 +2115:2:1657 +2116:2:1665 +2117:2:1666 +2118:2:1670 +2119:2:1671 +2120:2:1679 +2121:2:1684 +2122:2:1688 +2123:2:1689 +2124:2:1696 +2125:2:1697 +2126:2:1708 +2127:2:1716 +2128:2:1717 +2129:2:1721 +2130:2:1726 +2131:2:1727 +2132:0:2112 +2133:2:1739 +2134:0:2112 +2135:2:1560 +2136:0:2112 +2137:2:1561 +2138:0:2112 +2139:2:1562 +2140:2:1566 +2141:2:1567 +2142:2:1575 +2143:2:1576 +2144:2:1580 +2145:2:1581 +2146:2:1589 +2147:2:1594 +2148:2:1598 +2149:2:1599 +2150:2:1606 +2151:2:1607 +2152:2:1618 +2153:2:1626 +2154:2:1627 +2155:2:1631 +2156:2:1636 +2157:2:1637 +2158:0:2112 +2159:2:1649 +2160:0:2112 +2161:2:1651 +2162:0:2112 +2163:1:310 +2164:0:2112 +2165:2:1652 +2166:2:1656 +2167:2:1657 +2168:2:1665 +2169:2:1666 +2170:2:1670 +2171:2:1671 +2172:2:1679 +2173:2:1684 +2174:2:1688 +2175:2:1689 +2176:2:1696 +2177:2:1697 +2178:2:1708 +2179:2:1716 +2180:2:1717 +2181:2:1721 +2182:2:1726 +2183:2:1727 +2184:0:2112 +2185:2:1739 +2186:0:2112 +2187:2:1560 +2188:0:2112 +2189:2:1561 +2190:0:2112 +2191:2:1562 +2192:2:1566 +2193:2:1567 +2194:2:1575 +2195:2:1576 +2196:2:1580 +2197:2:1581 +2198:2:1589 +2199:2:1594 +2200:2:1598 +2201:2:1599 +2202:2:1606 +2203:2:1607 +2204:2:1618 +2205:2:1626 +2206:2:1627 +2207:2:1631 +2208:2:1636 +2209:2:1637 +2210:0:2112 +2211:2:1649 +2212:0:2112 +2213:2:1651 +2214:0:2112 +2215:1:311 +2216:1:315 +2217:1:316 +2218:1:324 +2219:1:325 +2220:1:326 +2221:1:338 +2222:1:343 +2223:1:347 +2224:1:348 +2225:1:355 +2226:1:356 +2227:1:367 +2228:1:368 +2229:1:369 +2230:1:380 +2231:1:385 +2232:1:386 +2233:0:2112 +2234:1:398 +2235:0:2112 +2236:2:1652 +2237:2:1656 +2238:2:1657 +2239:2:1665 +2240:2:1666 +2241:2:1670 +2242:2:1671 +2243:2:1679 +2244:2:1684 +2245:2:1688 +2246:2:1689 +2247:2:1696 +2248:2:1697 +2249:2:1708 +2250:2:1716 +2251:2:1717 +2252:2:1721 +2253:2:1726 +2254:2:1727 +2255:0:2112 +2256:2:1739 +2257:0:2112 +2258:2:1560 +2259:0:2112 +2260:2:1561 +2261:0:2112 +2262:2:1562 +2263:2:1566 +2264:2:1567 +2265:2:1575 +2266:2:1576 +2267:2:1580 +2268:2:1581 +2269:2:1589 +2270:2:1594 +2271:2:1598 +2272:2:1599 +2273:2:1606 +2274:2:1607 +2275:2:1618 +2276:2:1626 +2277:2:1627 +2278:2:1631 +2279:2:1636 +2280:2:1637 +2281:0:2112 +2282:2:1649 +2283:0:2112 +2284:2:1651 +2285:0:2112 +2286:1:400 +2287:0:2112 +2288:1:404 +2289:0:2112 +2290:1:9 +2291:0:2112 +2292:1:10 +2293:0:2112 +2294:1:11 +2295:0:2112 +2296:2:1652 +2297:2:1656 +2298:2:1657 +2299:2:1665 +2300:2:1666 +2301:2:1670 +2302:2:1671 +2303:2:1679 +2304:2:1684 +2305:2:1688 +2306:2:1689 +2307:2:1696 +2308:2:1697 +2309:2:1708 +2310:2:1716 +2311:2:1717 +2312:2:1721 +2313:2:1726 +2314:2:1727 +2315:0:2112 +2316:2:1739 +2317:0:2112 +2318:2:1560 +2319:0:2112 +2320:2:1561 +2321:0:2112 +2322:2:1562 +2323:2:1566 +2324:2:1567 +2325:2:1575 +2326:2:1576 +2327:2:1580 +2328:2:1581 +2329:2:1589 +2330:2:1594 +2331:2:1598 +2332:2:1599 +2333:2:1606 +2334:2:1607 +2335:2:1618 +2336:2:1626 +2337:2:1627 +2338:2:1631 +2339:2:1636 +2340:2:1637 +2341:0:2112 +2342:2:1649 +2343:0:2112 +2344:2:1651 +2345:0:2112 +2346:1:12 +2347:1:16 +2348:1:17 +2349:1:25 +2350:1:26 +2351:1:27 +2352:1:39 +2353:1:44 +2354:1:48 +2355:1:49 +2356:1:56 +2357:1:57 +2358:1:68 +2359:1:69 +2360:1:70 +2361:1:81 +2362:1:86 +2363:1:87 +2364:0:2112 +2365:1:99 +2366:0:2112 +2367:2:1652 +2368:2:1656 +2369:2:1657 +2370:2:1665 +2371:2:1666 +2372:2:1670 +2373:2:1671 +2374:2:1679 +2375:2:1684 +2376:2:1688 +2377:2:1689 +2378:2:1696 +2379:2:1697 +2380:2:1708 +2381:2:1716 +2382:2:1717 +2383:2:1721 +2384:2:1726 +2385:2:1727 +2386:0:2112 +2387:2:1739 +2388:0:2112 +2389:2:1560 +2390:0:2112 +2391:2:1561 +2392:0:2112 +2393:2:1562 +2394:2:1566 +2395:2:1567 +2396:2:1575 +2397:2:1576 +2398:2:1580 +2399:2:1581 +2400:2:1589 +2401:2:1594 +2402:2:1598 +2403:2:1599 +2404:2:1606 +2405:2:1607 +2406:2:1618 +2407:2:1626 +2408:2:1627 +2409:2:1631 +2410:2:1636 +2411:2:1637 +2412:0:2112 +2413:2:1649 +2414:0:2112 +2415:2:1651 +2416:0:2112 +2417:1:101 +2418:0:2112 +2419:2:1652 +2420:2:1656 +2421:2:1657 +2422:2:1665 +2423:2:1666 +2424:2:1670 +2425:2:1671 +2426:2:1679 +2427:2:1684 +2428:2:1688 +2429:2:1689 +2430:2:1696 +2431:2:1697 +2432:2:1708 +2433:2:1716 +2434:2:1717 +2435:2:1721 +2436:2:1726 +2437:2:1727 +2438:0:2112 +2439:2:1739 +2440:0:2112 +2441:2:1560 +2442:0:2112 +2443:2:1561 +2444:0:2112 +2445:2:1562 +2446:2:1566 +2447:2:1567 +2448:2:1575 +2449:2:1576 +2450:2:1580 +2451:2:1581 +2452:2:1589 +2453:2:1594 +2454:2:1598 +2455:2:1599 +2456:2:1606 +2457:2:1607 +2458:2:1618 +2459:2:1626 +2460:2:1627 +2461:2:1631 +2462:2:1636 +2463:2:1637 +2464:0:2112 +2465:2:1649 +2466:0:2112 +2467:2:1651 +2468:0:2112 +2469:1:102 +2470:1:106 +2471:1:107 +2472:1:115 +2473:1:116 +2474:1:120 +2475:1:121 +2476:1:129 +2477:1:134 +2478:1:138 +2479:1:139 +2480:1:146 +2481:1:147 +2482:1:158 +2483:1:159 +2484:1:160 +2485:1:171 +2486:1:176 +2487:1:177 +2488:0:2112 +2489:1:189 +2490:0:2112 +2491:1:191 +2492:0:2112 +2493:2:1652 +2494:2:1656 +2495:2:1657 +2496:2:1665 +2497:2:1666 +2498:2:1670 +2499:2:1671 +2500:2:1679 +2501:2:1684 +2502:2:1688 +2503:2:1689 +2504:2:1696 +2505:2:1697 +2506:2:1708 +2507:2:1716 +2508:2:1717 +2509:2:1721 +2510:2:1726 +2511:2:1727 +2512:0:2112 +2513:2:1739 +2514:0:2112 +2515:2:1560 +2516:0:2112 +2517:2:1561 +2518:0:2112 +2519:2:1562 +2520:2:1566 +2521:2:1567 +2522:2:1575 +2523:2:1576 +2524:2:1580 +2525:2:1581 +2526:2:1589 +2527:2:1594 +2528:2:1598 +2529:2:1599 +2530:2:1606 +2531:2:1607 +2532:2:1618 +2533:2:1626 +2534:2:1627 +2535:2:1631 +2536:2:1636 +2537:2:1637 +2538:0:2112 +2539:2:1649 +2540:0:2112 +2541:2:1651 +2542:0:2112 +2543:1:192 +2544:0:2112 +2545:2:1652 +2546:2:1656 +2547:2:1657 +2548:2:1665 +2549:2:1666 +2550:2:1670 +2551:2:1671 +2552:2:1679 +2553:2:1684 +2554:2:1688 +2555:2:1689 +2556:2:1696 +2557:2:1697 +2558:2:1708 +2559:2:1716 +2560:2:1717 +2561:2:1721 +2562:2:1726 +2563:2:1727 +2564:0:2112 +2565:2:1739 +2566:0:2112 +2567:2:1560 +2568:0:2112 +2569:2:1561 +2570:0:2112 +2571:2:1562 +2572:2:1566 +2573:2:1567 +2574:2:1575 +2575:2:1576 +2576:2:1580 +2577:2:1581 +2578:2:1589 +2579:2:1594 +2580:2:1598 +2581:2:1599 +2582:2:1606 +2583:2:1607 +2584:2:1618 +2585:2:1626 +2586:2:1627 +2587:2:1631 +2588:2:1636 +2589:2:1637 +2590:0:2112 +2591:2:1649 +2592:0:2112 +2593:2:1651 +2594:0:2112 +2595:1:193 +2596:1:197 +2597:1:198 +2598:1:206 +2599:1:207 +2600:1:211 +2601:1:212 +2602:1:220 +2603:1:225 +2604:1:229 +2605:1:230 +2606:1:237 +2607:1:238 +2608:1:249 +2609:1:250 +2610:1:251 +2611:1:262 +2612:1:267 +2613:1:268 +2614:0:2112 +2615:1:280 +2616:0:2112 +2617:2:1652 +2618:2:1656 +2619:2:1657 +2620:2:1665 +2621:2:1666 +2622:2:1670 +2623:2:1671 +2624:2:1679 +2625:2:1684 +2626:2:1688 +2627:2:1689 +2628:2:1696 +2629:2:1697 +2630:2:1708 +2631:2:1716 +2632:2:1717 +2633:2:1721 +2634:2:1726 +2635:2:1727 +2636:0:2112 +2637:2:1739 +2638:0:2112 +2639:2:1560 +2640:0:2112 +2641:2:1561 +2642:0:2112 +2643:2:1562 +2644:2:1566 +2645:2:1567 +2646:2:1575 +2647:2:1576 +2648:2:1580 +2649:2:1581 +2650:2:1589 +2651:2:1594 +2652:2:1598 +2653:2:1599 +2654:2:1606 +2655:2:1607 +2656:2:1618 +2657:2:1626 +2658:2:1627 +2659:2:1631 +2660:2:1636 +2661:2:1637 +2662:0:2112 +2663:2:1649 +2664:0:2112 +2665:2:1651 +2666:0:2112 +2667:1:282 +2668:0:2112 +2669:1:291 +2670:0:2112 +2671:1:293 +2672:0:2112 +2673:1:11 +2674:0:2112 +2675:2:1652 +2676:2:1656 +2677:2:1657 +2678:2:1665 +2679:2:1666 +2680:2:1670 +2681:2:1671 +2682:2:1679 +2683:2:1684 +2684:2:1688 +2685:2:1689 +2686:2:1696 +2687:2:1697 +2688:2:1708 +2689:2:1716 +2690:2:1717 +2691:2:1721 +2692:2:1726 +2693:2:1727 +2694:0:2112 +2695:2:1739 +2696:0:2112 +2697:2:1560 +2698:0:2112 +2699:2:1561 +2700:0:2112 +2701:2:1562 +2702:2:1566 +2703:2:1567 +2704:2:1575 +2705:2:1576 +2706:2:1580 +2707:2:1581 +2708:2:1589 +2709:2:1594 +2710:2:1598 +2711:2:1599 +2712:2:1606 +2713:2:1607 +2714:2:1618 +2715:2:1626 +2716:2:1627 +2717:2:1631 +2718:2:1636 +2719:2:1637 +2720:0:2112 +2721:2:1649 +2722:0:2112 +2723:2:1651 +2724:0:2112 +2725:1:12 +2726:1:16 +2727:1:17 +2728:1:25 +2729:1:34 +2730:1:35 +2731:1:39 +2732:1:44 +2733:1:48 +2734:1:49 +2735:1:56 +2736:1:57 +2737:1:68 +2738:1:69 +2739:1:72 +2740:1:73 +2741:1:81 +2742:1:86 +2743:1:87 +2744:0:2112 +2745:1:99 +2746:0:2112 +2747:2:1652 +2748:2:1656 +2749:2:1657 +2750:2:1665 +2751:2:1666 +2752:2:1670 +2753:2:1671 +2754:2:1679 +2755:2:1684 +2756:2:1688 +2757:2:1689 +2758:2:1696 +2759:2:1697 +2760:2:1708 +2761:2:1716 +2762:2:1717 +2763:2:1721 +2764:2:1726 +2765:2:1727 +2766:0:2112 +2767:2:1739 +2768:0:2112 +2769:2:1560 +2770:0:2112 +2771:2:1561 +2772:0:2112 +2773:2:1562 +2774:2:1566 +2775:2:1567 +2776:2:1575 +2777:2:1576 +2778:2:1580 +2779:2:1581 +2780:2:1589 +2781:2:1594 +2782:2:1598 +2783:2:1599 +2784:2:1606 +2785:2:1607 +2786:2:1618 +2787:2:1626 +2788:2:1627 +2789:2:1631 +2790:2:1636 +2791:2:1637 +2792:0:2112 +2793:2:1649 +2794:0:2112 +2795:2:1651 +2796:0:2112 +2797:1:101 +2798:0:2112 +2799:2:1652 +2800:2:1656 +2801:2:1657 +2802:2:1665 +2803:2:1666 +2804:2:1670 +2805:2:1671 +2806:2:1679 +2807:2:1684 +2808:2:1688 +2809:2:1689 +2810:2:1696 +2811:2:1697 +2812:2:1708 +2813:2:1716 +2814:2:1717 +2815:2:1721 +2816:2:1726 +2817:2:1727 +2818:0:2112 +2819:2:1739 +2820:0:2112 +2821:2:1560 +2822:0:2112 +2823:2:1561 +2824:0:2112 +2825:2:1562 +2826:2:1566 +2827:2:1567 +2828:2:1575 +2829:2:1576 +2830:2:1580 +2831:2:1581 +2832:2:1589 +2833:2:1594 +2834:2:1598 +2835:2:1599 +2836:2:1606 +2837:2:1607 +2838:2:1618 +2839:2:1626 +2840:2:1627 +2841:2:1631 +2842:2:1636 +2843:2:1637 +2844:0:2112 +2845:2:1649 +2846:0:2112 +2847:2:1651 +2848:0:2112 +2849:1:102 +2850:1:106 +2851:1:107 +2852:1:115 +2853:1:124 +2854:1:125 +2855:1:129 +2856:1:134 +2857:1:138 +2858:1:139 +2859:1:146 +2860:1:147 +2861:1:158 +2862:1:159 +2863:1:162 +2864:1:163 +2865:1:171 +2866:1:176 +2867:1:177 +2868:0:2112 +2869:1:189 +2870:0:2112 +2871:1:285 +2872:0:2112 +2873:2:1652 +2874:2:1656 +2875:2:1657 +2876:2:1665 +2877:2:1666 +2878:2:1670 +2879:2:1671 +2880:2:1679 +2881:2:1684 +2882:2:1688 +2883:2:1689 +2884:2:1696 +2885:2:1697 +2886:2:1708 +2887:2:1716 +2888:2:1717 +2889:2:1721 +2890:2:1726 +2891:2:1727 +2892:0:2112 +2893:2:1739 +2894:0:2112 +2895:2:1560 +2896:0:2112 +2897:2:1561 +2898:0:2112 +2899:2:1562 +2900:2:1566 +2901:2:1567 +2902:2:1575 +2903:2:1576 +2904:2:1580 +2905:2:1581 +2906:2:1589 +2907:2:1594 +2908:2:1598 +2909:2:1599 +2910:2:1606 +2911:2:1607 +2912:2:1618 +2913:2:1626 +2914:2:1627 +2915:2:1631 +2916:2:1636 +2917:2:1637 +2918:0:2112 +2919:2:1649 +2920:0:2112 +2921:2:1651 +2922:0:2112 +2923:1:286 +2924:0:2112 +2925:1:291 +2926:0:2112 +2927:1:293 +2928:0:2112 +2929:1:296 +2930:0:2112 +2931:2:1652 +2932:2:1656 +2933:2:1657 +2934:2:1665 +2935:2:1666 +2936:2:1670 +2937:2:1671 +2938:2:1679 +2939:2:1684 +2940:2:1688 +2941:2:1689 +2942:2:1696 +2943:2:1697 +2944:2:1708 +2945:2:1716 +2946:2:1717 +2947:2:1721 +2948:2:1726 +2949:2:1727 +2950:0:2112 +2951:2:1739 +2952:0:2112 +2953:2:1560 +2954:0:2112 +2955:2:1561 +2956:0:2112 +2957:2:1562 +2958:2:1566 +2959:2:1567 +2960:2:1575 +2961:2:1576 +2962:2:1580 +2963:2:1581 +2964:2:1589 +2965:2:1594 +2966:2:1598 +2967:2:1599 +2968:2:1606 +2969:2:1607 +2970:2:1618 +2971:2:1626 +2972:2:1627 +2973:2:1631 +2974:2:1636 +2975:2:1637 +2976:0:2112 +2977:2:1649 +2978:0:2112 +2979:2:1651 +2980:0:2112 +2981:1:301 +2982:0:2112 +2983:2:1652 +2984:2:1656 +2985:2:1657 +2986:2:1665 +2987:2:1666 +2988:2:1670 +2989:2:1671 +2990:2:1679 +2991:2:1684 +2992:2:1688 +2993:2:1689 +2994:2:1696 +2995:2:1697 +2996:2:1708 +2997:2:1716 +2998:2:1717 +2999:2:1721 +3000:2:1726 +3001:2:1727 +3002:0:2112 +3003:2:1739 +3004:0:2112 +3005:2:1560 +3006:0:2112 +3007:2:1561 +3008:0:2112 +3009:2:1562 +3010:2:1566 +3011:2:1567 +3012:2:1575 +3013:2:1576 +3014:2:1580 +3015:2:1581 +3016:2:1589 +3017:2:1594 +3018:2:1598 +3019:2:1599 +3020:2:1606 +3021:2:1607 +3022:2:1618 +3023:2:1626 +3024:2:1627 +3025:2:1631 +3026:2:1636 +3027:2:1637 +3028:0:2112 +3029:2:1649 +3030:0:2112 +3031:2:1651 +3032:0:2112 +3033:1:302 +3034:0:2112 +3035:2:1652 +3036:2:1656 +3037:2:1657 +3038:2:1665 +3039:2:1666 +3040:2:1670 +3041:2:1671 +3042:2:1679 +3043:2:1684 +3044:2:1688 +3045:2:1689 +3046:2:1696 +3047:2:1697 +3048:2:1708 +3049:2:1716 +3050:2:1717 +3051:2:1721 +3052:2:1726 +3053:2:1727 +3054:0:2112 +3055:2:1739 +3056:0:2112 +3057:2:1560 +3058:0:2112 +3059:2:1561 +3060:0:2112 +3061:2:1562 +3062:2:1566 +3063:2:1567 +3064:2:1575 +3065:2:1576 +3066:2:1580 +3067:2:1581 +3068:2:1589 +3069:2:1594 +3070:2:1598 +3071:2:1599 +3072:2:1606 +3073:2:1607 +3074:2:1618 +3075:2:1626 +3076:2:1627 +3077:2:1631 +3078:2:1636 +3079:2:1637 +3080:0:2112 +3081:2:1649 +3082:0:2112 +3083:2:1651 +3084:0:2112 +3085:1:303 +3086:0:2112 +3087:1:304 +3088:0:2112 +3089:1:305 +3090:0:2112 +3091:1:306 +3092:0:2112 +3093:1:308 +3094:0:2112 +3095:2:1652 +3096:2:1656 +3097:2:1657 +3098:2:1665 +3099:2:1666 +3100:2:1670 +3101:2:1671 +3102:2:1679 +3103:2:1684 +3104:2:1688 +3105:2:1689 +3106:2:1696 +3107:2:1697 +3108:2:1708 +3109:2:1716 +3110:2:1717 +3111:2:1721 +3112:2:1726 +3113:2:1727 +3114:0:2112 +3115:2:1739 +3116:0:2112 +3117:2:1560 +3118:0:2112 +3119:2:1561 +3120:0:2112 +3121:2:1562 +3122:2:1566 +3123:2:1567 +3124:2:1575 +3125:2:1576 +3126:2:1580 +3127:2:1581 +3128:2:1589 +3129:2:1594 +3130:2:1598 +3131:2:1599 +3132:2:1606 +3133:2:1607 +3134:2:1618 +3135:2:1626 +3136:2:1627 +3137:2:1631 +3138:2:1636 +3139:2:1637 +3140:0:2112 +3141:2:1649 +3142:0:2112 +3143:2:1651 +3144:0:2112 +3145:1:310 +3146:0:2112 +3147:2:1652 +3148:2:1656 +3149:2:1657 +3150:2:1665 +3151:2:1666 +3152:2:1670 +3153:2:1671 +3154:2:1679 +3155:2:1684 +3156:2:1688 +3157:2:1689 +3158:2:1696 +3159:2:1697 +3160:2:1708 +3161:2:1716 +3162:2:1717 +3163:2:1721 +3164:2:1726 +3165:2:1727 +3166:0:2112 +3167:2:1739 +3168:0:2112 +3169:2:1560 +3170:0:2112 +3171:2:1561 +3172:0:2112 +3173:2:1562 +3174:2:1566 +3175:2:1567 +3176:2:1575 +3177:2:1576 +3178:2:1580 +3179:2:1581 +3180:2:1589 +3181:2:1594 +3182:2:1598 +3183:2:1599 +3184:2:1606 +3185:2:1607 +3186:2:1618 +3187:2:1626 +3188:2:1627 +3189:2:1631 +3190:2:1636 +3191:2:1637 +3192:0:2112 +3193:2:1649 +3194:0:2112 +3195:2:1651 +3196:0:2112 +3197:1:311 +3198:1:315 +3199:1:316 +3200:1:324 +3201:1:333 +3202:1:334 +3203:1:338 +3204:1:343 +3205:1:347 +3206:1:348 +3207:1:355 +3208:1:356 +3209:1:367 +3210:1:368 +3211:1:371 +3212:1:372 +3213:1:380 +3214:1:385 +3215:1:386 +3216:0:2112 +3217:1:398 +3218:0:2112 +3219:2:1652 +3220:2:1656 +3221:2:1657 +3222:2:1665 +3223:2:1666 +3224:2:1670 +3225:2:1671 +3226:2:1679 +3227:2:1684 +3228:2:1688 +3229:2:1689 +3230:2:1696 +3231:2:1697 +3232:2:1708 +3233:2:1716 +3234:2:1717 +3235:2:1721 +3236:2:1726 +3237:2:1727 +3238:0:2112 +3239:2:1739 +3240:0:2112 +3241:2:1560 +3242:0:2112 +3243:2:1561 +3244:0:2112 +3245:2:1562 +3246:2:1566 +3247:2:1567 +3248:2:1575 +3249:2:1576 +3250:2:1580 +3251:2:1581 +3252:2:1589 +3253:2:1594 +3254:2:1598 +3255:2:1599 +3256:2:1606 +3257:2:1607 +3258:2:1618 +3259:2:1626 +3260:2:1627 +3261:2:1631 +3262:2:1636 +3263:2:1637 +3264:0:2112 +3265:2:1649 +3266:0:2112 +3267:2:1651 +3268:0:2112 +3269:1:400 +3270:0:2112 +3271:1:305 +3272:0:2112 +3273:1:306 +3274:0:2112 +3275:1:308 +3276:0:2112 +3277:2:1652 +3278:2:1656 +3279:2:1657 +3280:2:1665 +3281:2:1666 +3282:2:1670 +3283:2:1671 +3284:2:1679 +3285:2:1684 +3286:2:1688 +3287:2:1689 +3288:2:1696 +3289:2:1697 +3290:2:1708 +3291:2:1716 +3292:2:1717 +3293:2:1721 +3294:2:1726 +3295:2:1727 +3296:0:2112 +3297:2:1739 +3298:0:2112 +3299:2:1560 +3300:0:2112 +3301:2:1561 +3302:0:2112 +3303:2:1562 +3304:2:1566 +3305:2:1567 +3306:2:1575 +3307:2:1576 +3308:2:1580 +3309:2:1581 +3310:2:1589 +3311:2:1594 +3312:2:1598 +3313:2:1599 +3314:2:1606 +3315:2:1607 +3316:2:1618 +3317:2:1626 +3318:2:1627 +3319:2:1631 +3320:2:1636 +3321:2:1637 +3322:0:2112 +3323:2:1649 +3324:0:2112 +3325:2:1651 +3326:0:2112 +3327:1:310 +3328:0:2112 +3329:2:1652 +3330:2:1656 +3331:2:1657 +3332:2:1665 +3333:2:1666 +3334:2:1670 +3335:2:1671 +3336:2:1679 +3337:2:1684 +3338:2:1688 +3339:2:1689 +3340:2:1696 +3341:2:1697 +3342:2:1708 +3343:2:1716 +3344:2:1717 +3345:2:1721 +3346:2:1726 +3347:2:1727 +3348:0:2112 +3349:2:1739 +3350:0:2112 +3351:2:1560 +3352:0:2112 +3353:2:1561 +3354:0:2112 +3355:2:1562 +3356:2:1566 +3357:2:1567 +3358:2:1575 +3359:2:1576 +3360:2:1580 +3361:2:1581 +3362:2:1589 +3363:2:1594 +3364:2:1598 +3365:2:1599 +3366:2:1606 +3367:2:1607 +3368:2:1618 +3369:2:1626 +3370:2:1627 +3371:2:1631 +3372:2:1636 +3373:2:1637 +3374:0:2112 +3375:2:1649 +3376:0:2112 +3377:2:1651 +3378:0:2112 +3379:1:311 +3380:1:315 +3381:1:316 +3382:1:324 +3383:1:333 +3384:1:334 +3385:1:338 +3386:1:343 +3387:1:347 +3388:1:348 +3389:1:355 +3390:1:356 +3391:1:367 +3392:1:368 +3393:1:371 +3394:1:372 +3395:1:380 +3396:1:385 +3397:1:386 +3398:0:2112 +3399:1:398 +3400:0:2112 +3401:2:1652 +3402:2:1656 +3403:2:1657 +3404:2:1665 +3405:2:1666 +3406:2:1670 +3407:2:1671 +3408:2:1679 +3409:2:1684 +3410:2:1688 +3411:2:1689 +3412:2:1696 +3413:2:1697 +3414:2:1708 +3415:2:1716 +3416:2:1717 +3417:2:1721 +3418:2:1726 +3419:2:1727 +3420:0:2112 +3421:2:1739 +3422:0:2112 +3423:2:1560 +3424:0:2112 +3425:2:1561 +3426:0:2112 +3427:2:1562 +3428:2:1566 +3429:2:1567 +3430:2:1575 +3431:2:1576 +3432:2:1580 +3433:2:1581 +3434:2:1589 +3435:2:1594 +3436:2:1598 +3437:2:1599 +3438:2:1606 +3439:2:1607 +3440:2:1618 +3441:2:1626 +3442:2:1627 +3443:2:1631 +3444:2:1636 +3445:2:1637 +3446:0:2112 +3447:2:1649 +3448:0:2112 +3449:2:1651 +3450:0:2112 +3451:1:400 +3452:0:2112 +3453:1:404 +3454:0:2112 +3455:1:9 +3456:0:2112 +3457:1:10 +3458:0:2112 +3459:1:11 +3460:0:2112 +3461:2:1652 +3462:2:1656 +3463:2:1657 +3464:2:1665 +3465:2:1666 +3466:2:1670 +3467:2:1671 +3468:2:1679 +3469:2:1684 +3470:2:1688 +3471:2:1689 +3472:2:1696 +3473:2:1697 +3474:2:1708 +3475:2:1716 +3476:2:1717 +3477:2:1721 +3478:2:1726 +3479:2:1727 +3480:0:2112 +3481:2:1739 +3482:0:2112 +3483:2:1560 +3484:0:2112 +3485:2:1561 +3486:0:2112 +3487:2:1562 +3488:2:1566 +3489:2:1567 +3490:2:1575 +3491:2:1576 +3492:2:1580 +3493:2:1581 +3494:2:1589 +3495:2:1594 +3496:2:1598 +3497:2:1599 +3498:2:1606 +3499:2:1607 +3500:2:1618 +3501:2:1626 +3502:2:1627 +3503:2:1631 +3504:2:1636 +3505:2:1637 +3506:0:2112 +3507:2:1649 +3508:0:2112 +3509:2:1651 +3510:0:2112 +3511:1:12 +3512:1:16 +3513:1:17 +3514:1:25 +3515:1:34 +3516:1:35 +3517:1:39 +3518:1:44 +3519:1:48 +3520:1:49 +3521:1:56 +3522:1:57 +3523:1:68 +3524:1:69 +3525:1:72 +3526:1:73 +3527:1:81 +3528:1:86 +3529:1:87 +3530:0:2112 +3531:1:99 +3532:0:2112 +3533:2:1652 +3534:2:1656 +3535:2:1657 +3536:2:1665 +3537:2:1666 +3538:2:1670 +3539:2:1671 +3540:2:1679 +3541:2:1684 +3542:2:1688 +3543:2:1689 +3544:2:1696 +3545:2:1697 +3546:2:1708 +3547:2:1716 +3548:2:1717 +3549:2:1721 +3550:2:1726 +3551:2:1727 +3552:0:2112 +3553:2:1739 +3554:0:2112 +3555:2:1560 +3556:0:2112 +3557:2:1561 +3558:0:2112 +3559:2:1562 +3560:2:1566 +3561:2:1567 +3562:2:1575 +3563:2:1576 +3564:2:1580 +3565:2:1581 +3566:2:1589 +3567:2:1594 +3568:2:1598 +3569:2:1599 +3570:2:1606 +3571:2:1607 +3572:2:1618 +3573:2:1626 +3574:2:1627 +3575:2:1631 +3576:2:1636 +3577:2:1637 +3578:0:2112 +3579:2:1649 +3580:0:2112 +3581:2:1651 +3582:0:2112 +3583:1:101 +3584:0:2112 +3585:2:1652 +3586:2:1656 +3587:2:1657 +3588:2:1665 +3589:2:1666 +3590:2:1670 +3591:2:1671 +3592:2:1679 +3593:2:1684 +3594:2:1688 +3595:2:1689 +3596:2:1696 +3597:2:1697 +3598:2:1708 +3599:2:1716 +3600:2:1717 +3601:2:1721 +3602:2:1726 +3603:2:1727 +3604:0:2112 +3605:2:1739 +3606:0:2112 +3607:2:1560 +3608:0:2112 +3609:2:1561 +3610:0:2112 +3611:2:1562 +3612:2:1566 +3613:2:1567 +3614:2:1575 +3615:2:1576 +3616:2:1580 +3617:2:1581 +3618:2:1589 +3619:2:1594 +3620:2:1598 +3621:2:1599 +3622:2:1606 +3623:2:1607 +3624:2:1618 +3625:2:1626 +3626:2:1627 +3627:2:1631 +3628:2:1636 +3629:2:1637 +3630:0:2112 +3631:2:1649 +3632:0:2112 +3633:2:1651 +3634:0:2112 +3635:1:102 +3636:1:106 +3637:1:107 +3638:1:115 +3639:1:124 +3640:1:125 +3641:1:129 +3642:1:134 +3643:1:138 +3644:1:139 +3645:1:146 +3646:1:147 +3647:1:158 +3648:1:159 +3649:1:162 +3650:1:163 +3651:1:171 +3652:1:176 +3653:1:177 +3654:0:2112 +3655:1:189 +3656:0:2112 +3657:1:191 +3658:0:2112 +3659:2:1652 +3660:2:1656 +3661:2:1657 +3662:2:1665 +3663:2:1666 +3664:2:1670 +3665:2:1671 +3666:2:1679 +3667:2:1684 +3668:2:1688 +3669:2:1689 +3670:2:1696 +3671:2:1697 +3672:2:1708 +3673:2:1716 +3674:2:1717 +3675:2:1721 +3676:2:1726 +3677:2:1727 +3678:0:2112 +3679:2:1739 +3680:0:2112 +3681:2:1560 +3682:0:2112 +3683:2:1561 +3684:0:2112 +3685:2:1562 +3686:2:1566 +3687:2:1567 +3688:2:1575 +3689:2:1576 +3690:2:1580 +3691:2:1581 +3692:2:1589 +3693:2:1594 +3694:2:1598 +3695:2:1599 +3696:2:1606 +3697:2:1607 +3698:2:1618 +3699:2:1626 +3700:2:1627 +3701:2:1631 +3702:2:1636 +3703:2:1637 +3704:0:2112 +3705:2:1649 +3706:0:2112 +3707:2:1651 +3708:0:2112 +3709:1:192 +3710:0:2112 +3711:2:1652 +3712:2:1656 +3713:2:1657 +3714:2:1665 +3715:2:1666 +3716:2:1670 +3717:2:1671 +3718:2:1679 +3719:2:1684 +3720:2:1688 +3721:2:1689 +3722:2:1696 +3723:2:1697 +3724:2:1708 +3725:2:1716 +3726:2:1717 +3727:2:1721 +3728:2:1726 +3729:2:1727 +3730:0:2112 +3731:2:1739 +3732:0:2112 +3733:2:1560 +3734:0:2112 +3735:2:1561 +3736:0:2112 +3737:2:1562 +3738:2:1566 +3739:2:1567 +3740:2:1575 +3741:2:1576 +3742:2:1580 +3743:2:1581 +3744:2:1589 +3745:2:1594 +3746:2:1598 +3747:2:1599 +3748:2:1606 +3749:2:1607 +3750:2:1618 +3751:2:1626 +3752:2:1627 +3753:2:1631 +3754:2:1636 +3755:2:1637 +3756:0:2112 +3757:2:1649 +3758:0:2112 +3759:2:1651 +3760:0:2112 +3761:1:193 +3762:1:197 +3763:1:198 +3764:1:206 +3765:1:215 +3766:1:216 +3767:1:220 +3768:1:225 +3769:1:229 +3770:1:230 +3771:1:237 +3772:1:238 +3773:1:249 +3774:1:250 +3775:1:253 +3776:1:254 +3777:1:262 +3778:1:267 +3779:1:268 +3780:0:2112 +3781:1:280 +3782:0:2112 +3783:2:1652 +3784:2:1656 +3785:2:1657 +3786:2:1665 +3787:2:1666 +3788:2:1670 +3789:2:1671 +3790:2:1679 +3791:2:1684 +3792:2:1688 +3793:2:1689 +3794:2:1696 +3795:2:1697 +3796:2:1708 +3797:2:1716 +3798:2:1717 +3799:2:1721 +3800:2:1726 +3801:2:1727 +3802:0:2112 +3803:2:1739 +3804:0:2112 +3805:2:1560 +3806:0:2112 +3807:2:1561 +3808:0:2112 +3809:2:1562 +3810:2:1566 +3811:2:1567 +3812:2:1575 +3813:2:1576 +3814:2:1580 +3815:2:1581 +3816:2:1589 +3817:2:1594 +3818:2:1598 +3819:2:1599 +3820:2:1606 +3821:2:1607 +3822:2:1618 +3823:2:1626 +3824:2:1627 +3825:2:1631 +3826:2:1636 +3827:2:1637 +3828:0:2112 +3829:2:1649 +3830:0:2112 +3831:1:282 +3832:0:2112 +3833:1:291 +3834:0:2112 +3835:1:293 +3836:0:2112 +3837:1:11 +3838:0:2112 +3839:1:12 +3840:1:16 +3841:1:17 +3842:1:25 +3843:1:26 +3844:1:27 +3845:1:39 +3846:1:44 +3847:1:48 +3848:1:49 +3849:1:56 +3850:1:57 +3851:1:68 +3852:1:69 +3853:1:70 +3854:1:81 +3855:1:86 +3856:1:87 +3857:0:2112 +3858:1:99 +3859:0:2112 +3860:1:101 +3861:0:2112 +3862:1:102 +3863:1:106 +3864:1:107 +3865:1:115 +3866:1:116 +3867:1:120 +3868:1:121 +3869:1:129 +3870:1:134 +3871:1:138 +3872:1:139 +3873:1:146 +3874:1:147 +3875:1:158 +3876:1:159 +3877:1:160 +3878:1:171 +3879:1:176 +3880:1:177 +3881:0:2112 +3882:1:189 +3883:0:2112 +3884:1:285 +3885:0:2112 +3886:1:286 +3887:0:2112 +3888:1:291 +3889:0:2112 +3890:1:293 +3891:0:2112 +3892:1:296 +3893:0:2112 +3894:1:301 +3895:0:2112 +3896:1:302 +3897:0:2112 +3898:1:303 +3899:0:2112 +3900:1:304 +3901:0:2112 +3902:1:305 +3903:0:2112 +3904:1:306 +3905:0:2112 +3906:1:308 +3907:0:2112 +3908:1:310 +3909:0:2112 +3910:1:311 +3911:1:315 +3912:1:316 +3913:1:324 +3914:1:325 +3915:1:326 +3916:1:338 +3917:1:343 +3918:1:347 +3919:1:348 +3920:1:355 +3921:1:356 +3922:1:367 +3923:1:368 +3924:1:369 +3925:1:380 +3926:1:385 +3927:1:386 +3928:0:2112 +3929:1:398 +3930:0:2112 +3931:1:400 +3932:0:2112 +3933:1:305 +3934:0:2112 +3935:1:306 +3936:0:2112 +3937:1:308 +3938:0:2112 +3939:1:310 +3940:0:2112 +3941:1:311 +3942:1:315 +3943:1:316 +3944:1:324 +3945:1:325 +3946:1:326 +3947:1:338 +3948:1:343 +3949:1:347 +3950:1:348 +3951:1:355 +3952:1:356 +3953:1:367 +3954:1:368 +3955:1:369 +3956:1:380 +3957:1:385 +3958:1:386 +3959:0:2112 +3960:1:398 +3961:0:2112 +3962:1:400 +3963:0:2112 +3964:1:404 +3965:0:2112 +3966:1:9 +3967:0:2112 +3968:1:10 +3969:0:2112 +3970:1:11 +3971:0:2112 +3972:1:12 +3973:1:16 +3974:1:17 +3975:1:25 +3976:1:26 +3977:1:27 +3978:1:39 +3979:1:44 +3980:1:48 +3981:1:49 +3982:1:56 +3983:1:57 +3984:1:68 +3985:1:69 +3986:1:70 +3987:1:81 +3988:1:86 +3989:1:87 +3990:0:2112 +3991:1:99 +3992:0:2112 +3993:1:101 +3994:0:2112 +3995:1:102 +3996:1:106 +3997:1:107 +3998:1:115 +3999:1:116 +4000:1:120 +4001:1:121 +4002:1:129 +4003:1:134 +4004:1:138 +4005:1:139 +4006:1:146 +4007:1:147 +4008:1:158 +4009:1:159 +4010:1:160 +4011:1:171 +4012:1:176 +4013:1:177 +4014:0:2112 +4015:1:189 +4016:0:2112 +4017:1:191 +4018:0:2112 +4019:1:192 +4020:0:2112 +4021:1:193 +4022:1:197 +4023:1:198 +4024:1:206 +4025:1:207 +4026:1:211 +4027:1:212 +4028:1:220 +4029:1:225 +4030:1:229 +4031:1:230 +4032:1:237 +4033:1:238 +4034:1:249 +4035:1:250 +4036:1:251 +4037:1:262 +4038:1:267 +4039:1:268 +4040:0:2112 +4041:1:280 +4042:0:2112 +4043:1:282 +4044:0:2112 +4045:2:1651 +4046:0:2112 +4047:1:291 +4048:0:2112 +4049:2:1652 +4050:2:1656 +4051:2:1657 +4052:2:1665 +4053:2:1666 +4054:2:1670 +4055:2:1671 +4056:2:1679 +4057:2:1684 +4058:2:1688 +4059:2:1689 +4060:2:1696 +4061:2:1697 +4062:2:1708 +4063:2:1716 +4064:2:1717 +4065:2:1721 +4066:2:1726 +4067:2:1727 +4068:0:2112 +4069:2:1739 +4070:0:2112 +4071:2:1560 +4072:0:2112 +4073:1:293 +4074:0:2112 +4075:1:11 +4076:0:2112 +4077:1:12 +4078:1:16 +4079:1:17 +4080:1:25 +4081:1:26 +4082:1:27 +4083:1:39 +4084:1:44 +4085:1:48 +4086:1:49 +4087:1:56 +4088:1:57 +4089:1:68 +4090:1:69 +4091:1:70 +4092:1:81 +4093:1:86 +4094:1:87 +4095:0:2112 +4096:1:99 +4097:0:2112 +4098:1:101 +4099:0:2112 +4100:1:102 +4101:1:106 +4102:1:107 +4103:1:115 +4104:1:116 +4105:1:120 +4106:1:121 +4107:1:129 +4108:1:134 +4109:1:138 +4110:1:139 +4111:1:146 +4112:1:147 +4113:1:158 +4114:1:159 +4115:1:160 +4116:1:171 +4117:1:176 +4118:1:177 +4119:0:2112 +4120:1:189 +4121:0:2112 +4122:1:285 +4123:0:2112 +4124:1:286 +4125:0:2112 +4126:1:291 +4127:0:2112 +4128:1:293 +4129:0:2112 +4130:1:296 +4131:0:2112 +4132:1:301 +4133:0:2112 +4134:1:302 +4135:0:2112 +4136:1:303 +4137:0:2112 +4138:1:304 +4139:0:2112 +4140:1:305 +4141:0:2112 +4142:1:306 +4143:0:2112 +4144:1:308 +4145:0:2112 +4146:1:310 +4147:0:2112 +4148:1:311 +4149:1:315 +4150:1:316 +4151:1:324 +4152:1:325 +4153:1:326 +4154:1:338 +4155:1:343 +4156:1:347 +4157:1:348 +4158:1:355 +4159:1:356 +4160:1:367 +4161:1:368 +4162:1:369 +4163:1:380 +4164:1:385 +4165:1:386 +4166:0:2112 +4167:1:398 +4168:0:2112 +4169:1:400 +4170:0:2112 +4171:1:305 +4172:0:2112 +4173:1:306 +4174:0:2112 +4175:1:308 +4176:0:2112 +4177:1:310 +4178:0:2112 +4179:1:311 +4180:1:315 +4181:1:316 +4182:1:324 +4183:1:325 +4184:1:326 +4185:1:338 +4186:1:343 +4187:1:347 +4188:1:348 +4189:1:355 +4190:1:356 +4191:1:367 +4192:1:368 +4193:1:369 +4194:1:380 +4195:1:385 +4196:1:386 +4197:0:2112 +4198:1:398 +4199:0:2112 +4200:1:400 +4201:0:2112 +4202:1:404 +4203:0:2112 +4204:1:9 +4205:0:2112 +4206:1:10 +4207:0:2112 +4208:1:11 +4209:0:2112 +4210:1:12 +4211:1:16 +4212:1:17 +4213:1:25 +4214:1:26 +4215:1:27 +4216:1:39 +4217:1:44 +4218:1:48 +4219:1:49 +4220:1:56 +4221:1:57 +4222:1:68 +4223:1:69 +4224:1:70 +4225:1:81 +4226:1:86 +4227:1:87 +4228:0:2112 +4229:1:99 +4230:0:2112 +4231:1:101 +4232:0:2112 +4233:1:102 +4234:1:106 +4235:1:107 +4236:1:115 +4237:1:116 +4238:1:120 +4239:1:121 +4240:1:129 +4241:1:134 +4242:1:138 +4243:1:139 +4244:1:146 +4245:1:147 +4246:1:158 +4247:1:159 +4248:1:160 +4249:1:171 +4250:1:176 +4251:1:177 +4252:0:2112 +4253:1:189 +4254:0:2112 +4255:1:191 +4256:0:2112 +4257:1:192 +4258:0:2112 +4259:1:193 +4260:1:197 +4261:1:198 +4262:1:206 +4263:1:207 +4264:1:211 +4265:1:212 +4266:1:220 +4267:1:225 +4268:1:229 +4269:1:230 +4270:1:237 +4271:1:238 +4272:1:249 +4273:1:250 +4274:1:251 +4275:1:262 +4276:1:267 +4277:1:268 +4278:0:2112 +4279:1:280 +4280:0:2112 +4281:1:282 +4282:0:2112 +4283:1:291 +4284:0:2112 +4285:1:293 +4286:0:2112 +4287:2:1561 +4288:0:2112 +4289:1:11 +4290:0:2112 +4291:1:12 +4292:1:16 +4293:1:17 +4294:1:25 +4295:1:26 +4296:1:27 +4297:1:39 +4298:1:44 +4299:1:48 +4300:1:49 +4301:1:56 +4302:1:57 +4303:1:68 +4304:1:69 +4305:1:70 +4306:1:81 +4307:1:86 +4308:1:87 +-1:-1:-1 +4309:0:2112 +4310:1:99 +4311:0:2112 +4312:1:101 +4313:0:2112 +4314:1:102 +4315:1:106 +4316:1:107 +4317:1:115 +4318:1:116 +4319:1:120 +4320:1:121 +4321:1:129 +4322:1:134 +4323:1:138 +4324:1:139 +4325:1:146 +4326:1:147 +4327:1:158 +4328:1:159 +4329:1:160 +4330:1:171 +4331:1:176 +4332:1:177 +4333:0:2112 +4334:1:189 +4335:0:2112 +4336:1:285 +4337:0:2112 +4338:1:286 +4339:0:2112 +4340:1:291 +4341:0:2112 +4342:1:293 +4343:0:2112 +4344:1:296 +4345:0:2112 +4346:1:301 +4347:0:2112 +4348:1:302 +4349:0:2112 +4350:1:303 +4351:0:2112 +4352:1:304 +4353:0:2112 +4354:1:305 +4355:0:2112 +4356:1:306 +4357:0:2112 +4358:1:308 +4359:0:2112 +4360:1:310 +4361:0:2112 +4362:1:311 +4363:1:315 +4364:1:316 +4365:1:324 +4366:1:325 +4367:1:326 +4368:1:338 +4369:1:343 +4370:1:347 +4371:1:348 +4372:1:355 +4373:1:356 +4374:1:367 +4375:1:368 +4376:1:369 +4377:1:380 +4378:1:385 +4379:1:386 +4380:0:2112 +4381:1:398 +4382:0:2112 +4383:1:400 +4384:0:2112 +4385:1:305 +4386:0:2112 +4387:1:306 +4388:0:2112 +4389:1:308 +4390:0:2112 +4391:1:310 +4392:0:2112 +4393:1:311 +4394:1:315 +4395:1:316 +4396:1:324 +4397:1:325 +4398:1:326 +4399:1:338 +4400:1:343 +4401:1:347 +4402:1:348 +4403:1:355 +4404:1:356 +4405:1:367 +4406:1:368 +4407:1:369 +4408:1:380 +4409:1:385 +4410:1:386 +4411:0:2112 +4412:1:398 +4413:0:2112 +4414:1:400 +4415:0:2112 +4416:1:404 +4417:0:2112 +4418:1:9 +4419:0:2112 +4420:1:10 +4421:0:2112 +4422:1:11 +4423:0:2112 +4424:1:12 +4425:1:16 +4426:1:17 +4427:1:25 +4428:1:34 +4429:1:35 +4430:1:39 +4431:1:44 +4432:1:48 +4433:1:49 +4434:1:56 +4435:1:57 +4436:1:68 +4437:1:69 +4438:1:72 +4439:1:73 +4440:1:81 +4441:1:86 +4442:1:87 +4443:0:2112 +4444:1:99 +4445:0:2112 +4446:2:1562 +4447:2:1566 +4448:2:1567 +4449:2:1575 +4450:2:1576 +4451:2:1580 +4452:2:1581 +4453:2:1589 +4454:2:1594 +4455:2:1598 +4456:2:1599 +4457:2:1606 +4458:2:1607 +4459:2:1618 +4460:2:1626 +4461:2:1627 +4462:2:1631 +4463:2:1636 +4464:2:1637 +4465:0:2112 +4466:2:1649 +4467:0:2112 +4468:2:1651 +4469:0:2112 +4470:2:1652 +4471:2:1656 +4472:2:1657 +4473:2:1665 +4474:2:1666 +4475:2:1670 +4476:2:1671 +4477:2:1679 +4478:2:1684 +4479:2:1688 +4480:2:1689 +4481:2:1696 +4482:2:1697 +4483:2:1708 +4484:2:1716 +4485:2:1717 +4486:2:1721 +4487:2:1726 +4488:2:1727 +4489:0:2112 +4490:2:1739 +4491:0:2112 +4492:2:1560 +4493:0:2112 +4494:2:1561 +4495:0:2112 +4496:1:101 +4497:0:2112 +4498:2:1562 +4499:2:1566 +4500:2:1567 +4501:2:1575 +4502:2:1576 +4503:2:1580 +4504:2:1581 +4505:2:1589 +4506:2:1594 +4507:2:1598 +4508:2:1599 +4509:2:1606 +4510:2:1607 +4511:2:1618 +4512:2:1626 +4513:2:1627 +4514:2:1631 +4515:2:1636 +4516:2:1637 +4517:0:2112 +4518:2:1649 +4519:0:2112 +4520:2:1651 +4521:0:2112 +4522:2:1652 +4523:2:1656 +4524:2:1657 +4525:2:1665 +4526:2:1666 +4527:2:1670 +4528:2:1671 +4529:2:1679 +4530:2:1684 +4531:2:1688 +4532:2:1689 +4533:2:1696 +4534:2:1697 +4535:2:1708 +4536:2:1716 +4537:2:1717 +4538:2:1721 +4539:2:1726 +4540:2:1727 +4541:0:2112 +4542:2:1739 +4543:0:2112 +4544:2:1560 +4545:0:2112 +4546:2:1561 +4547:0:2112 +4548:1:102 +4549:1:106 +4550:1:107 +4551:1:115 +4552:1:116 +4553:1:117 +4554:1:129 +4555:1:134 +4556:1:138 +4557:1:139 +4558:1:146 +4559:1:147 +4560:1:158 +4561:1:159 +4562:1:160 +4563:1:171 +4564:1:176 +4565:1:177 +4566:0:2112 +4567:1:189 +4568:0:2112 +4569:1:191 +4570:0:2112 +4571:2:1562 +4572:2:1566 +4573:2:1567 +4574:2:1575 +4575:2:1576 +4576:2:1580 +4577:2:1581 +4578:2:1589 +4579:2:1594 +4580:2:1598 +4581:2:1599 +4582:2:1606 +4583:2:1607 +4584:2:1618 +4585:2:1626 +4586:2:1627 +4587:2:1631 +4588:2:1636 +4589:2:1637 +4590:0:2112 +4591:2:1649 +4592:0:2112 +4593:2:1651 +4594:0:2112 +4595:2:1652 +4596:2:1656 +4597:2:1657 +4598:2:1665 +4599:2:1666 +4600:2:1670 +4601:2:1671 +4602:2:1679 +4603:2:1684 +4604:2:1688 +4605:2:1689 +4606:2:1696 +4607:2:1697 +4608:2:1708 +4609:2:1716 +4610:2:1717 +4611:2:1721 +4612:2:1726 +4613:2:1727 +4614:0:2112 +4615:2:1739 +4616:0:2112 +4617:2:1560 +4618:0:2112 +4619:2:1561 +4620:0:2112 +4621:1:192 +4622:0:2112 +4623:2:1562 +4624:2:1566 +4625:2:1567 +4626:2:1575 +4627:2:1576 +4628:2:1580 +4629:2:1581 +4630:2:1589 +4631:2:1594 +4632:2:1598 +4633:2:1599 +4634:2:1606 +4635:2:1607 +4636:2:1618 +4637:2:1626 +4638:2:1627 +4639:2:1631 +4640:2:1636 +4641:2:1637 +4642:0:2112 +4643:2:1649 +4644:0:2112 +4645:2:1651 +4646:0:2112 +4647:2:1652 +4648:2:1656 +4649:2:1657 +4650:2:1665 +4651:2:1666 +4652:2:1670 +4653:2:1671 +4654:2:1679 +4655:2:1684 +4656:2:1688 +4657:2:1689 +4658:2:1696 +4659:2:1697 +4660:2:1708 +4661:2:1716 +4662:2:1717 +4663:2:1721 +4664:2:1726 +4665:2:1727 +4666:0:2112 +4667:2:1739 +4668:0:2112 +4669:2:1560 +4670:0:2112 +4671:2:1561 +4672:0:2112 +4673:1:193 +4674:1:197 +4675:1:198 +4676:1:206 +4677:1:207 +4678:1:211 +4679:1:212 +4680:1:220 +4681:1:225 +4682:1:229 +4683:1:230 +4684:1:237 +4685:1:238 +4686:1:249 +4687:1:250 +4688:1:251 +4689:1:262 +4690:1:267 +4691:1:268 +4692:0:2112 +4693:1:280 +4694:0:2112 +4695:2:1562 +4696:2:1566 +4697:2:1567 +4698:2:1575 +4699:2:1576 +4700:2:1580 +4701:2:1581 +4702:2:1589 +4703:2:1594 +4704:2:1598 +4705:2:1599 +4706:2:1606 +4707:2:1607 +4708:2:1618 +4709:2:1626 +4710:2:1627 +4711:2:1631 +4712:2:1636 +4713:2:1637 +4714:0:2112 +4715:2:1649 +4716:0:2112 +4717:2:1651 +4718:0:2112 +4719:2:1652 +4720:2:1656 +4721:2:1657 +4722:2:1665 +4723:2:1666 +4724:2:1670 +4725:2:1671 +4726:2:1679 +4727:2:1684 +4728:2:1688 +4729:2:1689 +4730:2:1696 +4731:2:1697 +4732:2:1708 +4733:2:1716 +4734:2:1717 +4735:2:1721 +4736:2:1726 +4737:2:1727 +4738:0:2112 +4739:2:1739 +4740:0:2112 +4741:2:1560 +4742:0:2112 +4743:2:1561 +4744:0:2112 +4745:1:282 +4746:0:2112 +4747:1:291 +4748:0:2112 +4749:1:293 +4750:0:2112 +4751:1:11 +4752:0:2112 +4753:2:1562 +4754:2:1566 +4755:2:1567 +4756:2:1575 +4757:2:1576 +4758:2:1580 +4759:2:1581 +4760:2:1589 +4761:2:1594 +4762:2:1598 +4763:2:1599 +4764:2:1606 +4765:2:1607 +4766:2:1618 +4767:2:1626 +4768:2:1627 +4769:2:1631 +4770:2:1636 +4771:2:1637 +4772:0:2112 +4773:2:1649 +4774:0:2112 +4775:2:1651 +4776:0:2112 +4777:2:1652 +4778:2:1656 +4779:2:1657 +4780:2:1665 +4781:2:1666 +4782:2:1670 +4783:2:1671 +4784:2:1679 +4785:2:1684 +4786:2:1688 +4787:2:1689 +4788:2:1696 +4789:2:1697 +4790:2:1708 +4791:2:1716 +4792:2:1717 +4793:2:1721 +4794:2:1726 +4795:2:1727 +4796:0:2112 +4797:2:1739 +4798:0:2112 +4799:2:1560 +4800:0:2112 +4801:2:1561 +4802:0:2112 +4803:1:12 +4804:1:16 +4805:1:17 +4806:1:25 +4807:1:26 +4808:1:27 +4809:1:39 +4810:1:44 +4811:1:48 +4812:1:49 +4813:1:56 +4814:1:57 +4815:1:68 +4816:1:69 +4817:1:70 +4818:1:81 +4819:1:86 +4820:1:87 diff --git a/formal-model/urcu/result-standard-execution-nonest/DEFINES b/formal-model/urcu/result-standard-execution-nonest/DEFINES new file mode 100644 index 0000000..5d5147e --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/DEFINES @@ -0,0 +1,17 @@ + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +//#define TEST_SIGNAL +//#define TEST_SIGNAL_ON_READ +//#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 1 +//#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS diff --git a/formal-model/urcu/result-standard-execution-nonest/Makefile b/formal-model/urcu/result-standard-execution-nonest/Makefile new file mode 100644 index 0000000..8af320d --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/Makefile @@ -0,0 +1,172 @@ +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Copyright (C) Mathieu Desnoyers, 2009 +# +# Authors: Mathieu Desnoyers + +#CFLAGS=-DSAFETY +#for multi-core verif, 15.5GB shared mem, use files if full +#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 +#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 + +#liveness +#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 +CFLAGS=-DHASH64 + +SPINFILE=urcu.spin + +default: + make urcu_free | tee urcu_free.log + #nested useless with signal test. + #make urcu_free_nested | tee urcu_free_nested.log + make urcu_free_no_rmb | tee urcu_free_no_rmb.log + make urcu_free_no_wmb | tee urcu_free_no_wmb.log + make urcu_free_no_mb | tee urcu_free_no_mb.log + make urcu_free_single_flip | tee urcu_free_single_flip.log + make urcu_progress_writer | tee urcu_progress_writer.log + make urcu_progress_reader | tee urcu_progress_reader.log + make urcu_progress_writer_error | tee urcu_progress_writer_error.log + make asserts | tee asserts.log + make summary + +#show trail : spin -v -t -N pan.ltl input.spin +# after each individual make. + +summary: + @echo + @echo "Verification summary" + @grep errors: *.log + +asserts: clean + cat DEFINES > .input.spin + cat ${SPINFILE} >> .input.spin + rm -f .input.spin.trail + spin -a -X .input.spin + gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c + ./pan -v -c1 -X -m10000000 -w20 + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free: clean urcu_free_ltl run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_nested_define: + cp urcu_free_nested.define .input.define + +urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_no_rmb_define: + cp urcu_free_no_rmb.define .input.define + +urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_no_wmb_define: + cp urcu_free_no_wmb.define .input.define + +urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_no_mb_define: + cp urcu_free_no_mb.define .input.define + +urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_free_single_flip_define: + cp urcu_free_single_flip.define .input.define + +urcu_free_ltl: + touch .input.define + cat .input.define >> pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl + +# Progress checks + +urcu_progress_writer: clean urcu_progress_writer_ltl \ + urcu_progress_writer_define run_weak_fair + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_progress_writer_define: + cp urcu_progress_writer.define .input.define + +urcu_progress_writer_ltl: + touch .input.define + cat .input.define > pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl + +urcu_progress_reader: clean urcu_progress_reader_ltl \ + urcu_progress_reader_define run_weak_fair + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_progress_reader_define: + cp urcu_progress_reader.define .input.define + +urcu_progress_reader_ltl: + touch .input.define + cat .input.define > pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl + +urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ + urcu_progress_writer_error_define run_weak_fair + cp .input.spin $@.spin.input + -cp .input.spin.trail $@.spin.input.trail + +urcu_progress_writer_error_define: + cp urcu_progress_writer_error.define .input.define + +urcu_progress_writer_error_ltl: + touch .input.define + cat .input.define > pan.ltl + cat DEFINES >> pan.ltl + spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl + + +run_weak_fair: pan + ./pan -a -f -v -c1 -X -m10000000 -w20 + +run: pan + ./pan -a -v -c1 -X -m10000000 -w20 + +pan: pan.c + gcc -O2 -w ${CFLAGS} -o pan pan.c + +pan.c: pan.ltl ${SPINFILE} + cat .input.define > .input.spin + cat DEFINES >> .input.spin + cat ${SPINFILE} >> .input.spin + rm -f .input.spin.trail + spin -a -X -N pan.ltl .input.spin + +.PHONY: clean default distclean summary +clean: + rm -f pan* trail.out .input.spin* *.spin.trail .input.define +distclean: + rm -f *.trail *.input *.log diff --git a/formal-model/urcu/result-standard-execution-nonest/asserts.log b/formal-model/urcu/result-standard-execution-nonest/asserts.log new file mode 100644 index 0000000..1071a7a --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/asserts.log @@ -0,0 +1,246 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +cat DEFINES > .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -DSAFETY -o pan pan.c +./pan -v -c1 -X -m10000000 -w20 + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim - (none specified) + assertion violations + + cycle checks - (disabled by -DSAFETY) + invalid end states + + +State-vector 48 byte, depth reached 2084, errors: 0 + 847558 states, stored + 9221089 states, matched + 10068647 transitions (= stored+matched) + 36786866 atomic steps +hash conflicts: 2126850 (resolved) + +Stats on memory usage (in Megabytes): + 61.430 equivalent memory usage for states (stored*(State-vector + overhead)) + 45.632 actual memory usage for states (compression: 74.28%) + state-vector as stored = 28 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 511.369 total actual memory usage + +unreached in proctype urcu_reader + line 398, ".input.spin", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 407, ".input.spin", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, ".input.spin", state 61, "(1)" + line 417, ".input.spin", state 91, "(1)" + line 398, ".input.spin", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 407, ".input.spin", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, ".input.spin", state 151, "(1)" + line 417, ".input.spin", state 181, "(1)" + line 398, ".input.spin", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 407, ".input.spin", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, ".input.spin", state 242, "(1)" + line 417, ".input.spin", state 272, "(1)" + line 398, ".input.spin", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 407, ".input.spin", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, ".input.spin", state 360, "(1)" + line 417, ".input.spin", state 390, "(1)" + line 539, ".input.spin", state 414, "-end-" + (17 of 414 states) +unreached in proctype urcu_writer + line 398, ".input.spin", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 402, ".input.spin", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 407, ".input.spin", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, ".input.spin", state 59, "(1)" + line 412, ".input.spin", state 72, "(1)" + line 417, ".input.spin", state 89, "(1)" + line 398, ".input.spin", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 402, ".input.spin", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, ".input.spin", state 153, "(1)" + line 412, ".input.spin", state 166, "(1)" + line 651, ".input.spin", state 199, "(1)" + line 174, ".input.spin", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 178, ".input.spin", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 159, ".input.spin", state 240, "(1)" + line 163, ".input.spin", state 248, "(1)" + line 167, ".input.spin", state 260, "(1)" + line 174, ".input.spin", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 407, ".input.spin", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, ".input.spin", state 927, "(1)" + line 408, ".input.spin", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 408, ".input.spin", state 928, "else" + line 408, ".input.spin", state 931, "(1)" + line 408, ".input.spin", state 932, "(1)" + line 408, ".input.spin", state 932, "(1)" + line 412, ".input.spin", state 940, "(1)" + line 412, ".input.spin", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 412, ".input.spin", state 941, "else" + line 412, ".input.spin", state 944, "(1)" + line 412, ".input.spin", state 945, "(1)" + line 412, ".input.spin", state 945, "(1)" + line 410, ".input.spin", state 950, "((i<1))" + line 410, ".input.spin", state 950, "((i>=1))" + line 417, ".input.spin", state 957, "(1)" + line 417, ".input.spin", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 417, ".input.spin", state 958, "else" + line 417, ".input.spin", state 961, "(1)" + line 417, ".input.spin", state 962, "(1)" + line 417, ".input.spin", state 962, "(1)" + line 419, ".input.spin", state 965, "(1)" + line 419, ".input.spin", state 965, "(1)" + line 402, ".input.spin", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 407, ".input.spin", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 412, ".input.spin", state 1040, "(1)" + line 417, ".input.spin", state 1057, "(1)" + line 402, ".input.spin", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 407, ".input.spin", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 412, ".input.spin", state 1130, "(1)" + line 417, ".input.spin", state 1147, "(1)" + line 398, ".input.spin", state 1166, "(1)" + line 402, ".input.spin", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 407, ".input.spin", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 412, ".input.spin", state 1222, "(1)" + line 417, ".input.spin", state 1239, "(1)" + line 402, ".input.spin", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 407, ".input.spin", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 412, ".input.spin", state 1315, "(1)" + line 417, ".input.spin", state 1332, "(1)" + line 178, ".input.spin", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 182, ".input.spin", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 159, ".input.spin", state 1378, "(1)" + line 163, ".input.spin", state 1386, "(1)" + line 167, ".input.spin", state 1398, "(1)" + line 174, ".input.spin", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 407, ".input.spin", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, ".input.spin", state 1595, "(1)" + line 408, ".input.spin", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 408, ".input.spin", state 1596, "else" + line 408, ".input.spin", state 1599, "(1)" + line 408, ".input.spin", state 1600, "(1)" + line 408, ".input.spin", state 1600, "(1)" + line 412, ".input.spin", state 1608, "(1)" + line 412, ".input.spin", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 412, ".input.spin", state 1609, "else" + line 412, ".input.spin", state 1612, "(1)" + line 412, ".input.spin", state 1613, "(1)" + line 412, ".input.spin", state 1613, "(1)" + line 410, ".input.spin", state 1618, "((i<1))" + line 410, ".input.spin", state 1618, "((i>=1))" + line 417, ".input.spin", state 1625, "(1)" + line 417, ".input.spin", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 417, ".input.spin", state 1626, "else" + line 417, ".input.spin", state 1629, "(1)" + line 417, ".input.spin", state 1630, "(1)" + line 417, ".input.spin", state 1630, "(1)" + line 419, ".input.spin", state 1633, "(1)" + line 419, ".input.spin", state 1633, "(1)" + line 178, ".input.spin", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 182, ".input.spin", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 159, ".input.spin", state 1681, "(1)" + line 163, ".input.spin", state 1689, "(1)" + line 167, ".input.spin", state 1701, "(1)" + line 174, ".input.spin", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-standard-execution-nonest/asserts.spin.input.trail b/formal-model/urcu/result-standard-execution-nonest/asserts.spin.input.trail new file mode 100644 index 0000000..287e52a --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/asserts.spin.input.trail @@ -0,0 +1,6 @@ +-4:-4:-4 +1:0:2673 +2:0:2674 +3:0:2675 +4:0:2676 +5:4:1129 diff --git a/formal-model/urcu/result-standard-execution-nonest/references.txt b/formal-model/urcu/result-standard-execution-nonest/references.txt new file mode 100644 index 0000000..72c67a2 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/references.txt @@ -0,0 +1,13 @@ +http://spinroot.com/spin/Man/ltl.html +http://en.wikipedia.org/wiki/Linear_temporal_logic +http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt + +http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php +http://spinroot.com/spin/Man/index.html +http://spinroot.com/spin/Man/promela.html + +LTL vs CTL : + +http://spinroot.com/spin/Doc/course/lecture12.pdf p. 9, p. 15, p. 18 +http://www-i2.informatik.rwth-aachen.de/i2/fileadmin/user_upload/documents/Introduction_to_Model_Checking/mc_lec18.pdf + (downloaded) diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu.sh b/formal-model/urcu/result-standard-execution-nonest/urcu.sh new file mode 100644 index 0000000..65ff517 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu.sh @@ -0,0 +1,29 @@ +#!/bin/sh +# +# Compiles and runs the urcu.spin Promela model. +# +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Copyright (C) IBM Corporation, 2009 +# Mathieu Desnoyers, 2009 +# +# Authors: Paul E. McKenney +# Mathieu Desnoyers + +# Basic execution, without LTL clauses. See Makefile. + +spin -a urcu.spin +cc -DSAFETY -o pan pan.c +./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu.spin b/formal-model/urcu/result-standard-execution-nonest/urcu.spin new file mode 100644 index 0000000..2cfcb70 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu.spin @@ -0,0 +1,705 @@ +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free.log b/formal-model/urcu/result-standard-execution-nonest/urcu_free.log new file mode 100644 index 0000000..00b1f6c --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free.log @@ -0,0 +1,257 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 743) + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 2560, errors: 0 + 954166 states, stored + 10460008 states, matched + 11414174 transitions (= stored+matched) + 41707752 atomic steps +hash conflicts: 2907736 (resolved) + +Stats on memory usage (in Megabytes): + 76.437 equivalent memory usage for states (stored*(State-vector + overhead)) + 58.605 actual memory usage for states (compression: 76.67%) + state-vector as stored = 36 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 524.358 total actual memory usage + +unreached in proctype urcu_reader + line 398, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 407, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 61, "(1)" + line 417, "pan.___", state 91, "(1)" + line 398, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 407, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 151, "(1)" + line 417, "pan.___", state 181, "(1)" + line 398, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 407, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 242, "(1)" + line 417, "pan.___", state 272, "(1)" + line 398, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 407, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 360, "(1)" + line 417, "pan.___", state 390, "(1)" + line 539, "pan.___", state 414, "-end-" + (17 of 414 states) +unreached in proctype urcu_writer + line 398, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 402, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 407, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 59, "(1)" + line 412, "pan.___", state 72, "(1)" + line 417, "pan.___", state 89, "(1)" + line 398, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 402, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 153, "(1)" + line 412, "pan.___", state 166, "(1)" + line 651, "pan.___", state 199, "(1)" + line 174, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 178, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 159, "pan.___", state 240, "(1)" + line 163, "pan.___", state 248, "(1)" + line 167, "pan.___", state 260, "(1)" + line 174, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 407, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 927, "(1)" + line 408, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 408, "pan.___", state 928, "else" + line 408, "pan.___", state 931, "(1)" + line 408, "pan.___", state 932, "(1)" + line 408, "pan.___", state 932, "(1)" + line 412, "pan.___", state 940, "(1)" + line 412, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 412, "pan.___", state 941, "else" + line 412, "pan.___", state 944, "(1)" + line 412, "pan.___", state 945, "(1)" + line 412, "pan.___", state 945, "(1)" + line 410, "pan.___", state 950, "((i<1))" + line 410, "pan.___", state 950, "((i>=1))" + line 417, "pan.___", state 957, "(1)" + line 417, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 417, "pan.___", state 958, "else" + line 417, "pan.___", state 961, "(1)" + line 417, "pan.___", state 962, "(1)" + line 417, "pan.___", state 962, "(1)" + line 419, "pan.___", state 965, "(1)" + line 419, "pan.___", state 965, "(1)" + line 402, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 407, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 412, "pan.___", state 1040, "(1)" + line 417, "pan.___", state 1057, "(1)" + line 402, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 407, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 412, "pan.___", state 1130, "(1)" + line 417, "pan.___", state 1147, "(1)" + line 398, "pan.___", state 1166, "(1)" + line 402, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 407, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 412, "pan.___", state 1222, "(1)" + line 417, "pan.___", state 1239, "(1)" + line 402, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 407, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 412, "pan.___", state 1315, "(1)" + line 417, "pan.___", state 1332, "(1)" + line 178, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 182, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 159, "pan.___", state 1378, "(1)" + line 163, "pan.___", state 1386, "(1)" + line 167, "pan.___", state 1398, "(1)" + line 174, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 407, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1595, "(1)" + line 408, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 408, "pan.___", state 1596, "else" + line 408, "pan.___", state 1599, "(1)" + line 408, "pan.___", state 1600, "(1)" + line 408, "pan.___", state 1600, "(1)" + line 412, "pan.___", state 1608, "(1)" + line 412, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 412, "pan.___", state 1609, "else" + line 412, "pan.___", state 1612, "(1)" + line 412, "pan.___", state 1613, "(1)" + line 412, "pan.___", state 1613, "(1)" + line 410, "pan.___", state 1618, "((i<1))" + line 410, "pan.___", state 1618, "((i>=1))" + line 417, "pan.___", state 1625, "(1)" + line 417, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 417, "pan.___", state 1626, "else" + line 417, "pan.___", state 1629, "(1)" + line 417, "pan.___", state 1630, "(1)" + line 417, "pan.___", state 1630, "(1)" + line 419, "pan.___", state 1633, "(1)" + line 419, "pan.___", state 1633, "(1)" + line 178, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 182, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 159, "pan.___", state 1681, "(1)" + line 163, "pan.___", state 1689, "(1)" + line 167, "pan.___", state 1701, "(1)" + line 174, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< !read_free_race) diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free.spin.input b/formal-model/urcu/result-standard-execution-nonest/urcu_free.spin.input new file mode 100644 index 0000000..e17e80e --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free.spin.input @@ -0,0 +1,722 @@ + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +//#define TEST_SIGNAL +//#define TEST_SIGNAL_ON_READ +//#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 1 +//#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free.spin.input.trail b/formal-model/urcu/result-standard-execution-nonest/urcu_free.spin.input.trail new file mode 100644 index 0000000..837f3d9 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free.spin.input.trail @@ -0,0 +1,15043 @@ +-2:4:-2 +-4:-4:-4 +1:0:4365 +2:4:4317 +3:4:4320 +4:4:4320 +5:4:4320 +6:4:4323 +7:4:4331 +8:4:4331 +9:4:4331 +10:4:4334 +11:4:4340 +12:4:4344 +13:4:4344 +14:4:4344 +15:4:4347 +16:4:4340 +17:4:4344 +18:4:4344 +19:4:4344 +20:4:4347 +21:4:4355 +22:4:4359 +23:4:4360 +24:0:4365 +25:4:4362 +26:0:4365 +27:3:2331 +28:0:4365 +29:3:2337 +30:0:4365 +31:3:2338 +32:0:4365 +33:3:2339 +34:3:2343 +35:3:2344 +36:3:2352 +37:3:2353 +38:3:2357 +39:3:2358 +40:3:2352 +41:3:2353 +42:3:2357 +43:3:2358 +44:3:2366 +45:3:2371 +46:3:2375 +47:3:2376 +48:3:2383 +49:3:2384 +50:3:2395 +51:3:2396 +52:3:2397 +53:3:2395 +54:3:2396 +55:3:2397 +56:3:2408 +57:3:2413 +58:3:2414 +59:0:4365 +60:3:2426 +61:0:4365 +62:3:2427 +63:0:4365 +64:2:1162 +65:0:4365 +66:3:2428 +67:0:4365 +68:2:1168 +69:0:4365 +70:2:1169 +71:0:4365 +72:3:2427 +73:0:4365 +74:2:1170 +75:0:4365 +76:3:2428 +77:0:4365 +78:3:2429 +79:0:4365 +80:3:2435 +81:3:2436 +82:0:4365 +83:3:2440 +84:3:2444 +85:3:2445 +86:3:2453 +87:3:2454 +88:3:2458 +89:3:2459 +90:3:2453 +91:3:2454 +92:3:2458 +93:3:2459 +94:3:2467 +95:3:2472 +96:3:2473 +97:3:2484 +98:3:2485 +99:3:2496 +100:3:2497 +101:3:2498 +102:3:2496 +103:3:2497 +104:3:2498 +105:3:2509 +106:3:2514 +107:3:2515 +108:0:4365 +109:3:2527 +110:0:4365 +111:3:2528 +112:0:4365 +113:2:1173 +114:0:4365 +115:3:2529 +116:0:4365 +117:2:1179 +118:0:4365 +119:2:1180 +120:0:4365 +121:3:2528 +122:0:4365 +123:2:1181 +124:2:1185 +125:2:1186 +126:2:1194 +127:2:1195 +128:2:1199 +129:2:1200 +130:2:1194 +131:2:1195 +132:2:1199 +133:2:1200 +134:2:1208 +135:2:1213 +136:2:1217 +137:2:1218 +138:2:1225 +139:2:1226 +140:2:1237 +141:2:1238 +142:2:1239 +143:2:1237 +144:2:1238 +145:2:1239 +146:2:1250 +147:2:1255 +148:2:1256 +149:0:4365 +150:3:2529 +151:0:4365 +152:2:1268 +153:0:4365 +154:3:2528 +155:0:4365 +156:2:1270 +157:0:4365 +158:3:2529 +159:0:4365 +160:2:1271 +161:2:1275 +162:2:1276 +163:2:1284 +164:2:1285 +165:2:1289 +166:2:1290 +167:2:1284 +168:2:1285 +169:2:1289 +170:2:1290 +171:2:1298 +172:2:1303 +173:2:1307 +174:2:1308 +175:2:1315 +176:2:1316 +177:2:1327 +178:2:1328 +179:2:1329 +180:2:1327 +181:2:1328 +182:2:1329 +183:2:1340 +184:2:1345 +185:2:1346 +186:0:4365 +187:2:1358 +188:0:4365 +189:2:1360 +190:0:4365 +191:3:2528 +192:0:4365 +193:2:1361 +194:0:4365 +195:3:2529 +196:0:4365 +197:2:1362 +198:2:1366 +199:2:1367 +200:2:1375 +201:2:1376 +202:2:1380 +203:2:1381 +204:2:1375 +205:2:1376 +206:2:1380 +207:2:1381 +208:2:1389 +209:2:1394 +210:2:1398 +211:2:1399 +212:2:1406 +213:2:1407 +214:2:1418 +215:2:1419 +216:2:1420 +217:2:1418 +218:2:1419 +219:2:1420 +220:2:1431 +221:2:1436 +222:2:1437 +223:0:4365 +224:2:1449 +225:0:4365 +226:3:2528 +227:0:4365 +228:2:1451 +229:0:4365 +230:3:2529 +231:0:4365 +232:2:1652 +233:0:4365 +234:2:1653 +235:0:4365 +236:2:1657 +237:0:4365 +238:2:1180 +239:0:4365 +240:3:2528 +241:0:4365 +242:2:1181 +243:2:1185 +244:2:1186 +245:2:1194 +246:2:1195 +247:2:1199 +248:2:1200 +249:2:1194 +250:2:1195 +251:2:1196 +252:2:1208 +253:2:1213 +254:2:1217 +255:2:1218 +256:2:1225 +257:2:1226 +258:2:1237 +259:2:1238 +260:2:1239 +261:2:1237 +262:2:1238 +263:2:1239 +264:2:1250 +265:2:1255 +266:2:1256 +267:0:4365 +268:3:2529 +269:0:4365 +270:2:1268 +271:0:4365 +272:3:2528 +273:0:4365 +274:2:1270 +275:0:4365 +276:3:2529 +277:0:4365 +278:2:1271 +279:2:1275 +280:2:1276 +281:2:1284 +282:2:1285 +283:2:1289 +284:2:1290 +285:2:1284 +286:2:1285 +287:2:1289 +288:2:1290 +289:2:1298 +290:2:1303 +291:2:1307 +292:2:1308 +293:2:1315 +294:2:1316 +295:2:1327 +296:2:1328 +297:2:1329 +298:2:1327 +299:2:1328 +300:2:1329 +301:2:1340 +302:2:1345 +303:2:1346 +304:0:4365 +305:2:1358 +306:0:4365 +307:2:1454 +308:0:4365 +309:3:2528 +310:0:4365 +311:2:1455 +312:0:4365 +313:3:2529 +314:0:4365 +315:2:1652 +316:0:4365 +317:2:1653 +318:0:4365 +319:2:1657 +320:0:4365 +321:2:1660 +322:0:4365 +323:3:2528 +324:0:4365 +325:2:1665 +326:2:1669 +327:2:1670 +328:2:1678 +329:2:1679 +330:2:1683 +331:2:1684 +332:2:1678 +333:2:1679 +334:2:1680 +335:2:1692 +336:2:1697 +337:2:1701 +338:2:1702 +339:2:1709 +340:2:1710 +341:2:1721 +342:2:1722 +343:2:1723 +344:2:1721 +345:2:1722 +346:2:1723 +347:2:1734 +348:2:1739 +349:2:1740 +350:0:4365 +351:3:2529 +352:0:4365 +353:2:1752 +354:0:4365 +355:3:2528 +356:0:4365 +357:2:1754 +358:0:4365 +359:3:2529 +360:0:4365 +361:2:1755 +362:2:1759 +363:2:1760 +364:2:1768 +365:2:1769 +366:2:1773 +367:2:1774 +368:2:1768 +369:2:1769 +370:2:1773 +371:2:1774 +372:2:1782 +373:2:1787 +374:2:1791 +375:2:1792 +376:2:1799 +377:2:1800 +378:2:1811 +379:2:1812 +380:2:1813 +381:2:1811 +382:2:1812 +383:2:1813 +384:2:1824 +385:2:1829 +386:2:1830 +387:0:4365 +388:2:1842 +389:0:4365 +390:3:2528 +391:0:4365 +392:2:1844 +393:0:4365 +394:3:2529 +395:0:4365 +396:2:1845 +397:2:1849 +398:2:1850 +399:2:1858 +400:2:1859 +401:2:1863 +402:2:1864 +403:2:1858 +404:2:1859 +405:2:1863 +406:2:1864 +407:2:1872 +408:2:1877 +409:2:1881 +410:2:1882 +411:2:1889 +412:2:1890 +413:2:1901 +414:2:1902 +415:2:1903 +416:2:1901 +417:2:1902 +418:2:1903 +419:2:1914 +420:2:1919 +421:2:1920 +422:0:4365 +423:2:1932 +424:0:4365 +425:3:2528 +426:0:4365 +427:2:1934 +428:0:4365 +429:3:2529 +430:0:4365 +431:2:1935 +432:0:4365 +433:2:1936 +434:0:4365 +435:2:2129 +436:0:4365 +437:2:2130 +438:0:4365 +439:2:2134 +440:0:4365 +441:3:2528 +442:0:4365 +443:2:2136 +444:0:4365 +445:3:2529 +446:0:4365 +447:2:2137 +448:2:2141 +449:2:2142 +450:2:2150 +451:2:2151 +452:2:2155 +453:2:2156 +454:2:2150 +455:2:2151 +456:2:2155 +457:2:2156 +458:2:2164 +459:2:2169 +460:2:2173 +461:2:2174 +462:2:2181 +463:2:2182 +464:2:2193 +465:2:2194 +466:2:2195 +467:2:2193 +468:2:2194 +469:2:2195 +470:2:2206 +471:2:2211 +472:2:2212 +473:0:4365 +474:2:2224 +475:0:4365 +476:3:2528 +477:0:4365 +478:2:2226 +479:0:4365 +480:3:2529 +481:0:4365 +482:2:1936 +483:0:4365 +484:2:2129 +485:0:4365 +486:2:2130 +487:0:4365 +488:2:2134 +489:0:4365 +490:3:2528 +491:0:4365 +492:2:2136 +493:0:4365 +494:3:2529 +495:0:4365 +496:2:2137 +497:2:2141 +498:2:2142 +499:2:2150 +500:2:2151 +501:2:2155 +502:2:2156 +503:2:2150 +504:2:2151 +505:2:2152 +506:2:2164 +507:2:2169 +508:2:2173 +509:2:2174 +510:2:2181 +511:2:2182 +512:2:2193 +513:2:2194 +514:2:2195 +515:2:2193 +516:2:2194 +517:2:2195 +518:2:2206 +519:2:2211 +520:2:2212 +521:0:4365 +522:2:2224 +523:0:4365 +524:3:2528 +525:0:4365 +526:2:2226 +527:0:4365 +528:3:2529 +529:0:4365 +530:2:2230 +531:0:4365 +532:3:2528 +533:0:4365 +534:2:2235 +535:2:2239 +536:2:2240 +537:2:2248 +538:2:2249 +539:2:2253 +540:2:2254 +541:2:2248 +542:2:2249 +543:2:2250 +544:2:2262 +545:2:2267 +546:2:2271 +547:2:2272 +548:2:2279 +549:2:2280 +550:2:2291 +551:2:2292 +552:2:2293 +553:2:2291 +554:2:2292 +555:2:2293 +556:2:2304 +557:2:2309 +558:2:2310 +559:0:4365 +560:3:2529 +561:0:4365 +562:2:2322 +563:0:4365 +564:2:1169 +565:0:4365 +566:3:2528 +567:0:4365 +568:2:1170 +569:0:4365 +570:3:2529 +571:0:4365 +572:3:2530 +573:0:4365 +574:3:2536 +575:0:4365 +576:3:2537 +577:0:4365 +578:3:2547 +579:0:4365 +580:3:2548 +581:0:4365 +582:3:2552 +583:3:2553 +584:3:2557 +585:3:2561 +586:3:2562 +587:3:2557 +588:3:2561 +589:3:2562 +590:3:2566 +591:3:2574 +592:3:2575 +593:3:2580 +594:3:2587 +595:3:2588 +596:3:2587 +597:3:2588 +598:3:2595 +599:3:2600 +600:0:4365 +601:3:2611 +602:0:4365 +603:3:2615 +604:3:2616 +605:3:2620 +606:3:2624 +607:3:2625 +608:3:2620 +609:3:2624 +610:3:2625 +611:3:2629 +612:3:2637 +613:3:2638 +614:3:2643 +615:3:2650 +616:3:2651 +617:3:2650 +618:3:2651 +619:3:2658 +620:3:2663 +621:0:4365 +622:3:2611 +623:0:4365 +624:3:2615 +625:3:2616 +626:3:2620 +627:3:2624 +628:3:2625 +629:3:2620 +630:3:2624 +631:3:2625 +632:3:2629 +633:3:2637 +634:3:2638 +635:3:2643 +636:3:2650 +637:3:2651 +638:3:2650 +639:3:2651 +640:3:2658 +641:3:2663 +642:0:4365 +643:3:2674 +644:0:4365 +645:3:2682 +646:3:2683 +647:3:2687 +648:3:2691 +649:3:2692 +650:3:2687 +651:3:2691 +652:3:2692 +653:3:2696 +654:3:2704 +655:3:2705 +656:3:2710 +657:3:2717 +658:3:2718 +659:3:2717 +660:3:2718 +661:3:2725 +662:3:2730 +663:0:4365 +664:3:2745 +665:0:4365 +666:3:2746 +667:0:4365 +668:2:1173 +669:0:4365 +670:3:2747 +671:0:4365 +672:2:1179 +673:0:4365 +674:2:1180 +675:0:4365 +676:3:2746 +677:0:4365 +678:2:1181 +679:2:1185 +680:2:1186 +681:2:1194 +682:2:1195 +683:2:1199 +684:2:1200 +685:2:1194 +686:2:1195 +687:2:1199 +688:2:1200 +689:2:1208 +690:2:1213 +691:2:1217 +692:2:1218 +693:2:1225 +694:2:1226 +695:2:1237 +696:2:1238 +697:2:1239 +698:2:1237 +699:2:1238 +700:2:1239 +701:2:1250 +702:2:1255 +703:2:1256 +704:0:4365 +705:3:2747 +706:0:4365 +707:2:1268 +708:0:4365 +709:3:2746 +710:0:4365 +711:2:1270 +712:0:4365 +713:3:2747 +714:0:4365 +715:2:1271 +716:2:1275 +717:2:1276 +718:2:1284 +719:2:1285 +720:2:1289 +721:2:1290 +722:2:1284 +723:2:1285 +724:2:1289 +725:2:1290 +726:2:1298 +727:2:1303 +728:2:1307 +729:2:1308 +730:2:1315 +731:2:1316 +732:2:1327 +733:2:1328 +734:2:1329 +735:2:1327 +736:2:1328 +737:2:1329 +738:2:1340 +739:2:1345 +740:2:1346 +741:0:4365 +742:2:1358 +743:0:4365 +744:2:1360 +745:0:4365 +746:3:2746 +747:0:4365 +748:2:1361 +749:0:4365 +750:3:2747 +751:0:4365 +752:2:1362 +753:2:1366 +754:2:1367 +755:2:1375 +756:2:1376 +757:2:1380 +758:2:1381 +759:2:1375 +760:2:1376 +761:2:1380 +762:2:1381 +763:2:1389 +764:2:1394 +765:2:1398 +766:2:1399 +767:2:1406 +768:2:1407 +769:2:1418 +770:2:1419 +771:2:1420 +772:2:1418 +773:2:1419 +774:2:1420 +775:2:1431 +776:2:1436 +777:2:1437 +778:0:4365 +779:2:1449 +780:0:4365 +781:3:2746 +782:0:4365 +783:2:1451 +784:0:4365 +785:3:2747 +786:0:4365 +787:2:1652 +788:0:4365 +789:2:1653 +790:0:4365 +791:2:1657 +792:0:4365 +793:2:1180 +794:0:4365 +795:3:2746 +796:0:4365 +797:2:1181 +798:2:1185 +799:2:1186 +800:2:1194 +801:2:1195 +802:2:1199 +803:2:1200 +804:2:1194 +805:2:1195 +806:2:1196 +807:2:1208 +808:2:1213 +809:2:1217 +810:2:1218 +811:2:1225 +812:2:1226 +813:2:1237 +814:2:1238 +815:2:1239 +816:2:1237 +817:2:1238 +818:2:1239 +819:2:1250 +820:2:1255 +821:2:1256 +822:0:4365 +823:3:2747 +824:0:4365 +825:2:1268 +826:0:4365 +827:3:2746 +828:0:4365 +829:2:1270 +830:0:4365 +831:3:2747 +832:0:4365 +833:2:1271 +834:2:1275 +835:2:1276 +836:2:1284 +837:2:1285 +838:2:1289 +839:2:1290 +840:2:1284 +841:2:1285 +842:2:1289 +843:2:1290 +844:2:1298 +845:2:1303 +846:2:1307 +847:2:1308 +848:2:1315 +849:2:1316 +850:2:1327 +851:2:1328 +852:2:1329 +853:2:1327 +854:2:1328 +855:2:1329 +856:2:1340 +857:2:1345 +858:2:1346 +859:0:4365 +860:2:1358 +861:0:4365 +862:2:1454 +863:0:4365 +864:3:2746 +865:0:4365 +866:2:1455 +867:0:4365 +868:3:2747 +869:0:4365 +870:2:1652 +871:0:4365 +872:2:1653 +873:0:4365 +874:2:1657 +875:0:4365 +876:2:1660 +877:0:4365 +878:3:2746 +879:0:4365 +880:2:1665 +881:2:1669 +882:2:1670 +883:2:1678 +884:2:1679 +885:2:1683 +886:2:1684 +887:2:1678 +888:2:1679 +889:2:1680 +890:2:1692 +891:2:1697 +892:2:1701 +893:2:1702 +894:2:1709 +895:2:1710 +896:2:1721 +897:2:1722 +898:2:1723 +899:2:1721 +900:2:1722 +901:2:1723 +902:2:1734 +903:2:1739 +904:2:1740 +905:0:4365 +906:3:2747 +907:0:4365 +908:2:1752 +909:0:4365 +910:3:2746 +911:0:4365 +912:2:1754 +913:0:4365 +914:3:2747 +915:0:4365 +916:2:1755 +917:2:1759 +918:2:1760 +919:2:1768 +920:2:1769 +921:2:1773 +922:2:1774 +923:2:1768 +924:2:1769 +925:2:1773 +926:2:1774 +927:2:1782 +928:2:1787 +929:2:1791 +930:2:1792 +931:2:1799 +932:2:1800 +933:2:1811 +934:2:1812 +935:2:1813 +936:2:1811 +937:2:1812 +938:2:1813 +939:2:1824 +940:2:1829 +941:2:1830 +942:0:4365 +943:2:1842 +944:0:4365 +945:3:2746 +946:0:4365 +947:2:1844 +948:0:4365 +949:3:2747 +950:0:4365 +951:2:1845 +952:2:1849 +953:2:1850 +954:2:1858 +955:2:1859 +956:2:1863 +957:2:1864 +958:2:1858 +959:2:1859 +960:2:1863 +961:2:1864 +962:2:1872 +963:2:1877 +964:2:1881 +965:2:1882 +966:2:1889 +967:2:1890 +968:2:1901 +969:2:1902 +970:2:1903 +971:2:1901 +972:2:1902 +973:2:1903 +974:2:1914 +975:2:1919 +976:2:1920 +977:0:4365 +978:2:1932 +979:0:4365 +980:3:2746 +981:0:4365 +982:2:1934 +983:0:4365 +984:3:2747 +985:0:4365 +986:2:1935 +987:0:4365 +988:2:1936 +989:0:4365 +990:2:2129 +991:0:4365 +992:2:2130 +993:0:4365 +994:2:2134 +995:0:4365 +996:3:2746 +997:0:4365 +998:2:2136 +999:0:4365 +1000:3:2747 +1001:0:4365 +1002:2:2137 +1003:2:2141 +1004:2:2142 +1005:2:2150 +1006:2:2151 +1007:2:2155 +1008:2:2156 +1009:2:2150 +1010:2:2151 +1011:2:2155 +1012:2:2156 +1013:2:2164 +1014:2:2169 +1015:2:2173 +1016:2:2174 +1017:2:2181 +1018:2:2182 +1019:2:2193 +1020:2:2194 +1021:2:2195 +1022:2:2193 +1023:2:2194 +1024:2:2195 +1025:2:2206 +1026:2:2211 +1027:2:2212 +1028:0:4365 +1029:2:2224 +1030:0:4365 +1031:3:2746 +1032:0:4365 +1033:2:2226 +1034:0:4365 +1035:3:2747 +1036:0:4365 +1037:2:1936 +1038:0:4365 +1039:2:2129 +1040:0:4365 +1041:2:2130 +1042:0:4365 +1043:2:2134 +1044:0:4365 +1045:3:2746 +1046:0:4365 +1047:2:2136 +1048:0:4365 +1049:3:2747 +1050:0:4365 +1051:2:2137 +1052:2:2141 +1053:2:2142 +1054:2:2150 +1055:2:2151 +1056:2:2155 +1057:2:2156 +1058:2:2150 +1059:2:2151 +1060:2:2152 +1061:2:2164 +1062:2:2169 +1063:2:2173 +1064:2:2174 +1065:2:2181 +1066:2:2182 +1067:2:2193 +1068:2:2194 +1069:2:2195 +1070:2:2193 +1071:2:2194 +1072:2:2195 +1073:2:2206 +1074:2:2211 +1075:2:2212 +1076:0:4365 +1077:2:2224 +1078:0:4365 +1079:3:2746 +1080:0:4365 +1081:2:2226 +1082:0:4365 +1083:3:2747 +1084:0:4365 +1085:2:2230 +1086:0:4365 +1087:3:2746 +1088:0:4365 +1089:2:2235 +1090:2:2239 +1091:2:2240 +1092:2:2248 +1093:2:2249 +1094:2:2253 +1095:2:2254 +1096:2:2248 +1097:2:2249 +1098:2:2250 +1099:2:2262 +1100:2:2267 +1101:2:2271 +1102:2:2272 +1103:2:2279 +1104:2:2280 +1105:2:2291 +1106:2:2292 +1107:2:2293 +1108:2:2291 +1109:2:2292 +1110:2:2293 +1111:2:2304 +1112:2:2309 +1113:2:2310 +1114:0:4365 +1115:3:2747 +1116:0:4365 +1117:2:2322 +1118:0:4365 +1119:2:1169 +1120:0:4365 +1121:3:2746 +1122:0:4365 +1123:2:1170 +1124:0:4365 +1125:3:2747 +1126:0:4365 +1127:3:2748 +1128:0:4365 +1129:3:2754 +1130:0:4365 +1131:3:2755 +1132:3:2759 +1133:3:2760 +1134:3:2768 +1135:3:2769 +1136:3:2773 +1137:3:2774 +1138:3:2768 +1139:3:2769 +1140:3:2773 +1141:3:2774 +1142:3:2782 +1143:3:2787 +1144:3:2791 +1145:3:2792 +1146:3:2799 +1147:3:2800 +1148:3:2811 +1149:3:2812 +1150:3:2813 +1151:3:2811 +1152:3:2812 +1153:3:2813 +1154:3:2824 +1155:3:2829 +1156:3:2830 +1157:0:4365 +1158:3:2842 +1159:0:4365 +1160:3:2843 +1161:0:4365 +1162:2:1173 +1163:0:4365 +1164:3:2844 +1165:0:4365 +1166:2:1179 +1167:0:4365 +1168:2:1180 +1169:0:4365 +1170:3:2843 +1171:0:4365 +1172:2:1181 +1173:2:1185 +1174:2:1186 +1175:2:1194 +1176:2:1195 +1177:2:1199 +1178:2:1200 +1179:2:1194 +1180:2:1195 +1181:2:1199 +1182:2:1200 +1183:2:1208 +1184:2:1213 +1185:2:1217 +1186:2:1218 +1187:2:1225 +1188:2:1226 +1189:2:1237 +1190:2:1238 +1191:2:1239 +1192:2:1237 +1193:2:1238 +1194:2:1239 +1195:2:1250 +1196:2:1255 +1197:2:1256 +1198:0:4365 +1199:3:2844 +1200:0:4365 +1201:2:1268 +1202:0:4365 +1203:3:2843 +1204:0:4365 +1205:2:1270 +1206:0:4365 +1207:3:2844 +1208:0:4365 +1209:2:1271 +1210:2:1275 +1211:2:1276 +1212:2:1284 +1213:2:1285 +1214:2:1289 +1215:2:1290 +1216:2:1284 +1217:2:1285 +1218:2:1289 +1219:2:1290 +1220:2:1298 +1221:2:1303 +1222:2:1307 +1223:2:1308 +1224:2:1315 +1225:2:1316 +1226:2:1327 +1227:2:1328 +1228:2:1329 +1229:2:1327 +1230:2:1328 +1231:2:1329 +1232:2:1340 +1233:2:1345 +1234:2:1346 +1235:0:4365 +1236:2:1358 +1237:0:4365 +1238:2:1360 +1239:0:4365 +1240:3:2843 +1241:0:4365 +1242:2:1361 +1243:0:4365 +1244:3:2844 +1245:0:4365 +1246:2:1362 +1247:2:1366 +1248:2:1367 +1249:2:1375 +1250:2:1376 +1251:2:1380 +1252:2:1381 +1253:2:1375 +1254:2:1376 +1255:2:1380 +1256:2:1381 +1257:2:1389 +1258:2:1394 +1259:2:1398 +1260:2:1399 +1261:2:1406 +1262:2:1407 +1263:2:1418 +1264:2:1419 +1265:2:1420 +1266:2:1418 +1267:2:1419 +1268:2:1420 +1269:2:1431 +1270:2:1436 +1271:2:1437 +1272:0:4365 +1273:2:1449 +1274:0:4365 +1275:3:2843 +1276:0:4365 +1277:2:1451 +1278:0:4365 +1279:3:2844 +1280:0:4365 +1281:2:1652 +1282:0:4365 +1283:2:1653 +1284:0:4365 +1285:2:1657 +1286:0:4365 +1287:2:1180 +1288:0:4365 +1289:3:2843 +1290:0:4365 +1291:2:1181 +1292:2:1185 +1293:2:1186 +1294:2:1194 +1295:2:1195 +1296:2:1199 +1297:2:1200 +1298:2:1194 +1299:2:1195 +1300:2:1196 +1301:2:1208 +1302:2:1213 +1303:2:1217 +1304:2:1218 +1305:2:1225 +1306:2:1226 +1307:2:1237 +1308:2:1238 +1309:2:1239 +1310:2:1237 +1311:2:1238 +1312:2:1239 +1313:2:1250 +1314:2:1255 +1315:2:1256 +1316:0:4365 +1317:3:2844 +1318:0:4365 +1319:2:1268 +1320:0:4365 +1321:3:2843 +1322:0:4365 +1323:2:1270 +1324:0:4365 +1325:3:2844 +1326:0:4365 +1327:2:1271 +1328:2:1275 +1329:2:1276 +1330:2:1284 +1331:2:1285 +1332:2:1289 +1333:2:1290 +1334:2:1284 +1335:2:1285 +1336:2:1289 +1337:2:1290 +1338:2:1298 +1339:2:1303 +1340:2:1307 +1341:2:1308 +1342:2:1315 +1343:2:1316 +1344:2:1327 +1345:2:1328 +1346:2:1329 +1347:2:1327 +1348:2:1328 +1349:2:1329 +1350:2:1340 +1351:2:1345 +1352:2:1346 +1353:0:4365 +1354:2:1358 +1355:0:4365 +1356:2:1454 +1357:0:4365 +1358:3:2843 +1359:0:4365 +1360:2:1455 +1361:0:4365 +1362:3:2844 +1363:0:4365 +1364:2:1652 +1365:0:4365 +1366:2:1653 +1367:0:4365 +1368:2:1657 +1369:0:4365 +1370:2:1660 +1371:0:4365 +1372:3:2843 +1373:0:4365 +1374:2:1665 +1375:2:1669 +1376:2:1670 +1377:2:1678 +1378:2:1679 +1379:2:1683 +1380:2:1684 +1381:2:1678 +1382:2:1679 +1383:2:1680 +1384:2:1692 +1385:2:1697 +1386:2:1701 +1387:2:1702 +1388:2:1709 +1389:2:1710 +1390:2:1721 +1391:2:1722 +1392:2:1723 +1393:2:1721 +1394:2:1722 +1395:2:1723 +1396:2:1734 +1397:2:1739 +1398:2:1740 +1399:0:4365 +1400:3:2844 +1401:0:4365 +1402:2:1752 +1403:0:4365 +1404:3:2843 +1405:0:4365 +1406:2:1754 +1407:0:4365 +1408:3:2844 +1409:0:4365 +1410:2:1755 +1411:2:1759 +1412:2:1760 +1413:2:1768 +1414:2:1769 +1415:2:1773 +1416:2:1774 +1417:2:1768 +1418:2:1769 +1419:2:1773 +1420:2:1774 +1421:2:1782 +1422:2:1787 +1423:2:1791 +1424:2:1792 +1425:2:1799 +1426:2:1800 +1427:2:1811 +1428:2:1812 +1429:2:1813 +1430:2:1811 +1431:2:1812 +1432:2:1813 +1433:2:1824 +1434:2:1829 +1435:2:1830 +1436:0:4365 +1437:2:1842 +1438:0:4365 +1439:3:2843 +1440:0:4365 +1441:2:1844 +1442:0:4365 +1443:3:2844 +1444:0:4365 +1445:2:1845 +1446:2:1849 +1447:2:1850 +1448:2:1858 +1449:2:1859 +1450:2:1863 +1451:2:1864 +1452:2:1858 +1453:2:1859 +1454:2:1863 +1455:2:1864 +1456:2:1872 +1457:2:1877 +1458:2:1881 +1459:2:1882 +1460:2:1889 +1461:2:1890 +1462:2:1901 +1463:2:1902 +1464:2:1903 +1465:2:1901 +1466:2:1902 +1467:2:1903 +1468:2:1914 +1469:2:1919 +1470:2:1920 +1471:0:4365 +1472:2:1932 +1473:0:4365 +1474:3:2843 +1475:0:4365 +1476:2:1934 +1477:0:4365 +1478:3:2844 +1479:0:4365 +1480:2:1935 +1481:0:4365 +1482:2:1936 +1483:0:4365 +1484:2:2129 +1485:0:4365 +1486:2:2130 +1487:0:4365 +1488:2:2134 +1489:0:4365 +1490:3:2843 +1491:0:4365 +1492:2:2136 +1493:0:4365 +1494:3:2844 +1495:0:4365 +1496:2:2137 +1497:2:2141 +1498:2:2142 +1499:2:2150 +1500:2:2151 +1501:2:2155 +1502:2:2156 +1503:2:2150 +1504:2:2151 +1505:2:2155 +1506:2:2156 +1507:2:2164 +1508:2:2169 +1509:2:2173 +1510:2:2174 +1511:2:2181 +1512:2:2182 +1513:2:2193 +1514:2:2194 +1515:2:2195 +1516:2:2193 +1517:2:2194 +1518:2:2195 +1519:2:2206 +1520:2:2211 +1521:2:2212 +1522:0:4365 +1523:2:2224 +1524:0:4365 +1525:3:2843 +1526:0:4365 +1527:2:2226 +1528:0:4365 +1529:3:2844 +1530:0:4365 +1531:2:1936 +1532:0:4365 +1533:2:2129 +1534:0:4365 +1535:2:2130 +1536:0:4365 +1537:2:2134 +1538:0:4365 +1539:3:2843 +1540:0:4365 +1541:2:2136 +1542:0:4365 +1543:3:2844 +1544:0:4365 +1545:2:2137 +1546:2:2141 +1547:2:2142 +1548:2:2150 +1549:2:2151 +1550:2:2155 +1551:2:2156 +1552:2:2150 +1553:2:2151 +1554:2:2152 +1555:2:2164 +1556:2:2169 +1557:2:2173 +1558:2:2174 +1559:2:2181 +1560:2:2182 +1561:2:2193 +1562:2:2194 +1563:2:2195 +1564:2:2193 +1565:2:2194 +1566:2:2195 +1567:2:2206 +1568:2:2211 +1569:2:2212 +1570:0:4365 +1571:2:2224 +1572:0:4365 +1573:3:2843 +1574:0:4365 +1575:2:2226 +1576:0:4365 +1577:3:2844 +1578:0:4365 +1579:2:2230 +1580:0:4365 +1581:3:2843 +1582:0:4365 +1583:2:2235 +1584:2:2239 +1585:2:2240 +1586:2:2248 +1587:2:2249 +1588:2:2253 +1589:2:2254 +1590:2:2248 +1591:2:2249 +1592:2:2250 +1593:2:2262 +1594:2:2267 +1595:2:2271 +1596:2:2272 +1597:2:2279 +1598:2:2280 +1599:2:2291 +1600:2:2292 +1601:2:2293 +1602:2:2291 +1603:2:2292 +1604:2:2293 +1605:2:2304 +1606:2:2309 +1607:2:2310 +1608:0:4365 +1609:3:2844 +1610:0:4365 +1611:2:2322 +1612:0:4365 +1613:2:1169 +1614:0:4365 +1615:3:2843 +1616:0:4365 +1617:2:1170 +1618:0:4365 +1619:3:2844 +1620:0:4365 +1621:3:2845 +1622:0:4365 +1623:3:2851 +1624:0:4365 +1625:3:2854 +1626:3:2855 +1627:3:2867 +1628:3:2868 +1629:3:2872 +1630:3:2873 +1631:3:2867 +1632:3:2868 +1633:3:2872 +1634:3:2873 +1635:3:2881 +1636:3:2886 +1637:3:2890 +1638:3:2891 +1639:3:2898 +1640:3:2899 +1641:3:2910 +1642:3:2911 +1643:3:2912 +1644:3:2910 +1645:3:2911 +1646:3:2912 +1647:3:2923 +1648:3:2928 +1649:3:2929 +1650:0:4365 +1651:3:2941 +1652:0:4365 +1653:3:2942 +1654:0:4365 +1655:2:1173 +1656:0:4365 +1657:3:2943 +1658:0:4365 +1659:2:1179 +1660:0:4365 +1661:2:1180 +1662:0:4365 +1663:3:2942 +1664:0:4365 +1665:2:1181 +1666:2:1185 +1667:2:1186 +1668:2:1194 +1669:2:1195 +1670:2:1199 +1671:2:1200 +1672:2:1194 +1673:2:1195 +1674:2:1199 +1675:2:1200 +1676:2:1208 +1677:2:1213 +1678:2:1217 +1679:2:1218 +1680:2:1225 +1681:2:1226 +1682:2:1237 +1683:2:1238 +1684:2:1239 +1685:2:1237 +1686:2:1238 +1687:2:1239 +1688:2:1250 +1689:2:1255 +1690:2:1256 +1691:0:4365 +1692:3:2943 +1693:0:4365 +1694:2:1268 +1695:0:4365 +1696:3:2942 +1697:0:4365 +1698:2:1270 +1699:0:4365 +1700:3:2943 +1701:0:4365 +1702:2:1271 +1703:2:1275 +1704:2:1276 +1705:2:1284 +1706:2:1285 +1707:2:1289 +1708:2:1290 +1709:2:1284 +1710:2:1285 +1711:2:1289 +1712:2:1290 +1713:2:1298 +1714:2:1303 +1715:2:1307 +1716:2:1308 +1717:2:1315 +1718:2:1316 +1719:2:1327 +1720:2:1328 +1721:2:1329 +1722:2:1327 +1723:2:1328 +1724:2:1329 +1725:2:1340 +1726:2:1345 +1727:2:1346 +1728:0:4365 +1729:2:1358 +1730:0:4365 +1731:2:1360 +1732:0:4365 +1733:3:2942 +1734:0:4365 +1735:2:1361 +1736:0:4365 +1737:3:2943 +1738:0:4365 +1739:2:1362 +1740:2:1366 +1741:2:1367 +1742:2:1375 +1743:2:1376 +1744:2:1380 +1745:2:1381 +1746:2:1375 +1747:2:1376 +1748:2:1380 +1749:2:1381 +1750:2:1389 +1751:2:1394 +1752:2:1398 +1753:2:1399 +1754:2:1406 +1755:2:1407 +1756:2:1418 +1757:2:1419 +1758:2:1420 +1759:2:1418 +1760:2:1419 +1761:2:1420 +1762:2:1431 +1763:2:1436 +1764:2:1437 +1765:0:4365 +1766:2:1449 +1767:0:4365 +1768:3:2942 +1769:0:4365 +1770:2:1451 +1771:0:4365 +1772:3:2943 +1773:0:4365 +1774:2:1652 +1775:0:4365 +1776:2:1653 +1777:0:4365 +1778:2:1657 +1779:0:4365 +1780:2:1180 +1781:0:4365 +1782:3:2942 +1783:0:4365 +1784:2:1181 +1785:2:1185 +1786:2:1186 +1787:2:1194 +1788:2:1195 +1789:2:1199 +1790:2:1200 +1791:2:1194 +1792:2:1195 +1793:2:1196 +1794:2:1208 +1795:2:1213 +1796:2:1217 +1797:2:1218 +1798:2:1225 +1799:2:1226 +1800:2:1237 +1801:2:1238 +1802:2:1239 +1803:2:1237 +1804:2:1238 +1805:2:1239 +1806:2:1250 +1807:2:1255 +1808:2:1256 +1809:0:4365 +1810:3:2943 +1811:0:4365 +1812:2:1268 +1813:0:4365 +1814:3:2942 +1815:0:4365 +1816:2:1270 +1817:0:4365 +1818:3:2943 +1819:0:4365 +1820:2:1271 +1821:2:1275 +1822:2:1276 +1823:2:1284 +1824:2:1285 +1825:2:1289 +1826:2:1290 +1827:2:1284 +1828:2:1285 +1829:2:1289 +1830:2:1290 +1831:2:1298 +1832:2:1303 +1833:2:1307 +1834:2:1308 +1835:2:1315 +1836:2:1316 +1837:2:1327 +1838:2:1328 +1839:2:1329 +1840:2:1327 +1841:2:1328 +1842:2:1329 +1843:2:1340 +1844:2:1345 +1845:2:1346 +1846:0:4365 +1847:2:1358 +1848:0:4365 +1849:2:1454 +1850:0:4365 +1851:3:2942 +1852:0:4365 +1853:2:1455 +1854:0:4365 +1855:3:2943 +1856:0:4365 +1857:2:1652 +1858:0:4365 +1859:2:1653 +1860:0:4365 +1861:2:1657 +1862:0:4365 +1863:2:1660 +1864:0:4365 +1865:3:2942 +1866:0:4365 +1867:2:1665 +1868:2:1669 +1869:2:1670 +1870:2:1678 +1871:2:1679 +1872:2:1683 +1873:2:1684 +1874:2:1678 +1875:2:1679 +1876:2:1680 +1877:2:1692 +1878:2:1697 +1879:2:1701 +1880:2:1702 +1881:2:1709 +1882:2:1710 +1883:2:1721 +1884:2:1722 +1885:2:1723 +1886:2:1721 +1887:2:1722 +1888:2:1723 +1889:2:1734 +1890:2:1739 +1891:2:1740 +1892:0:4365 +1893:3:2943 +1894:0:4365 +1895:2:1752 +1896:0:4365 +1897:3:2942 +1898:0:4365 +1899:2:1754 +1900:0:4365 +1901:3:2943 +1902:0:4365 +1903:2:1755 +1904:2:1759 +1905:2:1760 +1906:2:1768 +1907:2:1769 +1908:2:1773 +1909:2:1774 +1910:2:1768 +1911:2:1769 +1912:2:1773 +1913:2:1774 +1914:2:1782 +1915:2:1787 +1916:2:1791 +1917:2:1792 +1918:2:1799 +1919:2:1800 +1920:2:1811 +1921:2:1812 +1922:2:1813 +1923:2:1811 +1924:2:1812 +1925:2:1813 +1926:2:1824 +1927:2:1829 +1928:2:1830 +1929:0:4365 +1930:2:1842 +1931:0:4365 +1932:3:2942 +1933:0:4365 +1934:2:1844 +1935:0:4365 +1936:3:2943 +1937:0:4365 +1938:2:1845 +1939:2:1849 +1940:2:1850 +1941:2:1858 +1942:2:1859 +1943:2:1863 +1944:2:1864 +1945:2:1858 +1946:2:1859 +1947:2:1863 +1948:2:1864 +1949:2:1872 +1950:2:1877 +1951:2:1881 +1952:2:1882 +1953:2:1889 +1954:2:1890 +1955:2:1901 +1956:2:1902 +1957:2:1903 +1958:2:1901 +1959:2:1902 +1960:2:1903 +1961:2:1914 +1962:2:1919 +1963:2:1920 +1964:0:4365 +1965:2:1932 +1966:0:4365 +1967:3:2942 +1968:0:4365 +1969:2:1934 +1970:0:4365 +1971:3:2943 +1972:0:4365 +1973:2:1935 +1974:0:4365 +1975:2:1936 +1976:0:4365 +1977:2:2129 +1978:0:4365 +1979:2:2130 +1980:0:4365 +1981:2:2134 +1982:0:4365 +1983:3:2942 +1984:0:4365 +1985:2:2136 +1986:0:4365 +1987:3:2943 +1988:0:4365 +1989:2:2137 +1990:2:2141 +1991:2:2142 +1992:2:2150 +1993:2:2151 +1994:2:2155 +1995:2:2156 +1996:2:2150 +1997:2:2151 +1998:2:2155 +1999:2:2156 +2000:2:2164 +2001:2:2169 +2002:2:2173 +2003:2:2174 +2004:2:2181 +2005:2:2182 +2006:2:2193 +2007:2:2194 +2008:2:2195 +2009:2:2193 +2010:2:2194 +2011:2:2195 +2012:2:2206 +2013:2:2211 +2014:2:2212 +2015:0:4365 +2016:2:2224 +2017:0:4365 +2018:3:2942 +2019:0:4365 +2020:2:2226 +2021:0:4365 +2022:3:2943 +2023:0:4365 +2024:2:1936 +2025:0:4365 +2026:2:2129 +2027:0:4365 +2028:2:2130 +2029:0:4365 +2030:2:2134 +2031:0:4365 +2032:3:2942 +2033:0:4365 +2034:2:2136 +2035:0:4365 +2036:3:2943 +2037:0:4365 +2038:2:2137 +2039:2:2141 +2040:2:2142 +2041:2:2150 +2042:2:2151 +2043:2:2155 +2044:2:2156 +2045:2:2150 +2046:2:2151 +2047:2:2152 +2048:2:2164 +2049:2:2169 +2050:2:2173 +2051:2:2174 +2052:2:2181 +2053:2:2182 +2054:2:2193 +2055:2:2194 +2056:2:2195 +2057:2:2193 +2058:2:2194 +2059:2:2195 +2060:2:2206 +2061:2:2211 +2062:2:2212 +2063:0:4365 +2064:2:2224 +2065:0:4365 +2066:3:2942 +2067:0:4365 +2068:2:2226 +2069:0:4365 +2070:3:2943 +2071:0:4365 +2072:2:2230 +2073:0:4365 +2074:3:2942 +2075:0:4365 +2076:2:2235 +2077:2:2239 +2078:2:2240 +2079:2:2248 +2080:2:2249 +2081:2:2253 +2082:2:2254 +2083:2:2248 +2084:2:2249 +2085:2:2250 +2086:2:2262 +2087:2:2267 +2088:2:2271 +2089:2:2272 +2090:2:2279 +2091:2:2280 +2092:2:2291 +2093:2:2292 +2094:2:2293 +2095:2:2291 +2096:2:2292 +2097:2:2293 +2098:2:2304 +2099:2:2309 +2100:2:2310 +2101:0:4365 +2102:3:2943 +2103:0:4365 +2104:2:2322 +2105:0:4365 +2106:2:1169 +2107:0:4365 +2108:3:2942 +2109:0:4365 +2110:2:1170 +2111:0:4365 +2112:3:2943 +2113:0:4365 +2114:3:2944 +2115:0:4365 +2116:3:2950 +2117:0:4365 +2118:3:2951 +2119:0:4365 +2120:3:2952 +2121:0:4365 +2122:3:2953 +2123:0:4365 +2124:3:2954 +2125:3:2958 +2126:3:2959 +2127:3:2967 +2128:3:2968 +2129:3:2972 +2130:3:2973 +2131:3:2967 +2132:3:2968 +2133:3:2972 +2134:3:2973 +2135:3:2981 +2136:3:2986 +2137:3:2990 +2138:3:2991 +2139:3:2998 +2140:3:2999 +2141:3:3010 +2142:3:3011 +2143:3:3012 +2144:3:3010 +2145:3:3011 +2146:3:3012 +2147:3:3023 +2148:3:3028 +2149:3:3029 +2150:0:4365 +2151:3:3041 +2152:0:4365 +2153:3:3042 +2154:0:4365 +2155:2:1173 +2156:0:4365 +2157:3:3043 +2158:0:4365 +2159:2:1179 +2160:0:4365 +2161:2:1180 +2162:0:4365 +2163:3:3042 +2164:0:4365 +2165:2:1181 +2166:2:1185 +2167:2:1186 +2168:2:1194 +2169:2:1195 +2170:2:1199 +2171:2:1200 +2172:2:1194 +2173:2:1195 +2174:2:1199 +2175:2:1200 +2176:2:1208 +2177:2:1213 +2178:2:1217 +2179:2:1218 +2180:2:1225 +2181:2:1226 +2182:2:1237 +2183:2:1238 +2184:2:1239 +2185:2:1237 +2186:2:1238 +2187:2:1239 +2188:2:1250 +2189:2:1255 +2190:2:1256 +2191:0:4365 +2192:3:3043 +2193:0:4365 +2194:2:1268 +2195:0:4365 +2196:3:3042 +2197:0:4365 +2198:2:1270 +2199:0:4365 +2200:3:3043 +2201:0:4365 +2202:2:1271 +2203:2:1275 +2204:2:1276 +2205:2:1284 +2206:2:1285 +2207:2:1289 +2208:2:1290 +2209:2:1284 +2210:2:1285 +2211:2:1289 +2212:2:1290 +2213:2:1298 +2214:2:1303 +2215:2:1307 +2216:2:1308 +2217:2:1315 +2218:2:1316 +2219:2:1327 +2220:2:1328 +2221:2:1329 +2222:2:1327 +2223:2:1328 +2224:2:1329 +2225:2:1340 +2226:2:1345 +2227:2:1346 +2228:0:4365 +2229:2:1358 +2230:0:4365 +2231:2:1360 +2232:0:4365 +2233:3:3042 +2234:0:4365 +2235:2:1361 +2236:0:4365 +2237:3:3043 +2238:0:4365 +2239:2:1362 +2240:2:1366 +2241:2:1367 +2242:2:1375 +2243:2:1376 +2244:2:1380 +2245:2:1381 +2246:2:1375 +2247:2:1376 +2248:2:1380 +2249:2:1381 +2250:2:1389 +2251:2:1394 +2252:2:1398 +2253:2:1399 +2254:2:1406 +2255:2:1407 +2256:2:1418 +2257:2:1419 +2258:2:1420 +2259:2:1418 +2260:2:1419 +2261:2:1420 +2262:2:1431 +2263:2:1436 +2264:2:1437 +2265:0:4365 +2266:2:1449 +2267:0:4365 +2268:3:3042 +2269:0:4365 +2270:2:1451 +2271:0:4365 +2272:3:3043 +2273:0:4365 +2274:2:1652 +2275:0:4365 +2276:2:1653 +2277:0:4365 +2278:2:1657 +2279:0:4365 +2280:2:1180 +2281:0:4365 +2282:3:3042 +2283:0:4365 +2284:2:1181 +2285:2:1185 +2286:2:1186 +2287:2:1194 +2288:2:1195 +2289:2:1199 +2290:2:1200 +2291:2:1194 +2292:2:1195 +2293:2:1196 +2294:2:1208 +2295:2:1213 +2296:2:1217 +2297:2:1218 +2298:2:1225 +2299:2:1226 +2300:2:1237 +2301:2:1238 +2302:2:1239 +2303:2:1237 +2304:2:1238 +2305:2:1239 +2306:2:1250 +2307:2:1255 +2308:2:1256 +2309:0:4365 +2310:3:3043 +2311:0:4365 +2312:2:1268 +2313:0:4365 +2314:3:3042 +2315:0:4365 +2316:2:1270 +2317:0:4365 +2318:3:3043 +2319:0:4365 +2320:2:1271 +2321:2:1275 +2322:2:1276 +2323:2:1284 +2324:2:1285 +2325:2:1289 +2326:2:1290 +2327:2:1284 +2328:2:1285 +2329:2:1289 +2330:2:1290 +2331:2:1298 +2332:2:1303 +2333:2:1307 +2334:2:1308 +2335:2:1315 +2336:2:1316 +2337:2:1327 +2338:2:1328 +2339:2:1329 +2340:2:1327 +2341:2:1328 +2342:2:1329 +2343:2:1340 +2344:2:1345 +2345:2:1346 +2346:0:4365 +2347:2:1358 +2348:0:4365 +2349:2:1454 +2350:0:4365 +2351:3:3042 +2352:0:4365 +2353:2:1455 +2354:0:4365 +2355:3:3043 +2356:0:4365 +2357:2:1652 +2358:0:4365 +2359:2:1653 +2360:0:4365 +2361:2:1657 +2362:0:4365 +2363:2:1660 +2364:0:4365 +2365:3:3042 +2366:0:4365 +2367:2:1665 +2368:2:1669 +2369:2:1670 +2370:2:1678 +2371:2:1679 +2372:2:1683 +2373:2:1684 +2374:2:1678 +2375:2:1679 +2376:2:1680 +2377:2:1692 +2378:2:1697 +2379:2:1701 +2380:2:1702 +2381:2:1709 +2382:2:1710 +2383:2:1721 +2384:2:1722 +2385:2:1723 +2386:2:1721 +2387:2:1722 +2388:2:1723 +2389:2:1734 +2390:2:1739 +2391:2:1740 +2392:0:4365 +2393:3:3043 +2394:0:4365 +2395:2:1752 +2396:0:4365 +2397:3:3042 +2398:0:4365 +2399:2:1754 +2400:0:4365 +2401:3:3043 +2402:0:4365 +2403:2:1755 +2404:2:1759 +2405:2:1760 +2406:2:1768 +2407:2:1769 +2408:2:1773 +2409:2:1774 +2410:2:1768 +2411:2:1769 +2412:2:1773 +2413:2:1774 +2414:2:1782 +2415:2:1787 +2416:2:1791 +2417:2:1792 +2418:2:1799 +2419:2:1800 +2420:2:1811 +2421:2:1812 +2422:2:1813 +2423:2:1811 +2424:2:1812 +2425:2:1813 +2426:2:1824 +2427:2:1829 +2428:2:1830 +2429:0:4365 +2430:2:1842 +2431:0:4365 +2432:3:3042 +2433:0:4365 +2434:2:1844 +2435:0:4365 +2436:3:3043 +2437:0:4365 +2438:2:1845 +2439:2:1849 +2440:2:1850 +2441:2:1858 +2442:2:1859 +2443:2:1863 +2444:2:1864 +2445:2:1858 +2446:2:1859 +2447:2:1863 +2448:2:1864 +2449:2:1872 +2450:2:1877 +2451:2:1881 +2452:2:1882 +2453:2:1889 +2454:2:1890 +2455:2:1901 +2456:2:1902 +2457:2:1903 +2458:2:1901 +2459:2:1902 +2460:2:1903 +2461:2:1914 +2462:2:1919 +2463:2:1920 +2464:0:4365 +2465:2:1932 +2466:0:4365 +2467:3:3042 +2468:0:4365 +2469:2:1934 +2470:0:4365 +2471:3:3043 +2472:0:4365 +2473:2:1935 +2474:0:4365 +2475:2:1936 +2476:0:4365 +2477:2:2129 +2478:0:4365 +2479:2:2130 +2480:0:4365 +2481:2:2134 +2482:0:4365 +2483:3:3042 +2484:0:4365 +2485:2:2136 +2486:0:4365 +2487:3:3043 +2488:0:4365 +2489:2:2137 +2490:2:2141 +2491:2:2142 +2492:2:2150 +2493:2:2151 +2494:2:2155 +2495:2:2156 +2496:2:2150 +2497:2:2151 +2498:2:2155 +2499:2:2156 +2500:2:2164 +2501:2:2169 +2502:2:2173 +2503:2:2174 +2504:2:2181 +2505:2:2182 +2506:2:2193 +2507:2:2194 +2508:2:2195 +2509:2:2193 +2510:2:2194 +2511:2:2195 +2512:2:2206 +2513:2:2211 +2514:2:2212 +2515:0:4365 +2516:2:2224 +2517:0:4365 +2518:3:3042 +2519:0:4365 +2520:2:2226 +2521:0:4365 +2522:3:3043 +2523:0:4365 +2524:2:1936 +2525:0:4365 +2526:2:2129 +2527:0:4365 +2528:2:2130 +2529:0:4365 +2530:2:2134 +2531:0:4365 +2532:3:3042 +2533:0:4365 +2534:2:2136 +2535:0:4365 +2536:3:3043 +2537:0:4365 +2538:2:2137 +2539:2:2141 +2540:2:2142 +2541:2:2150 +2542:2:2151 +2543:2:2155 +2544:2:2156 +2545:2:2150 +2546:2:2151 +2547:2:2152 +2548:2:2164 +2549:2:2169 +2550:2:2173 +2551:2:2174 +2552:2:2181 +2553:2:2182 +2554:2:2193 +2555:2:2194 +2556:2:2195 +2557:2:2193 +2558:2:2194 +2559:2:2195 +2560:2:2206 +2561:2:2211 +2562:2:2212 +2563:0:4365 +2564:2:2224 +2565:0:4365 +2566:3:3042 +2567:0:4365 +2568:2:2226 +2569:0:4365 +2570:3:3043 +2571:0:4365 +2572:2:2230 +2573:0:4365 +2574:3:3042 +2575:0:4365 +2576:2:2235 +2577:2:2239 +2578:2:2240 +2579:2:2248 +2580:2:2249 +2581:2:2253 +2582:2:2254 +2583:2:2248 +2584:2:2249 +2585:2:2250 +2586:2:2262 +2587:2:2267 +2588:2:2271 +2589:2:2272 +2590:2:2279 +2591:2:2280 +2592:2:2291 +2593:2:2292 +2594:2:2293 +2595:2:2291 +2596:2:2292 +2597:2:2293 +2598:2:2304 +2599:2:2309 +2600:2:2310 +2601:0:4365 +2602:3:3043 +2603:0:4365 +2604:2:2322 +2605:0:4365 +2606:2:1169 +2607:0:4365 +2608:3:3042 +2609:0:4365 +2610:2:1170 +2611:0:4365 +2612:3:3043 +2613:0:4365 +2614:3:3044 +2615:0:4365 +2616:3:3257 +2617:0:4365 +2618:3:3265 +2619:0:4365 +2620:3:3266 +2621:3:3270 +2622:3:3271 +2623:3:3279 +2624:3:3280 +2625:3:3284 +2626:3:3285 +2627:3:3279 +2628:3:3280 +2629:3:3284 +2630:3:3285 +2631:3:3293 +2632:3:3298 +2633:3:3302 +2634:3:3303 +2635:3:3310 +2636:3:3311 +2637:3:3322 +2638:3:3323 +2639:3:3324 +2640:3:3322 +2641:3:3323 +2642:3:3324 +2643:3:3335 +2644:3:3340 +2645:3:3341 +2646:0:4365 +2647:3:3353 +2648:0:4365 +2649:3:3354 +2650:0:4365 +2651:2:1173 +2652:0:4365 +2653:3:3355 +2654:0:4365 +2655:2:1179 +2656:0:4365 +2657:2:1180 +2658:0:4365 +2659:3:3354 +2660:0:4365 +2661:2:1181 +2662:2:1185 +2663:2:1186 +2664:2:1194 +2665:2:1195 +2666:2:1199 +2667:2:1200 +2668:2:1194 +2669:2:1195 +2670:2:1199 +2671:2:1200 +2672:2:1208 +2673:2:1213 +2674:2:1217 +2675:2:1218 +2676:2:1225 +2677:2:1226 +2678:2:1237 +2679:2:1238 +2680:2:1239 +2681:2:1237 +2682:2:1238 +2683:2:1239 +2684:2:1250 +2685:2:1255 +2686:2:1256 +2687:0:4365 +2688:3:3355 +2689:0:4365 +2690:2:1268 +2691:0:4365 +2692:3:3354 +2693:0:4365 +2694:2:1270 +2695:0:4365 +2696:3:3355 +2697:0:4365 +2698:2:1271 +2699:2:1275 +2700:2:1276 +2701:2:1284 +2702:2:1285 +2703:2:1289 +2704:2:1290 +2705:2:1284 +2706:2:1285 +2707:2:1289 +2708:2:1290 +2709:2:1298 +2710:2:1303 +2711:2:1307 +2712:2:1308 +2713:2:1315 +2714:2:1316 +2715:2:1327 +2716:2:1328 +2717:2:1329 +2718:2:1327 +2719:2:1328 +2720:2:1329 +2721:2:1340 +2722:2:1345 +2723:2:1346 +2724:0:4365 +2725:2:1358 +2726:0:4365 +2727:2:1360 +2728:0:4365 +2729:3:3354 +2730:0:4365 +2731:2:1361 +2732:0:4365 +2733:3:3355 +2734:0:4365 +2735:2:1362 +2736:2:1366 +2737:2:1367 +2738:2:1375 +2739:2:1376 +2740:2:1380 +2741:2:1381 +2742:2:1375 +2743:2:1376 +2744:2:1380 +2745:2:1381 +2746:2:1389 +2747:2:1394 +2748:2:1398 +2749:2:1399 +2750:2:1406 +2751:2:1407 +2752:2:1418 +2753:2:1419 +2754:2:1420 +2755:2:1418 +2756:2:1419 +2757:2:1420 +2758:2:1431 +2759:2:1436 +2760:2:1437 +2761:0:4365 +2762:2:1449 +2763:0:4365 +2764:3:3354 +2765:0:4365 +2766:2:1451 +2767:0:4365 +2768:3:3355 +2769:0:4365 +2770:2:1652 +2771:0:4365 +2772:2:1653 +2773:0:4365 +2774:2:1657 +2775:0:4365 +2776:2:1180 +2777:0:4365 +2778:3:3354 +2779:0:4365 +2780:2:1181 +2781:2:1185 +2782:2:1186 +2783:2:1194 +2784:2:1195 +2785:2:1199 +2786:2:1200 +2787:2:1194 +2788:2:1195 +2789:2:1196 +2790:2:1208 +2791:2:1213 +2792:2:1217 +2793:2:1218 +2794:2:1225 +2795:2:1226 +2796:2:1237 +2797:2:1238 +2798:2:1239 +2799:2:1237 +2800:2:1238 +2801:2:1239 +2802:2:1250 +2803:2:1255 +2804:2:1256 +2805:0:4365 +2806:3:3355 +2807:0:4365 +2808:2:1268 +2809:0:4365 +2810:3:3354 +2811:0:4365 +2812:2:1270 +2813:0:4365 +2814:3:3355 +2815:0:4365 +2816:2:1271 +2817:2:1275 +2818:2:1276 +2819:2:1284 +2820:2:1285 +2821:2:1289 +2822:2:1290 +2823:2:1284 +2824:2:1285 +2825:2:1289 +2826:2:1290 +2827:2:1298 +2828:2:1303 +2829:2:1307 +2830:2:1308 +2831:2:1315 +2832:2:1316 +2833:2:1327 +2834:2:1328 +2835:2:1329 +2836:2:1327 +2837:2:1328 +2838:2:1329 +2839:2:1340 +2840:2:1345 +2841:2:1346 +2842:0:4365 +2843:2:1358 +2844:0:4365 +2845:2:1454 +2846:0:4365 +2847:3:3354 +2848:0:4365 +2849:2:1455 +2850:0:4365 +2851:3:3355 +2852:0:4365 +2853:2:1652 +2854:0:4365 +2855:2:1653 +2856:0:4365 +2857:2:1657 +2858:0:4365 +2859:2:1660 +2860:0:4365 +2861:3:3354 +2862:0:4365 +2863:2:1665 +2864:2:1669 +2865:2:1670 +2866:2:1678 +2867:2:1679 +2868:2:1683 +2869:2:1684 +2870:2:1678 +2871:2:1679 +2872:2:1680 +2873:2:1692 +2874:2:1697 +2875:2:1701 +2876:2:1702 +2877:2:1709 +2878:2:1710 +2879:2:1721 +2880:2:1722 +2881:2:1723 +2882:2:1721 +2883:2:1722 +2884:2:1723 +2885:2:1734 +2886:2:1739 +2887:2:1740 +2888:0:4365 +2889:3:3355 +2890:0:4365 +2891:2:1752 +2892:0:4365 +2893:3:3354 +2894:0:4365 +2895:2:1754 +2896:0:4365 +2897:3:3355 +2898:0:4365 +2899:2:1755 +2900:2:1759 +2901:2:1760 +2902:2:1768 +2903:2:1769 +2904:2:1773 +2905:2:1774 +2906:2:1768 +2907:2:1769 +2908:2:1773 +2909:2:1774 +2910:2:1782 +2911:2:1787 +2912:2:1791 +2913:2:1792 +2914:2:1799 +2915:2:1800 +2916:2:1811 +2917:2:1812 +2918:2:1813 +2919:2:1811 +2920:2:1812 +2921:2:1813 +2922:2:1824 +2923:2:1829 +2924:2:1830 +2925:0:4365 +2926:2:1842 +2927:0:4365 +2928:3:3354 +2929:0:4365 +2930:2:1844 +2931:0:4365 +2932:3:3355 +2933:0:4365 +2934:2:1845 +2935:2:1849 +2936:2:1850 +2937:2:1858 +2938:2:1859 +2939:2:1863 +2940:2:1864 +2941:2:1858 +2942:2:1859 +2943:2:1863 +2944:2:1864 +2945:2:1872 +2946:2:1877 +2947:2:1881 +2948:2:1882 +2949:2:1889 +2950:2:1890 +2951:2:1901 +2952:2:1902 +2953:2:1903 +2954:2:1901 +2955:2:1902 +2956:2:1903 +2957:2:1914 +2958:2:1919 +2959:2:1920 +2960:0:4365 +2961:2:1932 +2962:0:4365 +2963:3:3354 +2964:0:4365 +2965:2:1934 +2966:0:4365 +2967:3:3355 +2968:0:4365 +2969:2:1935 +2970:0:4365 +2971:2:1936 +2972:0:4365 +2973:2:2129 +2974:0:4365 +2975:2:2130 +2976:0:4365 +2977:2:2134 +2978:0:4365 +2979:3:3354 +2980:0:4365 +2981:2:2136 +2982:0:4365 +2983:3:3355 +2984:0:4365 +2985:2:2137 +2986:2:2141 +2987:2:2142 +2988:2:2150 +2989:2:2151 +2990:2:2155 +2991:2:2156 +2992:2:2150 +2993:2:2151 +2994:2:2155 +2995:2:2156 +2996:2:2164 +2997:2:2169 +2998:2:2173 +2999:2:2174 +3000:2:2181 +3001:2:2182 +3002:2:2193 +3003:2:2194 +3004:2:2195 +3005:2:2193 +3006:2:2194 +3007:2:2195 +3008:2:2206 +3009:2:2211 +3010:2:2212 +3011:0:4365 +3012:2:2224 +3013:0:4365 +3014:3:3354 +3015:0:4365 +3016:2:2226 +3017:0:4365 +3018:3:3355 +3019:0:4365 +3020:2:1936 +3021:0:4365 +3022:2:2129 +3023:0:4365 +3024:2:2130 +3025:0:4365 +3026:2:2134 +3027:0:4365 +3028:3:3354 +3029:0:4365 +3030:2:2136 +3031:0:4365 +3032:3:3355 +3033:0:4365 +3034:2:2137 +3035:2:2141 +3036:2:2142 +3037:2:2150 +3038:2:2151 +3039:2:2155 +3040:2:2156 +3041:2:2150 +3042:2:2151 +3043:2:2152 +3044:2:2164 +3045:2:2169 +3046:2:2173 +3047:2:2174 +3048:2:2181 +3049:2:2182 +3050:2:2193 +3051:2:2194 +3052:2:2195 +3053:2:2193 +3054:2:2194 +3055:2:2195 +3056:2:2206 +3057:2:2211 +3058:2:2212 +3059:0:4365 +3060:2:2224 +3061:0:4365 +3062:3:3354 +3063:0:4365 +3064:2:2226 +3065:0:4365 +3066:3:3355 +3067:0:4365 +3068:2:2230 +3069:0:4365 +3070:3:3354 +3071:0:4365 +3072:2:2235 +3073:2:2239 +3074:2:2240 +3075:2:2248 +3076:2:2249 +3077:2:2253 +3078:2:2254 +3079:2:2248 +3080:2:2249 +3081:2:2250 +3082:2:2262 +3083:2:2267 +3084:2:2271 +3085:2:2272 +3086:2:2279 +3087:2:2280 +3088:2:2291 +3089:2:2292 +3090:2:2293 +3091:2:2291 +3092:2:2292 +3093:2:2293 +3094:2:2304 +3095:2:2309 +3096:2:2310 +3097:0:4365 +3098:3:3355 +3099:0:4365 +3100:2:2322 +3101:0:4365 +3102:2:1169 +3103:0:4365 +3104:3:3354 +3105:0:4365 +3106:2:1170 +3107:0:4365 +3108:3:3355 +3109:0:4365 +3110:3:3356 +3111:0:4365 +3112:3:3366 +3113:0:4365 +3114:3:2951 +3115:0:4365 +3116:3:2952 +3117:0:4365 +3118:3:2953 +3119:0:4365 +3120:3:2954 +3121:3:2958 +3122:3:2959 +3123:3:2967 +3124:3:2968 +3125:3:2972 +3126:3:2973 +3127:3:2967 +3128:3:2968 +3129:3:2972 +3130:3:2973 +3131:3:2981 +3132:3:2986 +3133:3:2990 +3134:3:2991 +3135:3:2998 +3136:3:2999 +3137:3:3010 +3138:3:3011 +3139:3:3012 +3140:3:3010 +3141:3:3011 +3142:3:3012 +3143:3:3023 +3144:3:3028 +3145:3:3029 +3146:0:4365 +3147:3:3041 +3148:0:4365 +3149:3:3042 +3150:0:4365 +3151:2:1173 +3152:0:4365 +3153:3:3043 +3154:0:4365 +3155:2:1179 +3156:0:4365 +3157:2:1180 +3158:0:4365 +3159:3:3042 +3160:0:4365 +3161:2:1181 +3162:2:1185 +3163:2:1186 +3164:2:1194 +3165:2:1195 +3166:2:1199 +3167:2:1200 +3168:2:1194 +3169:2:1195 +3170:2:1199 +3171:2:1200 +3172:2:1208 +3173:2:1213 +3174:2:1217 +3175:2:1218 +3176:2:1225 +3177:2:1226 +3178:2:1237 +3179:2:1238 +3180:2:1239 +3181:2:1237 +3182:2:1238 +3183:2:1239 +3184:2:1250 +3185:2:1255 +3186:2:1256 +3187:0:4365 +3188:3:3043 +3189:0:4365 +3190:2:1268 +3191:0:4365 +3192:3:3042 +3193:0:4365 +3194:2:1270 +3195:0:4365 +3196:3:3043 +3197:0:4365 +3198:2:1271 +3199:2:1275 +3200:2:1276 +3201:2:1284 +3202:2:1285 +3203:2:1289 +3204:2:1290 +3205:2:1284 +3206:2:1285 +3207:2:1289 +3208:2:1290 +3209:2:1298 +3210:2:1303 +3211:2:1307 +3212:2:1308 +3213:2:1315 +3214:2:1316 +3215:2:1327 +3216:2:1328 +3217:2:1329 +3218:2:1327 +3219:2:1328 +3220:2:1329 +3221:2:1340 +3222:2:1345 +3223:2:1346 +3224:0:4365 +3225:2:1358 +3226:0:4365 +3227:2:1360 +3228:0:4365 +3229:3:3042 +3230:0:4365 +3231:2:1361 +3232:0:4365 +3233:3:3043 +3234:0:4365 +3235:2:1362 +3236:2:1366 +3237:2:1367 +3238:2:1375 +3239:2:1376 +3240:2:1380 +3241:2:1381 +3242:2:1375 +3243:2:1376 +3244:2:1380 +3245:2:1381 +3246:2:1389 +3247:2:1394 +3248:2:1398 +3249:2:1399 +3250:2:1406 +3251:2:1407 +3252:2:1418 +3253:2:1419 +3254:2:1420 +3255:2:1418 +3256:2:1419 +3257:2:1420 +3258:2:1431 +3259:2:1436 +3260:2:1437 +3261:0:4365 +3262:2:1449 +3263:0:4365 +3264:3:3042 +3265:0:4365 +3266:2:1451 +3267:0:4365 +3268:3:3043 +3269:0:4365 +3270:2:1652 +3271:0:4365 +3272:2:1653 +3273:0:4365 +3274:2:1657 +3275:0:4365 +3276:2:1180 +3277:0:4365 +3278:3:3042 +3279:0:4365 +3280:2:1181 +3281:2:1185 +3282:2:1186 +3283:2:1194 +3284:2:1195 +3285:2:1199 +3286:2:1200 +3287:2:1194 +3288:2:1195 +3289:2:1196 +3290:2:1208 +3291:2:1213 +3292:2:1217 +3293:2:1218 +3294:2:1225 +3295:2:1226 +3296:2:1237 +3297:2:1238 +3298:2:1239 +3299:2:1237 +3300:2:1238 +3301:2:1239 +3302:2:1250 +3303:2:1255 +3304:2:1256 +3305:0:4365 +3306:3:3043 +3307:0:4365 +3308:2:1268 +3309:0:4365 +3310:3:3042 +3311:0:4365 +3312:2:1270 +3313:0:4365 +3314:3:3043 +3315:0:4365 +3316:2:1271 +3317:2:1275 +3318:2:1276 +3319:2:1284 +3320:2:1285 +3321:2:1289 +3322:2:1290 +3323:2:1284 +3324:2:1285 +3325:2:1289 +3326:2:1290 +3327:2:1298 +3328:2:1303 +3329:2:1307 +3330:2:1308 +3331:2:1315 +3332:2:1316 +3333:2:1327 +3334:2:1328 +3335:2:1329 +3336:2:1327 +3337:2:1328 +3338:2:1329 +3339:2:1340 +3340:2:1345 +3341:2:1346 +3342:0:4365 +3343:2:1358 +3344:0:4365 +3345:2:1454 +3346:0:4365 +3347:3:3042 +3348:0:4365 +3349:2:1455 +3350:0:4365 +3351:3:3043 +3352:0:4365 +3353:2:1652 +3354:0:4365 +3355:2:1653 +3356:0:4365 +3357:2:1657 +3358:0:4365 +3359:2:1660 +3360:0:4365 +3361:3:3042 +3362:0:4365 +3363:2:1665 +3364:2:1669 +3365:2:1670 +3366:2:1678 +3367:2:1679 +3368:2:1683 +3369:2:1684 +3370:2:1678 +3371:2:1679 +3372:2:1680 +3373:2:1692 +3374:2:1697 +3375:2:1701 +3376:2:1702 +3377:2:1709 +3378:2:1710 +3379:2:1721 +3380:2:1722 +3381:2:1723 +3382:2:1721 +3383:2:1722 +3384:2:1723 +3385:2:1734 +3386:2:1739 +3387:2:1740 +3388:0:4365 +3389:3:3043 +3390:0:4365 +3391:2:1752 +3392:0:4365 +3393:3:3042 +3394:0:4365 +3395:2:1754 +3396:0:4365 +3397:3:3043 +3398:0:4365 +3399:2:1755 +3400:2:1759 +3401:2:1760 +3402:2:1768 +3403:2:1769 +3404:2:1773 +3405:2:1774 +3406:2:1768 +3407:2:1769 +3408:2:1773 +3409:2:1774 +3410:2:1782 +3411:2:1787 +3412:2:1791 +3413:2:1792 +3414:2:1799 +3415:2:1800 +3416:2:1811 +3417:2:1812 +3418:2:1813 +3419:2:1811 +3420:2:1812 +3421:2:1813 +3422:2:1824 +3423:2:1829 +3424:2:1830 +3425:0:4365 +3426:2:1842 +3427:0:4365 +3428:3:3042 +3429:0:4365 +3430:2:1844 +3431:0:4365 +3432:3:3043 +3433:0:4365 +3434:2:1845 +3435:2:1849 +3436:2:1850 +3437:2:1858 +3438:2:1859 +3439:2:1863 +3440:2:1864 +3441:2:1858 +3442:2:1859 +3443:2:1863 +3444:2:1864 +3445:2:1872 +3446:2:1877 +3447:2:1881 +3448:2:1882 +3449:2:1889 +3450:2:1890 +3451:2:1901 +3452:2:1902 +3453:2:1903 +3454:2:1901 +3455:2:1902 +3456:2:1903 +3457:2:1914 +3458:2:1919 +3459:2:1920 +3460:0:4365 +3461:2:1932 +3462:0:4365 +3463:3:3042 +3464:0:4365 +3465:2:1934 +3466:0:4365 +3467:3:3043 +3468:0:4365 +3469:2:1935 +3470:0:4365 +3471:2:1936 +3472:0:4365 +3473:2:2129 +3474:0:4365 +3475:2:2130 +3476:0:4365 +3477:2:2134 +3478:0:4365 +3479:3:3042 +3480:0:4365 +3481:2:2136 +3482:0:4365 +3483:3:3043 +3484:0:4365 +3485:2:2137 +3486:2:2141 +3487:2:2142 +3488:2:2150 +3489:2:2151 +3490:2:2155 +3491:2:2156 +3492:2:2150 +3493:2:2151 +3494:2:2155 +3495:2:2156 +3496:2:2164 +3497:2:2169 +3498:2:2173 +3499:2:2174 +3500:2:2181 +3501:2:2182 +3502:2:2193 +3503:2:2194 +3504:2:2195 +3505:2:2193 +3506:2:2194 +3507:2:2195 +3508:2:2206 +3509:2:2211 +3510:2:2212 +3511:0:4365 +3512:2:2224 +3513:0:4365 +3514:3:3042 +3515:0:4365 +3516:2:2226 +3517:0:4365 +3518:3:3043 +3519:0:4365 +3520:2:1936 +3521:0:4365 +3522:2:2129 +3523:0:4365 +3524:2:2130 +3525:0:4365 +3526:2:2134 +3527:0:4365 +3528:3:3042 +3529:0:4365 +3530:2:2136 +3531:0:4365 +3532:3:3043 +3533:0:4365 +3534:2:2137 +3535:2:2141 +3536:2:2142 +3537:2:2150 +3538:2:2151 +3539:2:2155 +3540:2:2156 +3541:2:2150 +3542:2:2151 +3543:2:2152 +3544:2:2164 +3545:2:2169 +3546:2:2173 +3547:2:2174 +3548:2:2181 +3549:2:2182 +3550:2:2193 +3551:2:2194 +3552:2:2195 +3553:2:2193 +3554:2:2194 +3555:2:2195 +3556:2:2206 +3557:2:2211 +3558:2:2212 +3559:0:4365 +3560:2:2224 +3561:0:4365 +3562:3:3042 +3563:0:4365 +3564:2:2226 +3565:0:4365 +3566:3:3043 +3567:0:4365 +3568:2:2230 +3569:0:4365 +3570:3:3042 +3571:0:4365 +3572:2:2235 +3573:2:2239 +3574:2:2240 +3575:2:2248 +3576:2:2249 +3577:2:2253 +3578:2:2254 +3579:2:2248 +3580:2:2249 +3581:2:2250 +3582:2:2262 +3583:2:2267 +3584:2:2271 +3585:2:2272 +3586:2:2279 +3587:2:2280 +3588:2:2291 +3589:2:2292 +3590:2:2293 +3591:2:2291 +3592:2:2292 +3593:2:2293 +3594:2:2304 +3595:2:2309 +3596:2:2310 +3597:0:4365 +3598:3:3043 +3599:0:4365 +3600:2:2322 +3601:0:4365 +3602:2:1169 +3603:0:4365 +3604:3:3042 +3605:0:4365 +3606:2:1170 +3607:0:4365 +3608:3:3043 +3609:0:4365 +3610:3:3044 +3611:0:4365 +3612:3:3257 +3613:0:4365 +3614:3:3362 +3615:0:4365 +3616:3:3363 +3617:0:4365 +3618:3:3367 +3619:0:4365 +3620:3:3373 +3621:3:3377 +3622:3:3378 +3623:3:3386 +3624:3:3387 +3625:3:3391 +3626:3:3392 +3627:3:3386 +3628:3:3387 +3629:3:3391 +3630:3:3392 +3631:3:3400 +3632:3:3405 +3633:3:3409 +3634:3:3410 +3635:3:3417 +3636:3:3418 +3637:3:3429 +3638:3:3430 +3639:3:3431 +3640:3:3429 +3641:3:3430 +3642:3:3431 +3643:3:3442 +3644:3:3447 +3645:3:3448 +3646:0:4365 +3647:3:3460 +3648:0:4365 +3649:3:3461 +3650:0:4365 +3651:2:1173 +3652:0:4365 +3653:3:3462 +3654:0:4365 +3655:2:1179 +3656:0:4365 +3657:2:1180 +3658:0:4365 +3659:3:3461 +3660:0:4365 +3661:2:1181 +3662:2:1185 +3663:2:1186 +3664:2:1194 +3665:2:1195 +3666:2:1199 +3667:2:1200 +3668:2:1194 +3669:2:1195 +3670:2:1199 +3671:2:1200 +3672:2:1208 +3673:2:1213 +3674:2:1217 +3675:2:1218 +3676:2:1225 +3677:2:1226 +3678:2:1237 +3679:2:1238 +3680:2:1239 +3681:2:1237 +3682:2:1238 +3683:2:1239 +3684:2:1250 +3685:2:1255 +3686:2:1256 +3687:0:4365 +3688:3:3462 +3689:0:4365 +3690:2:1268 +3691:0:4365 +3692:3:3461 +3693:0:4365 +3694:2:1270 +3695:0:4365 +3696:3:3462 +3697:0:4365 +3698:2:1271 +3699:2:1275 +3700:2:1276 +3701:2:1284 +3702:2:1285 +3703:2:1289 +3704:2:1290 +3705:2:1284 +3706:2:1285 +3707:2:1289 +3708:2:1290 +3709:2:1298 +3710:2:1303 +3711:2:1307 +3712:2:1308 +3713:2:1315 +3714:2:1316 +3715:2:1327 +3716:2:1328 +3717:2:1329 +3718:2:1327 +3719:2:1328 +3720:2:1329 +3721:2:1340 +3722:2:1345 +3723:2:1346 +3724:0:4365 +3725:2:1358 +3726:0:4365 +3727:2:1360 +3728:0:4365 +3729:3:3461 +3730:0:4365 +3731:2:1361 +3732:0:4365 +3733:3:3462 +3734:0:4365 +3735:2:1362 +3736:2:1366 +3737:2:1367 +3738:2:1375 +3739:2:1376 +3740:2:1380 +3741:2:1381 +3742:2:1375 +3743:2:1376 +3744:2:1380 +3745:2:1381 +3746:2:1389 +3747:2:1394 +3748:2:1398 +3749:2:1399 +3750:2:1406 +3751:2:1407 +3752:2:1418 +3753:2:1419 +3754:2:1420 +3755:2:1418 +3756:2:1419 +3757:2:1420 +3758:2:1431 +3759:2:1436 +3760:2:1437 +3761:0:4365 +3762:2:1449 +3763:0:4365 +3764:3:3461 +3765:0:4365 +3766:2:1451 +3767:0:4365 +3768:3:3462 +3769:0:4365 +3770:2:1652 +3771:0:4365 +3772:2:1653 +3773:0:4365 +3774:2:1657 +3775:0:4365 +3776:2:1180 +3777:0:4365 +3778:3:3461 +3779:0:4365 +3780:2:1181 +3781:2:1185 +3782:2:1186 +3783:2:1194 +3784:2:1195 +3785:2:1199 +3786:2:1200 +3787:2:1194 +3788:2:1195 +3789:2:1196 +3790:2:1208 +3791:2:1213 +3792:2:1217 +3793:2:1218 +3794:2:1225 +3795:2:1226 +3796:2:1237 +3797:2:1238 +3798:2:1239 +3799:2:1237 +3800:2:1238 +3801:2:1239 +3802:2:1250 +3803:2:1255 +3804:2:1256 +3805:0:4365 +3806:3:3462 +3807:0:4365 +3808:2:1268 +3809:0:4365 +3810:3:3461 +3811:0:4365 +3812:2:1270 +3813:0:4365 +3814:3:3462 +3815:0:4365 +3816:2:1271 +3817:2:1275 +3818:2:1276 +3819:2:1284 +3820:2:1285 +3821:2:1289 +3822:2:1290 +3823:2:1284 +3824:2:1285 +3825:2:1289 +3826:2:1290 +3827:2:1298 +3828:2:1303 +3829:2:1307 +3830:2:1308 +3831:2:1315 +3832:2:1316 +3833:2:1327 +3834:2:1328 +3835:2:1329 +3836:2:1327 +3837:2:1328 +3838:2:1329 +3839:2:1340 +3840:2:1345 +3841:2:1346 +3842:0:4365 +3843:2:1358 +3844:0:4365 +3845:2:1454 +3846:0:4365 +3847:3:3461 +3848:0:4365 +3849:2:1455 +3850:0:4365 +3851:3:3462 +3852:0:4365 +3853:2:1652 +3854:0:4365 +3855:2:1653 +3856:0:4365 +3857:2:1657 +3858:0:4365 +3859:2:1660 +3860:0:4365 +3861:3:3461 +3862:0:4365 +3863:2:1665 +3864:2:1669 +3865:2:1670 +3866:2:1678 +3867:2:1679 +3868:2:1683 +3869:2:1684 +3870:2:1678 +3871:2:1679 +3872:2:1680 +3873:2:1692 +3874:2:1697 +3875:2:1701 +3876:2:1702 +3877:2:1709 +3878:2:1710 +3879:2:1721 +3880:2:1722 +3881:2:1723 +3882:2:1721 +3883:2:1722 +3884:2:1723 +3885:2:1734 +3886:2:1739 +3887:2:1740 +3888:0:4365 +3889:3:3462 +3890:0:4365 +3891:2:1752 +3892:0:4365 +3893:3:3461 +3894:0:4365 +3895:2:1754 +3896:0:4365 +3897:3:3462 +3898:0:4365 +3899:2:1755 +3900:2:1759 +3901:2:1760 +3902:2:1768 +3903:2:1769 +3904:2:1773 +3905:2:1774 +3906:2:1768 +3907:2:1769 +3908:2:1773 +3909:2:1774 +3910:2:1782 +3911:2:1787 +3912:2:1791 +3913:2:1792 +3914:2:1799 +3915:2:1800 +3916:2:1811 +3917:2:1812 +3918:2:1813 +3919:2:1811 +3920:2:1812 +3921:2:1813 +3922:2:1824 +3923:2:1829 +3924:2:1830 +3925:0:4365 +3926:2:1842 +3927:0:4365 +3928:3:3461 +3929:0:4365 +3930:2:1844 +3931:0:4365 +3932:3:3462 +3933:0:4365 +3934:2:1845 +3935:2:1849 +3936:2:1850 +3937:2:1858 +3938:2:1859 +3939:2:1863 +3940:2:1864 +3941:2:1858 +3942:2:1859 +3943:2:1863 +3944:2:1864 +3945:2:1872 +3946:2:1877 +3947:2:1881 +3948:2:1882 +3949:2:1889 +3950:2:1890 +3951:2:1901 +3952:2:1902 +3953:2:1903 +3954:2:1901 +3955:2:1902 +3956:2:1903 +3957:2:1914 +3958:2:1919 +3959:2:1920 +3960:0:4365 +3961:2:1932 +3962:0:4365 +3963:3:3461 +3964:0:4365 +3965:2:1934 +3966:0:4365 +3967:3:3462 +3968:0:4365 +3969:2:1935 +3970:0:4365 +3971:2:1936 +3972:0:4365 +3973:2:2129 +3974:0:4365 +3975:2:2130 +3976:0:4365 +3977:2:2134 +3978:0:4365 +3979:3:3461 +3980:0:4365 +3981:2:2136 +3982:0:4365 +3983:3:3462 +3984:0:4365 +3985:2:2137 +3986:2:2141 +3987:2:2142 +3988:2:2150 +3989:2:2151 +3990:2:2155 +3991:2:2156 +3992:2:2150 +3993:2:2151 +3994:2:2155 +3995:2:2156 +3996:2:2164 +3997:2:2169 +3998:2:2173 +3999:2:2174 +4000:2:2181 +4001:2:2182 +4002:2:2193 +4003:2:2194 +4004:2:2195 +4005:2:2193 +4006:2:2194 +4007:2:2195 +4008:2:2206 +4009:2:2211 +4010:2:2212 +4011:0:4365 +4012:2:2224 +4013:0:4365 +4014:3:3461 +4015:0:4365 +4016:2:2226 +4017:0:4365 +4018:3:3462 +4019:0:4365 +4020:2:1936 +4021:0:4365 +4022:2:2129 +4023:0:4365 +4024:2:2130 +4025:0:4365 +4026:2:2134 +4027:0:4365 +4028:3:3461 +4029:0:4365 +4030:2:2136 +4031:0:4365 +4032:3:3462 +4033:0:4365 +4034:2:2137 +4035:2:2141 +4036:2:2142 +4037:2:2150 +4038:2:2151 +4039:2:2155 +4040:2:2156 +4041:2:2150 +4042:2:2151 +4043:2:2152 +4044:2:2164 +4045:2:2169 +4046:2:2173 +4047:2:2174 +4048:2:2181 +4049:2:2182 +4050:2:2193 +4051:2:2194 +4052:2:2195 +4053:2:2193 +4054:2:2194 +4055:2:2195 +4056:2:2206 +4057:2:2211 +4058:2:2212 +4059:0:4365 +4060:2:2224 +4061:0:4365 +4062:3:3461 +4063:0:4365 +4064:2:2226 +4065:0:4365 +4066:3:3462 +4067:0:4365 +4068:2:2230 +4069:0:4365 +4070:3:3461 +4071:0:4365 +4072:2:2235 +4073:2:2239 +4074:2:2240 +4075:2:2248 +4076:2:2249 +4077:2:2253 +4078:2:2254 +4079:2:2248 +4080:2:2249 +4081:2:2250 +4082:2:2262 +4083:2:2267 +4084:2:2271 +4085:2:2272 +4086:2:2279 +4087:2:2280 +4088:2:2291 +4089:2:2292 +4090:2:2293 +4091:2:2291 +4092:2:2292 +4093:2:2293 +4094:2:2304 +4095:2:2309 +4096:2:2310 +4097:0:4365 +4098:3:3462 +4099:0:4365 +4100:2:2322 +4101:0:4365 +4102:2:1169 +4103:0:4365 +4104:3:3461 +4105:0:4365 +4106:2:1170 +4107:0:4365 +4108:3:3462 +4109:0:4365 +4110:3:3463 +4111:0:4365 +4112:3:3469 +4113:0:4365 +4114:3:3470 +4115:3:3474 +4116:3:3475 +4117:3:3483 +4118:3:3484 +4119:3:3488 +4120:3:3489 +4121:3:3483 +4122:3:3484 +4123:3:3488 +4124:3:3489 +4125:3:3497 +4126:3:3502 +4127:3:3506 +4128:3:3507 +4129:3:3514 +4130:3:3515 +4131:3:3526 +4132:3:3527 +4133:3:3528 +4134:3:3526 +4135:3:3527 +4136:3:3528 +4137:3:3539 +4138:3:3544 +4139:3:3545 +4140:0:4365 +4141:3:3557 +4142:0:4365 +4143:3:3558 +4144:0:4365 +4145:2:1173 +4146:0:4365 +4147:3:3559 +4148:0:4365 +4149:2:1179 +4150:0:4365 +4151:2:1180 +4152:0:4365 +4153:3:3558 +4154:0:4365 +4155:2:1181 +4156:2:1185 +4157:2:1186 +4158:2:1194 +4159:2:1195 +4160:2:1199 +4161:2:1200 +4162:2:1194 +4163:2:1195 +4164:2:1199 +4165:2:1200 +4166:2:1208 +4167:2:1213 +4168:2:1217 +4169:2:1218 +4170:2:1225 +4171:2:1226 +4172:2:1237 +4173:2:1238 +4174:2:1239 +4175:2:1237 +4176:2:1238 +4177:2:1239 +4178:2:1250 +4179:2:1255 +4180:2:1256 +4181:0:4365 +4182:3:3559 +4183:0:4365 +4184:2:1268 +4185:0:4365 +4186:3:3558 +4187:0:4365 +4188:2:1270 +4189:0:4365 +4190:3:3559 +4191:0:4365 +4192:2:1271 +4193:2:1275 +4194:2:1276 +4195:2:1284 +4196:2:1285 +4197:2:1289 +4198:2:1290 +4199:2:1284 +4200:2:1285 +4201:2:1289 +4202:2:1290 +4203:2:1298 +4204:2:1303 +4205:2:1307 +4206:2:1308 +4207:2:1315 +4208:2:1316 +4209:2:1327 +4210:2:1328 +4211:2:1329 +4212:2:1327 +4213:2:1328 +4214:2:1329 +4215:2:1340 +4216:2:1345 +4217:2:1346 +4218:0:4365 +4219:2:1358 +4220:0:4365 +4221:2:1360 +4222:0:4365 +4223:3:3558 +4224:0:4365 +4225:2:1361 +4226:0:4365 +4227:3:3559 +4228:0:4365 +4229:2:1362 +4230:2:1366 +4231:2:1367 +4232:2:1375 +4233:2:1376 +4234:2:1380 +4235:2:1381 +4236:2:1375 +4237:2:1376 +4238:2:1380 +4239:2:1381 +4240:2:1389 +4241:2:1394 +4242:2:1398 +4243:2:1399 +4244:2:1406 +4245:2:1407 +4246:2:1418 +4247:2:1419 +4248:2:1420 +4249:2:1418 +4250:2:1419 +4251:2:1420 +4252:2:1431 +4253:2:1436 +4254:2:1437 +4255:0:4365 +4256:2:1449 +4257:0:4365 +4258:3:3558 +4259:0:4365 +4260:2:1451 +4261:0:4365 +4262:3:3559 +4263:0:4365 +4264:2:1652 +4265:0:4365 +4266:2:1653 +4267:0:4365 +4268:2:1657 +4269:0:4365 +4270:2:1180 +4271:0:4365 +4272:3:3558 +4273:0:4365 +4274:2:1181 +4275:2:1185 +4276:2:1186 +4277:2:1194 +4278:2:1195 +4279:2:1199 +4280:2:1200 +4281:2:1194 +4282:2:1195 +4283:2:1196 +4284:2:1208 +4285:2:1213 +4286:2:1217 +4287:2:1218 +4288:2:1225 +4289:2:1226 +4290:2:1237 +4291:2:1238 +4292:2:1239 +4293:2:1237 +4294:2:1238 +4295:2:1239 +4296:2:1250 +4297:2:1255 +4298:2:1256 +4299:0:4365 +4300:3:3559 +4301:0:4365 +4302:2:1268 +4303:0:4365 +4304:3:3558 +4305:0:4365 +4306:2:1270 +4307:0:4365 +4308:3:3559 +4309:0:4365 +4310:2:1271 +4311:2:1275 +4312:2:1276 +4313:2:1284 +4314:2:1285 +4315:2:1289 +4316:2:1290 +4317:2:1284 +4318:2:1285 +4319:2:1289 +4320:2:1290 +4321:2:1298 +4322:2:1303 +4323:2:1307 +4324:2:1308 +4325:2:1315 +4326:2:1316 +4327:2:1327 +4328:2:1328 +4329:2:1329 +4330:2:1327 +4331:2:1328 +4332:2:1329 +4333:2:1340 +4334:2:1345 +4335:2:1346 +4336:0:4365 +4337:2:1358 +4338:0:4365 +4339:2:1454 +4340:0:4365 +4341:3:3558 +4342:0:4365 +4343:2:1455 +4344:0:4365 +4345:3:3559 +4346:0:4365 +4347:2:1652 +4348:0:4365 +4349:2:1653 +4350:0:4365 +4351:2:1657 +4352:0:4365 +4353:2:1660 +4354:0:4365 +4355:3:3558 +4356:0:4365 +4357:2:1665 +4358:2:1669 +4359:2:1670 +4360:2:1678 +4361:2:1679 +4362:2:1683 +4363:2:1684 +4364:2:1678 +4365:2:1679 +4366:2:1680 +4367:2:1692 +4368:2:1697 +4369:2:1701 +4370:2:1702 +4371:2:1709 +4372:2:1710 +4373:2:1721 +4374:2:1722 +4375:2:1723 +4376:2:1721 +4377:2:1722 +4378:2:1723 +4379:2:1734 +4380:2:1739 +4381:2:1740 +4382:0:4365 +4383:3:3559 +4384:0:4365 +4385:2:1752 +4386:0:4365 +4387:3:3558 +4388:0:4365 +4389:2:1754 +4390:0:4365 +4391:3:3559 +4392:0:4365 +4393:2:1755 +4394:2:1759 +4395:2:1760 +4396:2:1768 +4397:2:1769 +4398:2:1773 +4399:2:1774 +4400:2:1768 +4401:2:1769 +4402:2:1773 +4403:2:1774 +4404:2:1782 +4405:2:1787 +4406:2:1791 +4407:2:1792 +4408:2:1799 +4409:2:1800 +4410:2:1811 +4411:2:1812 +4412:2:1813 +4413:2:1811 +4414:2:1812 +4415:2:1813 +4416:2:1824 +4417:2:1829 +4418:2:1830 +4419:0:4365 +4420:2:1842 +4421:0:4365 +4422:3:3558 +4423:0:4365 +4424:2:1844 +4425:0:4365 +4426:3:3559 +4427:0:4365 +4428:2:1845 +4429:2:1849 +4430:2:1850 +4431:2:1858 +4432:2:1859 +4433:2:1863 +4434:2:1864 +4435:2:1858 +4436:2:1859 +4437:2:1863 +4438:2:1864 +4439:2:1872 +4440:2:1877 +4441:2:1881 +4442:2:1882 +4443:2:1889 +4444:2:1890 +4445:2:1901 +4446:2:1902 +4447:2:1903 +4448:2:1901 +4449:2:1902 +4450:2:1903 +4451:2:1914 +4452:2:1919 +4453:2:1920 +4454:0:4365 +4455:2:1932 +4456:0:4365 +4457:3:3558 +4458:0:4365 +4459:2:1934 +4460:0:4365 +4461:3:3559 +4462:0:4365 +4463:2:1935 +4464:0:4365 +4465:2:1936 +4466:0:4365 +4467:2:2129 +4468:0:4365 +4469:2:2130 +4470:0:4365 +4471:2:2134 +4472:0:4365 +4473:3:3558 +4474:0:4365 +4475:2:2136 +4476:0:4365 +4477:3:3559 +4478:0:4365 +4479:2:2137 +4480:2:2141 +4481:2:2142 +4482:2:2150 +4483:2:2151 +4484:2:2155 +4485:2:2156 +4486:2:2150 +4487:2:2151 +4488:2:2155 +4489:2:2156 +4490:2:2164 +4491:2:2169 +4492:2:2173 +4493:2:2174 +4494:2:2181 +4495:2:2182 +4496:2:2193 +4497:2:2194 +4498:2:2195 +4499:2:2193 +4500:2:2194 +4501:2:2195 +4502:2:2206 +4503:2:2211 +4504:2:2212 +4505:0:4365 +4506:2:2224 +4507:0:4365 +4508:3:3558 +4509:0:4365 +4510:2:2226 +4511:0:4365 +4512:3:3559 +4513:0:4365 +4514:2:1936 +4515:0:4365 +4516:2:2129 +4517:0:4365 +4518:2:2130 +4519:0:4365 +4520:2:2134 +4521:0:4365 +4522:3:3558 +4523:0:4365 +4524:2:2136 +4525:0:4365 +4526:3:3559 +4527:0:4365 +4528:2:2137 +4529:2:2141 +4530:2:2142 +4531:2:2150 +4532:2:2151 +4533:2:2155 +4534:2:2156 +4535:2:2150 +4536:2:2151 +4537:2:2152 +4538:2:2164 +4539:2:2169 +4540:2:2173 +4541:2:2174 +4542:2:2181 +4543:2:2182 +4544:2:2193 +4545:2:2194 +4546:2:2195 +4547:2:2193 +4548:2:2194 +4549:2:2195 +4550:2:2206 +4551:2:2211 +4552:2:2212 +4553:0:4365 +4554:2:2224 +4555:0:4365 +4556:3:3558 +4557:0:4365 +4558:2:2226 +4559:0:4365 +4560:3:3559 +4561:0:4365 +4562:2:2230 +4563:0:4365 +4564:3:3558 +4565:0:4365 +4566:2:2235 +4567:2:2239 +4568:2:2240 +4569:2:2248 +4570:2:2249 +4571:2:2253 +4572:2:2254 +4573:2:2248 +4574:2:2249 +4575:2:2250 +4576:2:2262 +4577:2:2267 +4578:2:2271 +4579:2:2272 +4580:2:2279 +4581:2:2280 +4582:2:2291 +4583:2:2292 +4584:2:2293 +4585:2:2291 +4586:2:2292 +4587:2:2293 +4588:2:2304 +4589:2:2309 +4590:2:2310 +4591:0:4365 +4592:3:3559 +4593:0:4365 +4594:2:2322 +4595:0:4365 +4596:2:1169 +4597:0:4365 +4598:3:3558 +4599:0:4365 +4600:2:1170 +4601:0:4365 +4602:3:3559 +4603:0:4365 +4604:3:3560 +4605:0:4365 +4606:3:3566 +4607:0:4365 +4608:3:3569 +4609:3:3570 +4610:3:3582 +4611:3:3583 +4612:3:3587 +4613:3:3588 +4614:3:3582 +4615:3:3583 +4616:3:3587 +4617:3:3588 +4618:3:3596 +4619:3:3601 +4620:3:3605 +4621:3:3606 +4622:3:3613 +4623:3:3614 +4624:3:3625 +4625:3:3626 +4626:3:3627 +4627:3:3625 +4628:3:3626 +4629:3:3627 +4630:3:3638 +4631:3:3643 +4632:3:3644 +4633:0:4365 +4634:3:3656 +4635:0:4365 +4636:3:3657 +4637:0:4365 +4638:2:1173 +4639:0:4365 +4640:3:3658 +4641:0:4365 +4642:2:1179 +4643:0:4365 +4644:2:1180 +4645:0:4365 +4646:3:3657 +4647:0:4365 +4648:2:1181 +4649:2:1185 +4650:2:1186 +4651:2:1194 +4652:2:1195 +4653:2:1199 +4654:2:1200 +4655:2:1194 +4656:2:1195 +4657:2:1199 +4658:2:1200 +4659:2:1208 +4660:2:1213 +4661:2:1217 +4662:2:1218 +4663:2:1225 +4664:2:1226 +4665:2:1237 +4666:2:1238 +4667:2:1239 +4668:2:1237 +4669:2:1238 +4670:2:1239 +4671:2:1250 +4672:2:1255 +4673:2:1256 +4674:0:4365 +4675:3:3658 +4676:0:4365 +4677:2:1268 +4678:0:4365 +4679:3:3657 +4680:0:4365 +4681:2:1270 +4682:0:4365 +4683:3:3658 +4684:0:4365 +4685:2:1271 +4686:2:1275 +4687:2:1276 +4688:2:1284 +4689:2:1285 +4690:2:1289 +4691:2:1290 +4692:2:1284 +4693:2:1285 +4694:2:1289 +4695:2:1290 +4696:2:1298 +4697:2:1303 +4698:2:1307 +4699:2:1308 +4700:2:1315 +4701:2:1316 +4702:2:1327 +4703:2:1328 +4704:2:1329 +4705:2:1327 +4706:2:1328 +4707:2:1329 +4708:2:1340 +4709:2:1345 +4710:2:1346 +4711:0:4365 +4712:2:1358 +4713:0:4365 +4714:2:1360 +4715:0:4365 +4716:3:3657 +4717:0:4365 +4718:2:1361 +4719:0:4365 +4720:3:3658 +4721:0:4365 +4722:2:1362 +4723:2:1366 +4724:2:1367 +4725:2:1375 +4726:2:1376 +4727:2:1380 +4728:2:1381 +4729:2:1375 +4730:2:1376 +4731:2:1380 +4732:2:1381 +4733:2:1389 +4734:2:1394 +4735:2:1398 +4736:2:1399 +4737:2:1406 +4738:2:1407 +4739:2:1418 +4740:2:1419 +4741:2:1420 +4742:2:1418 +4743:2:1419 +4744:2:1420 +4745:2:1431 +4746:2:1436 +4747:2:1437 +4748:0:4365 +4749:2:1449 +4750:0:4365 +4751:3:3657 +4752:0:4365 +4753:2:1451 +4754:0:4365 +4755:3:3658 +4756:0:4365 +4757:2:1652 +4758:0:4365 +4759:2:1653 +4760:0:4365 +4761:2:1657 +4762:0:4365 +4763:2:1180 +4764:0:4365 +4765:3:3657 +4766:0:4365 +4767:2:1181 +4768:2:1185 +4769:2:1186 +4770:2:1194 +4771:2:1195 +4772:2:1199 +4773:2:1200 +4774:2:1194 +4775:2:1195 +4776:2:1196 +4777:2:1208 +4778:2:1213 +4779:2:1217 +4780:2:1218 +4781:2:1225 +4782:2:1226 +4783:2:1237 +4784:2:1238 +4785:2:1239 +4786:2:1237 +4787:2:1238 +4788:2:1239 +4789:2:1250 +4790:2:1255 +4791:2:1256 +4792:0:4365 +4793:3:3658 +4794:0:4365 +4795:2:1268 +4796:0:4365 +4797:3:3657 +4798:0:4365 +4799:2:1270 +4800:0:4365 +4801:3:3658 +4802:0:4365 +4803:2:1271 +4804:2:1275 +4805:2:1276 +4806:2:1284 +4807:2:1285 +4808:2:1289 +4809:2:1290 +4810:2:1284 +4811:2:1285 +4812:2:1289 +4813:2:1290 +4814:2:1298 +4815:2:1303 +4816:2:1307 +4817:2:1308 +4818:2:1315 +4819:2:1316 +4820:2:1327 +4821:2:1328 +4822:2:1329 +4823:2:1327 +4824:2:1328 +4825:2:1329 +4826:2:1340 +4827:2:1345 +4828:2:1346 +4829:0:4365 +4830:2:1358 +4831:0:4365 +4832:2:1454 +4833:0:4365 +4834:3:3657 +4835:0:4365 +4836:2:1455 +4837:0:4365 +4838:3:3658 +4839:0:4365 +4840:2:1652 +4841:0:4365 +4842:2:1653 +4843:0:4365 +4844:2:1657 +4845:0:4365 +4846:2:1660 +4847:0:4365 +4848:3:3657 +4849:0:4365 +4850:2:1665 +4851:2:1669 +4852:2:1670 +4853:2:1678 +4854:2:1679 +4855:2:1683 +4856:2:1684 +4857:2:1678 +4858:2:1679 +4859:2:1680 +4860:2:1692 +4861:2:1697 +4862:2:1701 +4863:2:1702 +4864:2:1709 +4865:2:1710 +4866:2:1721 +4867:2:1722 +4868:2:1723 +4869:2:1721 +4870:2:1722 +4871:2:1723 +4872:2:1734 +4873:2:1739 +4874:2:1740 +4875:0:4365 +4876:3:3658 +4877:0:4365 +4878:2:1752 +4879:0:4365 +4880:3:3657 +4881:0:4365 +4882:2:1754 +4883:0:4365 +4884:3:3658 +4885:0:4365 +4886:2:1755 +4887:2:1759 +4888:2:1760 +4889:2:1768 +4890:2:1769 +4891:2:1773 +4892:2:1774 +4893:2:1768 +4894:2:1769 +4895:2:1773 +4896:2:1774 +4897:2:1782 +4898:2:1787 +4899:2:1791 +4900:2:1792 +4901:2:1799 +4902:2:1800 +4903:2:1811 +4904:2:1812 +4905:2:1813 +4906:2:1811 +4907:2:1812 +4908:2:1813 +4909:2:1824 +4910:2:1829 +4911:2:1830 +4912:0:4365 +4913:2:1842 +4914:0:4365 +4915:3:3657 +4916:0:4365 +4917:2:1844 +4918:0:4365 +4919:3:3658 +4920:0:4365 +4921:2:1845 +4922:2:1849 +4923:2:1850 +4924:2:1858 +4925:2:1859 +4926:2:1863 +4927:2:1864 +4928:2:1858 +4929:2:1859 +4930:2:1863 +4931:2:1864 +4932:2:1872 +4933:2:1877 +4934:2:1881 +4935:2:1882 +4936:2:1889 +4937:2:1890 +4938:2:1901 +4939:2:1902 +4940:2:1903 +4941:2:1901 +4942:2:1902 +4943:2:1903 +4944:2:1914 +4945:2:1919 +4946:2:1920 +4947:0:4365 +4948:2:1932 +4949:0:4365 +4950:3:3657 +4951:0:4365 +4952:2:1934 +4953:0:4365 +4954:3:3658 +4955:0:4365 +4956:2:1935 +4957:0:4365 +4958:2:1936 +4959:0:4365 +4960:2:2129 +4961:0:4365 +4962:2:2130 +4963:0:4365 +4964:2:2134 +4965:0:4365 +4966:3:3657 +4967:0:4365 +4968:2:2136 +4969:0:4365 +4970:3:3658 +4971:0:4365 +4972:2:2137 +4973:2:2141 +4974:2:2142 +4975:2:2150 +4976:2:2151 +4977:2:2155 +4978:2:2156 +4979:2:2150 +4980:2:2151 +4981:2:2155 +4982:2:2156 +4983:2:2164 +4984:2:2169 +4985:2:2173 +4986:2:2174 +4987:2:2181 +4988:2:2182 +4989:2:2193 +4990:2:2194 +4991:2:2195 +4992:2:2193 +4993:2:2194 +4994:2:2195 +4995:2:2206 +4996:2:2211 +4997:2:2212 +4998:0:4365 +4999:2:2224 +5000:0:4365 +5001:3:3657 +5002:0:4365 +5003:2:2226 +5004:0:4365 +5005:3:3658 +5006:0:4365 +5007:2:1936 +5008:0:4365 +5009:2:2129 +5010:0:4365 +5011:2:2130 +5012:0:4365 +5013:2:2134 +5014:0:4365 +5015:3:3657 +5016:0:4365 +5017:2:2136 +5018:0:4365 +5019:3:3658 +5020:0:4365 +5021:2:2137 +5022:2:2141 +5023:2:2142 +5024:2:2150 +5025:2:2151 +5026:2:2155 +5027:2:2156 +5028:2:2150 +5029:2:2151 +5030:2:2152 +5031:2:2164 +5032:2:2169 +5033:2:2173 +5034:2:2174 +5035:2:2181 +5036:2:2182 +5037:2:2193 +5038:2:2194 +5039:2:2195 +5040:2:2193 +5041:2:2194 +5042:2:2195 +5043:2:2206 +5044:2:2211 +5045:2:2212 +5046:0:4365 +5047:2:2224 +5048:0:4365 +5049:3:3657 +5050:0:4365 +5051:2:2226 +5052:0:4365 +5053:3:3658 +5054:0:4365 +5055:2:2230 +5056:0:4365 +5057:3:3657 +5058:0:4365 +5059:2:2235 +5060:2:2239 +5061:2:2240 +5062:2:2248 +5063:2:2249 +5064:2:2253 +5065:2:2254 +5066:2:2248 +5067:2:2249 +5068:2:2250 +5069:2:2262 +5070:2:2267 +5071:2:2271 +5072:2:2272 +5073:2:2279 +5074:2:2280 +5075:2:2291 +5076:2:2292 +5077:2:2293 +5078:2:2291 +5079:2:2292 +5080:2:2293 +5081:2:2304 +5082:2:2309 +5083:2:2310 +5084:0:4365 +5085:3:3658 +5086:0:4365 +5087:2:2322 +5088:0:4365 +5089:2:1169 +5090:0:4365 +5091:3:3657 +5092:0:4365 +5093:2:1170 +5094:0:4365 +5095:3:3658 +5096:0:4365 +5097:3:3659 +5098:0:4365 +5099:3:3665 +5100:0:4365 +5101:3:3666 +5102:0:4365 +5103:3:3667 +5104:0:4365 +5105:3:3668 +5106:0:4365 +5107:3:3669 +5108:3:3673 +5109:3:3674 +5110:3:3682 +5111:3:3683 +5112:3:3687 +5113:3:3688 +5114:3:3682 +5115:3:3683 +5116:3:3687 +5117:3:3688 +5118:3:3696 +5119:3:3701 +5120:3:3705 +5121:3:3706 +5122:3:3713 +5123:3:3714 +5124:3:3725 +5125:3:3726 +5126:3:3727 +5127:3:3725 +5128:3:3726 +5129:3:3727 +5130:3:3738 +5131:3:3743 +5132:3:3744 +5133:0:4365 +5134:3:3756 +5135:0:4365 +5136:3:3757 +5137:0:4365 +5138:2:1173 +5139:0:4365 +5140:3:3758 +5141:0:4365 +5142:2:1179 +5143:0:4365 +5144:2:1180 +5145:0:4365 +5146:3:3757 +5147:0:4365 +5148:2:1181 +5149:2:1185 +5150:2:1186 +5151:2:1194 +5152:2:1195 +5153:2:1199 +5154:2:1200 +5155:2:1194 +5156:2:1195 +5157:2:1199 +5158:2:1200 +5159:2:1208 +5160:2:1213 +5161:2:1217 +5162:2:1218 +5163:2:1225 +5164:2:1226 +5165:2:1237 +5166:2:1238 +5167:2:1239 +5168:2:1237 +5169:2:1238 +5170:2:1239 +5171:2:1250 +5172:2:1255 +5173:2:1256 +5174:0:4365 +5175:3:3758 +5176:0:4365 +5177:2:1268 +5178:0:4365 +5179:3:3757 +5180:0:4365 +5181:2:1270 +5182:0:4365 +5183:3:3758 +5184:0:4365 +5185:2:1271 +5186:2:1275 +5187:2:1276 +5188:2:1284 +5189:2:1285 +5190:2:1289 +5191:2:1290 +5192:2:1284 +5193:2:1285 +5194:2:1289 +5195:2:1290 +5196:2:1298 +5197:2:1303 +5198:2:1307 +5199:2:1308 +5200:2:1315 +5201:2:1316 +5202:2:1327 +5203:2:1328 +5204:2:1329 +5205:2:1327 +5206:2:1328 +5207:2:1329 +5208:2:1340 +5209:2:1345 +5210:2:1346 +5211:0:4365 +5212:2:1358 +5213:0:4365 +5214:2:1360 +5215:0:4365 +5216:3:3757 +5217:0:4365 +5218:2:1361 +5219:0:4365 +5220:3:3758 +5221:0:4365 +5222:2:1362 +5223:2:1366 +5224:2:1367 +5225:2:1375 +5226:2:1376 +5227:2:1380 +5228:2:1381 +5229:2:1375 +5230:2:1376 +5231:2:1380 +5232:2:1381 +5233:2:1389 +5234:2:1394 +5235:2:1398 +5236:2:1399 +5237:2:1406 +5238:2:1407 +5239:2:1418 +5240:2:1419 +5241:2:1420 +5242:2:1418 +5243:2:1419 +5244:2:1420 +5245:2:1431 +5246:2:1436 +5247:2:1437 +5248:0:4365 +5249:2:1449 +5250:0:4365 +5251:3:3757 +5252:0:4365 +5253:2:1451 +5254:0:4365 +5255:3:3758 +5256:0:4365 +5257:2:1652 +5258:0:4365 +5259:2:1653 +5260:0:4365 +5261:2:1657 +5262:0:4365 +5263:2:1180 +5264:0:4365 +5265:3:3757 +5266:0:4365 +5267:2:1181 +5268:2:1185 +5269:2:1186 +5270:2:1194 +5271:2:1195 +5272:2:1199 +5273:2:1200 +5274:2:1194 +5275:2:1195 +5276:2:1196 +5277:2:1208 +5278:2:1213 +5279:2:1217 +5280:2:1218 +5281:2:1225 +5282:2:1226 +5283:2:1237 +5284:2:1238 +5285:2:1239 +5286:2:1237 +5287:2:1238 +5288:2:1239 +5289:2:1250 +5290:2:1255 +5291:2:1256 +5292:0:4365 +5293:3:3758 +5294:0:4365 +5295:2:1268 +5296:0:4365 +5297:3:3757 +5298:0:4365 +5299:2:1270 +5300:0:4365 +5301:3:3758 +5302:0:4365 +5303:2:1271 +5304:2:1275 +5305:2:1276 +5306:2:1284 +5307:2:1285 +5308:2:1289 +5309:2:1290 +5310:2:1284 +5311:2:1285 +5312:2:1289 +5313:2:1290 +5314:2:1298 +5315:2:1303 +5316:2:1307 +5317:2:1308 +5318:2:1315 +5319:2:1316 +5320:2:1327 +5321:2:1328 +5322:2:1329 +5323:2:1327 +5324:2:1328 +5325:2:1329 +5326:2:1340 +5327:2:1345 +5328:2:1346 +5329:0:4365 +5330:2:1358 +5331:0:4365 +5332:2:1454 +5333:0:4365 +5334:3:3757 +5335:0:4365 +5336:2:1455 +5337:0:4365 +5338:3:3758 +5339:0:4365 +5340:2:1652 +5341:0:4365 +5342:2:1653 +5343:0:4365 +5344:2:1657 +5345:0:4365 +5346:2:1660 +5347:0:4365 +5348:3:3757 +5349:0:4365 +5350:2:1665 +5351:2:1669 +5352:2:1670 +5353:2:1678 +5354:2:1679 +5355:2:1683 +5356:2:1684 +5357:2:1678 +5358:2:1679 +5359:2:1680 +5360:2:1692 +5361:2:1697 +5362:2:1701 +5363:2:1702 +5364:2:1709 +5365:2:1710 +5366:2:1721 +5367:2:1722 +5368:2:1723 +5369:2:1721 +5370:2:1722 +5371:2:1723 +5372:2:1734 +5373:2:1739 +5374:2:1740 +5375:0:4365 +5376:3:3758 +5377:0:4365 +5378:2:1752 +5379:0:4365 +5380:3:3757 +5381:0:4365 +5382:2:1754 +5383:0:4365 +5384:3:3758 +5385:0:4365 +5386:2:1755 +5387:2:1759 +5388:2:1760 +5389:2:1768 +5390:2:1769 +5391:2:1773 +5392:2:1774 +5393:2:1768 +5394:2:1769 +5395:2:1773 +5396:2:1774 +5397:2:1782 +5398:2:1787 +5399:2:1791 +5400:2:1792 +5401:2:1799 +5402:2:1800 +5403:2:1811 +5404:2:1812 +5405:2:1813 +5406:2:1811 +5407:2:1812 +5408:2:1813 +5409:2:1824 +5410:2:1829 +5411:2:1830 +5412:0:4365 +5413:2:1842 +5414:0:4365 +5415:3:3757 +5416:0:4365 +5417:2:1844 +5418:0:4365 +5419:3:3758 +5420:0:4365 +5421:2:1845 +5422:2:1849 +5423:2:1850 +5424:2:1858 +5425:2:1859 +5426:2:1863 +5427:2:1864 +5428:2:1858 +5429:2:1859 +5430:2:1863 +5431:2:1864 +5432:2:1872 +5433:2:1877 +5434:2:1881 +5435:2:1882 +5436:2:1889 +5437:2:1890 +5438:2:1901 +5439:2:1902 +5440:2:1903 +5441:2:1901 +5442:2:1902 +5443:2:1903 +5444:2:1914 +5445:2:1919 +5446:2:1920 +5447:0:4365 +5448:2:1932 +5449:0:4365 +5450:3:3757 +5451:0:4365 +5452:2:1934 +5453:0:4365 +5454:3:3758 +5455:0:4365 +5456:2:1935 +5457:0:4365 +5458:2:1936 +5459:0:4365 +5460:2:2129 +5461:0:4365 +5462:2:2130 +5463:0:4365 +5464:2:2134 +5465:0:4365 +5466:3:3757 +5467:0:4365 +5468:2:2136 +5469:0:4365 +5470:3:3758 +5471:0:4365 +5472:2:2137 +5473:2:2141 +5474:2:2142 +5475:2:2150 +5476:2:2151 +5477:2:2155 +5478:2:2156 +5479:2:2150 +5480:2:2151 +5481:2:2155 +5482:2:2156 +5483:2:2164 +5484:2:2169 +5485:2:2173 +5486:2:2174 +5487:2:2181 +5488:2:2182 +5489:2:2193 +5490:2:2194 +5491:2:2195 +5492:2:2193 +5493:2:2194 +5494:2:2195 +5495:2:2206 +5496:2:2211 +5497:2:2212 +5498:0:4365 +5499:2:2224 +5500:0:4365 +5501:3:3757 +5502:0:4365 +5503:2:2226 +5504:0:4365 +5505:3:3758 +5506:0:4365 +5507:2:1936 +5508:0:4365 +5509:2:2129 +5510:0:4365 +5511:2:2130 +5512:0:4365 +5513:2:2134 +5514:0:4365 +5515:3:3757 +5516:0:4365 +5517:2:2136 +5518:0:4365 +5519:3:3758 +5520:0:4365 +5521:2:2137 +5522:2:2141 +5523:2:2142 +5524:2:2150 +5525:2:2151 +5526:2:2155 +5527:2:2156 +5528:2:2150 +5529:2:2151 +5530:2:2152 +5531:2:2164 +5532:2:2169 +5533:2:2173 +5534:2:2174 +5535:2:2181 +5536:2:2182 +5537:2:2193 +5538:2:2194 +5539:2:2195 +5540:2:2193 +5541:2:2194 +5542:2:2195 +5543:2:2206 +5544:2:2211 +5545:2:2212 +5546:0:4365 +5547:2:2224 +5548:0:4365 +5549:3:3757 +5550:0:4365 +5551:2:2226 +5552:0:4365 +5553:3:3758 +5554:0:4365 +5555:2:2230 +5556:0:4365 +5557:3:3757 +5558:0:4365 +5559:2:2235 +5560:2:2239 +5561:2:2240 +5562:2:2248 +5563:2:2249 +5564:2:2253 +5565:2:2254 +5566:2:2248 +5567:2:2249 +5568:2:2250 +5569:2:2262 +5570:2:2267 +5571:2:2271 +5572:2:2272 +5573:2:2279 +5574:2:2280 +5575:2:2291 +5576:2:2292 +5577:2:2293 +5578:2:2291 +5579:2:2292 +5580:2:2293 +5581:2:2304 +5582:2:2309 +5583:2:2310 +5584:0:4365 +5585:3:3758 +5586:0:4365 +5587:2:2322 +5588:0:4365 +5589:2:1169 +5590:0:4365 +5591:3:3757 +5592:0:4365 +5593:2:1170 +5594:0:4365 +5595:3:3758 +5596:0:4365 +5597:3:3759 +5598:0:4365 +5599:3:3972 +5600:0:4365 +5601:3:3980 +5602:0:4365 +5603:3:3981 +5604:3:3985 +5605:3:3986 +5606:3:3994 +5607:3:3995 +5608:3:3999 +5609:3:4000 +5610:3:3994 +5611:3:3995 +5612:3:3999 +5613:3:4000 +5614:3:4008 +5615:3:4013 +5616:3:4017 +5617:3:4018 +5618:3:4025 +5619:3:4026 +5620:3:4037 +5621:3:4038 +5622:3:4039 +5623:3:4037 +5624:3:4038 +5625:3:4039 +5626:3:4050 +5627:3:4055 +5628:3:4056 +5629:0:4365 +5630:3:4068 +5631:0:4365 +5632:3:4069 +5633:0:4365 +5634:2:1173 +5635:0:4365 +5636:3:4070 +5637:0:4365 +5638:2:1179 +5639:0:4365 +5640:2:1180 +5641:0:4365 +5642:3:4069 +5643:0:4365 +5644:2:1181 +5645:2:1185 +5646:2:1186 +5647:2:1194 +5648:2:1195 +5649:2:1199 +5650:2:1200 +5651:2:1194 +5652:2:1195 +5653:2:1199 +5654:2:1200 +5655:2:1208 +5656:2:1213 +5657:2:1217 +5658:2:1218 +5659:2:1225 +5660:2:1226 +5661:2:1237 +5662:2:1238 +5663:2:1239 +5664:2:1237 +5665:2:1238 +5666:2:1239 +5667:2:1250 +5668:2:1255 +5669:2:1256 +5670:0:4365 +5671:3:4070 +5672:0:4365 +5673:2:1268 +5674:0:4365 +5675:3:4069 +5676:0:4365 +5677:2:1270 +5678:0:4365 +5679:3:4070 +5680:0:4365 +5681:2:1271 +5682:2:1275 +5683:2:1276 +5684:2:1284 +5685:2:1285 +5686:2:1289 +5687:2:1290 +5688:2:1284 +5689:2:1285 +5690:2:1289 +5691:2:1290 +5692:2:1298 +5693:2:1303 +5694:2:1307 +5695:2:1308 +5696:2:1315 +5697:2:1316 +5698:2:1327 +5699:2:1328 +5700:2:1329 +5701:2:1327 +5702:2:1328 +5703:2:1329 +5704:2:1340 +5705:2:1345 +5706:2:1346 +5707:0:4365 +5708:2:1358 +5709:0:4365 +5710:2:1360 +5711:0:4365 +5712:3:4069 +5713:0:4365 +5714:2:1361 +5715:0:4365 +5716:3:4070 +5717:0:4365 +5718:2:1362 +5719:2:1366 +5720:2:1367 +5721:2:1375 +5722:2:1376 +5723:2:1380 +5724:2:1381 +5725:2:1375 +5726:2:1376 +5727:2:1380 +5728:2:1381 +5729:2:1389 +5730:2:1394 +5731:2:1398 +5732:2:1399 +5733:2:1406 +5734:2:1407 +5735:2:1418 +5736:2:1419 +5737:2:1420 +5738:2:1418 +5739:2:1419 +5740:2:1420 +5741:2:1431 +5742:2:1436 +5743:2:1437 +5744:0:4365 +5745:2:1449 +5746:0:4365 +5747:3:4069 +5748:0:4365 +5749:2:1451 +5750:0:4365 +5751:3:4070 +5752:0:4365 +5753:2:1652 +5754:0:4365 +5755:2:1653 +5756:0:4365 +5757:2:1657 +5758:0:4365 +5759:2:1180 +5760:0:4365 +5761:3:4069 +5762:0:4365 +5763:2:1181 +5764:2:1185 +5765:2:1186 +5766:2:1194 +5767:2:1195 +5768:2:1199 +5769:2:1200 +5770:2:1194 +5771:2:1195 +5772:2:1196 +5773:2:1208 +5774:2:1213 +5775:2:1217 +5776:2:1218 +5777:2:1225 +5778:2:1226 +5779:2:1237 +5780:2:1238 +5781:2:1239 +5782:2:1237 +5783:2:1238 +5784:2:1239 +5785:2:1250 +5786:2:1255 +5787:2:1256 +5788:0:4365 +5789:3:4070 +5790:0:4365 +5791:2:1268 +5792:0:4365 +5793:3:4069 +5794:0:4365 +5795:2:1270 +5796:0:4365 +5797:3:4070 +5798:0:4365 +5799:2:1271 +5800:2:1275 +5801:2:1276 +5802:2:1284 +5803:2:1285 +5804:2:1289 +5805:2:1290 +5806:2:1284 +5807:2:1285 +5808:2:1289 +5809:2:1290 +5810:2:1298 +5811:2:1303 +5812:2:1307 +5813:2:1308 +5814:2:1315 +5815:2:1316 +5816:2:1327 +5817:2:1328 +5818:2:1329 +5819:2:1327 +5820:2:1328 +5821:2:1329 +5822:2:1340 +5823:2:1345 +5824:2:1346 +5825:0:4365 +5826:2:1358 +5827:0:4365 +5828:2:1454 +5829:0:4365 +5830:3:4069 +5831:0:4365 +5832:2:1455 +5833:0:4365 +5834:3:4070 +5835:0:4365 +5836:2:1652 +5837:0:4365 +5838:2:1653 +5839:0:4365 +5840:2:1657 +5841:0:4365 +5842:2:1660 +5843:0:4365 +5844:3:4069 +5845:0:4365 +5846:2:1665 +5847:2:1669 +5848:2:1670 +5849:2:1678 +5850:2:1679 +5851:2:1683 +5852:2:1684 +5853:2:1678 +5854:2:1679 +5855:2:1680 +5856:2:1692 +5857:2:1697 +5858:2:1701 +5859:2:1702 +5860:2:1709 +5861:2:1710 +5862:2:1721 +5863:2:1722 +5864:2:1723 +5865:2:1721 +5866:2:1722 +5867:2:1723 +5868:2:1734 +5869:2:1739 +5870:2:1740 +5871:0:4365 +5872:3:4070 +5873:0:4365 +5874:2:1752 +5875:0:4365 +5876:3:4069 +5877:0:4365 +5878:2:1754 +5879:0:4365 +5880:3:4070 +5881:0:4365 +5882:2:1755 +5883:2:1759 +5884:2:1760 +5885:2:1768 +5886:2:1769 +5887:2:1773 +5888:2:1774 +5889:2:1768 +5890:2:1769 +5891:2:1773 +5892:2:1774 +5893:2:1782 +5894:2:1787 +5895:2:1791 +5896:2:1792 +5897:2:1799 +5898:2:1800 +5899:2:1811 +5900:2:1812 +5901:2:1813 +5902:2:1811 +5903:2:1812 +5904:2:1813 +5905:2:1824 +5906:2:1829 +5907:2:1830 +5908:0:4365 +5909:2:1842 +5910:0:4365 +5911:3:4069 +5912:0:4365 +5913:2:1844 +5914:0:4365 +5915:3:4070 +5916:0:4365 +5917:2:1845 +5918:2:1849 +5919:2:1850 +5920:2:1858 +5921:2:1859 +5922:2:1863 +5923:2:1864 +5924:2:1858 +5925:2:1859 +5926:2:1863 +5927:2:1864 +5928:2:1872 +5929:2:1877 +5930:2:1881 +5931:2:1882 +5932:2:1889 +5933:2:1890 +5934:2:1901 +5935:2:1902 +5936:2:1903 +5937:2:1901 +5938:2:1902 +5939:2:1903 +5940:2:1914 +5941:2:1919 +5942:2:1920 +5943:0:4365 +5944:2:1932 +5945:0:4365 +5946:3:4069 +5947:0:4365 +5948:2:1934 +5949:0:4365 +5950:3:4070 +5951:0:4365 +5952:2:1935 +5953:0:4365 +5954:2:1936 +5955:0:4365 +5956:2:2129 +5957:0:4365 +5958:2:2130 +5959:0:4365 +5960:2:2134 +5961:0:4365 +5962:3:4069 +5963:0:4365 +5964:2:2136 +5965:0:4365 +5966:3:4070 +5967:0:4365 +5968:2:2137 +5969:2:2141 +5970:2:2142 +5971:2:2150 +5972:2:2151 +5973:2:2155 +5974:2:2156 +5975:2:2150 +5976:2:2151 +5977:2:2155 +5978:2:2156 +5979:2:2164 +5980:2:2169 +5981:2:2173 +5982:2:2174 +5983:2:2181 +5984:2:2182 +5985:2:2193 +5986:2:2194 +5987:2:2195 +5988:2:2193 +5989:2:2194 +5990:2:2195 +5991:2:2206 +5992:2:2211 +5993:2:2212 +5994:0:4365 +5995:2:2224 +5996:0:4365 +5997:3:4069 +5998:0:4365 +5999:2:2226 +6000:0:4365 +6001:3:4070 +6002:0:4365 +6003:2:1936 +6004:0:4365 +6005:2:2129 +6006:0:4365 +6007:2:2130 +6008:0:4365 +6009:2:2134 +6010:0:4365 +6011:3:4069 +6012:0:4365 +6013:2:2136 +6014:0:4365 +6015:3:4070 +6016:0:4365 +6017:2:2137 +6018:2:2141 +6019:2:2142 +6020:2:2150 +6021:2:2151 +6022:2:2155 +6023:2:2156 +6024:2:2150 +6025:2:2151 +6026:2:2152 +6027:2:2164 +6028:2:2169 +6029:2:2173 +6030:2:2174 +6031:2:2181 +6032:2:2182 +6033:2:2193 +6034:2:2194 +6035:2:2195 +6036:2:2193 +6037:2:2194 +6038:2:2195 +6039:2:2206 +6040:2:2211 +6041:2:2212 +6042:0:4365 +6043:2:2224 +6044:0:4365 +6045:3:4069 +6046:0:4365 +6047:2:2226 +6048:0:4365 +6049:3:4070 +6050:0:4365 +6051:2:2230 +6052:0:4365 +6053:3:4069 +6054:0:4365 +6055:2:2235 +6056:2:2239 +6057:2:2240 +6058:2:2248 +6059:2:2249 +6060:2:2253 +6061:2:2254 +6062:2:2248 +6063:2:2249 +6064:2:2250 +6065:2:2262 +6066:2:2267 +6067:2:2271 +6068:2:2272 +6069:2:2279 +6070:2:2280 +6071:2:2291 +6072:2:2292 +6073:2:2293 +6074:2:2291 +6075:2:2292 +6076:2:2293 +6077:2:2304 +6078:2:2309 +6079:2:2310 +6080:0:4365 +6081:3:4070 +6082:0:4365 +6083:2:2322 +6084:0:4365 +6085:2:1169 +6086:0:4365 +6087:3:4069 +6088:0:4365 +6089:2:1170 +6090:0:4365 +6091:3:4070 +6092:0:4365 +6093:3:4071 +6094:0:4365 +6095:3:4081 +6096:0:4365 +6097:3:3666 +6098:0:4365 +6099:3:3667 +6100:0:4365 +6101:3:3668 +6102:0:4365 +6103:3:3669 +6104:3:3673 +6105:3:3674 +6106:3:3682 +6107:3:3683 +6108:3:3687 +6109:3:3688 +6110:3:3682 +6111:3:3683 +6112:3:3687 +6113:3:3688 +6114:3:3696 +6115:3:3701 +6116:3:3705 +6117:3:3706 +6118:3:3713 +6119:3:3714 +6120:3:3725 +6121:3:3726 +6122:3:3727 +6123:3:3725 +6124:3:3726 +6125:3:3727 +6126:3:3738 +6127:3:3743 +6128:3:3744 +6129:0:4365 +6130:3:3756 +6131:0:4365 +6132:3:3757 +6133:0:4365 +6134:2:1173 +6135:0:4365 +6136:3:3758 +6137:0:4365 +6138:2:1179 +6139:0:4365 +6140:2:1180 +6141:0:4365 +6142:3:3757 +6143:0:4365 +6144:2:1181 +6145:2:1185 +6146:2:1186 +6147:2:1194 +6148:2:1195 +6149:2:1199 +6150:2:1200 +6151:2:1194 +6152:2:1195 +6153:2:1199 +6154:2:1200 +6155:2:1208 +6156:2:1213 +6157:2:1217 +6158:2:1218 +6159:2:1225 +6160:2:1226 +6161:2:1237 +6162:2:1238 +6163:2:1239 +6164:2:1237 +6165:2:1238 +6166:2:1239 +6167:2:1250 +6168:2:1255 +6169:2:1256 +6170:0:4365 +6171:3:3758 +6172:0:4365 +6173:2:1268 +6174:0:4365 +6175:3:3757 +6176:0:4365 +6177:2:1270 +6178:0:4365 +6179:3:3758 +6180:0:4365 +6181:2:1271 +6182:2:1275 +6183:2:1276 +6184:2:1284 +6185:2:1285 +6186:2:1289 +6187:2:1290 +6188:2:1284 +6189:2:1285 +6190:2:1289 +6191:2:1290 +6192:2:1298 +6193:2:1303 +6194:2:1307 +6195:2:1308 +6196:2:1315 +6197:2:1316 +6198:2:1327 +6199:2:1328 +6200:2:1329 +6201:2:1327 +6202:2:1328 +6203:2:1329 +6204:2:1340 +6205:2:1345 +6206:2:1346 +6207:0:4365 +6208:2:1358 +6209:0:4365 +6210:2:1360 +6211:0:4365 +6212:3:3757 +6213:0:4365 +6214:2:1361 +6215:0:4365 +6216:3:3758 +6217:0:4365 +6218:2:1362 +6219:2:1366 +6220:2:1367 +6221:2:1375 +6222:2:1376 +6223:2:1380 +6224:2:1381 +6225:2:1375 +6226:2:1376 +6227:2:1380 +6228:2:1381 +6229:2:1389 +6230:2:1394 +6231:2:1398 +6232:2:1399 +6233:2:1406 +6234:2:1407 +6235:2:1418 +6236:2:1419 +6237:2:1420 +6238:2:1418 +6239:2:1419 +6240:2:1420 +6241:2:1431 +6242:2:1436 +6243:2:1437 +6244:0:4365 +6245:2:1449 +6246:0:4365 +6247:3:3757 +6248:0:4365 +6249:2:1451 +6250:0:4365 +6251:3:3758 +6252:0:4365 +6253:2:1652 +6254:0:4365 +6255:2:1653 +6256:0:4365 +6257:2:1657 +6258:0:4365 +6259:2:1180 +6260:0:4365 +6261:3:3757 +6262:0:4365 +6263:2:1181 +6264:2:1185 +6265:2:1186 +6266:2:1194 +6267:2:1195 +6268:2:1199 +6269:2:1200 +6270:2:1194 +6271:2:1195 +6272:2:1196 +6273:2:1208 +6274:2:1213 +6275:2:1217 +6276:2:1218 +6277:2:1225 +6278:2:1226 +6279:2:1237 +6280:2:1238 +6281:2:1239 +6282:2:1237 +6283:2:1238 +6284:2:1239 +6285:2:1250 +6286:2:1255 +6287:2:1256 +6288:0:4365 +6289:3:3758 +6290:0:4365 +6291:2:1268 +6292:0:4365 +6293:3:3757 +6294:0:4365 +6295:2:1270 +6296:0:4365 +6297:3:3758 +6298:0:4365 +6299:2:1271 +6300:2:1275 +6301:2:1276 +6302:2:1284 +6303:2:1285 +6304:2:1289 +6305:2:1290 +6306:2:1284 +6307:2:1285 +6308:2:1289 +6309:2:1290 +6310:2:1298 +6311:2:1303 +6312:2:1307 +6313:2:1308 +6314:2:1315 +6315:2:1316 +6316:2:1327 +6317:2:1328 +6318:2:1329 +6319:2:1327 +6320:2:1328 +6321:2:1329 +6322:2:1340 +6323:2:1345 +6324:2:1346 +6325:0:4365 +6326:2:1358 +6327:0:4365 +6328:2:1454 +6329:0:4365 +6330:3:3757 +6331:0:4365 +6332:2:1455 +6333:0:4365 +6334:3:3758 +6335:0:4365 +6336:2:1652 +6337:0:4365 +6338:2:1653 +6339:0:4365 +6340:2:1657 +6341:0:4365 +6342:2:1660 +6343:0:4365 +6344:3:3757 +6345:0:4365 +6346:2:1665 +6347:2:1669 +6348:2:1670 +6349:2:1678 +6350:2:1679 +6351:2:1683 +6352:2:1684 +6353:2:1678 +6354:2:1679 +6355:2:1680 +6356:2:1692 +6357:2:1697 +6358:2:1701 +6359:2:1702 +6360:2:1709 +6361:2:1710 +6362:2:1721 +6363:2:1722 +6364:2:1723 +6365:2:1721 +6366:2:1722 +6367:2:1723 +6368:2:1734 +6369:2:1739 +6370:2:1740 +6371:0:4365 +6372:3:3758 +6373:0:4365 +6374:2:1752 +6375:0:4365 +6376:3:3757 +6377:0:4365 +6378:2:1754 +6379:0:4365 +6380:3:3758 +6381:0:4365 +6382:2:1755 +6383:2:1759 +6384:2:1760 +6385:2:1768 +6386:2:1769 +6387:2:1773 +6388:2:1774 +6389:2:1768 +6390:2:1769 +6391:2:1773 +6392:2:1774 +6393:2:1782 +6394:2:1787 +6395:2:1791 +6396:2:1792 +6397:2:1799 +6398:2:1800 +6399:2:1811 +6400:2:1812 +6401:2:1813 +6402:2:1811 +6403:2:1812 +6404:2:1813 +6405:2:1824 +6406:2:1829 +6407:2:1830 +6408:0:4365 +6409:2:1842 +6410:0:4365 +6411:3:3757 +6412:0:4365 +6413:2:1844 +6414:0:4365 +6415:3:3758 +6416:0:4365 +6417:2:1845 +6418:2:1849 +6419:2:1850 +6420:2:1858 +6421:2:1859 +6422:2:1863 +6423:2:1864 +6424:2:1858 +6425:2:1859 +6426:2:1863 +6427:2:1864 +6428:2:1872 +6429:2:1877 +6430:2:1881 +6431:2:1882 +6432:2:1889 +6433:2:1890 +6434:2:1901 +6435:2:1902 +6436:2:1903 +6437:2:1901 +6438:2:1902 +6439:2:1903 +6440:2:1914 +6441:2:1919 +6442:2:1920 +6443:0:4365 +6444:2:1932 +6445:0:4365 +6446:3:3757 +6447:0:4365 +6448:2:1934 +6449:0:4365 +6450:3:3758 +6451:0:4365 +6452:2:1935 +6453:0:4365 +6454:2:1936 +6455:0:4365 +6456:2:2129 +6457:0:4365 +6458:2:2130 +6459:0:4365 +6460:2:2134 +6461:0:4365 +6462:3:3757 +6463:0:4365 +6464:2:2136 +6465:0:4365 +6466:3:3758 +6467:0:4365 +6468:2:2137 +6469:2:2141 +6470:2:2142 +6471:2:2150 +6472:2:2151 +6473:2:2155 +6474:2:2156 +6475:2:2150 +6476:2:2151 +6477:2:2155 +6478:2:2156 +6479:2:2164 +6480:2:2169 +6481:2:2173 +6482:2:2174 +6483:2:2181 +6484:2:2182 +6485:2:2193 +6486:2:2194 +6487:2:2195 +6488:2:2193 +6489:2:2194 +6490:2:2195 +6491:2:2206 +6492:2:2211 +6493:2:2212 +6494:0:4365 +6495:2:2224 +6496:0:4365 +6497:3:3757 +6498:0:4365 +6499:2:2226 +6500:0:4365 +6501:3:3758 +6502:0:4365 +6503:2:1936 +6504:0:4365 +6505:2:2129 +6506:0:4365 +6507:2:2130 +6508:0:4365 +6509:2:2134 +6510:0:4365 +6511:3:3757 +6512:0:4365 +6513:2:2136 +6514:0:4365 +6515:3:3758 +6516:0:4365 +6517:2:2137 +6518:2:2141 +6519:2:2142 +6520:2:2150 +6521:2:2151 +6522:2:2155 +6523:2:2156 +6524:2:2150 +6525:2:2151 +6526:2:2152 +6527:2:2164 +6528:2:2169 +6529:2:2173 +6530:2:2174 +6531:2:2181 +6532:2:2182 +6533:2:2193 +6534:2:2194 +6535:2:2195 +6536:2:2193 +6537:2:2194 +6538:2:2195 +6539:2:2206 +6540:2:2211 +6541:2:2212 +6542:0:4365 +6543:2:2224 +6544:0:4365 +6545:3:3757 +6546:0:4365 +6547:2:2226 +6548:0:4365 +6549:3:3758 +6550:0:4365 +6551:2:2230 +6552:0:4365 +6553:3:3757 +6554:0:4365 +6555:2:2235 +6556:2:2239 +6557:2:2240 +6558:2:2248 +6559:2:2249 +6560:2:2253 +6561:2:2254 +6562:2:2248 +6563:2:2249 +6564:2:2250 +6565:2:2262 +6566:2:2267 +6567:2:2271 +6568:2:2272 +6569:2:2279 +6570:2:2280 +6571:2:2291 +6572:2:2292 +6573:2:2293 +6574:2:2291 +6575:2:2292 +6576:2:2293 +6577:2:2304 +6578:2:2309 +6579:2:2310 +6580:0:4365 +6581:3:3758 +6582:0:4365 +6583:2:2322 +6584:0:4365 +6585:2:1169 +6586:0:4365 +6587:3:3757 +6588:0:4365 +6589:2:1170 +6590:0:4365 +6591:3:3758 +6592:0:4365 +6593:3:3759 +6594:0:4365 +6595:3:3972 +6596:0:4365 +6597:3:4077 +6598:0:4365 +6599:3:4078 +6600:0:4365 +6601:3:4082 +6602:0:4365 +6603:3:4088 +6604:0:4365 +6605:3:4092 +6606:3:4093 +6607:3:4097 +6608:3:4101 +6609:3:4102 +6610:3:4097 +6611:3:4101 +6612:3:4102 +6613:3:4106 +6614:3:4114 +6615:3:4115 +6616:3:4120 +6617:3:4127 +6618:3:4128 +6619:3:4127 +6620:3:4128 +6621:3:4135 +6622:3:4140 +6623:0:4365 +6624:3:4151 +6625:0:4365 +6626:3:4155 +6627:3:4156 +6628:3:4160 +6629:3:4164 +6630:3:4165 +6631:3:4160 +6632:3:4164 +6633:3:4165 +6634:3:4169 +6635:3:4177 +6636:3:4178 +6637:3:4183 +6638:3:4190 +6639:3:4191 +6640:3:4190 +6641:3:4191 +6642:3:4198 +6643:3:4203 +6644:0:4365 +6645:3:4151 +6646:0:4365 +6647:3:4155 +6648:3:4156 +6649:3:4160 +6650:3:4164 +6651:3:4165 +6652:3:4160 +6653:3:4164 +6654:3:4165 +6655:3:4169 +6656:3:4177 +6657:3:4178 +6658:3:4183 +6659:3:4190 +6660:3:4191 +6661:3:4190 +6662:3:4191 +6663:3:4198 +6664:3:4203 +6665:0:4365 +6666:3:4214 +6667:0:4365 +6668:3:4222 +6669:3:4223 +6670:3:4227 +6671:3:4231 +6672:3:4232 +6673:3:4227 +6674:3:4231 +6675:3:4232 +6676:3:4236 +6677:3:4244 +6678:3:4245 +6679:3:4250 +6680:3:4257 +6681:3:4258 +6682:3:4257 +6683:3:4258 +6684:3:4265 +6685:3:4270 +6686:0:4365 +6687:3:4285 +6688:0:4365 +6689:3:4286 +6690:0:4365 +6691:2:1173 +6692:0:4365 +6693:3:4287 +6694:0:4365 +6695:2:1179 +6696:0:4365 +6697:2:1180 +6698:0:4365 +6699:3:4286 +6700:0:4365 +6701:2:1181 +6702:2:1185 +6703:2:1186 +6704:2:1194 +6705:2:1195 +6706:2:1199 +6707:2:1200 +6708:2:1194 +6709:2:1195 +6710:2:1199 +6711:2:1200 +6712:2:1208 +6713:2:1213 +6714:2:1217 +6715:2:1218 +6716:2:1225 +6717:2:1226 +6718:2:1237 +6719:2:1238 +6720:2:1239 +6721:2:1237 +6722:2:1238 +6723:2:1239 +6724:2:1250 +6725:2:1255 +6726:2:1256 +6727:0:4365 +6728:3:4287 +6729:0:4365 +6730:2:1268 +6731:0:4365 +6732:3:4286 +6733:0:4365 +6734:2:1270 +6735:0:4365 +6736:3:4287 +6737:0:4365 +6738:2:1271 +6739:2:1275 +6740:2:1276 +6741:2:1284 +6742:2:1285 +6743:2:1289 +6744:2:1290 +6745:2:1284 +6746:2:1285 +6747:2:1289 +6748:2:1290 +6749:2:1298 +6750:2:1303 +6751:2:1307 +6752:2:1308 +6753:2:1315 +6754:2:1316 +6755:2:1327 +6756:2:1328 +6757:2:1329 +6758:2:1327 +6759:2:1328 +6760:2:1329 +6761:2:1340 +6762:2:1345 +6763:2:1346 +6764:0:4365 +6765:2:1358 +6766:0:4365 +6767:2:1360 +6768:0:4365 +6769:3:4286 +6770:0:4365 +6771:2:1361 +6772:0:4365 +6773:3:4287 +6774:0:4365 +6775:2:1362 +6776:2:1366 +6777:2:1367 +6778:2:1375 +6779:2:1376 +6780:2:1380 +6781:2:1381 +6782:2:1375 +6783:2:1376 +6784:2:1380 +6785:2:1381 +6786:2:1389 +6787:2:1394 +6788:2:1398 +6789:2:1399 +6790:2:1406 +6791:2:1407 +6792:2:1418 +6793:2:1419 +6794:2:1420 +6795:2:1418 +6796:2:1419 +6797:2:1420 +6798:2:1431 +6799:2:1436 +6800:2:1437 +6801:0:4365 +6802:2:1449 +6803:0:4365 +6804:3:4286 +6805:0:4365 +6806:2:1451 +6807:0:4365 +6808:3:4287 +6809:0:4365 +6810:2:1652 +6811:0:4365 +6812:2:1653 +6813:0:4365 +6814:2:1657 +6815:0:4365 +6816:2:1180 +6817:0:4365 +6818:3:4286 +6819:0:4365 +6820:2:1181 +6821:2:1185 +6822:2:1186 +6823:2:1194 +6824:2:1195 +6825:2:1199 +6826:2:1200 +6827:2:1194 +6828:2:1195 +6829:2:1196 +6830:2:1208 +6831:2:1213 +6832:2:1217 +6833:2:1218 +6834:2:1225 +6835:2:1226 +6836:2:1237 +6837:2:1238 +6838:2:1239 +6839:2:1237 +6840:2:1238 +6841:2:1239 +6842:2:1250 +6843:2:1255 +6844:2:1256 +6845:0:4365 +6846:3:4287 +6847:0:4365 +6848:2:1268 +6849:0:4365 +6850:3:4286 +6851:0:4365 +6852:2:1270 +6853:0:4365 +6854:3:4287 +6855:0:4365 +6856:2:1271 +6857:2:1275 +6858:2:1276 +6859:2:1284 +6860:2:1285 +6861:2:1289 +6862:2:1290 +6863:2:1284 +6864:2:1285 +6865:2:1289 +6866:2:1290 +6867:2:1298 +6868:2:1303 +6869:2:1307 +6870:2:1308 +6871:2:1315 +6872:2:1316 +6873:2:1327 +6874:2:1328 +6875:2:1329 +6876:2:1327 +6877:2:1328 +6878:2:1329 +6879:2:1340 +6880:2:1345 +6881:2:1346 +6882:0:4365 +6883:2:1358 +6884:0:4365 +6885:2:1454 +6886:0:4365 +6887:3:4286 +6888:0:4365 +6889:2:1455 +6890:0:4365 +6891:3:4287 +6892:0:4365 +6893:2:1652 +6894:0:4365 +6895:2:1653 +6896:0:4365 +6897:2:1657 +6898:0:4365 +6899:2:1660 +6900:0:4365 +6901:3:4286 +6902:0:4365 +6903:2:1665 +6904:2:1669 +6905:2:1670 +6906:2:1678 +6907:2:1679 +6908:2:1683 +6909:2:1684 +6910:2:1678 +6911:2:1679 +6912:2:1680 +6913:2:1692 +6914:2:1697 +6915:2:1701 +6916:2:1702 +6917:2:1709 +6918:2:1710 +6919:2:1721 +6920:2:1722 +6921:2:1723 +6922:2:1721 +6923:2:1722 +6924:2:1723 +6925:2:1734 +6926:2:1739 +6927:2:1740 +6928:0:4365 +6929:3:4287 +6930:0:4365 +6931:2:1752 +6932:0:4365 +6933:3:4286 +6934:0:4365 +6935:2:1754 +6936:0:4365 +6937:3:4287 +6938:0:4365 +6939:2:1755 +6940:2:1759 +6941:2:1760 +6942:2:1768 +6943:2:1769 +6944:2:1773 +6945:2:1774 +6946:2:1768 +6947:2:1769 +6948:2:1773 +6949:2:1774 +6950:2:1782 +6951:2:1787 +6952:2:1791 +6953:2:1792 +6954:2:1799 +6955:2:1800 +6956:2:1811 +6957:2:1812 +6958:2:1813 +6959:2:1811 +6960:2:1812 +6961:2:1813 +6962:2:1824 +6963:2:1829 +6964:2:1830 +6965:0:4365 +6966:2:1842 +6967:0:4365 +6968:3:4286 +6969:0:4365 +6970:2:1844 +6971:0:4365 +6972:3:4287 +6973:0:4365 +6974:2:1845 +6975:2:1849 +6976:2:1850 +6977:2:1858 +6978:2:1859 +6979:2:1863 +6980:2:1864 +6981:2:1858 +6982:2:1859 +6983:2:1863 +6984:2:1864 +6985:2:1872 +6986:2:1877 +6987:2:1881 +6988:2:1882 +6989:2:1889 +6990:2:1890 +6991:2:1901 +6992:2:1902 +6993:2:1903 +6994:2:1901 +6995:2:1902 +6996:2:1903 +6997:2:1914 +6998:2:1919 +6999:2:1920 +7000:0:4365 +7001:2:1932 +7002:0:4365 +7003:3:4286 +7004:0:4365 +7005:2:1934 +7006:0:4365 +7007:3:4287 +7008:0:4365 +7009:2:1935 +7010:0:4365 +7011:2:1936 +7012:0:4365 +7013:2:2129 +7014:0:4365 +7015:2:2130 +7016:0:4365 +7017:2:2134 +7018:0:4365 +7019:3:4286 +7020:0:4365 +7021:2:2136 +7022:0:4365 +7023:3:4287 +7024:0:4365 +7025:2:2137 +7026:2:2141 +7027:2:2142 +7028:2:2150 +7029:2:2151 +7030:2:2155 +7031:2:2156 +7032:2:2150 +7033:2:2151 +7034:2:2155 +7035:2:2156 +7036:2:2164 +7037:2:2169 +7038:2:2173 +7039:2:2174 +7040:2:2181 +7041:2:2182 +7042:2:2193 +7043:2:2194 +7044:2:2195 +7045:2:2193 +7046:2:2194 +7047:2:2195 +7048:2:2206 +7049:2:2211 +7050:2:2212 +7051:0:4365 +7052:2:2224 +7053:0:4365 +7054:3:4286 +7055:0:4365 +7056:2:2226 +7057:0:4365 +7058:3:4287 +7059:0:4365 +7060:2:1936 +7061:0:4365 +7062:2:2129 +7063:0:4365 +7064:2:2130 +7065:0:4365 +7066:2:2134 +7067:0:4365 +7068:3:4286 +7069:0:4365 +7070:2:2136 +7071:0:4365 +7072:3:4287 +7073:0:4365 +7074:2:2137 +7075:2:2141 +7076:2:2142 +7077:2:2150 +7078:2:2151 +7079:2:2155 +7080:2:2156 +7081:2:2150 +7082:2:2151 +7083:2:2152 +7084:2:2164 +7085:2:2169 +7086:2:2173 +7087:2:2174 +7088:2:2181 +7089:2:2182 +7090:2:2193 +7091:2:2194 +7092:2:2195 +7093:2:2193 +7094:2:2194 +7095:2:2195 +7096:2:2206 +7097:2:2211 +7098:2:2212 +7099:0:4365 +7100:2:2224 +7101:0:4365 +7102:3:4286 +7103:0:4365 +7104:2:2226 +7105:0:4365 +7106:3:4287 +7107:0:4365 +7108:2:2230 +7109:0:4365 +7110:3:4286 +7111:0:4365 +7112:2:2235 +7113:2:2239 +7114:2:2240 +7115:2:2248 +7116:2:2249 +7117:2:2253 +7118:2:2254 +7119:2:2248 +7120:2:2249 +7121:2:2250 +7122:2:2262 +7123:2:2267 +7124:2:2271 +7125:2:2272 +7126:2:2279 +7127:2:2280 +7128:2:2291 +7129:2:2292 +7130:2:2293 +7131:2:2291 +7132:2:2292 +7133:2:2293 +7134:2:2304 +7135:2:2309 +7136:2:2310 +7137:0:4365 +7138:3:4287 +7139:0:4365 +7140:2:2322 +7141:0:4365 +7142:2:1169 +7143:0:4365 +7144:3:4286 +7145:0:4365 +7146:2:1170 +7147:0:4365 +7148:3:4287 +7149:0:4365 +7150:3:4288 +7151:0:4365 +7152:3:4294 +7153:0:4365 +7154:3:4295 +7155:0:4365 +7156:3:2338 +7157:0:4365 +7158:3:2339 +7159:3:2343 +7160:3:2344 +7161:3:2352 +7162:3:2353 +7163:3:2357 +7164:3:2358 +7165:3:2352 +7166:3:2353 +7167:3:2357 +7168:3:2358 +7169:3:2366 +7170:3:2371 +7171:3:2375 +7172:3:2376 +7173:3:2383 +7174:3:2384 +7175:3:2395 +7176:3:2396 +7177:3:2397 +7178:3:2395 +7179:3:2396 +7180:3:2397 +7181:3:2408 +7182:3:2413 +7183:3:2414 +7184:0:4365 +7185:3:2426 +7186:0:4365 +7187:3:2427 +7188:0:4365 +7189:2:1173 +7190:0:4365 +7191:3:2428 +7192:0:4365 +7193:2:1179 +7194:0:4365 +7195:2:1180 +7196:0:4365 +7197:3:2427 +7198:0:4365 +7199:2:1181 +7200:2:1185 +7201:2:1186 +7202:2:1194 +7203:2:1195 +7204:2:1199 +7205:2:1200 +7206:2:1194 +7207:2:1195 +7208:2:1199 +7209:2:1200 +7210:2:1208 +7211:2:1213 +7212:2:1217 +7213:2:1218 +7214:2:1225 +7215:2:1226 +7216:2:1237 +7217:2:1238 +7218:2:1239 +7219:2:1237 +7220:2:1238 +7221:2:1239 +7222:2:1250 +7223:2:1255 +7224:2:1256 +7225:0:4365 +7226:3:2428 +7227:0:4365 +7228:2:1268 +7229:0:4365 +7230:3:2427 +7231:0:4365 +7232:2:1270 +7233:0:4365 +7234:3:2428 +7235:0:4365 +7236:2:1271 +7237:2:1275 +7238:2:1276 +7239:2:1284 +7240:2:1285 +7241:2:1289 +7242:2:1290 +7243:2:1284 +7244:2:1285 +7245:2:1289 +7246:2:1290 +7247:2:1298 +7248:2:1303 +7249:2:1307 +7250:2:1308 +7251:2:1315 +7252:2:1316 +7253:2:1327 +7254:2:1328 +7255:2:1329 +7256:2:1327 +7257:2:1328 +7258:2:1329 +7259:2:1340 +7260:2:1345 +7261:2:1346 +7262:0:4365 +7263:2:1358 +7264:0:4365 +7265:2:1360 +7266:0:4365 +7267:3:2427 +7268:0:4365 +7269:2:1361 +7270:0:4365 +7271:3:2428 +7272:0:4365 +7273:2:1362 +7274:2:1366 +7275:2:1367 +7276:2:1375 +7277:2:1376 +7278:2:1380 +7279:2:1381 +7280:2:1375 +7281:2:1376 +7282:2:1380 +7283:2:1381 +7284:2:1389 +7285:2:1394 +7286:2:1398 +7287:2:1399 +7288:2:1406 +7289:2:1407 +7290:2:1418 +7291:2:1419 +7292:2:1420 +7293:2:1418 +7294:2:1419 +7295:2:1420 +7296:2:1431 +7297:2:1436 +7298:2:1437 +7299:0:4365 +7300:2:1449 +7301:0:4365 +7302:3:2427 +7303:0:4365 +7304:2:1451 +7305:0:4365 +7306:3:2428 +7307:0:4365 +7308:2:1652 +7309:0:4365 +7310:2:1653 +7311:0:4365 +7312:2:1657 +7313:0:4365 +7314:2:1180 +7315:0:4365 +7316:3:2427 +7317:0:4365 +7318:2:1181 +7319:2:1185 +7320:2:1186 +7321:2:1194 +7322:2:1195 +7323:2:1199 +7324:2:1200 +7325:2:1194 +7326:2:1195 +7327:2:1196 +7328:2:1208 +7329:2:1213 +7330:2:1217 +7331:2:1218 +7332:2:1225 +7333:2:1226 +7334:2:1237 +7335:2:1238 +7336:2:1239 +7337:2:1237 +7338:2:1238 +7339:2:1239 +7340:2:1250 +7341:2:1255 +7342:2:1256 +7343:0:4365 +7344:3:2428 +7345:0:4365 +7346:2:1268 +7347:0:4365 +7348:3:2427 +7349:0:4365 +7350:2:1270 +7351:0:4365 +7352:3:2428 +7353:0:4365 +7354:2:1271 +7355:2:1275 +7356:2:1276 +7357:2:1284 +7358:2:1285 +7359:2:1289 +7360:2:1290 +7361:2:1284 +7362:2:1285 +7363:2:1289 +7364:2:1290 +7365:2:1298 +7366:2:1303 +7367:2:1307 +7368:2:1308 +7369:2:1315 +7370:2:1316 +7371:2:1327 +7372:2:1328 +7373:2:1329 +7374:2:1327 +7375:2:1328 +7376:2:1329 +7377:2:1340 +7378:2:1345 +7379:2:1346 +7380:0:4365 +7381:2:1358 +7382:0:4365 +7383:2:1454 +7384:0:4365 +7385:3:2427 +7386:0:4365 +7387:2:1455 +7388:0:4365 +7389:3:2428 +7390:0:4365 +7391:2:1652 +7392:0:4365 +7393:2:1653 +7394:0:4365 +7395:2:1657 +7396:0:4365 +7397:2:1660 +7398:0:4365 +7399:3:2427 +7400:0:4365 +7401:2:1665 +7402:2:1669 +7403:2:1670 +7404:2:1678 +7405:2:1679 +7406:2:1683 +7407:2:1684 +7408:2:1678 +7409:2:1679 +7410:2:1680 +7411:2:1692 +7412:2:1697 +7413:2:1701 +7414:2:1702 +7415:2:1709 +7416:2:1710 +7417:2:1721 +7418:2:1722 +7419:2:1723 +7420:2:1721 +7421:2:1722 +7422:2:1723 +7423:2:1734 +7424:2:1739 +7425:2:1740 +7426:0:4365 +7427:3:2428 +7428:0:4365 +7429:2:1752 +7430:0:4365 +7431:3:2427 +7432:0:4365 +7433:2:1754 +7434:0:4365 +7435:3:2428 +7436:0:4365 +7437:2:1755 +7438:2:1759 +7439:2:1760 +7440:2:1768 +7441:2:1769 +7442:2:1773 +7443:2:1774 +7444:2:1768 +7445:2:1769 +7446:2:1773 +7447:2:1774 +7448:2:1782 +7449:2:1787 +7450:2:1791 +7451:2:1792 +7452:2:1799 +7453:2:1800 +7454:2:1811 +7455:2:1812 +7456:2:1813 +7457:2:1811 +7458:2:1812 +7459:2:1813 +7460:2:1824 +7461:2:1829 +7462:2:1830 +7463:0:4365 +7464:2:1842 +7465:0:4365 +7466:3:2427 +7467:0:4365 +7468:2:1844 +7469:0:4365 +7470:3:2428 +7471:0:4365 +7472:2:1845 +7473:2:1849 +7474:2:1850 +7475:2:1858 +7476:2:1859 +7477:2:1863 +7478:2:1864 +7479:2:1858 +7480:2:1859 +7481:2:1863 +7482:2:1864 +7483:2:1872 +7484:2:1877 +7485:2:1881 +7486:2:1882 +7487:2:1889 +7488:2:1890 +7489:2:1901 +7490:2:1902 +7491:2:1903 +7492:2:1901 +7493:2:1902 +7494:2:1903 +7495:2:1914 +7496:2:1919 +7497:2:1920 +7498:0:4365 +7499:2:1932 +7500:0:4365 +7501:3:2427 +7502:0:4365 +7503:2:1934 +7504:0:4365 +7505:3:2428 +7506:0:4365 +7507:2:1935 +7508:0:4365 +7509:2:1936 +7510:0:4365 +7511:2:2129 +7512:0:4365 +7513:2:2130 +7514:0:4365 +7515:2:2134 +7516:0:4365 +7517:3:2427 +7518:0:4365 +7519:2:2136 +7520:0:4365 +7521:3:2428 +7522:0:4365 +7523:2:2137 +7524:2:2141 +7525:2:2142 +7526:2:2150 +7527:2:2151 +7528:2:2155 +7529:2:2156 +7530:2:2150 +7531:2:2151 +7532:2:2155 +7533:2:2156 +7534:2:2164 +7535:2:2169 +7536:2:2173 +7537:2:2174 +7538:2:2181 +7539:2:2182 +7540:2:2193 +7541:2:2194 +7542:2:2195 +7543:2:2193 +7544:2:2194 +7545:2:2195 +7546:2:2206 +7547:2:2211 +7548:2:2212 +7549:0:4365 +7550:2:2224 +7551:0:4365 +7552:3:2427 +7553:0:4365 +7554:2:2226 +7555:0:4365 +7556:3:2428 +7557:0:4365 +7558:2:1936 +7559:0:4365 +7560:2:2129 +7561:0:4365 +7562:2:2130 +7563:0:4365 +7564:2:2134 +7565:0:4365 +7566:3:2427 +7567:0:4365 +7568:2:2136 +7569:0:4365 +7570:3:2428 +7571:0:4365 +7572:2:2137 +7573:2:2141 +7574:2:2142 +7575:2:2150 +7576:2:2151 +7577:2:2155 +7578:2:2156 +7579:2:2150 +7580:2:2151 +7581:2:2152 +7582:2:2164 +7583:2:2169 +7584:2:2173 +7585:2:2174 +7586:2:2181 +7587:2:2182 +7588:2:2193 +7589:2:2194 +7590:2:2195 +7591:2:2193 +7592:2:2194 +7593:2:2195 +7594:2:2206 +7595:2:2211 +7596:2:2212 +7597:0:4365 +7598:2:2224 +7599:0:4365 +7600:3:2427 +7601:0:4365 +7602:2:2226 +7603:0:4365 +7604:3:2428 +7605:0:4365 +7606:2:2230 +7607:0:4365 +7608:3:2427 +7609:0:4365 +7610:2:2235 +7611:2:2239 +7612:2:2240 +7613:2:2248 +7614:2:2249 +7615:2:2253 +7616:2:2254 +7617:2:2248 +7618:2:2249 +7619:2:2250 +7620:2:2262 +7621:2:2267 +7622:2:2271 +7623:2:2272 +7624:2:2279 +7625:2:2280 +7626:2:2291 +7627:2:2292 +7628:2:2293 +7629:2:2291 +7630:2:2292 +7631:2:2293 +7632:2:2304 +7633:2:2309 +7634:2:2310 +7635:0:4365 +7636:3:2428 +7637:0:4365 +7638:2:2322 +7639:0:4365 +7640:2:1169 +7641:0:4365 +7642:3:2427 +7643:0:4365 +7644:2:1170 +7645:0:4365 +7646:3:2428 +7647:0:4365 +7648:3:2429 +7649:0:4365 +7650:3:2435 +7651:3:2436 +7652:0:4365 +7653:3:2440 +7654:3:2444 +7655:3:2445 +7656:3:2453 +7657:3:2454 +7658:3:2458 +7659:3:2459 +7660:3:2453 +7661:3:2454 +7662:3:2458 +7663:3:2459 +7664:3:2467 +7665:3:2472 +7666:3:2473 +7667:3:2484 +7668:3:2485 +7669:3:2496 +7670:3:2497 +7671:3:2498 +7672:3:2496 +7673:3:2497 +7674:3:2498 +7675:3:2509 +7676:3:2514 +7677:3:2515 +7678:0:4365 +7679:3:2527 +7680:0:4365 +7681:3:2528 +7682:0:4365 +7683:2:1173 +7684:0:4365 +7685:3:2529 +7686:0:4365 +7687:2:1179 +7688:0:4365 +7689:2:1180 +7690:0:4365 +7691:3:2528 +7692:0:4365 +7693:2:1181 +7694:2:1185 +7695:2:1186 +7696:2:1194 +7697:2:1195 +7698:2:1199 +7699:2:1200 +7700:2:1194 +7701:2:1195 +7702:2:1199 +7703:2:1200 +7704:2:1208 +7705:2:1213 +7706:2:1217 +7707:2:1218 +7708:2:1225 +7709:2:1226 +7710:2:1237 +7711:2:1238 +7712:2:1239 +7713:2:1237 +7714:2:1238 +7715:2:1239 +7716:2:1250 +7717:2:1255 +7718:2:1256 +7719:0:4365 +7720:3:2529 +7721:0:4365 +7722:2:1268 +7723:0:4365 +7724:3:2528 +7725:0:4365 +7726:2:1270 +7727:0:4365 +7728:3:2529 +7729:0:4365 +7730:2:1271 +7731:2:1275 +7732:2:1276 +7733:2:1284 +7734:2:1285 +7735:2:1289 +7736:2:1290 +7737:2:1284 +7738:2:1285 +7739:2:1289 +7740:2:1290 +7741:2:1298 +7742:2:1303 +7743:2:1307 +7744:2:1308 +7745:2:1315 +7746:2:1316 +7747:2:1327 +7748:2:1328 +7749:2:1329 +7750:2:1327 +7751:2:1328 +7752:2:1329 +7753:2:1340 +7754:2:1345 +7755:2:1346 +7756:0:4365 +7757:2:1358 +7758:0:4365 +7759:2:1360 +7760:0:4365 +7761:3:2528 +7762:0:4365 +7763:2:1361 +7764:0:4365 +7765:3:2529 +7766:0:4365 +7767:2:1362 +7768:2:1366 +7769:2:1367 +7770:2:1375 +7771:2:1376 +7772:2:1380 +7773:2:1381 +7774:2:1375 +7775:2:1376 +7776:2:1380 +7777:2:1381 +7778:2:1389 +7779:2:1394 +7780:2:1398 +7781:2:1399 +7782:2:1406 +7783:2:1407 +7784:2:1418 +7785:2:1419 +7786:2:1420 +7787:2:1418 +7788:2:1419 +7789:2:1420 +7790:2:1431 +7791:2:1436 +7792:2:1437 +7793:0:4365 +7794:2:1449 +7795:0:4365 +7796:3:2528 +7797:0:4365 +7798:2:1451 +7799:0:4365 +7800:3:2529 +7801:0:4365 +7802:2:1652 +7803:0:4365 +7804:2:1653 +7805:0:4365 +7806:2:1657 +7807:0:4365 +7808:2:1180 +7809:0:4365 +7810:3:2528 +7811:0:4365 +7812:2:1181 +7813:2:1185 +7814:2:1186 +7815:2:1194 +7816:2:1195 +7817:2:1199 +7818:2:1200 +7819:2:1194 +7820:2:1195 +7821:2:1196 +7822:2:1208 +7823:2:1213 +7824:2:1217 +7825:2:1218 +7826:2:1225 +7827:2:1226 +7828:2:1237 +7829:2:1238 +7830:2:1239 +7831:2:1237 +7832:2:1238 +7833:2:1239 +7834:2:1250 +7835:2:1255 +7836:2:1256 +7837:0:4365 +7838:3:2529 +7839:0:4365 +7840:2:1268 +7841:0:4365 +7842:3:2528 +7843:0:4365 +7844:2:1270 +7845:0:4365 +7846:3:2529 +7847:0:4365 +7848:2:1271 +7849:2:1275 +7850:2:1276 +7851:2:1284 +7852:2:1285 +7853:2:1289 +7854:2:1290 +7855:2:1284 +7856:2:1285 +7857:2:1289 +7858:2:1290 +7859:2:1298 +7860:2:1303 +7861:2:1307 +7862:2:1308 +7863:2:1315 +7864:2:1316 +7865:2:1327 +7866:2:1328 +7867:2:1329 +7868:2:1327 +7869:2:1328 +7870:2:1329 +7871:2:1340 +7872:2:1345 +7873:2:1346 +7874:0:4365 +7875:2:1358 +7876:0:4365 +7877:2:1454 +7878:0:4365 +7879:3:2528 +7880:0:4365 +7881:2:1455 +7882:0:4365 +7883:3:2529 +7884:0:4365 +7885:2:1652 +7886:0:4365 +7887:2:1653 +7888:0:4365 +7889:2:1657 +7890:0:4365 +7891:2:1660 +7892:0:4365 +7893:3:2528 +7894:0:4365 +7895:2:1665 +7896:2:1669 +7897:2:1670 +7898:2:1678 +7899:2:1679 +7900:2:1683 +7901:2:1684 +7902:2:1678 +7903:2:1679 +7904:2:1680 +7905:2:1692 +7906:2:1697 +7907:2:1701 +7908:2:1702 +7909:2:1709 +7910:2:1710 +7911:2:1721 +7912:2:1722 +7913:2:1723 +7914:2:1721 +7915:2:1722 +7916:2:1723 +7917:2:1734 +7918:2:1739 +7919:2:1740 +7920:0:4365 +7921:3:2529 +7922:0:4365 +7923:2:1752 +7924:0:4365 +7925:3:2528 +7926:0:4365 +7927:2:1754 +7928:0:4365 +7929:3:2529 +7930:0:4365 +7931:2:1755 +7932:2:1759 +7933:2:1760 +7934:2:1768 +7935:2:1769 +7936:2:1773 +7937:2:1774 +7938:2:1768 +7939:2:1769 +7940:2:1773 +7941:2:1774 +7942:2:1782 +7943:2:1787 +7944:2:1791 +7945:2:1792 +7946:2:1799 +7947:2:1800 +7948:2:1811 +7949:2:1812 +7950:2:1813 +7951:2:1811 +7952:2:1812 +7953:2:1813 +7954:2:1824 +7955:2:1829 +7956:2:1830 +7957:0:4365 +7958:2:1842 +7959:0:4365 +7960:3:2528 +7961:0:4365 +7962:2:1844 +7963:0:4365 +7964:3:2529 +7965:0:4365 +7966:2:1845 +7967:2:1849 +7968:2:1850 +7969:2:1858 +7970:2:1859 +7971:2:1863 +7972:2:1864 +7973:2:1858 +7974:2:1859 +7975:2:1863 +7976:2:1864 +7977:2:1872 +7978:2:1877 +7979:2:1881 +7980:2:1882 +7981:2:1889 +7982:2:1890 +7983:2:1901 +7984:2:1902 +7985:2:1903 +7986:2:1901 +7987:2:1902 +7988:2:1903 +7989:2:1914 +7990:2:1919 +7991:2:1920 +7992:0:4365 +7993:2:1932 +7994:0:4365 +7995:3:2528 +7996:0:4365 +7997:2:1934 +7998:0:4365 +7999:3:2529 +8000:0:4365 +8001:2:1935 +8002:0:4365 +8003:2:1936 +8004:0:4365 +8005:2:2129 +8006:0:4365 +8007:2:2130 +8008:0:4365 +8009:2:2134 +8010:0:4365 +8011:3:2528 +8012:0:4365 +8013:2:2136 +8014:0:4365 +8015:3:2529 +8016:0:4365 +8017:2:2137 +8018:2:2141 +8019:2:2142 +8020:2:2150 +8021:2:2151 +8022:2:2155 +8023:2:2156 +8024:2:2150 +8025:2:2151 +8026:2:2155 +8027:2:2156 +8028:2:2164 +8029:2:2169 +8030:2:2173 +8031:2:2174 +8032:2:2181 +8033:2:2182 +8034:2:2193 +8035:2:2194 +8036:2:2195 +8037:2:2193 +8038:2:2194 +8039:2:2195 +8040:2:2206 +8041:2:2211 +8042:2:2212 +8043:0:4365 +8044:2:2224 +8045:0:4365 +8046:3:2528 +8047:0:4365 +8048:2:2226 +8049:0:4365 +8050:3:2529 +8051:0:4365 +8052:2:1936 +8053:0:4365 +8054:2:2129 +8055:0:4365 +8056:2:2130 +8057:0:4365 +8058:2:2134 +8059:0:4365 +8060:3:2528 +8061:0:4365 +8062:2:2136 +8063:0:4365 +8064:3:2529 +8065:0:4365 +8066:2:2137 +8067:2:2141 +8068:2:2142 +8069:2:2150 +8070:2:2151 +8071:2:2155 +8072:2:2156 +8073:2:2150 +8074:2:2151 +8075:2:2152 +8076:2:2164 +8077:2:2169 +8078:2:2173 +8079:2:2174 +8080:2:2181 +8081:2:2182 +8082:2:2193 +8083:2:2194 +8084:2:2195 +8085:2:2193 +8086:2:2194 +8087:2:2195 +8088:2:2206 +8089:2:2211 +8090:2:2212 +8091:0:4365 +8092:2:2224 +8093:0:4365 +8094:3:2528 +8095:0:4365 +8096:2:2226 +8097:0:4365 +8098:3:2529 +8099:0:4365 +8100:2:2230 +8101:0:4365 +8102:3:2528 +8103:0:4365 +8104:2:2235 +8105:2:2239 +8106:2:2240 +8107:2:2248 +8108:2:2249 +8109:2:2253 +8110:2:2254 +8111:2:2248 +8112:2:2249 +8113:2:2250 +8114:2:2262 +8115:2:2267 +8116:2:2271 +8117:2:2272 +8118:2:2279 +8119:2:2280 +8120:2:2291 +8121:2:2292 +8122:2:2293 +8123:2:2291 +8124:2:2292 +8125:2:2293 +8126:2:2304 +8127:2:2309 +8128:2:2310 +8129:0:4365 +8130:3:2529 +8131:0:4365 +8132:2:2322 +8133:0:4365 +8134:2:1169 +8135:0:4365 +8136:3:2528 +8137:0:4365 +8138:2:1170 +8139:0:4365 +8140:3:2529 +8141:0:4365 +8142:3:2530 +8143:0:4365 +8144:3:2536 +8145:0:4365 +8146:3:2537 +8147:0:4365 +8148:3:2547 +8149:0:4365 +8150:3:2548 +8151:0:4365 +8152:3:2552 +8153:3:2553 +8154:3:2557 +8155:3:2561 +8156:3:2562 +8157:3:2557 +8158:3:2561 +8159:3:2562 +8160:3:2566 +8161:3:2574 +8162:3:2575 +8163:3:2580 +8164:3:2587 +8165:3:2588 +8166:3:2587 +8167:3:2588 +8168:3:2595 +8169:3:2600 +8170:0:4365 +8171:3:2611 +8172:0:4365 +8173:3:2615 +8174:3:2616 +8175:3:2620 +8176:3:2624 +8177:3:2625 +8178:3:2620 +8179:3:2624 +8180:3:2625 +8181:3:2629 +8182:3:2637 +8183:3:2638 +8184:3:2643 +8185:3:2650 +8186:3:2651 +8187:3:2650 +8188:3:2651 +8189:3:2658 +8190:3:2663 +8191:0:4365 +8192:3:2611 +8193:0:4365 +8194:3:2615 +8195:3:2616 +8196:3:2620 +8197:3:2624 +8198:3:2625 +8199:3:2620 +8200:3:2624 +8201:3:2625 +8202:3:2629 +8203:3:2637 +8204:3:2638 +8205:3:2643 +8206:3:2650 +8207:3:2651 +8208:3:2650 +8209:3:2651 +8210:3:2658 +8211:3:2663 +8212:0:4365 +8213:3:2674 +8214:0:4365 +8215:3:2682 +8216:3:2683 +8217:3:2687 +8218:3:2691 +8219:3:2692 +8220:3:2687 +8221:3:2691 +8222:3:2692 +8223:3:2696 +8224:3:2704 +8225:3:2705 +8226:3:2710 +8227:3:2717 +8228:3:2718 +8229:3:2717 +8230:3:2718 +8231:3:2725 +8232:3:2730 +8233:0:4365 +8234:3:2745 +8235:0:4365 +8236:3:2746 +8237:0:4365 +8238:2:1173 +8239:0:4365 +8240:3:2747 +8241:0:4365 +8242:2:1179 +8243:0:4365 +8244:2:1180 +8245:0:4365 +8246:3:2746 +8247:0:4365 +8248:2:1181 +8249:2:1185 +8250:2:1186 +8251:2:1194 +8252:2:1195 +8253:2:1199 +8254:2:1200 +8255:2:1194 +8256:2:1195 +8257:2:1199 +8258:2:1200 +8259:2:1208 +8260:2:1213 +8261:2:1217 +8262:2:1218 +8263:2:1225 +8264:2:1226 +8265:2:1237 +8266:2:1238 +8267:2:1239 +8268:2:1237 +8269:2:1238 +8270:2:1239 +8271:2:1250 +8272:2:1255 +8273:2:1256 +8274:0:4365 +8275:3:2747 +8276:0:4365 +8277:2:1268 +8278:0:4365 +8279:3:2746 +8280:0:4365 +8281:2:1270 +8282:0:4365 +8283:3:2747 +8284:0:4365 +8285:2:1271 +8286:2:1275 +8287:2:1276 +8288:2:1284 +8289:2:1285 +8290:2:1289 +8291:2:1290 +8292:2:1284 +8293:2:1285 +8294:2:1289 +8295:2:1290 +8296:2:1298 +8297:2:1303 +8298:2:1307 +8299:2:1308 +8300:2:1315 +8301:2:1316 +8302:2:1327 +8303:2:1328 +8304:2:1329 +8305:2:1327 +8306:2:1328 +8307:2:1329 +8308:2:1340 +8309:2:1345 +8310:2:1346 +8311:0:4365 +8312:2:1358 +8313:0:4365 +8314:2:1360 +8315:0:4365 +8316:3:2746 +8317:0:4365 +8318:2:1361 +8319:0:4365 +8320:3:2747 +8321:0:4365 +8322:2:1362 +8323:2:1366 +8324:2:1367 +8325:2:1375 +8326:2:1376 +8327:2:1380 +8328:2:1381 +8329:2:1375 +8330:2:1376 +8331:2:1380 +8332:2:1381 +8333:2:1389 +8334:2:1394 +8335:2:1398 +8336:2:1399 +8337:2:1406 +8338:2:1407 +8339:2:1418 +8340:2:1419 +8341:2:1420 +8342:2:1418 +8343:2:1419 +8344:2:1420 +8345:2:1431 +8346:2:1436 +8347:2:1437 +8348:0:4365 +8349:2:1449 +8350:0:4365 +8351:3:2746 +8352:0:4365 +8353:2:1451 +8354:0:4365 +8355:3:2747 +8356:0:4365 +8357:2:1652 +8358:0:4365 +8359:2:1653 +8360:0:4365 +8361:2:1657 +8362:0:4365 +8363:2:1180 +8364:0:4365 +8365:3:2746 +8366:0:4365 +8367:2:1181 +8368:2:1185 +8369:2:1186 +8370:2:1194 +8371:2:1195 +8372:2:1199 +8373:2:1200 +8374:2:1194 +8375:2:1195 +8376:2:1196 +8377:2:1208 +8378:2:1213 +8379:2:1217 +8380:2:1218 +8381:2:1225 +8382:2:1226 +8383:2:1237 +8384:2:1238 +8385:2:1239 +8386:2:1237 +8387:2:1238 +8388:2:1239 +8389:2:1250 +8390:2:1255 +8391:2:1256 +8392:0:4365 +8393:3:2747 +8394:0:4365 +8395:2:1268 +8396:0:4365 +8397:3:2746 +8398:0:4365 +8399:2:1270 +8400:0:4365 +8401:3:2747 +8402:0:4365 +8403:2:1271 +8404:2:1275 +8405:2:1276 +8406:2:1284 +8407:2:1285 +8408:2:1289 +8409:2:1290 +8410:2:1284 +8411:2:1285 +8412:2:1289 +8413:2:1290 +8414:2:1298 +8415:2:1303 +8416:2:1307 +8417:2:1308 +8418:2:1315 +8419:2:1316 +8420:2:1327 +8421:2:1328 +8422:2:1329 +8423:2:1327 +8424:2:1328 +8425:2:1329 +8426:2:1340 +8427:2:1345 +8428:2:1346 +8429:0:4365 +8430:2:1358 +8431:0:4365 +8432:2:1454 +8433:0:4365 +8434:3:2746 +8435:0:4365 +8436:2:1455 +8437:0:4365 +8438:3:2747 +8439:0:4365 +8440:2:1652 +8441:0:4365 +8442:2:1653 +8443:0:4365 +8444:2:1657 +8445:0:4365 +8446:2:1660 +8447:0:4365 +8448:3:2746 +8449:0:4365 +8450:2:1665 +8451:2:1669 +8452:2:1670 +8453:2:1678 +8454:2:1679 +8455:2:1683 +8456:2:1684 +8457:2:1678 +8458:2:1679 +8459:2:1680 +8460:2:1692 +8461:2:1697 +8462:2:1701 +8463:2:1702 +8464:2:1709 +8465:2:1710 +8466:2:1721 +8467:2:1722 +8468:2:1723 +8469:2:1721 +8470:2:1722 +8471:2:1723 +8472:2:1734 +8473:2:1739 +8474:2:1740 +8475:0:4365 +8476:3:2747 +8477:0:4365 +8478:2:1752 +8479:0:4365 +8480:3:2746 +8481:0:4365 +8482:2:1754 +8483:0:4365 +8484:3:2747 +8485:0:4365 +8486:2:1755 +8487:2:1759 +8488:2:1760 +8489:2:1768 +8490:2:1769 +8491:2:1773 +8492:2:1774 +8493:2:1768 +8494:2:1769 +8495:2:1773 +8496:2:1774 +8497:2:1782 +8498:2:1787 +8499:2:1791 +8500:2:1792 +8501:2:1799 +8502:2:1800 +8503:2:1811 +8504:2:1812 +8505:2:1813 +8506:2:1811 +8507:2:1812 +8508:2:1813 +8509:2:1824 +8510:2:1829 +8511:2:1830 +8512:0:4365 +8513:2:1842 +8514:0:4365 +8515:3:2746 +8516:0:4365 +8517:2:1844 +8518:0:4365 +8519:3:2747 +8520:0:4365 +8521:2:1845 +8522:2:1849 +8523:2:1850 +8524:2:1858 +8525:2:1859 +8526:2:1863 +8527:2:1864 +8528:2:1858 +8529:2:1859 +8530:2:1863 +8531:2:1864 +8532:2:1872 +8533:2:1877 +8534:2:1881 +8535:2:1882 +8536:2:1889 +8537:2:1890 +8538:2:1901 +8539:2:1902 +8540:2:1903 +8541:2:1901 +8542:2:1902 +8543:2:1903 +8544:2:1914 +8545:2:1919 +8546:2:1920 +8547:0:4365 +8548:2:1932 +8549:0:4365 +8550:3:2746 +8551:0:4365 +8552:2:1934 +8553:0:4365 +8554:3:2747 +8555:0:4365 +8556:2:1935 +8557:0:4365 +8558:2:1936 +8559:0:4365 +8560:2:2129 +8561:0:4365 +8562:2:2130 +8563:0:4365 +8564:2:2134 +8565:0:4365 +8566:3:2746 +8567:0:4365 +8568:2:2136 +8569:0:4365 +8570:3:2747 +8571:0:4365 +8572:2:2137 +8573:2:2141 +8574:2:2142 +8575:2:2150 +8576:2:2151 +8577:2:2155 +8578:2:2156 +8579:2:2150 +8580:2:2151 +8581:2:2155 +8582:2:2156 +8583:2:2164 +8584:2:2169 +8585:2:2173 +8586:2:2174 +8587:2:2181 +8588:2:2182 +8589:2:2193 +8590:2:2194 +8591:2:2195 +8592:2:2193 +8593:2:2194 +8594:2:2195 +8595:2:2206 +8596:2:2211 +8597:2:2212 +8598:0:4365 +8599:2:2224 +8600:0:4365 +8601:3:2746 +8602:0:4365 +8603:2:2226 +8604:0:4365 +8605:3:2747 +8606:0:4365 +8607:2:1936 +8608:0:4365 +8609:2:2129 +8610:0:4365 +8611:2:2130 +8612:0:4365 +8613:2:2134 +8614:0:4365 +8615:3:2746 +8616:0:4365 +8617:2:2136 +8618:0:4365 +8619:3:2747 +8620:0:4365 +8621:2:2137 +8622:2:2141 +8623:2:2142 +8624:2:2150 +8625:2:2151 +8626:2:2155 +8627:2:2156 +8628:2:2150 +8629:2:2151 +8630:2:2152 +8631:2:2164 +8632:2:2169 +8633:2:2173 +8634:2:2174 +8635:2:2181 +8636:2:2182 +8637:2:2193 +8638:2:2194 +8639:2:2195 +8640:2:2193 +8641:2:2194 +8642:2:2195 +8643:2:2206 +8644:2:2211 +8645:2:2212 +8646:0:4365 +8647:2:2224 +8648:0:4365 +8649:3:2746 +8650:0:4365 +8651:2:2226 +8652:0:4365 +8653:3:2747 +8654:0:4365 +8655:2:2230 +8656:0:4365 +8657:3:2746 +8658:0:4365 +8659:2:2235 +8660:2:2239 +8661:2:2240 +8662:2:2248 +8663:2:2249 +8664:2:2253 +8665:2:2254 +8666:2:2248 +8667:2:2249 +8668:2:2250 +8669:2:2262 +8670:2:2267 +8671:2:2271 +8672:2:2272 +8673:2:2279 +8674:2:2280 +8675:2:2291 +8676:2:2292 +8677:2:2293 +8678:2:2291 +8679:2:2292 +8680:2:2293 +8681:2:2304 +8682:2:2309 +8683:2:2310 +8684:0:4365 +8685:3:2747 +8686:0:4365 +8687:2:2322 +8688:0:4365 +8689:2:1169 +8690:0:4365 +8691:3:2746 +8692:0:4365 +8693:2:1170 +8694:0:4365 +8695:3:2747 +8696:0:4365 +8697:3:2748 +8698:0:4365 +8699:3:2754 +8700:0:4365 +8701:3:2755 +8702:3:2759 +8703:3:2760 +8704:3:2768 +8705:3:2769 +8706:3:2773 +8707:3:2774 +8708:3:2768 +8709:3:2769 +8710:3:2773 +8711:3:2774 +8712:3:2782 +8713:3:2787 +8714:3:2791 +8715:3:2792 +8716:3:2799 +8717:3:2800 +8718:3:2811 +8719:3:2812 +8720:3:2813 +8721:3:2811 +8722:3:2812 +8723:3:2813 +8724:3:2824 +8725:3:2829 +8726:3:2830 +8727:0:4365 +8728:3:2842 +8729:0:4365 +8730:3:2843 +8731:0:4365 +8732:2:1173 +8733:0:4365 +8734:3:2844 +8735:0:4365 +8736:2:1179 +8737:0:4365 +8738:2:1180 +8739:0:4365 +8740:3:2843 +8741:0:4365 +8742:2:1181 +8743:2:1185 +8744:2:1186 +8745:2:1194 +8746:2:1195 +8747:2:1199 +8748:2:1200 +8749:2:1194 +8750:2:1195 +8751:2:1199 +8752:2:1200 +8753:2:1208 +8754:2:1213 +8755:2:1217 +8756:2:1218 +8757:2:1225 +8758:2:1226 +8759:2:1237 +8760:2:1238 +8761:2:1239 +8762:2:1237 +8763:2:1238 +8764:2:1239 +8765:2:1250 +8766:2:1255 +8767:2:1256 +8768:0:4365 +8769:3:2844 +8770:0:4365 +8771:2:1268 +8772:0:4365 +8773:3:2843 +8774:0:4365 +8775:2:1270 +8776:0:4365 +8777:3:2844 +8778:0:4365 +8779:2:1271 +8780:2:1275 +8781:2:1276 +8782:2:1284 +8783:2:1285 +8784:2:1289 +8785:2:1290 +8786:2:1284 +8787:2:1285 +8788:2:1289 +8789:2:1290 +8790:2:1298 +8791:2:1303 +8792:2:1307 +8793:2:1308 +8794:2:1315 +8795:2:1316 +8796:2:1327 +8797:2:1328 +8798:2:1329 +8799:2:1327 +8800:2:1328 +8801:2:1329 +8802:2:1340 +8803:2:1345 +8804:2:1346 +8805:0:4365 +8806:2:1358 +8807:0:4365 +8808:2:1360 +8809:0:4365 +8810:3:2843 +8811:0:4365 +8812:2:1361 +8813:0:4365 +8814:3:2844 +8815:0:4365 +8816:2:1362 +8817:2:1366 +8818:2:1367 +8819:2:1375 +8820:2:1376 +8821:2:1380 +8822:2:1381 +8823:2:1375 +8824:2:1376 +8825:2:1380 +8826:2:1381 +8827:2:1389 +8828:2:1394 +8829:2:1398 +8830:2:1399 +8831:2:1406 +8832:2:1407 +8833:2:1418 +8834:2:1419 +8835:2:1420 +8836:2:1418 +8837:2:1419 +8838:2:1420 +8839:2:1431 +8840:2:1436 +8841:2:1437 +8842:0:4365 +8843:2:1449 +8844:0:4365 +8845:3:2843 +8846:0:4365 +8847:2:1451 +8848:0:4365 +8849:3:2844 +8850:0:4365 +8851:2:1652 +8852:0:4365 +8853:2:1653 +8854:0:4365 +8855:2:1657 +8856:0:4365 +8857:2:1180 +8858:0:4365 +8859:3:2843 +8860:0:4365 +8861:2:1181 +8862:2:1185 +8863:2:1186 +8864:2:1194 +8865:2:1195 +8866:2:1199 +8867:2:1200 +8868:2:1194 +8869:2:1195 +8870:2:1196 +8871:2:1208 +8872:2:1213 +8873:2:1217 +8874:2:1218 +8875:2:1225 +8876:2:1226 +8877:2:1237 +8878:2:1238 +8879:2:1239 +8880:2:1237 +8881:2:1238 +8882:2:1239 +8883:2:1250 +8884:2:1255 +8885:2:1256 +8886:0:4365 +8887:3:2844 +8888:0:4365 +8889:2:1268 +8890:0:4365 +8891:3:2843 +8892:0:4365 +8893:2:1270 +8894:0:4365 +8895:3:2844 +8896:0:4365 +8897:2:1271 +8898:2:1275 +8899:2:1276 +8900:2:1284 +8901:2:1285 +8902:2:1289 +8903:2:1290 +8904:2:1284 +8905:2:1285 +8906:2:1289 +8907:2:1290 +8908:2:1298 +8909:2:1303 +8910:2:1307 +8911:2:1308 +8912:2:1315 +8913:2:1316 +8914:2:1327 +8915:2:1328 +8916:2:1329 +8917:2:1327 +8918:2:1328 +8919:2:1329 +8920:2:1340 +8921:2:1345 +8922:2:1346 +8923:0:4365 +8924:2:1358 +8925:0:4365 +8926:2:1454 +8927:0:4365 +8928:3:2843 +8929:0:4365 +8930:2:1455 +8931:0:4365 +8932:3:2844 +8933:0:4365 +8934:2:1652 +8935:0:4365 +8936:2:1653 +8937:0:4365 +8938:2:1657 +8939:0:4365 +8940:2:1660 +8941:0:4365 +8942:3:2843 +8943:0:4365 +8944:2:1665 +8945:2:1669 +8946:2:1670 +8947:2:1678 +8948:2:1679 +8949:2:1683 +8950:2:1684 +8951:2:1678 +8952:2:1679 +8953:2:1680 +8954:2:1692 +8955:2:1697 +8956:2:1701 +8957:2:1702 +8958:2:1709 +8959:2:1710 +8960:2:1721 +8961:2:1722 +8962:2:1723 +8963:2:1721 +8964:2:1722 +8965:2:1723 +8966:2:1734 +8967:2:1739 +8968:2:1740 +8969:0:4365 +8970:3:2844 +8971:0:4365 +8972:2:1752 +8973:0:4365 +8974:3:2843 +8975:0:4365 +8976:2:1754 +8977:0:4365 +8978:3:2844 +8979:0:4365 +8980:2:1755 +8981:2:1759 +8982:2:1760 +8983:2:1768 +8984:2:1769 +8985:2:1773 +8986:2:1774 +8987:2:1768 +8988:2:1769 +8989:2:1773 +8990:2:1774 +8991:2:1782 +8992:2:1787 +8993:2:1791 +8994:2:1792 +8995:2:1799 +8996:2:1800 +8997:2:1811 +8998:2:1812 +8999:2:1813 +9000:2:1811 +9001:2:1812 +9002:2:1813 +9003:2:1824 +9004:2:1829 +9005:2:1830 +9006:0:4365 +9007:2:1842 +9008:0:4365 +9009:3:2843 +9010:0:4365 +9011:2:1844 +9012:0:4365 +9013:3:2844 +9014:0:4365 +9015:2:1845 +9016:2:1849 +9017:2:1850 +9018:2:1858 +9019:2:1859 +9020:2:1863 +9021:2:1864 +9022:2:1858 +9023:2:1859 +9024:2:1863 +9025:2:1864 +9026:2:1872 +9027:2:1877 +9028:2:1881 +9029:2:1882 +9030:2:1889 +9031:2:1890 +9032:2:1901 +9033:2:1902 +9034:2:1903 +9035:2:1901 +9036:2:1902 +9037:2:1903 +9038:2:1914 +9039:2:1919 +9040:2:1920 +9041:0:4365 +9042:2:1932 +9043:0:4365 +9044:3:2843 +9045:0:4365 +9046:2:1934 +9047:0:4365 +9048:3:2844 +9049:0:4365 +9050:2:1935 +9051:0:4365 +9052:2:1936 +9053:0:4365 +9054:2:2129 +9055:0:4365 +9056:2:2130 +9057:0:4365 +9058:2:2134 +9059:0:4365 +9060:3:2843 +9061:0:4365 +9062:2:2136 +9063:0:4365 +9064:3:2844 +9065:0:4365 +9066:2:2137 +9067:2:2141 +9068:2:2142 +9069:2:2150 +9070:2:2151 +9071:2:2155 +9072:2:2156 +9073:2:2150 +9074:2:2151 +9075:2:2155 +9076:2:2156 +9077:2:2164 +9078:2:2169 +9079:2:2173 +9080:2:2174 +9081:2:2181 +9082:2:2182 +9083:2:2193 +9084:2:2194 +9085:2:2195 +9086:2:2193 +9087:2:2194 +9088:2:2195 +9089:2:2206 +9090:2:2211 +9091:2:2212 +9092:0:4365 +9093:2:2224 +9094:0:4365 +9095:3:2843 +9096:0:4365 +9097:2:2226 +9098:0:4365 +9099:3:2844 +9100:0:4365 +9101:2:1936 +9102:0:4365 +9103:2:2129 +9104:0:4365 +9105:2:2130 +9106:0:4365 +9107:2:2134 +9108:0:4365 +9109:3:2843 +9110:0:4365 +9111:2:2136 +9112:0:4365 +9113:3:2844 +9114:0:4365 +9115:2:2137 +9116:2:2141 +9117:2:2142 +9118:2:2150 +9119:2:2151 +9120:2:2155 +9121:2:2156 +9122:2:2150 +9123:2:2151 +9124:2:2152 +9125:2:2164 +9126:2:2169 +9127:2:2173 +9128:2:2174 +9129:2:2181 +9130:2:2182 +9131:2:2193 +9132:2:2194 +9133:2:2195 +9134:2:2193 +9135:2:2194 +9136:2:2195 +9137:2:2206 +9138:2:2211 +9139:2:2212 +9140:0:4365 +9141:2:2224 +9142:0:4365 +9143:3:2843 +9144:0:4365 +9145:2:2226 +9146:0:4365 +9147:3:2844 +9148:0:4365 +9149:2:2230 +9150:0:4365 +9151:3:2843 +9152:0:4365 +9153:2:2235 +9154:2:2239 +9155:2:2240 +9156:2:2248 +9157:2:2249 +9158:2:2253 +9159:2:2254 +9160:2:2248 +9161:2:2249 +9162:2:2250 +9163:2:2262 +9164:2:2267 +9165:2:2271 +9166:2:2272 +9167:2:2279 +9168:2:2280 +9169:2:2291 +9170:2:2292 +9171:2:2293 +9172:2:2291 +9173:2:2292 +9174:2:2293 +9175:2:2304 +9176:2:2309 +9177:2:2310 +9178:0:4365 +9179:3:2844 +9180:0:4365 +9181:2:2322 +9182:0:4365 +9183:2:1169 +9184:0:4365 +9185:3:2843 +9186:0:4365 +9187:2:1170 +9188:0:4365 +9189:3:2844 +9190:0:4365 +9191:3:2845 +9192:0:4365 +9193:3:2851 +9194:0:4365 +9195:3:2854 +9196:3:2855 +9197:3:2867 +9198:3:2868 +9199:3:2872 +9200:3:2873 +9201:3:2867 +9202:3:2868 +9203:3:2872 +9204:3:2873 +9205:3:2881 +9206:3:2886 +9207:3:2890 +9208:3:2891 +9209:3:2898 +9210:3:2899 +9211:3:2910 +9212:3:2911 +9213:3:2912 +9214:3:2910 +9215:3:2911 +9216:3:2912 +9217:3:2923 +9218:3:2928 +9219:3:2929 +9220:0:4365 +9221:3:2941 +9222:0:4365 +9223:3:2942 +9224:0:4365 +9225:2:1173 +9226:0:4365 +9227:3:2943 +9228:0:4365 +9229:2:1179 +9230:0:4365 +9231:2:1180 +9232:0:4365 +9233:3:2942 +9234:0:4365 +9235:2:1181 +9236:2:1185 +9237:2:1186 +9238:2:1194 +9239:2:1195 +9240:2:1199 +9241:2:1200 +9242:2:1194 +9243:2:1195 +9244:2:1199 +9245:2:1200 +9246:2:1208 +9247:2:1213 +9248:2:1217 +9249:2:1218 +9250:2:1225 +9251:2:1226 +9252:2:1237 +9253:2:1238 +9254:2:1239 +9255:2:1237 +9256:2:1238 +9257:2:1239 +9258:2:1250 +9259:2:1255 +9260:2:1256 +9261:0:4365 +9262:3:2943 +9263:0:4365 +9264:2:1268 +9265:0:4365 +9266:3:2942 +9267:0:4365 +9268:2:1270 +9269:0:4365 +9270:3:2943 +9271:0:4365 +9272:2:1271 +9273:2:1275 +9274:2:1276 +9275:2:1284 +9276:2:1285 +9277:2:1289 +9278:2:1290 +9279:2:1284 +9280:2:1285 +9281:2:1289 +9282:2:1290 +9283:2:1298 +9284:2:1303 +9285:2:1307 +9286:2:1308 +9287:2:1315 +9288:2:1316 +9289:2:1327 +9290:2:1328 +9291:2:1329 +9292:2:1327 +9293:2:1328 +9294:2:1329 +9295:2:1340 +9296:2:1345 +9297:2:1346 +9298:0:4365 +9299:2:1358 +9300:0:4365 +9301:2:1360 +9302:0:4365 +9303:3:2942 +9304:0:4365 +9305:2:1361 +9306:0:4365 +9307:3:2943 +9308:0:4365 +9309:2:1362 +9310:2:1366 +9311:2:1367 +9312:2:1375 +9313:2:1376 +9314:2:1380 +9315:2:1381 +9316:2:1375 +9317:2:1376 +9318:2:1380 +9319:2:1381 +9320:2:1389 +9321:2:1394 +9322:2:1398 +9323:2:1399 +9324:2:1406 +9325:2:1407 +9326:2:1418 +9327:2:1419 +9328:2:1420 +9329:2:1418 +9330:2:1419 +9331:2:1420 +9332:2:1431 +9333:2:1436 +9334:2:1437 +9335:0:4365 +9336:2:1449 +9337:0:4365 +9338:3:2942 +9339:0:4365 +9340:2:1451 +9341:0:4365 +9342:3:2943 +9343:0:4365 +9344:2:1652 +9345:0:4365 +9346:2:1653 +9347:0:4365 +9348:2:1657 +9349:0:4365 +9350:2:1180 +9351:0:4365 +9352:3:2942 +9353:0:4365 +9354:2:1181 +9355:2:1185 +9356:2:1186 +9357:2:1194 +9358:2:1195 +9359:2:1199 +9360:2:1200 +9361:2:1194 +9362:2:1195 +9363:2:1196 +9364:2:1208 +9365:2:1213 +9366:2:1217 +9367:2:1218 +9368:2:1225 +9369:2:1226 +9370:2:1237 +9371:2:1238 +9372:2:1239 +9373:2:1237 +9374:2:1238 +9375:2:1239 +9376:2:1250 +9377:2:1255 +9378:2:1256 +9379:0:4365 +9380:3:2943 +9381:0:4365 +9382:2:1268 +9383:0:4365 +9384:3:2942 +9385:0:4365 +9386:2:1270 +9387:0:4365 +9388:3:2943 +9389:0:4365 +9390:2:1271 +9391:2:1275 +9392:2:1276 +9393:2:1284 +9394:2:1285 +9395:2:1289 +9396:2:1290 +9397:2:1284 +9398:2:1285 +9399:2:1289 +9400:2:1290 +9401:2:1298 +9402:2:1303 +9403:2:1307 +9404:2:1308 +9405:2:1315 +9406:2:1316 +9407:2:1327 +9408:2:1328 +9409:2:1329 +9410:2:1327 +9411:2:1328 +9412:2:1329 +9413:2:1340 +9414:2:1345 +9415:2:1346 +9416:0:4365 +9417:2:1358 +9418:0:4365 +9419:2:1454 +9420:0:4365 +9421:3:2942 +9422:0:4365 +9423:2:1455 +9424:0:4365 +9425:3:2943 +9426:0:4365 +9427:2:1652 +9428:0:4365 +9429:2:1653 +9430:0:4365 +9431:2:1657 +9432:0:4365 +9433:2:1660 +9434:0:4365 +9435:3:2942 +9436:0:4365 +9437:2:1665 +9438:2:1669 +9439:2:1670 +9440:2:1678 +9441:2:1679 +9442:2:1683 +9443:2:1684 +9444:2:1678 +9445:2:1679 +9446:2:1680 +9447:2:1692 +9448:2:1697 +9449:2:1701 +9450:2:1702 +9451:2:1709 +9452:2:1710 +9453:2:1721 +9454:2:1722 +9455:2:1723 +9456:2:1721 +9457:2:1722 +9458:2:1723 +9459:2:1734 +9460:2:1739 +9461:2:1740 +9462:0:4365 +9463:3:2943 +9464:0:4365 +9465:2:1752 +9466:0:4365 +9467:3:2942 +9468:0:4365 +9469:2:1754 +9470:0:4365 +9471:3:2943 +9472:0:4365 +9473:2:1755 +9474:2:1759 +9475:2:1760 +9476:2:1768 +9477:2:1769 +9478:2:1773 +9479:2:1774 +9480:2:1768 +9481:2:1769 +9482:2:1773 +9483:2:1774 +9484:2:1782 +9485:2:1787 +9486:2:1791 +9487:2:1792 +9488:2:1799 +9489:2:1800 +9490:2:1811 +9491:2:1812 +9492:2:1813 +9493:2:1811 +9494:2:1812 +9495:2:1813 +9496:2:1824 +9497:2:1829 +9498:2:1830 +9499:0:4365 +9500:2:1842 +9501:0:4365 +9502:3:2942 +9503:0:4365 +9504:2:1844 +9505:0:4365 +9506:3:2943 +9507:0:4365 +9508:2:1845 +9509:2:1849 +9510:2:1850 +9511:2:1858 +9512:2:1859 +9513:2:1863 +9514:2:1864 +9515:2:1858 +9516:2:1859 +9517:2:1863 +9518:2:1864 +9519:2:1872 +9520:2:1877 +9521:2:1881 +9522:2:1882 +9523:2:1889 +9524:2:1890 +9525:2:1901 +9526:2:1902 +9527:2:1903 +9528:2:1901 +9529:2:1902 +9530:2:1903 +9531:2:1914 +9532:2:1919 +9533:2:1920 +9534:0:4365 +9535:2:1932 +9536:0:4365 +9537:3:2942 +9538:0:4365 +9539:2:1934 +9540:0:4365 +9541:3:2943 +9542:0:4365 +9543:2:1935 +9544:0:4365 +9545:2:1936 +9546:0:4365 +9547:2:2129 +9548:0:4365 +9549:2:2130 +9550:0:4365 +9551:2:2134 +9552:0:4365 +9553:3:2942 +9554:0:4365 +9555:2:2136 +9556:0:4365 +9557:3:2943 +9558:0:4365 +9559:2:2137 +9560:2:2141 +9561:2:2142 +9562:2:2150 +9563:2:2151 +9564:2:2155 +9565:2:2156 +9566:2:2150 +9567:2:2151 +9568:2:2155 +9569:2:2156 +9570:2:2164 +9571:2:2169 +9572:2:2173 +9573:2:2174 +9574:2:2181 +9575:2:2182 +9576:2:2193 +9577:2:2194 +9578:2:2195 +9579:2:2193 +9580:2:2194 +9581:2:2195 +9582:2:2206 +9583:2:2211 +9584:2:2212 +9585:0:4365 +9586:2:2224 +9587:0:4365 +9588:3:2942 +9589:0:4365 +9590:2:2226 +9591:0:4365 +9592:3:2943 +9593:0:4365 +9594:2:1936 +9595:0:4365 +9596:2:2129 +9597:0:4365 +9598:2:2130 +9599:0:4365 +9600:2:2134 +9601:0:4365 +9602:3:2942 +9603:0:4365 +9604:2:2136 +9605:0:4365 +9606:3:2943 +9607:0:4365 +9608:2:2137 +9609:2:2141 +9610:2:2142 +9611:2:2150 +9612:2:2151 +9613:2:2155 +9614:2:2156 +9615:2:2150 +9616:2:2151 +9617:2:2152 +9618:2:2164 +9619:2:2169 +9620:2:2173 +9621:2:2174 +9622:2:2181 +9623:2:2182 +9624:2:2193 +9625:2:2194 +9626:2:2195 +9627:2:2193 +9628:2:2194 +9629:2:2195 +9630:2:2206 +9631:2:2211 +9632:2:2212 +9633:0:4365 +9634:2:2224 +9635:0:4365 +9636:3:2942 +9637:0:4365 +9638:2:2226 +9639:0:4365 +9640:3:2943 +9641:0:4365 +9642:2:2230 +9643:0:4365 +9644:3:2942 +9645:0:4365 +9646:2:2235 +9647:2:2239 +9648:2:2240 +9649:2:2248 +9650:2:2249 +9651:2:2253 +9652:2:2254 +9653:2:2248 +9654:2:2249 +9655:2:2250 +9656:2:2262 +9657:2:2267 +9658:2:2271 +9659:2:2272 +9660:2:2279 +9661:2:2280 +9662:2:2291 +9663:2:2292 +9664:2:2293 +9665:2:2291 +9666:2:2292 +9667:2:2293 +9668:2:2304 +9669:2:2309 +9670:2:2310 +9671:0:4365 +9672:3:2943 +9673:0:4365 +9674:2:2322 +9675:0:4365 +9676:2:1169 +9677:0:4365 +9678:3:2942 +9679:0:4365 +9680:2:1170 +9681:0:4365 +9682:3:2943 +9683:0:4365 +9684:3:2944 +9685:0:4365 +9686:3:2950 +9687:0:4365 +9688:3:2951 +9689:0:4365 +9690:3:2952 +9691:0:4365 +9692:3:2953 +9693:0:4365 +9694:3:2954 +9695:3:2958 +9696:3:2959 +9697:3:2967 +9698:3:2968 +9699:3:2972 +9700:3:2973 +9701:3:2967 +9702:3:2968 +9703:3:2972 +9704:3:2973 +9705:3:2981 +9706:3:2986 +9707:3:2990 +9708:3:2991 +9709:3:2998 +9710:3:2999 +9711:3:3010 +9712:3:3011 +9713:3:3012 +9714:3:3010 +9715:3:3011 +9716:3:3012 +9717:3:3023 +9718:3:3028 +9719:3:3029 +9720:0:4365 +9721:3:3041 +9722:0:4365 +9723:3:3042 +9724:0:4365 +9725:2:1173 +9726:0:4365 +9727:3:3043 +9728:0:4365 +9729:2:1179 +9730:0:4365 +9731:2:1180 +9732:0:4365 +9733:3:3042 +9734:0:4365 +9735:2:1181 +9736:2:1185 +9737:2:1186 +9738:2:1194 +9739:2:1195 +9740:2:1199 +9741:2:1200 +9742:2:1194 +9743:2:1195 +9744:2:1199 +9745:2:1200 +9746:2:1208 +9747:2:1213 +9748:2:1217 +9749:2:1218 +9750:2:1225 +9751:2:1226 +9752:2:1237 +9753:2:1238 +9754:2:1239 +9755:2:1237 +9756:2:1238 +9757:2:1239 +9758:2:1250 +9759:2:1255 +9760:2:1256 +9761:0:4365 +9762:3:3043 +9763:0:4365 +9764:2:1268 +9765:0:4365 +9766:3:3042 +9767:0:4365 +9768:2:1270 +9769:0:4365 +9770:3:3043 +9771:0:4365 +9772:2:1271 +9773:2:1275 +9774:2:1276 +9775:2:1284 +9776:2:1285 +9777:2:1289 +9778:2:1290 +9779:2:1284 +9780:2:1285 +9781:2:1289 +9782:2:1290 +9783:2:1298 +9784:2:1303 +9785:2:1307 +9786:2:1308 +9787:2:1315 +9788:2:1316 +9789:2:1327 +9790:2:1328 +9791:2:1329 +9792:2:1327 +9793:2:1328 +9794:2:1329 +9795:2:1340 +9796:2:1345 +9797:2:1346 +9798:0:4365 +9799:2:1358 +9800:0:4365 +9801:2:1360 +9802:0:4365 +9803:3:3042 +9804:0:4365 +9805:2:1361 +9806:0:4365 +9807:3:3043 +9808:0:4365 +9809:2:1362 +9810:2:1366 +9811:2:1367 +9812:2:1375 +9813:2:1376 +9814:2:1380 +9815:2:1381 +9816:2:1375 +9817:2:1376 +9818:2:1380 +9819:2:1381 +9820:2:1389 +9821:2:1394 +9822:2:1398 +9823:2:1399 +9824:2:1406 +9825:2:1407 +9826:2:1418 +9827:2:1419 +9828:2:1420 +9829:2:1418 +9830:2:1419 +9831:2:1420 +9832:2:1431 +9833:2:1436 +9834:2:1437 +9835:0:4365 +9836:2:1449 +9837:0:4365 +9838:3:3042 +9839:0:4365 +9840:2:1451 +9841:0:4365 +9842:3:3043 +9843:0:4365 +9844:2:1652 +9845:0:4365 +9846:2:1653 +9847:0:4365 +9848:2:1657 +9849:0:4365 +9850:2:1180 +9851:0:4365 +9852:3:3042 +9853:0:4365 +9854:2:1181 +9855:2:1185 +9856:2:1186 +9857:2:1194 +9858:2:1195 +9859:2:1199 +9860:2:1200 +9861:2:1194 +9862:2:1195 +9863:2:1196 +9864:2:1208 +9865:2:1213 +9866:2:1217 +9867:2:1218 +9868:2:1225 +9869:2:1226 +9870:2:1237 +9871:2:1238 +9872:2:1239 +9873:2:1237 +9874:2:1238 +9875:2:1239 +9876:2:1250 +9877:2:1255 +9878:2:1256 +9879:0:4365 +9880:3:3043 +9881:0:4365 +9882:2:1268 +9883:0:4365 +9884:3:3042 +9885:0:4365 +9886:2:1270 +9887:0:4365 +9888:3:3043 +9889:0:4365 +9890:2:1271 +9891:2:1275 +9892:2:1276 +9893:2:1284 +9894:2:1285 +9895:2:1289 +9896:2:1290 +9897:2:1284 +9898:2:1285 +9899:2:1289 +9900:2:1290 +9901:2:1298 +9902:2:1303 +9903:2:1307 +9904:2:1308 +9905:2:1315 +9906:2:1316 +9907:2:1327 +9908:2:1328 +9909:2:1329 +9910:2:1327 +9911:2:1328 +9912:2:1329 +9913:2:1340 +9914:2:1345 +9915:2:1346 +9916:0:4365 +9917:2:1358 +9918:0:4365 +9919:2:1454 +9920:0:4365 +9921:3:3042 +9922:0:4365 +9923:2:1455 +9924:0:4365 +9925:3:3043 +9926:0:4365 +9927:2:1652 +9928:0:4365 +9929:2:1653 +9930:0:4365 +9931:2:1657 +9932:0:4365 +9933:2:1660 +9934:0:4365 +9935:3:3042 +9936:0:4365 +9937:2:1665 +9938:2:1669 +9939:2:1670 +9940:2:1678 +9941:2:1679 +9942:2:1683 +9943:2:1684 +9944:2:1678 +9945:2:1679 +9946:2:1680 +9947:2:1692 +9948:2:1697 +9949:2:1701 +9950:2:1702 +9951:2:1709 +9952:2:1710 +9953:2:1721 +9954:2:1722 +9955:2:1723 +9956:2:1721 +9957:2:1722 +9958:2:1723 +9959:2:1734 +9960:2:1739 +9961:2:1740 +9962:0:4365 +9963:3:3043 +9964:0:4365 +9965:2:1752 +9966:0:4365 +9967:3:3042 +9968:0:4365 +9969:2:1754 +9970:0:4365 +9971:3:3043 +9972:0:4365 +9973:2:1755 +9974:2:1759 +9975:2:1760 +9976:2:1768 +9977:2:1769 +9978:2:1773 +9979:2:1774 +9980:2:1768 +9981:2:1769 +9982:2:1773 +9983:2:1774 +9984:2:1782 +9985:2:1787 +9986:2:1791 +9987:2:1792 +9988:2:1799 +9989:2:1800 +9990:2:1811 +9991:2:1812 +9992:2:1813 +9993:2:1811 +9994:2:1812 +9995:2:1813 +9996:2:1824 +9997:2:1829 +9998:2:1830 +9999:0:4365 +10000:2:1842 +10001:0:4365 +10002:3:3042 +10003:0:4365 +10004:2:1844 +10005:0:4365 +10006:3:3043 +10007:0:4365 +10008:2:1845 +10009:2:1849 +10010:2:1850 +10011:2:1858 +10012:2:1859 +10013:2:1863 +10014:2:1864 +10015:2:1858 +10016:2:1859 +10017:2:1863 +10018:2:1864 +10019:2:1872 +10020:2:1877 +10021:2:1881 +10022:2:1882 +10023:2:1889 +10024:2:1890 +10025:2:1901 +10026:2:1902 +10027:2:1903 +10028:2:1901 +10029:2:1902 +10030:2:1903 +10031:2:1914 +10032:2:1919 +10033:2:1920 +10034:0:4365 +10035:2:1932 +10036:0:4365 +10037:3:3042 +10038:0:4365 +10039:2:1934 +10040:0:4365 +10041:3:3043 +10042:0:4365 +10043:2:1935 +10044:0:4365 +10045:2:1936 +10046:0:4365 +10047:2:2129 +10048:0:4365 +10049:2:2130 +10050:0:4365 +10051:2:2134 +10052:0:4365 +10053:3:3042 +10054:0:4365 +10055:2:2136 +10056:0:4365 +10057:3:3043 +10058:0:4365 +10059:2:2137 +10060:2:2141 +10061:2:2142 +10062:2:2150 +10063:2:2151 +10064:2:2155 +10065:2:2156 +10066:2:2150 +10067:2:2151 +10068:2:2155 +10069:2:2156 +10070:2:2164 +10071:2:2169 +10072:2:2173 +10073:2:2174 +10074:2:2181 +10075:2:2182 +10076:2:2193 +10077:2:2194 +10078:2:2195 +10079:2:2193 +10080:2:2194 +10081:2:2195 +10082:2:2206 +10083:2:2211 +10084:2:2212 +10085:0:4365 +10086:2:2224 +10087:0:4365 +10088:3:3042 +10089:0:4365 +10090:2:2226 +10091:0:4365 +10092:3:3043 +10093:0:4365 +10094:2:1936 +10095:0:4365 +10096:2:2129 +10097:0:4365 +10098:2:2130 +10099:0:4365 +10100:2:2134 +10101:0:4365 +10102:3:3042 +10103:0:4365 +10104:2:2136 +10105:0:4365 +10106:3:3043 +10107:0:4365 +10108:2:2137 +10109:2:2141 +10110:2:2142 +10111:2:2150 +10112:2:2151 +10113:2:2155 +10114:2:2156 +10115:2:2150 +10116:2:2151 +10117:2:2152 +10118:2:2164 +10119:2:2169 +10120:2:2173 +10121:2:2174 +10122:2:2181 +10123:2:2182 +10124:2:2193 +10125:2:2194 +10126:2:2195 +10127:2:2193 +10128:2:2194 +10129:2:2195 +10130:2:2206 +10131:2:2211 +10132:2:2212 +10133:0:4365 +10134:2:2224 +10135:0:4365 +10136:3:3042 +10137:0:4365 +10138:2:2226 +10139:0:4365 +10140:3:3043 +10141:0:4365 +10142:2:2230 +10143:0:4365 +10144:3:3042 +10145:0:4365 +10146:2:2235 +10147:2:2239 +10148:2:2240 +10149:2:2248 +10150:2:2249 +10151:2:2253 +10152:2:2254 +10153:2:2248 +10154:2:2249 +10155:2:2250 +10156:2:2262 +10157:2:2267 +10158:2:2271 +10159:2:2272 +10160:2:2279 +10161:2:2280 +10162:2:2291 +10163:2:2292 +10164:2:2293 +10165:2:2291 +10166:2:2292 +10167:2:2293 +10168:2:2304 +10169:2:2309 +10170:2:2310 +10171:0:4365 +10172:3:3043 +10173:0:4365 +10174:2:2322 +10175:0:4365 +10176:2:1169 +10177:0:4365 +10178:3:3042 +10179:0:4365 +10180:2:1170 +10181:0:4365 +10182:3:3043 +10183:0:4365 +10184:3:3044 +10185:0:4365 +10186:3:3257 +10187:0:4365 +10188:3:3265 +10189:0:4365 +10190:3:3266 +10191:3:3270 +10192:3:3271 +10193:3:3279 +10194:3:3280 +10195:3:3284 +10196:3:3285 +10197:3:3279 +10198:3:3280 +10199:3:3284 +10200:3:3285 +10201:3:3293 +10202:3:3298 +10203:3:3302 +10204:3:3303 +10205:3:3310 +10206:3:3311 +10207:3:3322 +10208:3:3323 +10209:3:3324 +10210:3:3322 +10211:3:3323 +10212:3:3324 +10213:3:3335 +10214:3:3340 +10215:3:3341 +10216:0:4365 +10217:3:3353 +10218:0:4365 +10219:3:3354 +10220:0:4365 +10221:2:1173 +10222:0:4365 +10223:3:3355 +10224:0:4365 +10225:2:1179 +10226:0:4365 +10227:2:1180 +10228:0:4365 +10229:3:3354 +10230:0:4365 +10231:2:1181 +10232:2:1185 +10233:2:1186 +10234:2:1194 +10235:2:1195 +10236:2:1199 +10237:2:1200 +10238:2:1194 +10239:2:1195 +10240:2:1199 +10241:2:1200 +10242:2:1208 +10243:2:1213 +10244:2:1217 +10245:2:1218 +10246:2:1225 +10247:2:1226 +10248:2:1237 +10249:2:1238 +10250:2:1239 +10251:2:1237 +10252:2:1238 +10253:2:1239 +10254:2:1250 +10255:2:1255 +10256:2:1256 +10257:0:4365 +10258:3:3355 +10259:0:4365 +10260:2:1268 +10261:0:4365 +10262:3:3354 +10263:0:4365 +10264:2:1270 +10265:0:4365 +10266:3:3355 +10267:0:4365 +10268:2:1271 +10269:2:1275 +10270:2:1276 +10271:2:1284 +10272:2:1285 +10273:2:1289 +10274:2:1290 +10275:2:1284 +10276:2:1285 +10277:2:1289 +10278:2:1290 +10279:2:1298 +10280:2:1303 +10281:2:1307 +10282:2:1308 +10283:2:1315 +10284:2:1316 +10285:2:1327 +10286:2:1328 +10287:2:1329 +10288:2:1327 +10289:2:1328 +10290:2:1329 +10291:2:1340 +10292:2:1345 +10293:2:1346 +10294:0:4365 +10295:2:1358 +10296:0:4365 +10297:2:1360 +10298:0:4365 +10299:3:3354 +10300:0:4365 +10301:2:1361 +10302:0:4365 +10303:3:3355 +10304:0:4365 +10305:2:1362 +10306:2:1366 +10307:2:1367 +10308:2:1375 +10309:2:1376 +10310:2:1380 +10311:2:1381 +10312:2:1375 +10313:2:1376 +10314:2:1380 +10315:2:1381 +10316:2:1389 +10317:2:1394 +10318:2:1398 +10319:2:1399 +10320:2:1406 +10321:2:1407 +10322:2:1418 +10323:2:1419 +10324:2:1420 +10325:2:1418 +10326:2:1419 +10327:2:1420 +10328:2:1431 +10329:2:1436 +10330:2:1437 +10331:0:4365 +10332:2:1449 +10333:0:4365 +10334:3:3354 +10335:0:4365 +10336:2:1451 +10337:0:4365 +10338:3:3355 +10339:0:4365 +10340:2:1652 +10341:0:4365 +10342:2:1653 +10343:0:4365 +10344:2:1657 +10345:0:4365 +10346:2:1180 +10347:0:4365 +10348:3:3354 +10349:0:4365 +10350:2:1181 +10351:2:1185 +10352:2:1186 +10353:2:1194 +10354:2:1195 +10355:2:1199 +10356:2:1200 +10357:2:1194 +10358:2:1195 +10359:2:1196 +10360:2:1208 +10361:2:1213 +10362:2:1217 +10363:2:1218 +10364:2:1225 +10365:2:1226 +10366:2:1237 +10367:2:1238 +10368:2:1239 +10369:2:1237 +10370:2:1238 +10371:2:1239 +10372:2:1250 +10373:2:1255 +10374:2:1256 +10375:0:4365 +10376:3:3355 +10377:0:4365 +10378:2:1268 +10379:0:4365 +10380:3:3354 +10381:0:4365 +10382:2:1270 +10383:0:4365 +10384:3:3355 +10385:0:4365 +10386:2:1271 +10387:2:1275 +10388:2:1276 +10389:2:1284 +10390:2:1285 +10391:2:1289 +10392:2:1290 +10393:2:1284 +10394:2:1285 +10395:2:1289 +10396:2:1290 +10397:2:1298 +10398:2:1303 +10399:2:1307 +10400:2:1308 +10401:2:1315 +10402:2:1316 +10403:2:1327 +10404:2:1328 +10405:2:1329 +10406:2:1327 +10407:2:1328 +10408:2:1329 +10409:2:1340 +10410:2:1345 +10411:2:1346 +10412:0:4365 +10413:2:1358 +10414:0:4365 +10415:2:1454 +10416:0:4365 +10417:3:3354 +10418:0:4365 +10419:2:1455 +10420:0:4365 +10421:3:3355 +10422:0:4365 +10423:2:1652 +10424:0:4365 +10425:2:1653 +10426:0:4365 +10427:2:1657 +10428:0:4365 +10429:2:1660 +10430:0:4365 +10431:3:3354 +10432:0:4365 +10433:2:1665 +10434:2:1669 +10435:2:1670 +10436:2:1678 +10437:2:1679 +10438:2:1683 +10439:2:1684 +10440:2:1678 +10441:2:1679 +10442:2:1680 +10443:2:1692 +10444:2:1697 +10445:2:1701 +10446:2:1702 +10447:2:1709 +10448:2:1710 +10449:2:1721 +10450:2:1722 +10451:2:1723 +10452:2:1721 +10453:2:1722 +10454:2:1723 +10455:2:1734 +10456:2:1739 +10457:2:1740 +10458:0:4365 +10459:3:3355 +10460:0:4365 +10461:2:1752 +10462:0:4365 +10463:3:3354 +10464:0:4365 +10465:2:1754 +10466:0:4365 +10467:3:3355 +10468:0:4365 +10469:2:1755 +10470:2:1759 +10471:2:1760 +10472:2:1768 +10473:2:1769 +10474:2:1773 +10475:2:1774 +10476:2:1768 +10477:2:1769 +10478:2:1773 +10479:2:1774 +10480:2:1782 +10481:2:1787 +10482:2:1791 +10483:2:1792 +10484:2:1799 +10485:2:1800 +10486:2:1811 +10487:2:1812 +10488:2:1813 +10489:2:1811 +10490:2:1812 +10491:2:1813 +10492:2:1824 +10493:2:1829 +10494:2:1830 +10495:0:4365 +10496:2:1842 +10497:0:4365 +10498:3:3354 +10499:0:4365 +10500:2:1844 +10501:0:4365 +10502:3:3355 +10503:0:4365 +10504:2:1845 +10505:2:1849 +10506:2:1850 +10507:2:1858 +10508:2:1859 +10509:2:1863 +10510:2:1864 +10511:2:1858 +10512:2:1859 +10513:2:1863 +10514:2:1864 +10515:2:1872 +10516:2:1877 +10517:2:1881 +10518:2:1882 +10519:2:1889 +10520:2:1890 +10521:2:1901 +10522:2:1902 +10523:2:1903 +10524:2:1901 +10525:2:1902 +10526:2:1903 +10527:2:1914 +10528:2:1919 +10529:2:1920 +10530:0:4365 +10531:2:1932 +10532:0:4365 +10533:3:3354 +10534:0:4365 +10535:2:1934 +10536:0:4365 +10537:3:3355 +10538:0:4365 +10539:2:1935 +10540:0:4365 +10541:2:1936 +10542:0:4365 +10543:2:2129 +10544:0:4365 +10545:2:2130 +10546:0:4365 +10547:2:2134 +10548:0:4365 +10549:3:3354 +10550:0:4365 +10551:2:2136 +10552:0:4365 +10553:3:3355 +10554:0:4365 +10555:2:2137 +10556:2:2141 +10557:2:2142 +10558:2:2150 +10559:2:2151 +10560:2:2155 +10561:2:2156 +10562:2:2150 +10563:2:2151 +10564:2:2155 +10565:2:2156 +10566:2:2164 +10567:2:2169 +10568:2:2173 +10569:2:2174 +10570:2:2181 +10571:2:2182 +10572:2:2193 +10573:2:2194 +10574:2:2195 +10575:2:2193 +10576:2:2194 +10577:2:2195 +10578:2:2206 +10579:2:2211 +10580:2:2212 +10581:0:4365 +10582:2:2224 +10583:0:4365 +10584:3:3354 +10585:0:4365 +10586:2:2226 +10587:0:4365 +10588:3:3355 +10589:0:4365 +10590:2:1936 +10591:0:4365 +10592:2:2129 +10593:0:4365 +10594:2:2130 +10595:0:4365 +10596:2:2134 +10597:0:4365 +10598:3:3354 +10599:0:4365 +10600:2:2136 +10601:0:4365 +10602:3:3355 +10603:0:4365 +10604:2:2137 +10605:2:2141 +10606:2:2142 +10607:2:2150 +10608:2:2151 +10609:2:2155 +10610:2:2156 +10611:2:2150 +10612:2:2151 +10613:2:2152 +10614:2:2164 +10615:2:2169 +10616:2:2173 +10617:2:2174 +10618:2:2181 +10619:2:2182 +10620:2:2193 +10621:2:2194 +10622:2:2195 +10623:2:2193 +10624:2:2194 +10625:2:2195 +10626:2:2206 +10627:2:2211 +10628:2:2212 +10629:0:4365 +10630:2:2224 +10631:0:4365 +10632:3:3354 +10633:0:4365 +10634:2:2226 +10635:0:4365 +10636:3:3355 +10637:0:4365 +10638:2:2230 +10639:0:4365 +10640:3:3354 +10641:0:4365 +10642:2:2235 +10643:2:2239 +10644:2:2240 +10645:2:2248 +10646:2:2249 +10647:2:2253 +10648:2:2254 +10649:2:2248 +10650:2:2249 +10651:2:2250 +10652:2:2262 +10653:2:2267 +10654:2:2271 +10655:2:2272 +10656:2:2279 +10657:2:2280 +10658:2:2291 +10659:2:2292 +10660:2:2293 +10661:2:2291 +10662:2:2292 +10663:2:2293 +10664:2:2304 +10665:2:2309 +10666:2:2310 +10667:0:4365 +10668:3:3355 +10669:0:4365 +10670:2:2322 +10671:0:4365 +10672:2:1169 +10673:0:4365 +10674:3:3354 +10675:0:4365 +10676:2:1170 +10677:0:4365 +10678:3:3355 +10679:0:4365 +10680:3:3356 +10681:0:4365 +10682:3:3366 +10683:0:4365 +10684:3:2951 +10685:0:4365 +10686:3:2952 +10687:0:4365 +10688:3:2953 +10689:0:4365 +10690:3:2954 +10691:3:2958 +10692:3:2959 +10693:3:2967 +10694:3:2968 +10695:3:2972 +10696:3:2973 +10697:3:2967 +10698:3:2968 +10699:3:2972 +10700:3:2973 +10701:3:2981 +10702:3:2986 +10703:3:2990 +10704:3:2991 +10705:3:2998 +10706:3:2999 +10707:3:3010 +10708:3:3011 +10709:3:3012 +10710:3:3010 +10711:3:3011 +10712:3:3012 +10713:3:3023 +10714:3:3028 +10715:3:3029 +10716:0:4365 +10717:3:3041 +10718:0:4365 +10719:3:3042 +10720:0:4365 +10721:2:1173 +10722:0:4365 +10723:3:3043 +10724:0:4365 +10725:2:1179 +10726:0:4365 +10727:2:1180 +10728:0:4365 +10729:3:3042 +10730:0:4365 +10731:2:1181 +10732:2:1185 +10733:2:1186 +10734:2:1194 +10735:2:1195 +10736:2:1199 +10737:2:1200 +10738:2:1194 +10739:2:1195 +10740:2:1199 +10741:2:1200 +10742:2:1208 +10743:2:1213 +10744:2:1217 +10745:2:1218 +10746:2:1225 +10747:2:1226 +10748:2:1237 +10749:2:1238 +10750:2:1239 +10751:2:1237 +10752:2:1238 +10753:2:1239 +10754:2:1250 +10755:2:1255 +10756:2:1256 +10757:0:4365 +10758:3:3043 +10759:0:4365 +10760:2:1268 +10761:0:4365 +10762:3:3042 +10763:0:4365 +10764:2:1270 +10765:0:4365 +10766:3:3043 +10767:0:4365 +10768:2:1271 +10769:2:1275 +10770:2:1276 +10771:2:1284 +10772:2:1285 +10773:2:1289 +10774:2:1290 +10775:2:1284 +10776:2:1285 +10777:2:1289 +10778:2:1290 +10779:2:1298 +10780:2:1303 +10781:2:1307 +10782:2:1308 +10783:2:1315 +10784:2:1316 +10785:2:1327 +10786:2:1328 +10787:2:1329 +10788:2:1327 +10789:2:1328 +10790:2:1329 +10791:2:1340 +10792:2:1345 +10793:2:1346 +10794:0:4365 +10795:2:1358 +10796:0:4365 +10797:2:1360 +10798:0:4365 +10799:3:3042 +10800:0:4365 +10801:2:1361 +10802:0:4365 +10803:3:3043 +10804:0:4365 +10805:2:1362 +10806:2:1366 +10807:2:1367 +10808:2:1375 +10809:2:1376 +10810:2:1380 +10811:2:1381 +10812:2:1375 +10813:2:1376 +10814:2:1380 +10815:2:1381 +10816:2:1389 +10817:2:1394 +10818:2:1398 +10819:2:1399 +10820:2:1406 +10821:2:1407 +10822:2:1418 +10823:2:1419 +10824:2:1420 +10825:2:1418 +10826:2:1419 +10827:2:1420 +10828:2:1431 +10829:2:1436 +10830:2:1437 +10831:0:4365 +10832:2:1449 +10833:0:4365 +10834:3:3042 +10835:0:4365 +10836:2:1451 +10837:0:4365 +10838:3:3043 +10839:0:4365 +10840:2:1652 +10841:0:4365 +10842:2:1653 +10843:0:4365 +10844:2:1657 +10845:0:4365 +10846:2:1180 +10847:0:4365 +10848:3:3042 +10849:0:4365 +10850:2:1181 +10851:2:1185 +10852:2:1186 +10853:2:1194 +10854:2:1195 +10855:2:1199 +10856:2:1200 +10857:2:1194 +10858:2:1195 +10859:2:1196 +10860:2:1208 +10861:2:1213 +10862:2:1217 +10863:2:1218 +10864:2:1225 +10865:2:1226 +10866:2:1237 +10867:2:1238 +10868:2:1239 +10869:2:1237 +10870:2:1238 +10871:2:1239 +10872:2:1250 +10873:2:1255 +10874:2:1256 +10875:0:4365 +10876:3:3043 +10877:0:4365 +10878:2:1268 +10879:0:4365 +10880:3:3042 +10881:0:4365 +10882:2:1270 +10883:0:4365 +10884:3:3043 +10885:0:4365 +10886:2:1271 +10887:2:1275 +10888:2:1276 +10889:2:1284 +10890:2:1285 +10891:2:1289 +10892:2:1290 +10893:2:1284 +10894:2:1285 +10895:2:1289 +10896:2:1290 +10897:2:1298 +10898:2:1303 +10899:2:1307 +10900:2:1308 +10901:2:1315 +10902:2:1316 +10903:2:1327 +10904:2:1328 +10905:2:1329 +10906:2:1327 +10907:2:1328 +10908:2:1329 +10909:2:1340 +10910:2:1345 +10911:2:1346 +10912:0:4365 +10913:2:1358 +10914:0:4365 +10915:2:1454 +10916:0:4365 +10917:3:3042 +10918:0:4365 +10919:2:1455 +10920:0:4365 +10921:3:3043 +10922:0:4365 +10923:2:1652 +10924:0:4365 +10925:2:1653 +10926:0:4365 +10927:2:1657 +10928:0:4365 +10929:2:1660 +10930:0:4365 +10931:3:3042 +10932:0:4365 +10933:2:1665 +10934:2:1669 +10935:2:1670 +10936:2:1678 +10937:2:1679 +10938:2:1683 +10939:2:1684 +10940:2:1678 +10941:2:1679 +10942:2:1680 +10943:2:1692 +10944:2:1697 +10945:2:1701 +10946:2:1702 +10947:2:1709 +10948:2:1710 +10949:2:1721 +10950:2:1722 +10951:2:1723 +10952:2:1721 +10953:2:1722 +10954:2:1723 +10955:2:1734 +10956:2:1739 +10957:2:1740 +10958:0:4365 +10959:3:3043 +10960:0:4365 +10961:2:1752 +10962:0:4365 +10963:3:3042 +10964:0:4365 +10965:2:1754 +10966:0:4365 +10967:3:3043 +10968:0:4365 +10969:2:1755 +10970:2:1759 +10971:2:1760 +10972:2:1768 +10973:2:1769 +10974:2:1773 +10975:2:1774 +10976:2:1768 +10977:2:1769 +10978:2:1773 +10979:2:1774 +10980:2:1782 +10981:2:1787 +10982:2:1791 +10983:2:1792 +10984:2:1799 +10985:2:1800 +10986:2:1811 +10987:2:1812 +10988:2:1813 +10989:2:1811 +10990:2:1812 +10991:2:1813 +10992:2:1824 +10993:2:1829 +10994:2:1830 +10995:0:4365 +10996:2:1842 +10997:0:4365 +10998:3:3042 +10999:0:4365 +11000:2:1844 +11001:0:4365 +11002:3:3043 +11003:0:4365 +11004:2:1845 +11005:2:1849 +11006:2:1850 +11007:2:1858 +11008:2:1859 +11009:2:1863 +11010:2:1864 +11011:2:1858 +11012:2:1859 +11013:2:1863 +11014:2:1864 +11015:2:1872 +11016:2:1877 +11017:2:1881 +11018:2:1882 +11019:2:1889 +11020:2:1890 +11021:2:1901 +11022:2:1902 +11023:2:1903 +11024:2:1901 +11025:2:1902 +11026:2:1903 +11027:2:1914 +11028:2:1919 +11029:2:1920 +11030:0:4365 +11031:2:1932 +11032:0:4365 +11033:3:3042 +11034:0:4365 +11035:2:1934 +11036:0:4365 +11037:3:3043 +11038:0:4365 +11039:2:1935 +11040:0:4365 +11041:2:1936 +11042:0:4365 +11043:2:2129 +11044:0:4365 +11045:2:2130 +11046:0:4365 +11047:2:2134 +11048:0:4365 +11049:3:3042 +11050:0:4365 +11051:2:2136 +11052:0:4365 +11053:3:3043 +11054:0:4365 +11055:2:2137 +11056:2:2141 +11057:2:2142 +11058:2:2150 +11059:2:2151 +11060:2:2155 +11061:2:2156 +11062:2:2150 +11063:2:2151 +11064:2:2155 +11065:2:2156 +11066:2:2164 +11067:2:2169 +11068:2:2173 +11069:2:2174 +11070:2:2181 +11071:2:2182 +11072:2:2193 +11073:2:2194 +11074:2:2195 +11075:2:2193 +11076:2:2194 +11077:2:2195 +11078:2:2206 +11079:2:2211 +11080:2:2212 +11081:0:4365 +11082:2:2224 +11083:0:4365 +11084:3:3042 +11085:0:4365 +11086:2:2226 +11087:0:4365 +11088:3:3043 +11089:0:4365 +11090:2:1936 +11091:0:4365 +11092:2:2129 +11093:0:4365 +11094:2:2130 +11095:0:4365 +11096:2:2134 +11097:0:4365 +11098:3:3042 +11099:0:4365 +11100:2:2136 +11101:0:4365 +11102:3:3043 +11103:0:4365 +11104:2:2137 +11105:2:2141 +11106:2:2142 +11107:2:2150 +11108:2:2151 +11109:2:2155 +11110:2:2156 +11111:2:2150 +11112:2:2151 +11113:2:2152 +11114:2:2164 +11115:2:2169 +11116:2:2173 +11117:2:2174 +11118:2:2181 +11119:2:2182 +11120:2:2193 +11121:2:2194 +11122:2:2195 +11123:2:2193 +11124:2:2194 +11125:2:2195 +11126:2:2206 +11127:2:2211 +11128:2:2212 +11129:0:4365 +11130:2:2224 +11131:0:4365 +11132:3:3042 +11133:0:4365 +11134:2:2226 +11135:0:4365 +11136:3:3043 +11137:0:4365 +11138:2:2230 +11139:0:4365 +11140:3:3042 +11141:0:4365 +11142:2:2235 +11143:2:2239 +11144:2:2240 +11145:2:2248 +11146:2:2249 +11147:2:2253 +11148:2:2254 +11149:2:2248 +11150:2:2249 +11151:2:2250 +11152:2:2262 +11153:2:2267 +11154:2:2271 +11155:2:2272 +11156:2:2279 +11157:2:2280 +11158:2:2291 +11159:2:2292 +11160:2:2293 +11161:2:2291 +11162:2:2292 +11163:2:2293 +11164:2:2304 +11165:2:2309 +11166:2:2310 +11167:0:4365 +11168:3:3043 +11169:0:4365 +11170:2:2322 +11171:0:4365 +11172:2:1169 +11173:0:4365 +11174:3:3042 +11175:0:4365 +11176:2:1170 +11177:0:4365 +11178:3:3043 +11179:0:4365 +11180:3:3044 +11181:0:4365 +11182:3:3257 +11183:0:4365 +11184:3:3362 +11185:0:4365 +11186:3:3363 +11187:0:4365 +11188:3:3367 +11189:0:4365 +11190:3:3373 +11191:3:3377 +11192:3:3378 +11193:3:3386 +11194:3:3387 +11195:3:3391 +11196:3:3392 +11197:3:3386 +11198:3:3387 +11199:3:3391 +11200:3:3392 +11201:3:3400 +11202:3:3405 +11203:3:3409 +11204:3:3410 +11205:3:3417 +11206:3:3418 +11207:3:3429 +11208:3:3430 +11209:3:3431 +11210:3:3429 +11211:3:3430 +11212:3:3431 +11213:3:3442 +11214:3:3447 +11215:3:3448 +11216:0:4365 +11217:3:3460 +11218:0:4365 +11219:3:3461 +11220:0:4365 +11221:2:1173 +11222:0:4365 +11223:3:3462 +11224:0:4365 +11225:2:1179 +11226:0:4365 +11227:2:1180 +11228:0:4365 +11229:3:3461 +11230:0:4365 +11231:2:1181 +11232:2:1185 +11233:2:1186 +11234:2:1194 +11235:2:1195 +11236:2:1199 +11237:2:1200 +11238:2:1194 +11239:2:1195 +11240:2:1199 +11241:2:1200 +11242:2:1208 +11243:2:1213 +11244:2:1217 +11245:2:1218 +11246:2:1225 +11247:2:1226 +11248:2:1237 +11249:2:1238 +11250:2:1239 +11251:2:1237 +11252:2:1238 +11253:2:1239 +11254:2:1250 +11255:2:1255 +11256:2:1256 +11257:0:4365 +11258:3:3462 +11259:0:4365 +11260:2:1268 +11261:0:4365 +11262:3:3461 +11263:0:4365 +11264:2:1270 +11265:0:4365 +11266:3:3462 +11267:0:4365 +11268:2:1271 +11269:2:1275 +11270:2:1276 +11271:2:1284 +11272:2:1285 +11273:2:1289 +11274:2:1290 +11275:2:1284 +11276:2:1285 +11277:2:1289 +11278:2:1290 +11279:2:1298 +11280:2:1303 +11281:2:1307 +11282:2:1308 +11283:2:1315 +11284:2:1316 +11285:2:1327 +11286:2:1328 +11287:2:1329 +11288:2:1327 +11289:2:1328 +11290:2:1329 +11291:2:1340 +11292:2:1345 +11293:2:1346 +11294:0:4365 +11295:2:1358 +11296:0:4365 +11297:2:1360 +11298:0:4365 +11299:3:3461 +11300:0:4365 +11301:2:1361 +11302:0:4365 +11303:3:3462 +11304:0:4365 +11305:2:1362 +11306:2:1366 +11307:2:1367 +11308:2:1375 +11309:2:1376 +11310:2:1380 +11311:2:1381 +11312:2:1375 +11313:2:1376 +11314:2:1380 +11315:2:1381 +11316:2:1389 +11317:2:1394 +11318:2:1398 +11319:2:1399 +11320:2:1406 +11321:2:1407 +11322:2:1418 +11323:2:1419 +11324:2:1420 +11325:2:1418 +11326:2:1419 +11327:2:1420 +11328:2:1431 +11329:2:1436 +11330:2:1437 +11331:0:4365 +11332:2:1449 +11333:0:4365 +11334:3:3461 +11335:0:4365 +11336:2:1451 +11337:0:4365 +11338:3:3462 +11339:0:4365 +11340:2:1652 +11341:0:4365 +11342:2:1653 +11343:0:4365 +11344:2:1657 +11345:0:4365 +11346:2:1180 +11347:0:4365 +11348:3:3461 +11349:0:4365 +11350:2:1181 +11351:2:1185 +11352:2:1186 +11353:2:1194 +11354:2:1195 +11355:2:1199 +11356:2:1200 +11357:2:1194 +11358:2:1195 +11359:2:1196 +11360:2:1208 +11361:2:1213 +11362:2:1217 +11363:2:1218 +11364:2:1225 +11365:2:1226 +11366:2:1237 +11367:2:1238 +11368:2:1239 +11369:2:1237 +11370:2:1238 +11371:2:1239 +11372:2:1250 +11373:2:1255 +11374:2:1256 +11375:0:4365 +11376:3:3462 +11377:0:4365 +11378:2:1268 +11379:0:4365 +11380:3:3461 +11381:0:4365 +11382:2:1270 +11383:0:4365 +11384:3:3462 +11385:0:4365 +11386:2:1271 +11387:2:1275 +11388:2:1276 +11389:2:1284 +11390:2:1285 +11391:2:1289 +11392:2:1290 +11393:2:1284 +11394:2:1285 +11395:2:1289 +11396:2:1290 +11397:2:1298 +11398:2:1303 +11399:2:1307 +11400:2:1308 +11401:2:1315 +11402:2:1316 +11403:2:1327 +11404:2:1328 +11405:2:1329 +11406:2:1327 +11407:2:1328 +11408:2:1329 +11409:2:1340 +11410:2:1345 +11411:2:1346 +11412:0:4365 +11413:2:1358 +11414:0:4365 +11415:2:1454 +11416:0:4365 +11417:3:3461 +11418:0:4365 +11419:2:1455 +11420:0:4365 +11421:3:3462 +11422:0:4365 +11423:2:1652 +11424:0:4365 +11425:2:1653 +11426:0:4365 +11427:2:1657 +11428:0:4365 +11429:2:1660 +11430:0:4365 +11431:3:3461 +11432:0:4365 +11433:2:1665 +11434:2:1669 +11435:2:1670 +11436:2:1678 +11437:2:1679 +11438:2:1683 +11439:2:1684 +11440:2:1678 +11441:2:1679 +11442:2:1680 +11443:2:1692 +11444:2:1697 +11445:2:1701 +11446:2:1702 +11447:2:1709 +11448:2:1710 +11449:2:1721 +11450:2:1722 +11451:2:1723 +11452:2:1721 +11453:2:1722 +11454:2:1723 +11455:2:1734 +11456:2:1739 +11457:2:1740 +11458:0:4365 +11459:3:3462 +11460:0:4365 +11461:2:1752 +11462:0:4365 +11463:3:3461 +11464:0:4365 +11465:2:1754 +11466:0:4365 +11467:3:3462 +11468:0:4365 +11469:2:1755 +11470:2:1759 +11471:2:1760 +11472:2:1768 +11473:2:1769 +11474:2:1773 +11475:2:1774 +11476:2:1768 +11477:2:1769 +11478:2:1773 +11479:2:1774 +11480:2:1782 +11481:2:1787 +11482:2:1791 +11483:2:1792 +11484:2:1799 +11485:2:1800 +11486:2:1811 +11487:2:1812 +11488:2:1813 +11489:2:1811 +11490:2:1812 +11491:2:1813 +11492:2:1824 +11493:2:1829 +11494:2:1830 +11495:0:4365 +11496:2:1842 +11497:0:4365 +11498:3:3461 +11499:0:4365 +11500:2:1844 +11501:0:4365 +11502:3:3462 +11503:0:4365 +11504:2:1845 +11505:2:1849 +11506:2:1850 +11507:2:1858 +11508:2:1859 +11509:2:1863 +11510:2:1864 +11511:2:1858 +11512:2:1859 +11513:2:1863 +11514:2:1864 +11515:2:1872 +11516:2:1877 +11517:2:1881 +11518:2:1882 +11519:2:1889 +11520:2:1890 +11521:2:1901 +11522:2:1902 +11523:2:1903 +11524:2:1901 +11525:2:1902 +11526:2:1903 +11527:2:1914 +11528:2:1919 +11529:2:1920 +11530:0:4365 +11531:2:1932 +11532:0:4365 +11533:3:3461 +11534:0:4365 +11535:2:1934 +11536:0:4365 +11537:3:3462 +11538:0:4365 +11539:2:1935 +11540:0:4365 +11541:2:1936 +11542:0:4365 +11543:2:2129 +11544:0:4365 +11545:2:2130 +11546:0:4365 +11547:2:2134 +11548:0:4365 +11549:3:3461 +11550:0:4365 +11551:2:2136 +11552:0:4365 +11553:3:3462 +11554:0:4365 +11555:2:2137 +11556:2:2141 +11557:2:2142 +11558:2:2150 +11559:2:2151 +11560:2:2155 +11561:2:2156 +11562:2:2150 +11563:2:2151 +11564:2:2155 +11565:2:2156 +11566:2:2164 +11567:2:2169 +11568:2:2173 +11569:2:2174 +11570:2:2181 +11571:2:2182 +11572:2:2193 +11573:2:2194 +11574:2:2195 +11575:2:2193 +11576:2:2194 +11577:2:2195 +11578:2:2206 +11579:2:2211 +11580:2:2212 +11581:0:4365 +11582:2:2224 +11583:0:4365 +11584:3:3461 +11585:0:4365 +11586:2:2226 +11587:0:4365 +11588:3:3462 +11589:0:4365 +11590:2:1936 +11591:0:4365 +11592:2:2129 +11593:0:4365 +11594:2:2130 +11595:0:4365 +11596:2:2134 +11597:0:4365 +11598:3:3461 +11599:0:4365 +11600:2:2136 +11601:0:4365 +11602:3:3462 +11603:0:4365 +11604:2:2137 +11605:2:2141 +11606:2:2142 +11607:2:2150 +11608:2:2151 +11609:2:2155 +11610:2:2156 +11611:2:2150 +11612:2:2151 +11613:2:2152 +11614:2:2164 +11615:2:2169 +11616:2:2173 +11617:2:2174 +11618:2:2181 +11619:2:2182 +11620:2:2193 +11621:2:2194 +11622:2:2195 +11623:2:2193 +11624:2:2194 +11625:2:2195 +11626:2:2206 +11627:2:2211 +11628:2:2212 +11629:0:4365 +11630:2:2224 +11631:0:4365 +11632:3:3461 +11633:0:4365 +11634:2:2226 +11635:0:4365 +11636:3:3462 +11637:0:4365 +11638:2:2230 +11639:0:4365 +11640:3:3461 +11641:0:4365 +11642:2:2235 +11643:2:2239 +11644:2:2240 +11645:2:2248 +11646:2:2249 +11647:2:2253 +11648:2:2254 +11649:2:2248 +11650:2:2249 +11651:2:2250 +11652:2:2262 +11653:2:2267 +11654:2:2271 +11655:2:2272 +11656:2:2279 +11657:2:2280 +11658:2:2291 +11659:2:2292 +11660:2:2293 +11661:2:2291 +11662:2:2292 +11663:2:2293 +11664:2:2304 +11665:2:2309 +11666:2:2310 +11667:0:4365 +11668:3:3462 +11669:0:4365 +11670:2:2322 +11671:0:4365 +11672:2:1169 +11673:0:4365 +11674:3:3461 +11675:0:4365 +11676:2:1170 +11677:0:4365 +11678:3:3462 +11679:0:4365 +11680:3:3463 +11681:0:4365 +11682:3:3469 +11683:0:4365 +11684:3:3470 +11685:3:3474 +11686:3:3475 +11687:3:3483 +11688:3:3484 +11689:3:3488 +11690:3:3489 +11691:3:3483 +11692:3:3484 +11693:3:3488 +11694:3:3489 +11695:3:3497 +11696:3:3502 +11697:3:3506 +11698:3:3507 +11699:3:3514 +11700:3:3515 +11701:3:3526 +11702:3:3527 +11703:3:3528 +11704:3:3526 +11705:3:3527 +11706:3:3528 +11707:3:3539 +11708:3:3544 +11709:3:3545 +11710:0:4365 +11711:3:3557 +11712:0:4365 +11713:3:3558 +11714:0:4365 +11715:2:1173 +11716:0:4365 +11717:3:3559 +11718:0:4365 +11719:2:1179 +11720:0:4365 +11721:2:1180 +11722:0:4365 +11723:3:3558 +11724:0:4365 +11725:2:1181 +11726:2:1185 +11727:2:1186 +11728:2:1194 +11729:2:1195 +11730:2:1199 +11731:2:1200 +11732:2:1194 +11733:2:1195 +11734:2:1199 +11735:2:1200 +11736:2:1208 +11737:2:1213 +11738:2:1217 +11739:2:1218 +11740:2:1225 +11741:2:1226 +11742:2:1237 +11743:2:1238 +11744:2:1239 +11745:2:1237 +11746:2:1238 +11747:2:1239 +11748:2:1250 +11749:2:1255 +11750:2:1256 +11751:0:4365 +11752:3:3559 +11753:0:4365 +11754:2:1268 +11755:0:4365 +11756:3:3558 +11757:0:4365 +11758:2:1270 +11759:0:4365 +11760:3:3559 +11761:0:4365 +11762:2:1271 +11763:2:1275 +11764:2:1276 +11765:2:1284 +11766:2:1285 +11767:2:1289 +11768:2:1290 +11769:2:1284 +11770:2:1285 +11771:2:1289 +11772:2:1290 +11773:2:1298 +11774:2:1303 +11775:2:1307 +11776:2:1308 +11777:2:1315 +11778:2:1316 +11779:2:1327 +11780:2:1328 +11781:2:1329 +11782:2:1327 +11783:2:1328 +11784:2:1329 +11785:2:1340 +11786:2:1345 +11787:2:1346 +11788:0:4365 +11789:2:1358 +11790:0:4365 +11791:2:1360 +11792:0:4365 +11793:3:3558 +11794:0:4365 +11795:2:1361 +11796:0:4365 +11797:3:3559 +11798:0:4365 +11799:2:1362 +11800:2:1366 +11801:2:1367 +11802:2:1375 +11803:2:1376 +11804:2:1380 +11805:2:1381 +11806:2:1375 +11807:2:1376 +11808:2:1380 +11809:2:1381 +11810:2:1389 +11811:2:1394 +11812:2:1398 +11813:2:1399 +11814:2:1406 +11815:2:1407 +11816:2:1418 +11817:2:1419 +11818:2:1420 +11819:2:1418 +11820:2:1419 +11821:2:1420 +11822:2:1431 +11823:2:1436 +11824:2:1437 +11825:0:4365 +11826:2:1449 +11827:0:4365 +11828:3:3558 +11829:0:4365 +11830:2:1451 +11831:0:4365 +11832:3:3559 +11833:0:4365 +11834:2:1652 +11835:0:4365 +11836:2:1653 +11837:0:4365 +11838:2:1657 +11839:0:4365 +11840:2:1180 +11841:0:4365 +11842:3:3558 +11843:0:4365 +11844:2:1181 +11845:2:1185 +11846:2:1186 +11847:2:1194 +11848:2:1195 +11849:2:1199 +11850:2:1200 +11851:2:1194 +11852:2:1195 +11853:2:1196 +11854:2:1208 +11855:2:1213 +11856:2:1217 +11857:2:1218 +11858:2:1225 +11859:2:1226 +11860:2:1237 +11861:2:1238 +11862:2:1239 +11863:2:1237 +11864:2:1238 +11865:2:1239 +11866:2:1250 +11867:2:1255 +11868:2:1256 +11869:0:4365 +11870:3:3559 +11871:0:4365 +11872:2:1268 +11873:0:4365 +11874:3:3558 +11875:0:4365 +11876:2:1270 +11877:0:4365 +11878:3:3559 +11879:0:4365 +11880:2:1271 +11881:2:1275 +11882:2:1276 +11883:2:1284 +11884:2:1285 +11885:2:1289 +11886:2:1290 +11887:2:1284 +11888:2:1285 +11889:2:1289 +11890:2:1290 +11891:2:1298 +11892:2:1303 +11893:2:1307 +11894:2:1308 +11895:2:1315 +11896:2:1316 +11897:2:1327 +11898:2:1328 +11899:2:1329 +11900:2:1327 +11901:2:1328 +11902:2:1329 +11903:2:1340 +11904:2:1345 +11905:2:1346 +11906:0:4365 +11907:2:1358 +11908:0:4365 +11909:2:1454 +11910:0:4365 +11911:3:3558 +11912:0:4365 +11913:2:1455 +11914:0:4365 +11915:3:3559 +11916:0:4365 +11917:2:1652 +11918:0:4365 +11919:2:1653 +11920:0:4365 +11921:2:1657 +11922:0:4365 +11923:2:1660 +11924:0:4365 +11925:3:3558 +11926:0:4365 +11927:2:1665 +11928:2:1669 +11929:2:1670 +11930:2:1678 +11931:2:1679 +11932:2:1683 +11933:2:1684 +11934:2:1678 +11935:2:1679 +11936:2:1680 +11937:2:1692 +11938:2:1697 +11939:2:1701 +11940:2:1702 +11941:2:1709 +11942:2:1710 +11943:2:1721 +11944:2:1722 +11945:2:1723 +11946:2:1721 +11947:2:1722 +11948:2:1723 +11949:2:1734 +11950:2:1739 +11951:2:1740 +11952:0:4365 +11953:3:3559 +11954:0:4365 +11955:2:1752 +11956:0:4365 +11957:3:3558 +11958:0:4365 +11959:2:1754 +11960:0:4365 +11961:3:3559 +11962:0:4365 +11963:2:1755 +11964:2:1759 +11965:2:1760 +11966:2:1768 +11967:2:1769 +11968:2:1773 +11969:2:1774 +11970:2:1768 +11971:2:1769 +11972:2:1773 +11973:2:1774 +11974:2:1782 +11975:2:1787 +11976:2:1791 +11977:2:1792 +11978:2:1799 +11979:2:1800 +11980:2:1811 +11981:2:1812 +11982:2:1813 +11983:2:1811 +11984:2:1812 +11985:2:1813 +11986:2:1824 +11987:2:1829 +11988:2:1830 +11989:0:4365 +11990:2:1842 +11991:0:4365 +11992:3:3558 +11993:0:4365 +11994:2:1844 +11995:0:4365 +11996:3:3559 +11997:0:4365 +11998:2:1845 +11999:2:1849 +12000:2:1850 +12001:2:1858 +12002:2:1859 +12003:2:1863 +12004:2:1864 +12005:2:1858 +12006:2:1859 +12007:2:1863 +12008:2:1864 +12009:2:1872 +12010:2:1877 +12011:2:1881 +12012:2:1882 +12013:2:1889 +12014:2:1890 +12015:2:1901 +12016:2:1902 +12017:2:1903 +12018:2:1901 +12019:2:1902 +12020:2:1903 +12021:2:1914 +12022:2:1919 +12023:2:1920 +12024:0:4365 +12025:2:1932 +12026:0:4365 +12027:3:3558 +12028:0:4365 +12029:2:1934 +12030:0:4365 +12031:3:3559 +12032:0:4365 +12033:2:1935 +12034:0:4365 +12035:2:1936 +12036:0:4365 +12037:2:2129 +12038:0:4365 +12039:2:2130 +12040:0:4365 +12041:2:2134 +12042:0:4365 +12043:3:3558 +12044:0:4365 +12045:2:2136 +12046:0:4365 +12047:3:3559 +12048:0:4365 +12049:2:2137 +12050:2:2141 +12051:2:2142 +12052:2:2150 +12053:2:2151 +12054:2:2155 +12055:2:2156 +12056:2:2150 +12057:2:2151 +12058:2:2155 +12059:2:2156 +12060:2:2164 +12061:2:2169 +12062:2:2173 +12063:2:2174 +12064:2:2181 +12065:2:2182 +12066:2:2193 +12067:2:2194 +12068:2:2195 +12069:2:2193 +12070:2:2194 +12071:2:2195 +12072:2:2206 +12073:2:2211 +12074:2:2212 +12075:0:4365 +12076:2:2224 +12077:0:4365 +12078:3:3558 +12079:0:4365 +12080:2:2226 +12081:0:4365 +12082:3:3559 +12083:0:4365 +12084:2:1936 +12085:0:4365 +12086:2:2129 +12087:0:4365 +12088:2:2130 +12089:0:4365 +12090:2:2134 +12091:0:4365 +12092:3:3558 +12093:0:4365 +12094:2:2136 +12095:0:4365 +12096:3:3559 +12097:0:4365 +12098:2:2137 +12099:2:2141 +12100:2:2142 +12101:2:2150 +12102:2:2151 +12103:2:2155 +12104:2:2156 +12105:2:2150 +12106:2:2151 +12107:2:2152 +12108:2:2164 +12109:2:2169 +12110:2:2173 +12111:2:2174 +12112:2:2181 +12113:2:2182 +12114:2:2193 +12115:2:2194 +12116:2:2195 +12117:2:2193 +12118:2:2194 +12119:2:2195 +12120:2:2206 +12121:2:2211 +12122:2:2212 +12123:0:4365 +12124:2:2224 +12125:0:4365 +12126:3:3558 +12127:0:4365 +12128:2:2226 +12129:0:4365 +12130:3:3559 +12131:0:4365 +12132:2:2230 +12133:0:4365 +12134:3:3558 +12135:0:4365 +12136:2:2235 +12137:2:2239 +12138:2:2240 +12139:2:2248 +12140:2:2249 +12141:2:2253 +12142:2:2254 +12143:2:2248 +12144:2:2249 +12145:2:2250 +12146:2:2262 +12147:2:2267 +12148:2:2271 +12149:2:2272 +12150:2:2279 +12151:2:2280 +12152:2:2291 +12153:2:2292 +12154:2:2293 +12155:2:2291 +12156:2:2292 +12157:2:2293 +12158:2:2304 +12159:2:2309 +12160:2:2310 +12161:0:4365 +12162:3:3559 +12163:0:4365 +12164:2:2322 +12165:0:4365 +12166:2:1169 +12167:0:4365 +12168:3:3558 +12169:0:4365 +12170:2:1170 +12171:0:4365 +12172:3:3559 +12173:0:4365 +12174:3:3560 +12175:0:4365 +12176:3:3566 +12177:0:4365 +12178:3:3569 +12179:3:3570 +12180:3:3582 +12181:3:3583 +12182:3:3587 +12183:3:3588 +12184:3:3582 +12185:3:3583 +12186:3:3587 +12187:3:3588 +12188:3:3596 +12189:3:3601 +12190:3:3605 +12191:3:3606 +12192:3:3613 +12193:3:3614 +12194:3:3625 +12195:3:3626 +12196:3:3627 +12197:3:3625 +12198:3:3626 +12199:3:3627 +12200:3:3638 +12201:3:3643 +12202:3:3644 +12203:0:4365 +12204:3:3656 +12205:0:4365 +12206:3:3657 +12207:0:4365 +12208:2:1173 +12209:0:4365 +12210:3:3658 +12211:0:4365 +12212:2:1179 +12213:0:4365 +12214:2:1180 +12215:0:4365 +12216:3:3657 +12217:0:4365 +12218:2:1181 +12219:2:1185 +12220:2:1186 +12221:2:1194 +12222:2:1195 +12223:2:1199 +12224:2:1200 +12225:2:1194 +12226:2:1195 +12227:2:1199 +12228:2:1200 +12229:2:1208 +12230:2:1213 +12231:2:1217 +12232:2:1218 +12233:2:1225 +12234:2:1226 +12235:2:1237 +12236:2:1238 +12237:2:1239 +12238:2:1237 +12239:2:1238 +12240:2:1239 +12241:2:1250 +12242:2:1255 +12243:2:1256 +12244:0:4365 +12245:3:3658 +12246:0:4365 +12247:2:1268 +12248:0:4365 +12249:3:3657 +12250:0:4365 +12251:2:1270 +12252:0:4365 +12253:3:3658 +12254:0:4365 +12255:2:1271 +12256:2:1275 +12257:2:1276 +12258:2:1284 +12259:2:1285 +12260:2:1289 +12261:2:1290 +12262:2:1284 +12263:2:1285 +12264:2:1289 +12265:2:1290 +12266:2:1298 +12267:2:1303 +12268:2:1307 +12269:2:1308 +12270:2:1315 +12271:2:1316 +12272:2:1327 +12273:2:1328 +12274:2:1329 +12275:2:1327 +12276:2:1328 +12277:2:1329 +12278:2:1340 +12279:2:1345 +12280:2:1346 +12281:0:4365 +12282:2:1358 +12283:0:4365 +12284:2:1360 +12285:0:4365 +12286:3:3657 +12287:0:4365 +12288:2:1361 +12289:0:4365 +12290:3:3658 +12291:0:4365 +12292:2:1362 +12293:2:1366 +12294:2:1367 +12295:2:1375 +12296:2:1376 +12297:2:1380 +12298:2:1381 +12299:2:1375 +12300:2:1376 +12301:2:1380 +12302:2:1381 +12303:2:1389 +12304:2:1394 +12305:2:1398 +12306:2:1399 +12307:2:1406 +12308:2:1407 +12309:2:1418 +12310:2:1419 +12311:2:1420 +12312:2:1418 +12313:2:1419 +12314:2:1420 +12315:2:1431 +12316:2:1436 +12317:2:1437 +12318:0:4365 +12319:2:1449 +12320:0:4365 +12321:3:3657 +12322:0:4365 +12323:2:1451 +12324:0:4365 +12325:3:3658 +12326:0:4365 +12327:2:1652 +12328:0:4365 +12329:2:1653 +12330:0:4365 +12331:2:1657 +12332:0:4365 +12333:2:1180 +12334:0:4365 +12335:3:3657 +12336:0:4365 +12337:2:1181 +12338:2:1185 +12339:2:1186 +12340:2:1194 +12341:2:1195 +12342:2:1199 +12343:2:1200 +12344:2:1194 +12345:2:1195 +12346:2:1196 +12347:2:1208 +12348:2:1213 +12349:2:1217 +12350:2:1218 +12351:2:1225 +12352:2:1226 +12353:2:1237 +12354:2:1238 +12355:2:1239 +12356:2:1237 +12357:2:1238 +12358:2:1239 +12359:2:1250 +12360:2:1255 +12361:2:1256 +12362:0:4365 +12363:3:3658 +12364:0:4365 +12365:2:1268 +12366:0:4365 +12367:3:3657 +12368:0:4365 +12369:2:1270 +12370:0:4365 +12371:3:3658 +12372:0:4365 +12373:2:1271 +12374:2:1275 +12375:2:1276 +12376:2:1284 +12377:2:1285 +12378:2:1289 +12379:2:1290 +12380:2:1284 +12381:2:1285 +12382:2:1289 +12383:2:1290 +12384:2:1298 +12385:2:1303 +12386:2:1307 +12387:2:1308 +12388:2:1315 +12389:2:1316 +12390:2:1327 +12391:2:1328 +12392:2:1329 +12393:2:1327 +12394:2:1328 +12395:2:1329 +12396:2:1340 +12397:2:1345 +12398:2:1346 +12399:0:4365 +12400:2:1358 +12401:0:4365 +12402:2:1454 +12403:0:4365 +12404:3:3657 +12405:0:4365 +12406:2:1455 +12407:0:4365 +12408:3:3658 +12409:0:4365 +12410:2:1652 +12411:0:4365 +12412:2:1653 +12413:0:4365 +12414:2:1657 +12415:0:4365 +12416:2:1660 +12417:0:4365 +12418:3:3657 +12419:0:4365 +12420:2:1665 +12421:2:1669 +12422:2:1670 +12423:2:1678 +12424:2:1679 +12425:2:1683 +12426:2:1684 +12427:2:1678 +12428:2:1679 +12429:2:1680 +12430:2:1692 +12431:2:1697 +12432:2:1701 +12433:2:1702 +12434:2:1709 +12435:2:1710 +12436:2:1721 +12437:2:1722 +12438:2:1723 +12439:2:1721 +12440:2:1722 +12441:2:1723 +12442:2:1734 +12443:2:1739 +12444:2:1740 +12445:0:4365 +12446:3:3658 +12447:0:4365 +12448:2:1752 +12449:0:4365 +12450:3:3657 +12451:0:4365 +12452:2:1754 +12453:0:4365 +12454:3:3658 +12455:0:4365 +12456:2:1755 +12457:2:1759 +12458:2:1760 +12459:2:1768 +12460:2:1769 +12461:2:1773 +12462:2:1774 +12463:2:1768 +12464:2:1769 +12465:2:1773 +12466:2:1774 +12467:2:1782 +12468:2:1787 +12469:2:1791 +12470:2:1792 +12471:2:1799 +12472:2:1800 +12473:2:1811 +12474:2:1812 +12475:2:1813 +12476:2:1811 +12477:2:1812 +12478:2:1813 +12479:2:1824 +12480:2:1829 +12481:2:1830 +12482:0:4365 +12483:2:1842 +12484:0:4365 +12485:3:3657 +12486:0:4365 +12487:2:1844 +12488:0:4365 +12489:3:3658 +12490:0:4365 +12491:2:1845 +12492:2:1849 +12493:2:1850 +12494:2:1858 +12495:2:1859 +12496:2:1863 +12497:2:1864 +12498:2:1858 +12499:2:1859 +12500:2:1863 +12501:2:1864 +12502:2:1872 +12503:2:1877 +12504:2:1881 +12505:2:1882 +12506:2:1889 +12507:2:1890 +12508:2:1901 +12509:2:1902 +12510:2:1903 +12511:2:1901 +12512:2:1902 +12513:2:1903 +12514:2:1914 +12515:2:1919 +12516:2:1920 +12517:0:4365 +12518:2:1932 +12519:0:4365 +12520:3:3657 +12521:0:4365 +12522:2:1934 +12523:0:4365 +12524:3:3658 +12525:0:4365 +12526:2:1935 +12527:0:4365 +12528:2:1936 +12529:0:4365 +12530:2:2129 +12531:0:4365 +12532:2:2130 +12533:0:4365 +12534:2:2134 +12535:0:4365 +12536:3:3657 +12537:0:4365 +12538:2:2136 +12539:0:4365 +12540:3:3658 +12541:0:4365 +12542:2:2137 +12543:2:2141 +12544:2:2142 +12545:2:2150 +12546:2:2151 +12547:2:2155 +12548:2:2156 +12549:2:2150 +12550:2:2151 +12551:2:2155 +12552:2:2156 +12553:2:2164 +12554:2:2169 +12555:2:2173 +12556:2:2174 +12557:2:2181 +12558:2:2182 +12559:2:2193 +12560:2:2194 +12561:2:2195 +12562:2:2193 +12563:2:2194 +12564:2:2195 +12565:2:2206 +12566:2:2211 +12567:2:2212 +12568:0:4365 +12569:2:2224 +12570:0:4365 +12571:3:3657 +12572:0:4365 +12573:2:2226 +12574:0:4365 +12575:3:3658 +12576:0:4365 +12577:2:1936 +12578:0:4365 +12579:2:2129 +12580:0:4365 +12581:2:2130 +12582:0:4365 +12583:2:2134 +12584:0:4365 +12585:3:3657 +12586:0:4365 +12587:2:2136 +12588:0:4365 +12589:3:3658 +12590:0:4365 +12591:2:2137 +12592:2:2141 +12593:2:2142 +12594:2:2150 +12595:2:2151 +12596:2:2155 +12597:2:2156 +12598:2:2150 +12599:2:2151 +12600:2:2152 +12601:2:2164 +12602:2:2169 +12603:2:2173 +12604:2:2174 +12605:2:2181 +12606:2:2182 +12607:2:2193 +12608:2:2194 +12609:2:2195 +12610:2:2193 +12611:2:2194 +12612:2:2195 +12613:2:2206 +12614:2:2211 +12615:2:2212 +12616:0:4365 +12617:2:2224 +12618:0:4365 +12619:3:3657 +12620:0:4365 +12621:2:2226 +12622:0:4365 +12623:3:3658 +12624:0:4365 +12625:2:2230 +12626:0:4365 +12627:3:3657 +12628:0:4365 +12629:2:2235 +12630:2:2239 +12631:2:2240 +12632:2:2248 +12633:2:2249 +12634:2:2253 +12635:2:2254 +12636:2:2248 +12637:2:2249 +12638:2:2250 +12639:2:2262 +12640:2:2267 +12641:2:2271 +12642:2:2272 +12643:2:2279 +12644:2:2280 +12645:2:2291 +12646:2:2292 +12647:2:2293 +12648:2:2291 +12649:2:2292 +12650:2:2293 +12651:2:2304 +12652:2:2309 +12653:2:2310 +12654:0:4365 +12655:3:3658 +12656:0:4365 +12657:2:2322 +12658:0:4365 +12659:2:1169 +12660:0:4365 +12661:3:3657 +12662:0:4365 +12663:2:1170 +12664:0:4365 +12665:3:3658 +12666:0:4365 +12667:3:3659 +12668:0:4365 +12669:3:3665 +12670:0:4365 +12671:3:3666 +12672:0:4365 +12673:3:3667 +12674:0:4365 +12675:3:3668 +12676:0:4365 +12677:3:3669 +12678:3:3673 +12679:3:3674 +12680:3:3682 +12681:3:3683 +12682:3:3687 +12683:3:3688 +12684:3:3682 +12685:3:3683 +12686:3:3687 +12687:3:3688 +12688:3:3696 +12689:3:3701 +12690:3:3705 +12691:3:3706 +12692:3:3713 +12693:3:3714 +12694:3:3725 +12695:3:3726 +12696:3:3727 +12697:3:3725 +12698:3:3726 +12699:3:3727 +12700:3:3738 +12701:3:3743 +12702:3:3744 +12703:0:4365 +12704:3:3756 +12705:0:4365 +12706:3:3757 +12707:0:4365 +12708:2:1173 +12709:0:4365 +12710:3:3758 +12711:0:4365 +12712:2:1179 +12713:0:4365 +12714:2:1180 +12715:0:4365 +12716:3:3757 +12717:0:4365 +12718:2:1181 +12719:2:1185 +12720:2:1186 +12721:2:1194 +12722:2:1195 +12723:2:1199 +12724:2:1200 +12725:2:1194 +12726:2:1195 +12727:2:1199 +12728:2:1200 +12729:2:1208 +12730:2:1213 +12731:2:1217 +12732:2:1218 +12733:2:1225 +12734:2:1226 +12735:2:1237 +12736:2:1238 +12737:2:1239 +12738:2:1237 +12739:2:1238 +12740:2:1239 +12741:2:1250 +12742:2:1255 +12743:2:1256 +12744:0:4365 +12745:3:3758 +12746:0:4365 +12747:2:1268 +12748:0:4365 +12749:3:3757 +12750:0:4365 +12751:2:1270 +12752:0:4365 +12753:3:3758 +12754:0:4365 +12755:2:1271 +12756:2:1275 +12757:2:1276 +12758:2:1284 +12759:2:1285 +12760:2:1289 +12761:2:1290 +12762:2:1284 +12763:2:1285 +12764:2:1289 +12765:2:1290 +12766:2:1298 +12767:2:1303 +12768:2:1307 +12769:2:1308 +12770:2:1315 +12771:2:1316 +12772:2:1327 +12773:2:1328 +12774:2:1329 +12775:2:1327 +12776:2:1328 +12777:2:1329 +12778:2:1340 +12779:2:1345 +12780:2:1346 +12781:0:4365 +12782:2:1358 +12783:0:4365 +12784:2:1360 +12785:0:4365 +12786:3:3757 +12787:0:4365 +12788:2:1361 +12789:0:4365 +12790:3:3758 +12791:0:4365 +12792:2:1362 +12793:2:1366 +12794:2:1367 +12795:2:1375 +12796:2:1376 +12797:2:1380 +12798:2:1381 +12799:2:1375 +12800:2:1376 +12801:2:1380 +12802:2:1381 +12803:2:1389 +12804:2:1394 +12805:2:1398 +12806:2:1399 +12807:2:1406 +12808:2:1407 +12809:2:1418 +12810:2:1419 +12811:2:1420 +12812:2:1418 +12813:2:1419 +12814:2:1420 +12815:2:1431 +12816:2:1436 +12817:2:1437 +12818:0:4365 +12819:2:1449 +12820:0:4365 +12821:3:3757 +12822:0:4365 +12823:2:1451 +12824:0:4365 +12825:3:3758 +12826:0:4365 +12827:2:1652 +12828:0:4365 +12829:2:1653 +12830:0:4365 +12831:2:1657 +12832:0:4365 +12833:2:1180 +12834:0:4365 +12835:3:3757 +12836:0:4365 +12837:2:1181 +12838:2:1185 +12839:2:1186 +12840:2:1194 +12841:2:1195 +12842:2:1199 +12843:2:1200 +12844:2:1194 +12845:2:1195 +12846:2:1196 +12847:2:1208 +12848:2:1213 +12849:2:1217 +12850:2:1218 +12851:2:1225 +12852:2:1226 +12853:2:1237 +12854:2:1238 +12855:2:1239 +12856:2:1237 +12857:2:1238 +12858:2:1239 +12859:2:1250 +12860:2:1255 +12861:2:1256 +12862:0:4365 +12863:3:3758 +12864:0:4365 +12865:2:1268 +12866:0:4365 +12867:3:3757 +12868:0:4365 +12869:2:1270 +12870:0:4365 +12871:3:3758 +12872:0:4365 +12873:2:1271 +12874:2:1275 +12875:2:1276 +12876:2:1284 +12877:2:1285 +12878:2:1289 +12879:2:1290 +12880:2:1284 +12881:2:1285 +12882:2:1289 +12883:2:1290 +12884:2:1298 +12885:2:1303 +12886:2:1307 +12887:2:1308 +12888:2:1315 +12889:2:1316 +12890:2:1327 +12891:2:1328 +12892:2:1329 +12893:2:1327 +12894:2:1328 +12895:2:1329 +12896:2:1340 +12897:2:1345 +12898:2:1346 +12899:0:4365 +12900:2:1358 +12901:0:4365 +12902:2:1454 +12903:0:4365 +12904:3:3757 +12905:0:4365 +12906:2:1455 +12907:0:4365 +12908:3:3758 +12909:0:4365 +12910:2:1652 +12911:0:4365 +12912:2:1653 +12913:0:4365 +12914:2:1657 +12915:0:4365 +12916:2:1660 +12917:0:4365 +12918:3:3757 +12919:0:4365 +12920:2:1665 +12921:2:1669 +12922:2:1670 +12923:2:1678 +12924:2:1679 +12925:2:1683 +12926:2:1684 +12927:2:1678 +12928:2:1679 +12929:2:1680 +12930:2:1692 +12931:2:1697 +12932:2:1701 +12933:2:1702 +12934:2:1709 +12935:2:1710 +12936:2:1721 +12937:2:1722 +12938:2:1723 +12939:2:1721 +12940:2:1722 +12941:2:1723 +12942:2:1734 +12943:2:1739 +12944:2:1740 +12945:0:4365 +12946:3:3758 +12947:0:4365 +12948:2:1752 +12949:0:4365 +12950:3:3757 +12951:0:4365 +12952:2:1754 +12953:0:4365 +12954:3:3758 +12955:0:4365 +12956:2:1755 +12957:2:1759 +12958:2:1760 +12959:2:1768 +12960:2:1769 +12961:2:1773 +12962:2:1774 +12963:2:1768 +12964:2:1769 +12965:2:1773 +12966:2:1774 +12967:2:1782 +12968:2:1787 +12969:2:1791 +12970:2:1792 +12971:2:1799 +12972:2:1800 +12973:2:1811 +12974:2:1812 +12975:2:1813 +12976:2:1811 +12977:2:1812 +12978:2:1813 +12979:2:1824 +12980:2:1829 +12981:2:1830 +12982:0:4365 +12983:2:1842 +12984:0:4365 +12985:3:3757 +12986:0:4365 +12987:2:1844 +12988:0:4365 +12989:3:3758 +12990:0:4365 +12991:2:1845 +12992:2:1849 +12993:2:1850 +12994:2:1858 +12995:2:1859 +12996:2:1863 +12997:2:1864 +12998:2:1858 +12999:2:1859 +13000:2:1863 +13001:2:1864 +13002:2:1872 +13003:2:1877 +13004:2:1881 +13005:2:1882 +13006:2:1889 +13007:2:1890 +13008:2:1901 +13009:2:1902 +13010:2:1903 +13011:2:1901 +13012:2:1902 +13013:2:1903 +13014:2:1914 +13015:2:1919 +13016:2:1920 +13017:0:4365 +13018:2:1932 +13019:0:4365 +13020:3:3757 +13021:0:4365 +13022:2:1934 +13023:0:4365 +13024:3:3758 +13025:0:4365 +13026:2:1935 +13027:0:4365 +13028:2:1936 +13029:0:4365 +13030:2:2129 +13031:0:4365 +13032:2:2130 +13033:0:4365 +13034:2:2134 +13035:0:4365 +13036:3:3757 +13037:0:4365 +13038:2:2136 +13039:0:4365 +13040:3:3758 +13041:0:4365 +13042:2:2137 +13043:2:2141 +13044:2:2142 +13045:2:2150 +13046:2:2151 +13047:2:2155 +13048:2:2156 +13049:2:2150 +13050:2:2151 +13051:2:2155 +13052:2:2156 +13053:2:2164 +13054:2:2169 +13055:2:2173 +13056:2:2174 +13057:2:2181 +13058:2:2182 +13059:2:2193 +13060:2:2194 +13061:2:2195 +13062:2:2193 +13063:2:2194 +13064:2:2195 +13065:2:2206 +13066:2:2211 +13067:2:2212 +13068:0:4365 +13069:2:2224 +13070:0:4365 +13071:3:3757 +13072:0:4365 +13073:2:2226 +13074:0:4365 +13075:3:3758 +13076:0:4365 +13077:2:1936 +13078:0:4365 +13079:2:2129 +13080:0:4365 +13081:2:2130 +13082:0:4365 +13083:2:2134 +13084:0:4365 +13085:3:3757 +13086:0:4365 +13087:2:2136 +13088:0:4365 +13089:3:3758 +13090:0:4365 +13091:2:2137 +13092:2:2141 +13093:2:2142 +13094:2:2150 +13095:2:2151 +13096:2:2155 +13097:2:2156 +13098:2:2150 +13099:2:2151 +13100:2:2152 +13101:2:2164 +13102:2:2169 +13103:2:2173 +13104:2:2174 +13105:2:2181 +13106:2:2182 +13107:2:2193 +13108:2:2194 +13109:2:2195 +13110:2:2193 +13111:2:2194 +13112:2:2195 +13113:2:2206 +13114:2:2211 +13115:2:2212 +13116:0:4365 +13117:2:2224 +13118:0:4365 +13119:3:3757 +13120:0:4365 +13121:2:2226 +13122:0:4365 +13123:3:3758 +13124:0:4365 +13125:2:2230 +13126:0:4365 +13127:3:3757 +13128:0:4365 +13129:2:2235 +13130:2:2239 +13131:2:2240 +13132:2:2248 +13133:2:2249 +13134:2:2253 +13135:2:2254 +13136:2:2248 +13137:2:2249 +13138:2:2250 +13139:2:2262 +13140:2:2267 +13141:2:2271 +13142:2:2272 +13143:2:2279 +13144:2:2280 +13145:2:2291 +13146:2:2292 +13147:2:2293 +13148:2:2291 +13149:2:2292 +13150:2:2293 +13151:2:2304 +13152:2:2309 +13153:2:2310 +13154:0:4365 +13155:3:3758 +13156:0:4365 +13157:2:2322 +13158:0:4365 +13159:2:1169 +13160:0:4365 +13161:3:3757 +13162:0:4365 +13163:2:1170 +13164:0:4365 +13165:3:3758 +13166:0:4365 +13167:3:3759 +13168:0:4365 +13169:3:3972 +13170:0:4365 +13171:3:3980 +13172:0:4365 +13173:3:3981 +13174:3:3985 +13175:3:3986 +13176:3:3994 +13177:3:3995 +13178:3:3999 +13179:3:4000 +13180:3:3994 +13181:3:3995 +13182:3:3999 +13183:3:4000 +13184:3:4008 +13185:3:4013 +13186:3:4017 +13187:3:4018 +13188:3:4025 +13189:3:4026 +13190:3:4037 +13191:3:4038 +13192:3:4039 +13193:3:4037 +13194:3:4038 +13195:3:4039 +13196:3:4050 +13197:3:4055 +13198:3:4056 +13199:0:4365 +13200:3:4068 +13201:0:4365 +13202:3:4069 +13203:0:4365 +13204:2:1173 +13205:0:4365 +13206:3:4070 +13207:0:4365 +13208:2:1179 +13209:0:4365 +13210:2:1180 +13211:0:4365 +13212:3:4069 +13213:0:4365 +13214:2:1181 +13215:2:1185 +13216:2:1186 +13217:2:1194 +13218:2:1195 +13219:2:1199 +13220:2:1200 +13221:2:1194 +13222:2:1195 +13223:2:1199 +13224:2:1200 +13225:2:1208 +13226:2:1213 +13227:2:1217 +13228:2:1218 +13229:2:1225 +13230:2:1226 +13231:2:1237 +13232:2:1238 +13233:2:1239 +13234:2:1237 +13235:2:1238 +13236:2:1239 +13237:2:1250 +13238:2:1255 +13239:2:1256 +13240:0:4365 +13241:3:4070 +13242:0:4365 +13243:2:1268 +13244:0:4365 +13245:3:4069 +13246:0:4365 +13247:2:1270 +13248:0:4365 +13249:3:4070 +13250:0:4365 +13251:2:1271 +13252:2:1275 +13253:2:1276 +13254:2:1284 +13255:2:1285 +13256:2:1289 +13257:2:1290 +13258:2:1284 +13259:2:1285 +13260:2:1289 +13261:2:1290 +13262:2:1298 +13263:2:1303 +13264:2:1307 +13265:2:1308 +13266:2:1315 +13267:2:1316 +13268:2:1327 +13269:2:1328 +13270:2:1329 +13271:2:1327 +13272:2:1328 +13273:2:1329 +13274:2:1340 +13275:2:1345 +13276:2:1346 +13277:0:4365 +13278:2:1358 +13279:0:4365 +13280:2:1360 +13281:0:4365 +13282:3:4069 +13283:0:4365 +13284:2:1361 +13285:0:4365 +13286:3:4070 +13287:0:4365 +13288:2:1362 +13289:2:1366 +13290:2:1367 +13291:2:1375 +13292:2:1376 +13293:2:1380 +13294:2:1381 +13295:2:1375 +13296:2:1376 +13297:2:1380 +13298:2:1381 +13299:2:1389 +13300:2:1394 +13301:2:1398 +13302:2:1399 +13303:2:1406 +13304:2:1407 +13305:2:1418 +13306:2:1419 +13307:2:1420 +13308:2:1418 +13309:2:1419 +13310:2:1420 +13311:2:1431 +13312:2:1436 +13313:2:1437 +13314:0:4365 +13315:2:1449 +13316:0:4365 +13317:3:4069 +13318:0:4365 +13319:2:1451 +13320:0:4365 +13321:3:4070 +13322:0:4365 +13323:2:1652 +13324:0:4365 +13325:2:1653 +13326:0:4365 +13327:2:1657 +13328:0:4365 +13329:2:1180 +13330:0:4365 +13331:3:4069 +13332:0:4365 +13333:2:1181 +13334:2:1185 +13335:2:1186 +13336:2:1194 +13337:2:1195 +13338:2:1199 +13339:2:1200 +13340:2:1194 +13341:2:1195 +13342:2:1196 +13343:2:1208 +13344:2:1213 +13345:2:1217 +13346:2:1218 +13347:2:1225 +13348:2:1226 +13349:2:1237 +13350:2:1238 +13351:2:1239 +13352:2:1237 +13353:2:1238 +13354:2:1239 +13355:2:1250 +13356:2:1255 +13357:2:1256 +13358:0:4365 +13359:3:4070 +13360:0:4365 +13361:2:1268 +13362:0:4365 +13363:3:4069 +13364:0:4365 +13365:2:1270 +13366:0:4365 +13367:3:4070 +13368:0:4365 +13369:2:1271 +13370:2:1275 +13371:2:1276 +13372:2:1284 +13373:2:1285 +13374:2:1289 +13375:2:1290 +13376:2:1284 +13377:2:1285 +13378:2:1289 +13379:2:1290 +13380:2:1298 +13381:2:1303 +13382:2:1307 +13383:2:1308 +13384:2:1315 +13385:2:1316 +13386:2:1327 +13387:2:1328 +13388:2:1329 +13389:2:1327 +13390:2:1328 +13391:2:1329 +13392:2:1340 +13393:2:1345 +13394:2:1346 +13395:0:4365 +13396:2:1358 +13397:0:4365 +13398:2:1454 +13399:0:4365 +13400:3:4069 +13401:0:4365 +13402:2:1455 +13403:0:4365 +13404:3:4070 +13405:0:4365 +13406:2:1652 +13407:0:4365 +13408:2:1653 +13409:0:4365 +13410:2:1657 +13411:0:4365 +13412:2:1660 +13413:0:4365 +13414:3:4069 +13415:0:4365 +13416:2:1665 +13417:2:1669 +13418:2:1670 +13419:2:1678 +13420:2:1679 +13421:2:1683 +13422:2:1684 +13423:2:1678 +13424:2:1679 +13425:2:1680 +13426:2:1692 +13427:2:1697 +13428:2:1701 +13429:2:1702 +13430:2:1709 +13431:2:1710 +13432:2:1721 +13433:2:1722 +13434:2:1723 +13435:2:1721 +13436:2:1722 +13437:2:1723 +13438:2:1734 +13439:2:1739 +13440:2:1740 +13441:0:4365 +13442:3:4070 +13443:0:4365 +13444:2:1752 +13445:0:4365 +13446:3:4069 +13447:0:4365 +13448:2:1754 +13449:0:4365 +13450:3:4070 +13451:0:4365 +13452:2:1755 +13453:2:1759 +13454:2:1760 +13455:2:1768 +13456:2:1769 +13457:2:1773 +13458:2:1774 +13459:2:1768 +13460:2:1769 +13461:2:1773 +13462:2:1774 +13463:2:1782 +13464:2:1787 +13465:2:1791 +13466:2:1792 +13467:2:1799 +13468:2:1800 +13469:2:1811 +13470:2:1812 +13471:2:1813 +13472:2:1811 +13473:2:1812 +13474:2:1813 +13475:2:1824 +13476:2:1829 +13477:2:1830 +13478:0:4365 +13479:2:1842 +13480:0:4365 +13481:3:4069 +13482:0:4365 +13483:2:1844 +13484:0:4365 +13485:3:4070 +13486:0:4365 +13487:2:1845 +13488:2:1849 +13489:2:1850 +13490:2:1858 +13491:2:1859 +13492:2:1863 +13493:2:1864 +13494:2:1858 +13495:2:1859 +13496:2:1863 +13497:2:1864 +13498:2:1872 +13499:2:1877 +13500:2:1881 +13501:2:1882 +13502:2:1889 +13503:2:1890 +13504:2:1901 +13505:2:1902 +13506:2:1903 +13507:2:1901 +13508:2:1902 +13509:2:1903 +13510:2:1914 +13511:2:1919 +13512:2:1920 +13513:0:4365 +13514:2:1932 +13515:0:4365 +13516:3:4069 +13517:0:4365 +13518:2:1934 +13519:0:4365 +13520:3:4070 +13521:0:4365 +13522:2:1935 +13523:0:4365 +13524:2:1936 +13525:0:4365 +13526:2:2129 +13527:0:4365 +13528:2:2130 +13529:0:4365 +13530:2:2134 +13531:0:4365 +13532:3:4069 +13533:0:4365 +13534:2:2136 +13535:0:4365 +13536:3:4070 +13537:0:4365 +13538:2:2137 +13539:2:2141 +13540:2:2142 +13541:2:2150 +13542:2:2151 +13543:2:2155 +13544:2:2156 +13545:2:2150 +13546:2:2151 +13547:2:2155 +13548:2:2156 +13549:2:2164 +13550:2:2169 +13551:2:2173 +13552:2:2174 +13553:2:2181 +13554:2:2182 +13555:2:2193 +13556:2:2194 +13557:2:2195 +13558:2:2193 +13559:2:2194 +13560:2:2195 +13561:2:2206 +13562:2:2211 +13563:2:2212 +13564:0:4365 +13565:2:2224 +13566:0:4365 +13567:3:4069 +13568:0:4365 +13569:2:2226 +13570:0:4365 +13571:3:4070 +13572:0:4365 +13573:2:1936 +13574:0:4365 +13575:2:2129 +13576:0:4365 +13577:2:2130 +13578:0:4365 +13579:2:2134 +13580:0:4365 +13581:3:4069 +13582:0:4365 +13583:2:2136 +13584:0:4365 +13585:3:4070 +13586:0:4365 +13587:2:2137 +13588:2:2141 +13589:2:2142 +13590:2:2150 +13591:2:2151 +13592:2:2155 +13593:2:2156 +13594:2:2150 +13595:2:2151 +13596:2:2152 +13597:2:2164 +13598:2:2169 +13599:2:2173 +13600:2:2174 +13601:2:2181 +13602:2:2182 +13603:2:2193 +13604:2:2194 +13605:2:2195 +13606:2:2193 +13607:2:2194 +13608:2:2195 +13609:2:2206 +13610:2:2211 +13611:2:2212 +13612:0:4365 +13613:2:2224 +13614:0:4365 +13615:3:4069 +13616:0:4365 +13617:2:2226 +13618:0:4365 +13619:3:4070 +13620:0:4365 +13621:2:2230 +13622:0:4365 +13623:3:4069 +13624:0:4365 +13625:2:2235 +13626:2:2239 +13627:2:2240 +13628:2:2248 +13629:2:2249 +13630:2:2253 +13631:2:2254 +13632:2:2248 +13633:2:2249 +13634:2:2250 +13635:2:2262 +13636:2:2267 +13637:2:2271 +13638:2:2272 +13639:2:2279 +13640:2:2280 +13641:2:2291 +13642:2:2292 +13643:2:2293 +13644:2:2291 +13645:2:2292 +13646:2:2293 +13647:2:2304 +13648:2:2309 +13649:2:2310 +13650:0:4365 +13651:3:4070 +13652:0:4365 +13653:2:2322 +13654:0:4365 +13655:2:1169 +13656:0:4365 +13657:3:4069 +13658:0:4365 +13659:2:1170 +13660:0:4365 +13661:3:4070 +13662:0:4365 +13663:3:4071 +13664:0:4365 +13665:3:4081 +13666:0:4365 +13667:3:3666 +13668:0:4365 +13669:3:3667 +13670:0:4365 +13671:3:3668 +13672:0:4365 +13673:3:3669 +13674:3:3673 +13675:3:3674 +13676:3:3682 +13677:3:3683 +13678:3:3687 +13679:3:3688 +13680:3:3682 +13681:3:3683 +13682:3:3687 +13683:3:3688 +13684:3:3696 +13685:3:3701 +13686:3:3705 +13687:3:3706 +13688:3:3713 +13689:3:3714 +13690:3:3725 +13691:3:3726 +13692:3:3727 +13693:3:3725 +13694:3:3726 +13695:3:3727 +13696:3:3738 +13697:3:3743 +13698:3:3744 +13699:0:4365 +13700:3:3756 +13701:0:4365 +13702:3:3757 +13703:0:4365 +13704:2:1173 +13705:0:4365 +13706:3:3758 +13707:0:4365 +13708:2:1179 +13709:0:4365 +13710:2:1180 +13711:0:4365 +13712:3:3757 +13713:0:4365 +13714:2:1181 +13715:2:1185 +13716:2:1186 +13717:2:1194 +13718:2:1195 +13719:2:1199 +13720:2:1200 +13721:2:1194 +13722:2:1195 +13723:2:1199 +13724:2:1200 +13725:2:1208 +13726:2:1213 +13727:2:1217 +13728:2:1218 +13729:2:1225 +13730:2:1226 +13731:2:1237 +13732:2:1238 +13733:2:1239 +13734:2:1237 +13735:2:1238 +13736:2:1239 +13737:2:1250 +13738:2:1255 +13739:2:1256 +13740:0:4365 +13741:3:3758 +13742:0:4365 +13743:2:1268 +13744:0:4365 +13745:3:3757 +13746:0:4365 +13747:2:1270 +13748:0:4365 +13749:3:3758 +13750:0:4365 +13751:2:1271 +13752:2:1275 +13753:2:1276 +13754:2:1284 +13755:2:1285 +13756:2:1289 +13757:2:1290 +13758:2:1284 +13759:2:1285 +13760:2:1289 +13761:2:1290 +13762:2:1298 +13763:2:1303 +13764:2:1307 +13765:2:1308 +13766:2:1315 +13767:2:1316 +13768:2:1327 +13769:2:1328 +13770:2:1329 +13771:2:1327 +13772:2:1328 +13773:2:1329 +13774:2:1340 +13775:2:1345 +13776:2:1346 +13777:0:4365 +13778:2:1358 +13779:0:4365 +13780:2:1360 +13781:0:4365 +13782:3:3757 +13783:0:4365 +13784:2:1361 +13785:0:4365 +13786:3:3758 +13787:0:4365 +13788:2:1362 +13789:2:1366 +13790:2:1367 +13791:2:1375 +13792:2:1376 +13793:2:1380 +13794:2:1381 +13795:2:1375 +13796:2:1376 +13797:2:1380 +13798:2:1381 +13799:2:1389 +13800:2:1394 +13801:2:1398 +13802:2:1399 +13803:2:1406 +13804:2:1407 +13805:2:1418 +13806:2:1419 +13807:2:1420 +13808:2:1418 +13809:2:1419 +13810:2:1420 +13811:2:1431 +13812:2:1436 +13813:2:1437 +13814:0:4365 +13815:2:1449 +13816:0:4365 +13817:3:3757 +13818:0:4365 +13819:2:1451 +13820:0:4365 +13821:3:3758 +13822:0:4365 +13823:2:1652 +13824:0:4365 +13825:2:1653 +13826:0:4365 +13827:2:1657 +13828:0:4365 +13829:2:1180 +13830:0:4365 +13831:3:3757 +13832:0:4365 +13833:2:1181 +13834:2:1185 +13835:2:1186 +13836:2:1194 +13837:2:1195 +13838:2:1199 +13839:2:1200 +13840:2:1194 +13841:2:1195 +13842:2:1196 +13843:2:1208 +13844:2:1213 +13845:2:1217 +13846:2:1218 +13847:2:1225 +13848:2:1226 +13849:2:1237 +13850:2:1238 +13851:2:1239 +13852:2:1237 +13853:2:1238 +13854:2:1239 +13855:2:1250 +13856:2:1255 +13857:2:1256 +13858:0:4365 +13859:3:3758 +13860:0:4365 +13861:2:1268 +13862:0:4365 +13863:3:3757 +13864:0:4365 +13865:2:1270 +13866:0:4365 +13867:3:3758 +13868:0:4365 +13869:2:1271 +13870:2:1275 +13871:2:1276 +13872:2:1284 +13873:2:1285 +13874:2:1289 +13875:2:1290 +13876:2:1284 +13877:2:1285 +13878:2:1289 +13879:2:1290 +13880:2:1298 +13881:2:1303 +13882:2:1307 +13883:2:1308 +13884:2:1315 +13885:2:1316 +13886:2:1327 +13887:2:1328 +13888:2:1329 +13889:2:1327 +13890:2:1328 +13891:2:1329 +13892:2:1340 +13893:2:1345 +13894:2:1346 +13895:0:4365 +13896:2:1358 +13897:0:4365 +13898:2:1454 +13899:0:4365 +13900:3:3757 +13901:0:4365 +13902:2:1455 +13903:0:4365 +13904:3:3758 +13905:0:4365 +13906:2:1652 +13907:0:4365 +13908:2:1653 +13909:0:4365 +13910:2:1657 +13911:0:4365 +13912:2:1660 +13913:0:4365 +13914:3:3757 +13915:0:4365 +13916:2:1665 +13917:2:1669 +13918:2:1670 +13919:2:1678 +13920:2:1679 +13921:2:1683 +13922:2:1684 +13923:2:1678 +13924:2:1679 +13925:2:1680 +13926:2:1692 +13927:2:1697 +13928:2:1701 +13929:2:1702 +13930:2:1709 +13931:2:1710 +13932:2:1721 +13933:2:1722 +13934:2:1723 +13935:2:1721 +13936:2:1722 +13937:2:1723 +13938:2:1734 +13939:2:1739 +13940:2:1740 +13941:0:4365 +13942:3:3758 +13943:0:4365 +13944:2:1752 +13945:0:4365 +13946:3:3757 +13947:0:4365 +13948:2:1754 +13949:0:4365 +13950:3:3758 +13951:0:4365 +13952:2:1755 +13953:2:1759 +13954:2:1760 +13955:2:1768 +13956:2:1769 +13957:2:1773 +13958:2:1774 +13959:2:1768 +13960:2:1769 +13961:2:1773 +13962:2:1774 +13963:2:1782 +13964:2:1787 +13965:2:1791 +13966:2:1792 +13967:2:1799 +13968:2:1800 +13969:2:1811 +13970:2:1812 +13971:2:1813 +13972:2:1811 +13973:2:1812 +13974:2:1813 +13975:2:1824 +13976:2:1829 +13977:2:1830 +13978:0:4365 +13979:2:1842 +13980:0:4365 +13981:3:3757 +13982:0:4365 +13983:2:1844 +13984:0:4365 +13985:3:3758 +13986:0:4365 +13987:2:1845 +13988:2:1849 +13989:2:1850 +13990:2:1858 +13991:2:1859 +13992:2:1863 +13993:2:1864 +13994:2:1858 +13995:2:1859 +13996:2:1863 +13997:2:1864 +13998:2:1872 +13999:2:1877 +14000:2:1881 +14001:2:1882 +14002:2:1889 +14003:2:1890 +14004:2:1901 +14005:2:1902 +14006:2:1903 +14007:2:1901 +14008:2:1902 +14009:2:1903 +14010:2:1914 +14011:2:1919 +14012:2:1920 +14013:0:4365 +14014:2:1932 +14015:0:4365 +14016:3:3757 +14017:0:4365 +14018:2:1934 +14019:0:4365 +14020:3:3758 +14021:0:4365 +14022:2:1935 +14023:0:4365 +14024:2:1936 +14025:0:4365 +14026:2:2129 +14027:0:4365 +14028:2:2130 +14029:0:4365 +14030:2:2134 +14031:0:4365 +14032:3:3757 +14033:0:4365 +14034:2:2136 +14035:0:4365 +14036:3:3758 +14037:0:4365 +14038:2:2137 +14039:2:2141 +14040:2:2142 +14041:2:2150 +14042:2:2151 +14043:2:2155 +14044:2:2156 +14045:2:2150 +14046:2:2151 +14047:2:2155 +14048:2:2156 +14049:2:2164 +14050:2:2169 +14051:2:2173 +14052:2:2174 +14053:2:2181 +14054:2:2182 +14055:2:2193 +14056:2:2194 +14057:2:2195 +14058:2:2193 +14059:2:2194 +14060:2:2195 +14061:2:2206 +14062:2:2211 +14063:2:2212 +14064:0:4365 +14065:2:2224 +14066:0:4365 +14067:3:3757 +14068:0:4365 +14069:2:2226 +14070:0:4365 +14071:3:3758 +14072:0:4365 +14073:2:1936 +14074:0:4365 +14075:2:2129 +14076:0:4365 +14077:2:2130 +14078:0:4365 +14079:2:2134 +14080:0:4365 +14081:3:3757 +14082:0:4365 +14083:2:2136 +14084:0:4365 +14085:3:3758 +14086:0:4365 +14087:2:2137 +14088:2:2141 +14089:2:2142 +14090:2:2150 +14091:2:2151 +14092:2:2155 +14093:2:2156 +14094:2:2150 +14095:2:2151 +14096:2:2152 +14097:2:2164 +14098:2:2169 +14099:2:2173 +14100:2:2174 +14101:2:2181 +14102:2:2182 +14103:2:2193 +14104:2:2194 +14105:2:2195 +14106:2:2193 +14107:2:2194 +14108:2:2195 +14109:2:2206 +14110:2:2211 +14111:2:2212 +14112:0:4365 +14113:2:2224 +14114:0:4365 +14115:3:3757 +14116:0:4365 +14117:2:2226 +14118:0:4365 +14119:3:3758 +14120:0:4365 +14121:2:2230 +14122:0:4365 +14123:3:3757 +14124:0:4365 +14125:2:2235 +14126:2:2239 +14127:2:2240 +14128:2:2248 +14129:2:2249 +14130:2:2253 +14131:2:2254 +14132:2:2248 +14133:2:2249 +14134:2:2250 +14135:2:2262 +14136:2:2267 +14137:2:2271 +14138:2:2272 +14139:2:2279 +14140:2:2280 +14141:2:2291 +14142:2:2292 +14143:2:2293 +14144:2:2291 +14145:2:2292 +14146:2:2293 +14147:2:2304 +14148:2:2309 +14149:2:2310 +14150:0:4365 +14151:3:3758 +14152:0:4365 +14153:2:2322 +14154:0:4365 +14155:2:1169 +14156:0:4365 +14157:3:3757 +14158:0:4365 +14159:2:1170 +14160:0:4365 +14161:3:3758 +14162:0:4365 +14163:3:3759 +14164:0:4365 +14165:3:3972 +14166:0:4365 +14167:3:4077 +14168:0:4365 +14169:3:4078 +14170:0:4365 +14171:3:4082 +14172:0:4365 +14173:3:4088 +14174:0:4365 +14175:3:4092 +14176:3:4093 +14177:3:4097 +14178:3:4101 +14179:3:4102 +14180:3:4097 +14181:3:4101 +14182:3:4102 +14183:3:4106 +14184:3:4114 +14185:3:4115 +14186:3:4120 +14187:3:4127 +14188:3:4128 +14189:3:4127 +14190:3:4128 +14191:3:4135 +14192:3:4140 +14193:0:4365 +14194:3:4151 +14195:0:4365 +14196:3:4155 +14197:3:4156 +14198:3:4160 +14199:3:4164 +14200:3:4165 +14201:3:4160 +14202:3:4164 +14203:3:4165 +14204:3:4169 +14205:3:4177 +14206:3:4178 +14207:3:4183 +14208:3:4190 +14209:3:4191 +14210:3:4190 +14211:3:4191 +14212:3:4198 +14213:3:4203 +14214:0:4365 +14215:3:4151 +14216:0:4365 +14217:3:4155 +14218:3:4156 +14219:3:4160 +14220:3:4164 +14221:3:4165 +14222:3:4160 +14223:3:4164 +14224:3:4165 +14225:3:4169 +14226:3:4177 +14227:3:4178 +14228:3:4183 +14229:3:4190 +14230:3:4191 +14231:3:4190 +14232:3:4191 +14233:3:4198 +14234:3:4203 +14235:0:4365 +14236:3:4214 +14237:0:4365 +14238:3:4222 +14239:3:4223 +14240:3:4227 +14241:3:4231 +14242:3:4232 +14243:3:4227 +14244:3:4231 +14245:3:4232 +14246:3:4236 +14247:3:4244 +14248:3:4245 +14249:3:4250 +14250:3:4257 +14251:3:4258 +14252:3:4257 +14253:3:4258 +14254:3:4265 +14255:3:4270 +14256:0:4365 +14257:3:4285 +14258:0:4365 +14259:3:4286 +14260:0:4365 +14261:2:1173 +14262:0:4365 +14263:3:4287 +14264:0:4365 +14265:2:1179 +14266:0:4365 +14267:2:1180 +14268:0:4365 +14269:3:4286 +14270:0:4365 +14271:2:1181 +14272:2:1185 +14273:2:1186 +14274:2:1194 +14275:2:1195 +14276:2:1199 +14277:2:1200 +14278:2:1194 +14279:2:1195 +14280:2:1199 +14281:2:1200 +14282:2:1208 +14283:2:1213 +14284:2:1217 +14285:2:1218 +14286:2:1225 +14287:2:1226 +14288:2:1237 +14289:2:1238 +14290:2:1239 +14291:2:1237 +14292:2:1238 +14293:2:1239 +14294:2:1250 +14295:2:1255 +14296:2:1256 +14297:0:4365 +14298:3:4287 +14299:0:4365 +14300:2:1268 +14301:0:4365 +14302:3:4286 +14303:0:4365 +14304:2:1270 +14305:0:4365 +14306:3:4287 +14307:0:4365 +14308:2:1271 +14309:2:1275 +14310:2:1276 +14311:2:1284 +14312:2:1285 +14313:2:1289 +14314:2:1290 +14315:2:1284 +14316:2:1285 +14317:2:1289 +14318:2:1290 +14319:2:1298 +14320:2:1303 +14321:2:1307 +14322:2:1308 +14323:2:1315 +14324:2:1316 +14325:2:1327 +14326:2:1328 +14327:2:1329 +14328:2:1327 +14329:2:1328 +14330:2:1329 +14331:2:1340 +14332:2:1345 +14333:2:1346 +14334:0:4365 +14335:2:1358 +14336:0:4365 +14337:2:1360 +14338:0:4365 +14339:3:4286 +14340:0:4365 +14341:2:1361 +14342:0:4365 +14343:3:4287 +14344:0:4365 +14345:2:1362 +14346:2:1366 +14347:2:1367 +14348:2:1375 +14349:2:1376 +14350:2:1380 +14351:2:1381 +14352:2:1375 +14353:2:1376 +14354:2:1380 +14355:2:1381 +14356:2:1389 +14357:2:1394 +14358:2:1398 +14359:2:1399 +14360:2:1406 +14361:2:1407 +14362:2:1418 +14363:2:1419 +14364:2:1420 +14365:2:1418 +14366:2:1419 +14367:2:1420 +14368:2:1431 +14369:2:1436 +14370:2:1437 +14371:0:4365 +14372:2:1449 +14373:0:4365 +14374:3:4286 +14375:0:4365 +14376:2:1451 +14377:0:4365 +14378:3:4287 +14379:0:4365 +14380:2:1652 +14381:0:4365 +14382:2:1653 +14383:0:4365 +14384:2:1657 +14385:0:4365 +14386:2:1180 +14387:0:4365 +14388:3:4286 +14389:0:4365 +14390:2:1181 +14391:2:1185 +14392:2:1186 +14393:2:1194 +14394:2:1195 +14395:2:1199 +14396:2:1200 +14397:2:1194 +14398:2:1195 +14399:2:1196 +14400:2:1208 +14401:2:1213 +14402:2:1217 +14403:2:1218 +14404:2:1225 +14405:2:1226 +14406:2:1237 +14407:2:1238 +14408:2:1239 +14409:2:1237 +14410:2:1238 +14411:2:1239 +14412:2:1250 +14413:2:1255 +14414:2:1256 +14415:0:4365 +14416:3:4287 +14417:0:4365 +14418:2:1268 +14419:0:4365 +14420:3:4286 +14421:0:4365 +14422:2:1270 +14423:0:4365 +14424:3:4287 +14425:0:4365 +14426:2:1271 +14427:2:1275 +14428:2:1276 +14429:2:1284 +14430:2:1285 +14431:2:1289 +14432:2:1290 +14433:2:1284 +14434:2:1285 +14435:2:1289 +14436:2:1290 +14437:2:1298 +14438:2:1303 +14439:2:1307 +14440:2:1308 +14441:2:1315 +14442:2:1316 +14443:2:1327 +14444:2:1328 +14445:2:1329 +14446:2:1327 +14447:2:1328 +14448:2:1329 +14449:2:1340 +14450:2:1345 +14451:2:1346 +14452:0:4365 +14453:2:1358 +14454:0:4365 +14455:2:1454 +14456:0:4365 +14457:3:4286 +14458:0:4365 +14459:2:1455 +14460:0:4365 +14461:3:4287 +14462:0:4365 +14463:2:1652 +14464:0:4365 +14465:2:1653 +14466:0:4365 +14467:2:1657 +14468:0:4365 +14469:2:1660 +14470:0:4365 +14471:3:4286 +14472:0:4365 +14473:2:1665 +14474:2:1669 +14475:2:1670 +14476:2:1678 +14477:2:1679 +14478:2:1683 +14479:2:1684 +14480:2:1678 +14481:2:1679 +14482:2:1680 +14483:2:1692 +14484:2:1697 +14485:2:1701 +14486:2:1702 +14487:2:1709 +14488:2:1710 +14489:2:1721 +14490:2:1722 +14491:2:1723 +14492:2:1721 +14493:2:1722 +14494:2:1723 +14495:2:1734 +14496:2:1739 +14497:2:1740 +14498:0:4365 +14499:3:4287 +14500:0:4365 +14501:2:1752 +14502:0:4365 +14503:3:4286 +14504:0:4365 +14505:2:1754 +14506:0:4365 +14507:3:4287 +14508:0:4365 +14509:2:1755 +14510:2:1759 +14511:2:1760 +14512:2:1768 +14513:2:1769 +14514:2:1773 +14515:2:1774 +14516:2:1768 +14517:2:1769 +14518:2:1773 +14519:2:1774 +14520:2:1782 +14521:2:1787 +14522:2:1791 +14523:2:1792 +14524:2:1799 +14525:2:1800 +14526:2:1811 +14527:2:1812 +14528:2:1813 +14529:2:1811 +14530:2:1812 +14531:2:1813 +14532:2:1824 +14533:2:1829 +14534:2:1830 +14535:0:4365 +14536:2:1842 +14537:0:4365 +14538:3:4286 +14539:0:4365 +14540:2:1844 +14541:0:4365 +14542:3:4287 +14543:0:4365 +14544:2:1845 +14545:2:1849 +14546:2:1850 +14547:2:1858 +14548:2:1859 +14549:2:1863 +14550:2:1864 +14551:2:1858 +14552:2:1859 +14553:2:1863 +14554:2:1864 +14555:2:1872 +14556:2:1877 +14557:2:1881 +14558:2:1882 +14559:2:1889 +14560:2:1890 +14561:2:1901 +14562:2:1902 +14563:2:1903 +14564:2:1901 +14565:2:1902 +14566:2:1903 +14567:2:1914 +14568:2:1919 +14569:2:1920 +14570:0:4365 +14571:2:1932 +14572:0:4365 +14573:3:4286 +14574:0:4365 +14575:2:1934 +14576:0:4365 +14577:3:4287 +14578:0:4365 +14579:2:1935 +14580:0:4365 +14581:2:1936 +14582:0:4365 +14583:2:2129 +14584:0:4365 +14585:2:2130 +14586:0:4365 +14587:2:2134 +14588:0:4365 +14589:3:4286 +14590:0:4365 +14591:2:2136 +14592:0:4365 +14593:3:4287 +14594:0:4365 +14595:2:2137 +14596:2:2141 +14597:2:2142 +14598:2:2150 +14599:2:2151 +14600:2:2155 +14601:2:2156 +14602:2:2150 +14603:2:2151 +14604:2:2155 +14605:2:2156 +14606:2:2164 +14607:2:2169 +14608:2:2173 +14609:2:2174 +14610:2:2181 +14611:2:2182 +14612:2:2193 +14613:2:2194 +14614:2:2195 +14615:2:2193 +14616:2:2194 +14617:2:2195 +14618:2:2206 +14619:2:2211 +14620:2:2212 +14621:0:4365 +14622:2:2224 +14623:0:4365 +14624:3:4286 +14625:0:4365 +14626:2:2226 +14627:0:4365 +14628:3:4287 +14629:0:4365 +14630:2:1936 +14631:0:4365 +14632:2:2129 +14633:0:4365 +14634:2:2130 +14635:0:4365 +14636:2:2134 +14637:0:4365 +14638:3:4286 +14639:0:4365 +14640:2:2136 +14641:0:4365 +14642:3:4287 +14643:0:4365 +14644:2:2137 +14645:2:2141 +14646:2:2142 +14647:2:2150 +14648:2:2151 +14649:2:2155 +14650:2:2156 +14651:2:2150 +14652:2:2151 +14653:2:2152 +14654:2:2164 +14655:2:2169 +14656:2:2173 +14657:2:2174 +14658:2:2181 +14659:2:2182 +14660:2:2193 +14661:2:2194 +14662:2:2195 +14663:2:2193 +14664:2:2194 +14665:2:2195 +14666:2:2206 +14667:2:2211 +14668:2:2212 +14669:0:4365 +14670:2:2224 +14671:0:4365 +14672:3:4286 +14673:0:4365 +14674:2:2226 +14675:0:4365 +14676:3:4287 +14677:0:4365 +14678:2:2230 +14679:0:4365 +14680:3:4286 +14681:0:4365 +14682:2:2235 +14683:2:2239 +14684:2:2240 +14685:2:2248 +14686:2:2249 +14687:2:2253 +14688:2:2254 +14689:2:2248 +14690:2:2249 +14691:2:2250 +14692:2:2262 +14693:2:2267 +14694:2:2271 +14695:2:2272 +14696:2:2279 +14697:2:2280 +14698:2:2291 +14699:2:2292 +14700:2:2293 +14701:2:2291 +14702:2:2292 +14703:2:2293 +14704:2:2304 +14705:2:2309 +14706:2:2310 +14707:0:4365 +14708:3:4287 +14709:0:4365 +14710:2:2322 +14711:0:4365 +14712:2:1169 +14713:0:4365 +14714:3:4286 +14715:0:4365 +14716:2:1170 +14717:0:4365 +14718:3:4287 +14719:0:4365 +14720:3:4288 +14721:0:4365 +14722:3:4294 +14723:0:4365 +14724:3:4295 +14725:0:4365 +14726:3:2338 +14727:0:4365 +14728:3:2339 +14729:3:2343 +14730:3:2344 +14731:3:2352 +14732:3:2353 +14733:3:2357 +14734:3:2358 +14735:3:2352 +14736:3:2353 +14737:3:2357 +14738:3:2358 +14739:3:2366 +14740:3:2371 +14741:3:2375 +14742:3:2376 +14743:3:2383 +14744:3:2384 +14745:3:2395 +14746:3:2396 +14747:3:2397 +14748:3:2395 +14749:3:2396 +14750:3:2397 +14751:3:2408 +14752:3:2413 +14753:3:2414 +14754:0:4365 +14755:3:2426 +14756:0:4365 +14757:3:2427 +14758:0:4365 +14759:2:1173 +14760:0:4365 +14761:3:2428 +14762:0:4365 +14763:2:1179 +14764:0:4365 +14765:2:1180 +14766:0:4365 +14767:3:2427 +14768:0:4365 +14769:2:1181 +14770:2:1185 +14771:2:1186 +14772:2:1194 +14773:2:1195 +14774:2:1199 +14775:2:1200 +14776:2:1194 +14777:2:1195 +14778:2:1199 +14779:2:1200 +14780:2:1208 +14781:2:1213 +14782:2:1217 +14783:2:1218 +14784:2:1225 +14785:2:1226 +14786:2:1237 +14787:2:1238 +14788:2:1239 +14789:2:1237 +14790:2:1238 +14791:2:1239 +14792:2:1250 +14793:2:1255 +14794:2:1256 +14795:0:4365 +14796:3:2428 +14797:0:4365 +14798:2:1268 +14799:0:4365 +14800:3:2427 +14801:0:4365 +14802:2:1270 +14803:0:4365 +14804:3:2428 +14805:0:4365 +14806:2:1271 +14807:2:1275 +14808:2:1276 +14809:2:1284 +14810:2:1285 +14811:2:1289 +14812:2:1290 +14813:2:1284 +14814:2:1285 +14815:2:1289 +14816:2:1290 +14817:2:1298 +14818:2:1303 +14819:2:1307 +14820:2:1308 +14821:2:1315 +14822:2:1316 +14823:2:1327 +14824:2:1328 +14825:2:1329 +14826:2:1327 +14827:2:1328 +14828:2:1329 +14829:2:1340 +14830:2:1345 +14831:2:1346 +14832:0:4365 +14833:2:1358 +14834:0:4365 +14835:2:1360 +14836:0:4365 +14837:3:2427 +14838:0:4365 +14839:2:1361 +14840:0:4365 +14841:3:2428 +14842:0:4365 +14843:2:1362 +14844:2:1366 +14845:2:1367 +14846:2:1375 +14847:2:1376 +14848:2:1380 +14849:2:1381 +14850:2:1375 +14851:2:1376 +14852:2:1380 +14853:2:1381 +14854:2:1389 +14855:2:1394 +14856:2:1398 +14857:2:1399 +14858:2:1406 +14859:2:1407 +14860:2:1418 +14861:2:1419 +14862:2:1420 +14863:2:1418 +14864:2:1419 +14865:2:1420 +14866:2:1431 +14867:2:1436 +14868:2:1437 +14869:0:4365 +14870:2:1449 +14871:0:4365 +14872:3:2427 +14873:0:4365 +14874:2:1451 +14875:0:4365 +14876:3:2428 +14877:0:4365 +14878:2:1652 +14879:0:4365 +14880:2:1653 +14881:0:4365 +14882:2:1657 +14883:0:4365 +14884:2:1180 +14885:0:4365 +14886:3:2427 +14887:0:4365 +14888:2:1181 +14889:2:1185 +14890:2:1186 +14891:2:1194 +14892:2:1195 +14893:2:1199 +14894:2:1200 +14895:2:1194 +14896:2:1195 +14897:2:1196 +14898:2:1208 +14899:2:1213 +14900:2:1217 +14901:2:1218 +14902:2:1225 +14903:2:1226 +14904:2:1237 +14905:2:1238 +14906:2:1239 +14907:2:1237 +14908:2:1238 +14909:2:1239 +14910:2:1250 +14911:2:1255 +14912:2:1256 +14913:0:4365 +14914:3:2428 +14915:0:4365 +14916:2:1268 +14917:0:4365 +14918:3:2427 +14919:0:4365 +14920:2:1270 +14921:0:4365 +14922:3:2428 +14923:0:4365 +14924:2:1271 +14925:2:1275 +14926:2:1276 +14927:2:1284 +14928:2:1285 +14929:2:1289 +14930:2:1290 +14931:2:1284 +14932:2:1285 +14933:2:1289 +14934:2:1290 +14935:2:1298 +14936:2:1303 +14937:2:1307 +14938:2:1308 +14939:2:1315 +14940:2:1316 +14941:2:1327 +14942:2:1328 +14943:2:1329 +14944:2:1327 +14945:2:1328 +14946:2:1329 +14947:2:1340 +14948:2:1345 +14949:2:1346 +14950:0:4365 +14951:2:1358 +14952:0:4365 +14953:2:1454 +14954:0:4365 +14955:3:2427 +14956:0:4365 +14957:2:1455 +14958:0:4365 +14959:3:2428 +14960:0:4365 +14961:2:1652 +14962:0:4365 +14963:2:1653 +14964:0:4365 +14965:2:1657 +14966:0:4365 +14967:2:1660 +14968:0:4365 +14969:3:2427 +14970:0:4365 +14971:2:1665 +14972:2:1669 +14973:2:1670 +14974:2:1678 +14975:2:1679 +14976:2:1683 +14977:2:1684 +14978:2:1678 +14979:2:1679 +14980:2:1680 +14981:2:1692 +14982:2:1697 +14983:2:1701 +14984:2:1702 +14985:2:1709 +14986:2:1710 +14987:2:1721 +14988:2:1722 +14989:2:1723 +14990:2:1721 +14991:2:1722 +14992:2:1723 +14993:2:1734 +14994:2:1739 +14995:2:1740 +14996:0:4365 +14997:3:2428 +14998:0:4365 +14999:2:1752 +15000:0:4365 +15001:3:2427 +15002:0:4365 +15003:2:1754 +15004:0:4365 +15005:3:2428 +15006:0:4365 +15007:2:1755 +15008:2:1759 +15009:2:1760 +15010:2:1768 +15011:2:1769 +15012:2:1773 +15013:2:1774 +15014:2:1768 +15015:2:1769 +15016:2:1773 +15017:2:1774 +15018:2:1782 +15019:2:1787 +15020:2:1791 +15021:2:1792 +15022:2:1799 +15023:2:1800 +15024:2:1811 +15025:2:1812 +15026:2:1813 +15027:2:1811 +15028:2:1812 +15029:2:1813 +15030:2:1824 +15031:2:1829 +15032:2:1830 +15033:0:4365 +15034:2:1842 +15035:0:4365 +15036:3:2427 +15037:0:4365 +15038:2:1844 +15039:0:4363 +15040:3:2428 +15041:0:4369 diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.define b/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.define new file mode 100644 index 0000000..0fb59bd --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.define @@ -0,0 +1 @@ +#define READER_NEST_LEVEL 2 diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.log b/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.log new file mode 100644 index 0000000..d503334 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.log @@ -0,0 +1,20 @@ +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_free_nested.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 742) +Depth= 3880 States= 1e+06 Transitions= 1.18e+07 Memory= 527.190 t= 9.48 R= 1e+05 +Depth= 3880 States= 2e+06 Transitions= 2.39e+07 Memory= 588.225 t= 19.6 R= 1e+05 +Depth= 3880 States= 3e+06 Transitions= 3.61e+07 Memory= 649.260 t= 30.3 R= 1e+05 diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.spin.input b/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.spin.input new file mode 100644 index 0000000..c94928c --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.spin.input @@ -0,0 +1,696 @@ +#define READER_NEST_LEVEL 1 + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +#define TEST_SIGNAL +#define TEST_SIGNAL_ON_READ + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE +#define get_pid() ((_pid < 1) -> 0 : 1) +#elif defined(TEST_SIGNAL_ON_READ) +#define get_pid() ((_pid < 2) -> 0 : 1) +#else +#define get_pid() (_pid) +#endif + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb(i, j) +{ + if + :: get_pid() >= NR_READERS -> + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); + :: else -> skip; + fi; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +#define get_readerid() (get_pid()) +#define get_writerid() (get_readerid() + NR_READERS) + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + ooo_mem(i); + dispatch_sighand_read_exec(); + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + ooo_mem(i); + dispatch_sighand_read_exec(); + data_access[get_readerid()] = 1; + ooo_mem(i); + dispatch_sighand_read_exec(); + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + ooo_mem(i); + dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS + /* Only test progress of one random reader. They are all the + * same. */ + if + :: get_readerid() == 0 -> +progress_reader: + skip; + fi; +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + ooo_mem(i); + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + ooo_mem(i); + data_access[get_readerid()] = 1; + ooo_mem(i); + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS + /* Only test progress of one random reader. They are all the + * same. */ + if + :: get_readerid() == 0 -> +progress_reader: + skip; + fi; +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.spin.input.trail b/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.spin.input.trail new file mode 100644 index 0000000..6f29ad2 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.spin.input.trail @@ -0,0 +1,11161 @@ +-2:4:-2 +-4:-4:-4 +1:0:4365 +2:4:4317 +3:4:4320 +4:4:4320 +5:4:4320 +6:4:4323 +7:4:4331 +8:4:4331 +9:4:4331 +10:4:4334 +11:4:4340 +12:4:4344 +13:4:4344 +14:4:4344 +15:4:4347 +16:4:4340 +17:4:4344 +18:4:4344 +19:4:4344 +20:4:4347 +21:4:4355 +22:4:4359 +23:4:4360 +24:0:4365 +25:4:4362 +26:0:4365 +27:3:2331 +28:0:4365 +29:3:2337 +30:0:4365 +31:3:2338 +32:0:4365 +33:3:2339 +34:3:2343 +35:3:2344 +36:3:2352 +37:3:2353 +38:3:2357 +39:3:2358 +40:3:2352 +41:3:2353 +42:3:2357 +43:3:2358 +44:3:2366 +45:3:2371 +46:3:2375 +47:3:2376 +48:3:2383 +49:3:2384 +50:3:2395 +51:3:2396 +52:3:2397 +53:3:2395 +54:3:2396 +55:3:2397 +56:3:2408 +57:3:2413 +58:3:2414 +59:0:4365 +60:3:2426 +61:0:4365 +62:3:2427 +63:0:4365 +64:2:1162 +65:0:4365 +66:3:2428 +67:0:4365 +68:2:1168 +69:0:4365 +70:2:1169 +71:0:4365 +72:3:2427 +73:0:4365 +74:2:1170 +75:0:4365 +76:3:2428 +77:0:4365 +78:3:2429 +79:0:4365 +80:3:2435 +81:3:2436 +82:0:4365 +83:3:2440 +84:3:2444 +85:3:2445 +86:3:2453 +87:3:2454 +88:3:2458 +89:3:2459 +90:3:2453 +91:3:2454 +92:3:2458 +93:3:2459 +94:3:2467 +95:3:2472 +96:3:2473 +97:3:2484 +98:3:2485 +99:3:2496 +100:3:2497 +101:3:2498 +102:3:2496 +103:3:2497 +104:3:2498 +105:3:2509 +106:3:2514 +107:3:2515 +108:0:4365 +109:3:2527 +110:0:4365 +111:3:2528 +112:0:4365 +113:2:1173 +114:0:4365 +115:3:2529 +116:0:4365 +117:2:1179 +118:0:4365 +119:2:1180 +120:0:4365 +121:3:2528 +122:0:4365 +123:2:1181 +124:2:1185 +125:2:1186 +126:2:1194 +127:2:1195 +128:2:1199 +129:2:1200 +130:2:1194 +131:2:1195 +132:2:1199 +133:2:1200 +134:2:1208 +135:2:1213 +136:2:1217 +137:2:1218 +138:2:1225 +139:2:1226 +140:2:1237 +141:2:1238 +142:2:1239 +143:2:1237 +144:2:1238 +145:2:1239 +146:2:1250 +147:2:1255 +148:2:1256 +149:0:4365 +150:3:2529 +151:0:4365 +152:2:1268 +153:0:4365 +154:3:2528 +155:0:4365 +156:2:1270 +157:0:4365 +158:3:2529 +159:0:4365 +160:2:1271 +161:2:1275 +162:2:1276 +163:2:1284 +164:2:1285 +165:2:1289 +166:2:1290 +167:2:1284 +168:2:1285 +169:2:1289 +170:2:1290 +171:2:1298 +172:2:1303 +173:2:1307 +174:2:1308 +175:2:1315 +176:2:1316 +177:2:1327 +178:2:1328 +179:2:1329 +180:2:1327 +181:2:1328 +182:2:1329 +183:2:1340 +184:2:1345 +185:2:1346 +186:0:4365 +187:2:1358 +188:0:4365 +189:2:1360 +190:0:4365 +191:3:2528 +192:0:4365 +193:2:1361 +194:0:4365 +195:3:2529 +196:0:4365 +197:2:1362 +198:2:1366 +199:2:1367 +200:2:1375 +201:2:1376 +202:2:1380 +203:2:1381 +204:2:1375 +205:2:1376 +206:2:1380 +207:2:1381 +208:2:1389 +209:2:1394 +210:2:1398 +211:2:1399 +212:2:1406 +213:2:1407 +214:2:1418 +215:2:1419 +216:2:1420 +217:2:1418 +218:2:1419 +219:2:1420 +220:2:1431 +221:2:1436 +222:2:1437 +223:0:4365 +224:2:1449 +225:0:4365 +226:3:2528 +227:0:4365 +228:2:1451 +229:0:4365 +230:3:2529 +231:0:4365 +232:2:1652 +233:0:4365 +234:2:1653 +235:0:4365 +236:2:1657 +237:0:4365 +238:2:1660 +239:0:4365 +240:3:2528 +241:0:4365 +242:2:1665 +243:2:1669 +244:2:1670 +245:2:1678 +246:2:1679 +247:2:1683 +248:2:1684 +249:2:1678 +250:2:1679 +251:2:1680 +252:2:1692 +253:2:1697 +254:2:1701 +255:2:1702 +256:2:1709 +257:2:1710 +258:2:1721 +259:2:1722 +260:2:1723 +261:2:1721 +262:2:1722 +263:2:1723 +264:2:1734 +265:2:1739 +266:2:1740 +267:0:4365 +268:3:2529 +269:0:4365 +270:2:1752 +271:0:4365 +272:3:2528 +273:0:4365 +274:2:1754 +275:0:4365 +276:3:2529 +277:0:4365 +278:2:1755 +279:2:1759 +280:2:1760 +281:2:1768 +282:2:1769 +283:2:1773 +284:2:1774 +285:2:1768 +286:2:1769 +287:2:1773 +288:2:1774 +289:2:1782 +290:2:1787 +291:2:1791 +292:2:1792 +293:2:1799 +294:2:1800 +295:2:1811 +296:2:1812 +297:2:1813 +298:2:1811 +299:2:1812 +300:2:1813 +301:2:1824 +302:2:1829 +303:2:1830 +304:0:4365 +305:2:1842 +306:0:4365 +307:3:2528 +308:0:4365 +309:2:1844 +310:0:4365 +311:3:2529 +312:0:4365 +313:2:1845 +314:2:1849 +315:2:1850 +316:2:1858 +317:2:1859 +318:2:1863 +319:2:1864 +320:2:1858 +321:2:1859 +322:2:1863 +323:2:1864 +324:2:1872 +325:2:1877 +326:2:1881 +327:2:1882 +328:2:1889 +329:2:1890 +330:2:1901 +331:2:1902 +332:2:1903 +333:2:1901 +334:2:1902 +335:2:1903 +336:2:1914 +337:2:1919 +338:2:1920 +339:0:4365 +340:2:1932 +341:0:4365 +342:3:2528 +343:0:4365 +344:2:1934 +345:0:4365 +346:3:2529 +347:0:4365 +348:2:1935 +349:0:4365 +350:2:1936 +351:0:4365 +352:2:2129 +353:0:4365 +354:2:2130 +355:0:4365 +356:2:2134 +357:0:4365 +358:3:2528 +359:0:4365 +360:2:2136 +361:0:4365 +362:3:2529 +363:0:4365 +364:2:2137 +365:2:2141 +366:2:2142 +367:2:2150 +368:2:2151 +369:2:2155 +370:2:2156 +371:2:2150 +372:2:2151 +373:2:2155 +374:2:2156 +375:2:2164 +376:2:2169 +377:2:2173 +378:2:2174 +379:2:2181 +380:2:2182 +381:2:2193 +382:2:2194 +383:2:2195 +384:2:2193 +385:2:2194 +386:2:2195 +387:2:2206 +388:2:2211 +389:2:2212 +390:0:4365 +391:2:2224 +392:0:4365 +393:3:2528 +394:0:4365 +395:2:2226 +396:0:4365 +397:3:2529 +398:0:4365 +399:2:2230 +400:0:4365 +401:3:2528 +402:0:4365 +403:2:2235 +404:2:2239 +405:2:2240 +406:2:2248 +407:2:2249 +408:2:2253 +409:2:2254 +410:2:2248 +411:2:2249 +412:2:2250 +413:2:2262 +414:2:2267 +415:2:2271 +416:2:2272 +417:2:2279 +418:2:2280 +419:2:2291 +420:2:2292 +421:2:2293 +422:2:2291 +423:2:2292 +424:2:2293 +425:2:2304 +426:2:2309 +427:2:2310 +428:0:4365 +429:3:2529 +430:0:4365 +431:2:2322 +432:0:4365 +433:2:1169 +434:0:4365 +435:3:2528 +436:0:4365 +437:2:1170 +438:0:4365 +439:3:2529 +440:0:4365 +441:3:2530 +442:0:4365 +443:3:2536 +444:0:4365 +445:3:2537 +446:0:4365 +447:3:2547 +448:0:4365 +449:3:2548 +450:0:4365 +451:3:2552 +452:3:2553 +453:3:2557 +454:3:2561 +455:3:2562 +456:3:2557 +457:3:2561 +458:3:2562 +459:3:2566 +460:3:2574 +461:3:2575 +462:3:2580 +463:3:2587 +464:3:2588 +465:3:2587 +466:3:2588 +467:3:2595 +468:3:2600 +469:0:4365 +470:3:2611 +471:0:4365 +472:3:2615 +473:3:2616 +474:3:2620 +475:3:2624 +476:3:2625 +477:3:2620 +478:3:2624 +479:3:2625 +480:3:2629 +481:3:2637 +482:3:2638 +483:3:2643 +484:3:2650 +485:3:2651 +486:3:2650 +487:3:2651 +488:3:2658 +489:3:2663 +490:0:4365 +491:3:2611 +492:0:4365 +493:3:2615 +494:3:2616 +495:3:2620 +496:3:2624 +497:3:2625 +498:3:2620 +499:3:2624 +500:3:2625 +501:3:2629 +502:3:2637 +503:3:2638 +504:3:2643 +505:3:2650 +506:3:2651 +507:3:2650 +508:3:2651 +509:3:2658 +510:3:2663 +511:0:4365 +512:3:2674 +513:0:4365 +514:3:2682 +515:3:2683 +516:3:2687 +517:3:2691 +518:3:2692 +519:3:2687 +520:3:2691 +521:3:2692 +522:3:2696 +523:3:2704 +524:3:2705 +525:3:2710 +526:3:2717 +527:3:2718 +528:3:2717 +529:3:2718 +530:3:2725 +531:3:2730 +532:0:4365 +533:3:2745 +534:0:4365 +535:3:2746 +536:0:4365 +537:2:1173 +538:0:4365 +539:3:2747 +540:0:4365 +541:2:1179 +542:0:4365 +543:2:1180 +544:0:4365 +545:3:2746 +546:0:4365 +547:2:1181 +548:2:1185 +549:2:1186 +550:2:1194 +551:2:1195 +552:2:1199 +553:2:1200 +554:2:1194 +555:2:1195 +556:2:1199 +557:2:1200 +558:2:1208 +559:2:1213 +560:2:1217 +561:2:1218 +562:2:1225 +563:2:1226 +564:2:1237 +565:2:1238 +566:2:1239 +567:2:1237 +568:2:1238 +569:2:1239 +570:2:1250 +571:2:1255 +572:2:1256 +573:0:4365 +574:3:2747 +575:0:4365 +576:2:1268 +577:0:4365 +578:3:2746 +579:0:4365 +580:2:1270 +581:0:4365 +582:3:2747 +583:0:4365 +584:2:1271 +585:2:1275 +586:2:1276 +587:2:1284 +588:2:1285 +589:2:1289 +590:2:1290 +591:2:1284 +592:2:1285 +593:2:1289 +594:2:1290 +595:2:1298 +596:2:1303 +597:2:1307 +598:2:1308 +599:2:1315 +600:2:1316 +601:2:1327 +602:2:1328 +603:2:1329 +604:2:1327 +605:2:1328 +606:2:1329 +607:2:1340 +608:2:1345 +609:2:1346 +610:0:4365 +611:2:1358 +612:0:4365 +613:2:1360 +614:0:4365 +615:3:2746 +616:0:4365 +617:2:1361 +618:0:4365 +619:3:2747 +620:0:4365 +621:2:1362 +622:2:1366 +623:2:1367 +624:2:1375 +625:2:1376 +626:2:1380 +627:2:1381 +628:2:1375 +629:2:1376 +630:2:1380 +631:2:1381 +632:2:1389 +633:2:1394 +634:2:1398 +635:2:1399 +636:2:1406 +637:2:1407 +638:2:1418 +639:2:1419 +640:2:1420 +641:2:1418 +642:2:1419 +643:2:1420 +644:2:1431 +645:2:1436 +646:2:1437 +647:0:4365 +648:2:1449 +649:0:4365 +650:3:2746 +651:0:4365 +652:2:1451 +653:0:4365 +654:3:2747 +655:0:4365 +656:2:1652 +657:0:4365 +658:2:1653 +659:0:4365 +660:2:1657 +661:0:4365 +662:2:1660 +663:0:4365 +664:3:2746 +665:0:4365 +666:2:1665 +667:2:1669 +668:2:1670 +669:2:1678 +670:2:1679 +671:2:1683 +672:2:1684 +673:2:1678 +674:2:1679 +675:2:1680 +676:2:1692 +677:2:1697 +678:2:1701 +679:2:1702 +680:2:1709 +681:2:1710 +682:2:1721 +683:2:1722 +684:2:1723 +685:2:1721 +686:2:1722 +687:2:1723 +688:2:1734 +689:2:1739 +690:2:1740 +691:0:4365 +692:3:2747 +693:0:4365 +694:2:1752 +695:0:4365 +696:3:2746 +697:0:4365 +698:2:1754 +699:0:4365 +700:3:2747 +701:0:4365 +702:2:1755 +703:2:1759 +704:2:1760 +705:2:1768 +706:2:1769 +707:2:1773 +708:2:1774 +709:2:1768 +710:2:1769 +711:2:1773 +712:2:1774 +713:2:1782 +714:2:1787 +715:2:1791 +716:2:1792 +717:2:1799 +718:2:1800 +719:2:1811 +720:2:1812 +721:2:1813 +722:2:1811 +723:2:1812 +724:2:1813 +725:2:1824 +726:2:1829 +727:2:1830 +728:0:4365 +729:2:1842 +730:0:4365 +731:3:2746 +732:0:4365 +733:2:1844 +734:0:4365 +735:3:2747 +736:0:4365 +737:2:1845 +738:2:1849 +739:2:1850 +740:2:1858 +741:2:1859 +742:2:1863 +743:2:1864 +744:2:1858 +745:2:1859 +746:2:1863 +747:2:1864 +748:2:1872 +749:2:1877 +750:2:1881 +751:2:1882 +752:2:1889 +753:2:1890 +754:2:1901 +755:2:1902 +756:2:1903 +757:2:1901 +758:2:1902 +759:2:1903 +760:2:1914 +761:2:1919 +762:2:1920 +763:0:4365 +764:2:1932 +765:0:4365 +766:3:2746 +767:0:4365 +768:2:1934 +769:0:4365 +770:3:2747 +771:0:4365 +772:2:1935 +773:0:4365 +774:2:1936 +775:0:4365 +776:2:2129 +777:0:4365 +778:2:2130 +779:0:4365 +780:2:2134 +781:0:4365 +782:3:2746 +783:0:4365 +784:2:2136 +785:0:4365 +786:3:2747 +787:0:4365 +788:2:2137 +789:2:2141 +790:2:2142 +791:2:2150 +792:2:2151 +793:2:2155 +794:2:2156 +795:2:2150 +796:2:2151 +797:2:2155 +798:2:2156 +799:2:2164 +800:2:2169 +801:2:2173 +802:2:2174 +803:2:2181 +804:2:2182 +805:2:2193 +806:2:2194 +807:2:2195 +808:2:2193 +809:2:2194 +810:2:2195 +811:2:2206 +812:2:2211 +813:2:2212 +814:0:4365 +815:2:2224 +816:0:4365 +817:3:2746 +818:0:4365 +819:2:2226 +820:0:4365 +821:3:2747 +822:0:4365 +823:2:2230 +824:0:4365 +825:3:2746 +826:0:4365 +827:2:2235 +828:2:2239 +829:2:2240 +830:2:2248 +831:2:2249 +832:2:2253 +833:2:2254 +834:2:2248 +835:2:2249 +836:2:2250 +837:2:2262 +838:2:2267 +839:2:2271 +840:2:2272 +841:2:2279 +842:2:2280 +843:2:2291 +844:2:2292 +845:2:2293 +846:2:2291 +847:2:2292 +848:2:2293 +849:2:2304 +850:2:2309 +851:2:2310 +852:0:4365 +853:3:2747 +854:0:4365 +855:2:2322 +856:0:4365 +857:2:1169 +858:0:4365 +859:3:2746 +860:0:4365 +861:2:1170 +862:0:4365 +863:3:2747 +864:0:4365 +865:3:2748 +866:0:4365 +867:3:2754 +868:0:4365 +869:3:2755 +870:3:2759 +871:3:2760 +872:3:2768 +873:3:2769 +874:3:2773 +875:3:2774 +876:3:2768 +877:3:2769 +878:3:2773 +879:3:2774 +880:3:2782 +881:3:2787 +882:3:2791 +883:3:2792 +884:3:2799 +885:3:2800 +886:3:2811 +887:3:2812 +888:3:2813 +889:3:2811 +890:3:2812 +891:3:2813 +892:3:2824 +893:3:2829 +894:3:2830 +895:0:4365 +896:3:2842 +897:0:4365 +898:3:2843 +899:0:4365 +900:2:1173 +901:0:4365 +902:3:2844 +903:0:4365 +904:2:1179 +905:0:4365 +906:2:1180 +907:0:4365 +908:3:2843 +909:0:4365 +910:2:1181 +911:2:1185 +912:2:1186 +913:2:1194 +914:2:1195 +915:2:1199 +916:2:1200 +917:2:1194 +918:2:1195 +919:2:1199 +920:2:1200 +921:2:1208 +922:2:1213 +923:2:1217 +924:2:1218 +925:2:1225 +926:2:1226 +927:2:1237 +928:2:1238 +929:2:1239 +930:2:1237 +931:2:1238 +932:2:1239 +933:2:1250 +934:2:1255 +935:2:1256 +936:0:4365 +937:3:2844 +938:0:4365 +939:2:1268 +940:0:4365 +941:3:2843 +942:0:4365 +943:2:1270 +944:0:4365 +945:3:2844 +946:0:4365 +947:2:1271 +948:2:1275 +949:2:1276 +950:2:1284 +951:2:1285 +952:2:1289 +953:2:1290 +954:2:1284 +955:2:1285 +956:2:1289 +957:2:1290 +958:2:1298 +959:2:1303 +960:2:1307 +961:2:1308 +962:2:1315 +963:2:1316 +964:2:1327 +965:2:1328 +966:2:1329 +967:2:1327 +968:2:1328 +969:2:1329 +970:2:1340 +971:2:1345 +972:2:1346 +973:0:4365 +974:2:1358 +975:0:4365 +976:2:1360 +977:0:4365 +978:3:2843 +979:0:4365 +980:2:1361 +981:0:4365 +982:3:2844 +983:0:4365 +984:2:1362 +985:2:1366 +986:2:1367 +987:2:1375 +988:2:1376 +989:2:1380 +990:2:1381 +991:2:1375 +992:2:1376 +993:2:1380 +994:2:1381 +995:2:1389 +996:2:1394 +997:2:1398 +998:2:1399 +999:2:1406 +1000:2:1407 +1001:2:1418 +1002:2:1419 +1003:2:1420 +1004:2:1418 +1005:2:1419 +1006:2:1420 +1007:2:1431 +1008:2:1436 +1009:2:1437 +1010:0:4365 +1011:2:1449 +1012:0:4365 +1013:3:2843 +1014:0:4365 +1015:2:1451 +1016:0:4365 +1017:3:2844 +1018:0:4365 +1019:2:1652 +1020:0:4365 +1021:2:1653 +1022:0:4365 +1023:2:1657 +1024:0:4365 +1025:2:1660 +1026:0:4365 +1027:3:2843 +1028:0:4365 +1029:2:1665 +1030:2:1669 +1031:2:1670 +1032:2:1678 +1033:2:1679 +1034:2:1683 +1035:2:1684 +1036:2:1678 +1037:2:1679 +1038:2:1680 +1039:2:1692 +1040:2:1697 +1041:2:1701 +1042:2:1702 +1043:2:1709 +1044:2:1710 +1045:2:1721 +1046:2:1722 +1047:2:1723 +1048:2:1721 +1049:2:1722 +1050:2:1723 +1051:2:1734 +1052:2:1739 +1053:2:1740 +1054:0:4365 +1055:3:2844 +1056:0:4365 +1057:2:1752 +1058:0:4365 +1059:3:2843 +1060:0:4365 +1061:2:1754 +1062:0:4365 +1063:3:2844 +1064:0:4365 +1065:2:1755 +1066:2:1759 +1067:2:1760 +1068:2:1768 +1069:2:1769 +1070:2:1773 +1071:2:1774 +1072:2:1768 +1073:2:1769 +1074:2:1773 +1075:2:1774 +1076:2:1782 +1077:2:1787 +1078:2:1791 +1079:2:1792 +1080:2:1799 +1081:2:1800 +1082:2:1811 +1083:2:1812 +1084:2:1813 +1085:2:1811 +1086:2:1812 +1087:2:1813 +1088:2:1824 +1089:2:1829 +1090:2:1830 +1091:0:4365 +1092:2:1842 +1093:0:4365 +1094:3:2843 +1095:0:4365 +1096:2:1844 +1097:0:4365 +1098:3:2844 +1099:0:4365 +1100:2:1845 +1101:2:1849 +1102:2:1850 +1103:2:1858 +1104:2:1859 +1105:2:1863 +1106:2:1864 +1107:2:1858 +1108:2:1859 +1109:2:1863 +1110:2:1864 +1111:2:1872 +1112:2:1877 +1113:2:1881 +1114:2:1882 +1115:2:1889 +1116:2:1890 +1117:2:1901 +1118:2:1902 +1119:2:1903 +1120:2:1901 +1121:2:1902 +1122:2:1903 +1123:2:1914 +1124:2:1919 +1125:2:1920 +1126:0:4365 +1127:2:1932 +1128:0:4365 +1129:3:2843 +1130:0:4365 +1131:2:1934 +1132:0:4365 +1133:3:2844 +1134:0:4365 +1135:2:1935 +1136:0:4365 +1137:2:1936 +1138:0:4365 +1139:2:2129 +1140:0:4365 +1141:2:2130 +1142:0:4365 +1143:2:2134 +1144:0:4365 +1145:3:2843 +1146:0:4365 +1147:2:2136 +1148:0:4365 +1149:3:2844 +1150:0:4365 +1151:2:2137 +1152:2:2141 +1153:2:2142 +1154:2:2150 +1155:2:2151 +1156:2:2155 +1157:2:2156 +1158:2:2150 +1159:2:2151 +1160:2:2155 +1161:2:2156 +1162:2:2164 +1163:2:2169 +1164:2:2173 +1165:2:2174 +1166:2:2181 +1167:2:2182 +1168:2:2193 +1169:2:2194 +1170:2:2195 +1171:2:2193 +1172:2:2194 +1173:2:2195 +1174:2:2206 +1175:2:2211 +1176:2:2212 +1177:0:4365 +1178:2:2224 +1179:0:4365 +1180:3:2843 +1181:0:4365 +1182:2:2226 +1183:0:4365 +1184:3:2844 +1185:0:4365 +1186:2:2230 +1187:0:4365 +1188:3:2843 +1189:0:4365 +1190:2:2235 +1191:2:2239 +1192:2:2240 +1193:2:2248 +1194:2:2249 +1195:2:2253 +1196:2:2254 +1197:2:2248 +1198:2:2249 +1199:2:2250 +1200:2:2262 +1201:2:2267 +1202:2:2271 +1203:2:2272 +1204:2:2279 +1205:2:2280 +1206:2:2291 +1207:2:2292 +1208:2:2293 +1209:2:2291 +1210:2:2292 +1211:2:2293 +1212:2:2304 +1213:2:2309 +1214:2:2310 +1215:0:4365 +1216:3:2844 +1217:0:4365 +1218:2:2322 +1219:0:4365 +1220:2:1169 +1221:0:4365 +1222:3:2843 +1223:0:4365 +1224:2:1170 +1225:0:4365 +1226:3:2844 +1227:0:4365 +1228:3:2845 +1229:0:4365 +1230:3:2851 +1231:0:4365 +1232:3:2854 +1233:3:2855 +1234:3:2867 +1235:3:2868 +1236:3:2872 +1237:3:2873 +1238:3:2867 +1239:3:2868 +1240:3:2872 +1241:3:2873 +1242:3:2881 +1243:3:2886 +1244:3:2890 +1245:3:2891 +1246:3:2898 +1247:3:2899 +1248:3:2910 +1249:3:2911 +1250:3:2912 +1251:3:2910 +1252:3:2911 +1253:3:2912 +1254:3:2923 +1255:3:2928 +1256:3:2929 +1257:0:4365 +1258:3:2941 +1259:0:4365 +1260:3:2942 +1261:0:4365 +1262:2:1173 +1263:0:4365 +1264:3:2943 +1265:0:4365 +1266:2:1179 +1267:0:4365 +1268:2:1180 +1269:0:4365 +1270:3:2942 +1271:0:4365 +1272:2:1181 +1273:2:1185 +1274:2:1186 +1275:2:1194 +1276:2:1195 +1277:2:1199 +1278:2:1200 +1279:2:1194 +1280:2:1195 +1281:2:1199 +1282:2:1200 +1283:2:1208 +1284:2:1213 +1285:2:1217 +1286:2:1218 +1287:2:1225 +1288:2:1226 +1289:2:1237 +1290:2:1238 +1291:2:1239 +1292:2:1237 +1293:2:1238 +1294:2:1239 +1295:2:1250 +1296:2:1255 +1297:2:1256 +1298:0:4365 +1299:3:2943 +1300:0:4365 +1301:2:1268 +1302:0:4365 +1303:3:2942 +1304:0:4365 +1305:2:1270 +1306:0:4365 +1307:3:2943 +1308:0:4365 +1309:2:1271 +1310:2:1275 +1311:2:1276 +1312:2:1284 +1313:2:1285 +1314:2:1289 +1315:2:1290 +1316:2:1284 +1317:2:1285 +1318:2:1289 +1319:2:1290 +1320:2:1298 +1321:2:1303 +1322:2:1307 +1323:2:1308 +1324:2:1315 +1325:2:1316 +1326:2:1327 +1327:2:1328 +1328:2:1329 +1329:2:1327 +1330:2:1328 +1331:2:1329 +1332:2:1340 +1333:2:1345 +1334:2:1346 +1335:0:4365 +1336:2:1358 +1337:0:4365 +1338:2:1360 +1339:0:4365 +1340:3:2942 +1341:0:4365 +1342:2:1361 +1343:0:4365 +1344:3:2943 +1345:0:4365 +1346:2:1362 +1347:2:1366 +1348:2:1367 +1349:2:1375 +1350:2:1376 +1351:2:1380 +1352:2:1381 +1353:2:1375 +1354:2:1376 +1355:2:1380 +1356:2:1381 +1357:2:1389 +1358:2:1394 +1359:2:1398 +1360:2:1399 +1361:2:1406 +1362:2:1407 +1363:2:1418 +1364:2:1419 +1365:2:1420 +1366:2:1418 +1367:2:1419 +1368:2:1420 +1369:2:1431 +1370:2:1436 +1371:2:1437 +1372:0:4365 +1373:2:1449 +1374:0:4365 +1375:3:2942 +1376:0:4365 +1377:2:1451 +1378:0:4365 +1379:3:2943 +1380:0:4365 +1381:2:1652 +1382:0:4365 +1383:2:1653 +1384:0:4365 +1385:2:1657 +1386:0:4365 +1387:2:1660 +1388:0:4365 +1389:3:2942 +1390:0:4365 +1391:2:1665 +1392:2:1669 +1393:2:1670 +1394:2:1678 +1395:2:1679 +1396:2:1683 +1397:2:1684 +1398:2:1678 +1399:2:1679 +1400:2:1680 +1401:2:1692 +1402:2:1697 +1403:2:1701 +1404:2:1702 +1405:2:1709 +1406:2:1710 +1407:2:1721 +1408:2:1722 +1409:2:1723 +1410:2:1721 +1411:2:1722 +1412:2:1723 +1413:2:1734 +1414:2:1739 +1415:2:1740 +1416:0:4365 +1417:3:2943 +1418:0:4365 +1419:2:1752 +1420:0:4365 +1421:3:2942 +1422:0:4365 +1423:2:1754 +1424:0:4365 +1425:3:2943 +1426:0:4365 +1427:2:1755 +1428:2:1759 +1429:2:1760 +1430:2:1768 +1431:2:1769 +1432:2:1773 +1433:2:1774 +1434:2:1768 +1435:2:1769 +1436:2:1773 +1437:2:1774 +1438:2:1782 +1439:2:1787 +1440:2:1791 +1441:2:1792 +1442:2:1799 +1443:2:1800 +1444:2:1811 +1445:2:1812 +1446:2:1813 +1447:2:1811 +1448:2:1812 +1449:2:1813 +1450:2:1824 +1451:2:1829 +1452:2:1830 +1453:0:4365 +1454:2:1842 +1455:0:4365 +1456:3:2942 +1457:0:4365 +1458:2:1844 +1459:0:4365 +1460:3:2943 +1461:0:4365 +1462:2:1845 +1463:2:1849 +1464:2:1850 +1465:2:1858 +1466:2:1859 +1467:2:1863 +1468:2:1864 +1469:2:1858 +1470:2:1859 +1471:2:1863 +1472:2:1864 +1473:2:1872 +1474:2:1877 +1475:2:1881 +1476:2:1882 +1477:2:1889 +1478:2:1890 +1479:2:1901 +1480:2:1902 +1481:2:1903 +1482:2:1901 +1483:2:1902 +1484:2:1903 +1485:2:1914 +1486:2:1919 +1487:2:1920 +1488:0:4365 +1489:2:1932 +1490:0:4365 +1491:3:2942 +1492:0:4365 +1493:2:1934 +1494:0:4365 +1495:3:2943 +1496:0:4365 +1497:2:1935 +1498:0:4365 +1499:2:1936 +1500:0:4365 +1501:2:2129 +1502:0:4365 +1503:2:2130 +1504:0:4365 +1505:2:2134 +1506:0:4365 +1507:3:2942 +1508:0:4365 +1509:2:2136 +1510:0:4365 +1511:3:2943 +1512:0:4365 +1513:2:2137 +1514:2:2141 +1515:2:2142 +1516:2:2150 +1517:2:2151 +1518:2:2155 +1519:2:2156 +1520:2:2150 +1521:2:2151 +1522:2:2155 +1523:2:2156 +1524:2:2164 +1525:2:2169 +1526:2:2173 +1527:2:2174 +1528:2:2181 +1529:2:2182 +1530:2:2193 +1531:2:2194 +1532:2:2195 +1533:2:2193 +1534:2:2194 +1535:2:2195 +1536:2:2206 +1537:2:2211 +1538:2:2212 +1539:0:4365 +1540:2:2224 +1541:0:4365 +1542:3:2942 +1543:0:4365 +1544:2:2226 +1545:0:4365 +1546:3:2943 +1547:0:4365 +1548:2:2230 +1549:0:4365 +1550:3:2942 +1551:0:4365 +1552:2:2235 +1553:2:2239 +1554:2:2240 +1555:2:2248 +1556:2:2249 +1557:2:2253 +1558:2:2254 +1559:2:2248 +1560:2:2249 +1561:2:2250 +1562:2:2262 +1563:2:2267 +1564:2:2271 +1565:2:2272 +1566:2:2279 +1567:2:2280 +1568:2:2291 +1569:2:2292 +1570:2:2293 +1571:2:2291 +1572:2:2292 +1573:2:2293 +1574:2:2304 +1575:2:2309 +1576:2:2310 +1577:0:4365 +1578:3:2943 +1579:0:4365 +1580:2:2322 +1581:0:4365 +1582:2:1169 +1583:0:4365 +1584:3:2942 +1585:0:4365 +1586:2:1170 +1587:0:4365 +1588:3:2943 +1589:0:4365 +1590:3:2944 +1591:0:4365 +1592:3:2950 +1593:0:4365 +1594:3:2951 +1595:0:4365 +1596:3:2952 +1597:0:4365 +1598:3:2953 +1599:0:4365 +1600:3:2954 +1601:3:2958 +1602:3:2959 +1603:3:2967 +1604:3:2968 +1605:3:2972 +1606:3:2973 +1607:3:2967 +1608:3:2968 +1609:3:2972 +1610:3:2973 +1611:3:2981 +1612:3:2986 +1613:3:2990 +1614:3:2991 +1615:3:2998 +1616:3:2999 +1617:3:3010 +1618:3:3011 +1619:3:3012 +1620:3:3010 +1621:3:3011 +1622:3:3012 +1623:3:3023 +1624:3:3028 +1625:3:3029 +1626:0:4365 +1627:3:3041 +1628:0:4365 +1629:3:3042 +1630:0:4365 +1631:2:1173 +1632:0:4365 +1633:3:3043 +1634:0:4365 +1635:2:1179 +1636:0:4365 +1637:2:1180 +1638:0:4365 +1639:3:3042 +1640:0:4365 +1641:2:1181 +1642:2:1185 +1643:2:1186 +1644:2:1194 +1645:2:1195 +1646:2:1199 +1647:2:1200 +1648:2:1194 +1649:2:1195 +1650:2:1199 +1651:2:1200 +1652:2:1208 +1653:2:1213 +1654:2:1217 +1655:2:1218 +1656:2:1225 +1657:2:1226 +1658:2:1237 +1659:2:1238 +1660:2:1239 +1661:2:1237 +1662:2:1238 +1663:2:1239 +1664:2:1250 +1665:2:1255 +1666:2:1256 +1667:0:4365 +1668:3:3043 +1669:0:4365 +1670:2:1268 +1671:0:4365 +1672:3:3042 +1673:0:4365 +1674:2:1270 +1675:0:4365 +1676:3:3043 +1677:0:4365 +1678:2:1271 +1679:2:1275 +1680:2:1276 +1681:2:1284 +1682:2:1285 +1683:2:1289 +1684:2:1290 +1685:2:1284 +1686:2:1285 +1687:2:1289 +1688:2:1290 +1689:2:1298 +1690:2:1303 +1691:2:1307 +1692:2:1308 +1693:2:1315 +1694:2:1316 +1695:2:1327 +1696:2:1328 +1697:2:1329 +1698:2:1327 +1699:2:1328 +1700:2:1329 +1701:2:1340 +1702:2:1345 +1703:2:1346 +1704:0:4365 +1705:2:1358 +1706:0:4365 +1707:2:1360 +1708:0:4365 +1709:3:3042 +1710:0:4365 +1711:2:1361 +1712:0:4365 +1713:3:3043 +1714:0:4365 +1715:2:1362 +1716:2:1366 +1717:2:1367 +1718:2:1375 +1719:2:1376 +1720:2:1380 +1721:2:1381 +1722:2:1375 +1723:2:1376 +1724:2:1380 +1725:2:1381 +1726:2:1389 +1727:2:1394 +1728:2:1398 +1729:2:1399 +1730:2:1406 +1731:2:1407 +1732:2:1418 +1733:2:1419 +1734:2:1420 +1735:2:1418 +1736:2:1419 +1737:2:1420 +1738:2:1431 +1739:2:1436 +1740:2:1437 +1741:0:4365 +1742:2:1449 +1743:0:4365 +1744:3:3042 +1745:0:4365 +1746:2:1451 +1747:0:4365 +1748:3:3043 +1749:0:4365 +1750:2:1652 +1751:0:4365 +1752:2:1653 +1753:0:4365 +1754:2:1657 +1755:0:4365 +1756:2:1660 +1757:0:4365 +1758:3:3042 +1759:0:4365 +1760:2:1665 +1761:2:1669 +1762:2:1670 +1763:2:1678 +1764:2:1679 +1765:2:1683 +1766:2:1684 +1767:2:1678 +1768:2:1679 +1769:2:1680 +1770:2:1692 +1771:2:1697 +1772:2:1701 +1773:2:1702 +1774:2:1709 +1775:2:1710 +1776:2:1721 +1777:2:1722 +1778:2:1723 +1779:2:1721 +1780:2:1722 +1781:2:1723 +1782:2:1734 +1783:2:1739 +1784:2:1740 +1785:0:4365 +1786:3:3043 +1787:0:4365 +1788:2:1752 +1789:0:4365 +1790:3:3042 +1791:0:4365 +1792:2:1754 +1793:0:4365 +1794:3:3043 +1795:0:4365 +1796:2:1755 +1797:2:1759 +1798:2:1760 +1799:2:1768 +1800:2:1769 +1801:2:1773 +1802:2:1774 +1803:2:1768 +1804:2:1769 +1805:2:1773 +1806:2:1774 +1807:2:1782 +1808:2:1787 +1809:2:1791 +1810:2:1792 +1811:2:1799 +1812:2:1800 +1813:2:1811 +1814:2:1812 +1815:2:1813 +1816:2:1811 +1817:2:1812 +1818:2:1813 +1819:2:1824 +1820:2:1829 +1821:2:1830 +1822:0:4365 +1823:2:1842 +1824:0:4365 +1825:3:3042 +1826:0:4365 +1827:2:1844 +1828:0:4365 +1829:3:3043 +1830:0:4365 +1831:2:1845 +1832:2:1849 +1833:2:1850 +1834:2:1858 +1835:2:1859 +1836:2:1863 +1837:2:1864 +1838:2:1858 +1839:2:1859 +1840:2:1863 +1841:2:1864 +1842:2:1872 +1843:2:1877 +1844:2:1881 +1845:2:1882 +1846:2:1889 +1847:2:1890 +1848:2:1901 +1849:2:1902 +1850:2:1903 +1851:2:1901 +1852:2:1902 +1853:2:1903 +1854:2:1914 +1855:2:1919 +1856:2:1920 +1857:0:4365 +1858:2:1932 +1859:0:4365 +1860:3:3042 +1861:0:4365 +1862:2:1934 +1863:0:4365 +1864:3:3043 +1865:0:4365 +1866:2:1935 +1867:0:4365 +1868:2:1936 +1869:0:4365 +1870:2:2129 +1871:0:4365 +1872:2:2130 +1873:0:4365 +1874:2:2134 +1875:0:4365 +1876:3:3042 +1877:0:4365 +1878:2:2136 +1879:0:4365 +1880:3:3043 +1881:0:4365 +1882:2:2137 +1883:2:2141 +1884:2:2142 +1885:2:2150 +1886:2:2151 +1887:2:2155 +1888:2:2156 +1889:2:2150 +1890:2:2151 +1891:2:2155 +1892:2:2156 +1893:2:2164 +1894:2:2169 +1895:2:2173 +1896:2:2174 +1897:2:2181 +1898:2:2182 +1899:2:2193 +1900:2:2194 +1901:2:2195 +1902:2:2193 +1903:2:2194 +1904:2:2195 +1905:2:2206 +1906:2:2211 +1907:2:2212 +1908:0:4365 +1909:2:2224 +1910:0:4365 +1911:3:3042 +1912:0:4365 +1913:2:2226 +1914:0:4365 +1915:3:3043 +1916:0:4365 +1917:2:2230 +1918:0:4365 +1919:3:3042 +1920:0:4365 +1921:2:2235 +1922:2:2239 +1923:2:2240 +1924:2:2248 +1925:2:2249 +1926:2:2253 +1927:2:2254 +1928:2:2248 +1929:2:2249 +1930:2:2250 +1931:2:2262 +1932:2:2267 +1933:2:2271 +1934:2:2272 +1935:2:2279 +1936:2:2280 +1937:2:2291 +1938:2:2292 +1939:2:2293 +1940:2:2291 +1941:2:2292 +1942:2:2293 +1943:2:2304 +1944:2:2309 +1945:2:2310 +1946:0:4365 +1947:3:3043 +1948:0:4365 +1949:2:2322 +1950:0:4365 +1951:2:1169 +1952:0:4365 +1953:3:3042 +1954:0:4365 +1955:2:1170 +1956:0:4365 +1957:3:3043 +1958:0:4365 +1959:3:3044 +1960:0:4365 +1961:3:3257 +1962:0:4365 +1963:3:3265 +1964:0:4365 +1965:3:3266 +1966:3:3270 +1967:3:3271 +1968:3:3279 +1969:3:3280 +1970:3:3284 +1971:3:3285 +1972:3:3279 +1973:3:3280 +1974:3:3284 +1975:3:3285 +1976:3:3293 +1977:3:3298 +1978:3:3302 +1979:3:3303 +1980:3:3310 +1981:3:3311 +1982:3:3322 +1983:3:3323 +1984:3:3324 +1985:3:3322 +1986:3:3323 +1987:3:3324 +1988:3:3335 +1989:3:3340 +1990:3:3341 +1991:0:4365 +1992:3:3353 +1993:0:4365 +1994:3:3354 +1995:0:4365 +1996:2:1173 +1997:0:4365 +1998:3:3355 +1999:0:4365 +2000:2:1179 +2001:0:4365 +2002:2:1180 +2003:0:4365 +2004:3:3354 +2005:0:4365 +2006:2:1181 +2007:2:1185 +2008:2:1186 +2009:2:1194 +2010:2:1195 +2011:2:1199 +2012:2:1200 +2013:2:1194 +2014:2:1195 +2015:2:1199 +2016:2:1200 +2017:2:1208 +2018:2:1213 +2019:2:1217 +2020:2:1218 +2021:2:1225 +2022:2:1226 +2023:2:1237 +2024:2:1238 +2025:2:1239 +2026:2:1237 +2027:2:1238 +2028:2:1239 +2029:2:1250 +2030:2:1255 +2031:2:1256 +2032:0:4365 +2033:3:3355 +2034:0:4365 +2035:2:1268 +2036:0:4365 +2037:3:3354 +2038:0:4365 +2039:2:1270 +2040:0:4365 +2041:3:3355 +2042:0:4365 +2043:2:1271 +2044:2:1275 +2045:2:1276 +2046:2:1284 +2047:2:1285 +2048:2:1289 +2049:2:1290 +2050:2:1284 +2051:2:1285 +2052:2:1289 +2053:2:1290 +2054:2:1298 +2055:2:1303 +2056:2:1307 +2057:2:1308 +2058:2:1315 +2059:2:1316 +2060:2:1327 +2061:2:1328 +2062:2:1329 +2063:2:1327 +2064:2:1328 +2065:2:1329 +2066:2:1340 +2067:2:1345 +2068:2:1346 +2069:0:4365 +2070:2:1358 +2071:0:4365 +2072:2:1360 +2073:0:4365 +2074:3:3354 +2075:0:4365 +2076:2:1361 +2077:0:4365 +2078:3:3355 +2079:0:4365 +2080:2:1362 +2081:2:1366 +2082:2:1367 +2083:2:1375 +2084:2:1376 +2085:2:1380 +2086:2:1381 +2087:2:1375 +2088:2:1376 +2089:2:1380 +2090:2:1381 +2091:2:1389 +2092:2:1394 +2093:2:1398 +2094:2:1399 +2095:2:1406 +2096:2:1407 +2097:2:1418 +2098:2:1419 +2099:2:1420 +2100:2:1418 +2101:2:1419 +2102:2:1420 +2103:2:1431 +2104:2:1436 +2105:2:1437 +2106:0:4365 +2107:2:1449 +2108:0:4365 +2109:3:3354 +2110:0:4365 +2111:2:1451 +2112:0:4365 +2113:3:3355 +2114:0:4365 +2115:2:1652 +2116:0:4365 +2117:2:1653 +2118:0:4365 +2119:2:1657 +2120:0:4365 +2121:2:1660 +2122:0:4365 +2123:3:3354 +2124:0:4365 +2125:2:1665 +2126:2:1669 +2127:2:1670 +2128:2:1678 +2129:2:1679 +2130:2:1683 +2131:2:1684 +2132:2:1678 +2133:2:1679 +2134:2:1680 +2135:2:1692 +2136:2:1697 +2137:2:1701 +2138:2:1702 +2139:2:1709 +2140:2:1710 +2141:2:1721 +2142:2:1722 +2143:2:1723 +2144:2:1721 +2145:2:1722 +2146:2:1723 +2147:2:1734 +2148:2:1739 +2149:2:1740 +2150:0:4365 +2151:3:3355 +2152:0:4365 +2153:2:1752 +2154:0:4365 +2155:3:3354 +2156:0:4365 +2157:2:1754 +2158:0:4365 +2159:3:3355 +2160:0:4365 +2161:2:1755 +2162:2:1759 +2163:2:1760 +2164:2:1768 +2165:2:1769 +2166:2:1773 +2167:2:1774 +2168:2:1768 +2169:2:1769 +2170:2:1773 +2171:2:1774 +2172:2:1782 +2173:2:1787 +2174:2:1791 +2175:2:1792 +2176:2:1799 +2177:2:1800 +2178:2:1811 +2179:2:1812 +2180:2:1813 +2181:2:1811 +2182:2:1812 +2183:2:1813 +2184:2:1824 +2185:2:1829 +2186:2:1830 +2187:0:4365 +2188:2:1842 +2189:0:4365 +2190:3:3354 +2191:0:4365 +2192:2:1844 +2193:0:4365 +2194:3:3355 +2195:0:4365 +2196:2:1845 +2197:2:1849 +2198:2:1850 +2199:2:1858 +2200:2:1859 +2201:2:1863 +2202:2:1864 +2203:2:1858 +2204:2:1859 +2205:2:1863 +2206:2:1864 +2207:2:1872 +2208:2:1877 +2209:2:1881 +2210:2:1882 +2211:2:1889 +2212:2:1890 +2213:2:1901 +2214:2:1902 +2215:2:1903 +2216:2:1901 +2217:2:1902 +2218:2:1903 +2219:2:1914 +2220:2:1919 +2221:2:1920 +2222:0:4365 +2223:2:1932 +2224:0:4365 +2225:3:3354 +2226:0:4365 +2227:2:1934 +2228:0:4365 +2229:3:3355 +2230:0:4365 +2231:2:1935 +2232:0:4365 +2233:2:1936 +2234:0:4365 +2235:2:2129 +2236:0:4365 +2237:2:2130 +2238:0:4365 +2239:2:2134 +2240:0:4365 +2241:3:3354 +2242:0:4365 +2243:2:2136 +2244:0:4365 +2245:3:3355 +2246:0:4365 +2247:2:2137 +2248:2:2141 +2249:2:2142 +2250:2:2150 +2251:2:2151 +2252:2:2155 +2253:2:2156 +2254:2:2150 +2255:2:2151 +2256:2:2155 +2257:2:2156 +2258:2:2164 +2259:2:2169 +2260:2:2173 +2261:2:2174 +2262:2:2181 +2263:2:2182 +2264:2:2193 +2265:2:2194 +2266:2:2195 +2267:2:2193 +2268:2:2194 +2269:2:2195 +2270:2:2206 +2271:2:2211 +2272:2:2212 +2273:0:4365 +2274:2:2224 +2275:0:4365 +2276:3:3354 +2277:0:4365 +2278:2:2226 +2279:0:4365 +2280:3:3355 +2281:0:4365 +2282:2:2230 +2283:0:4365 +2284:3:3354 +2285:0:4365 +2286:2:2235 +2287:2:2239 +2288:2:2240 +2289:2:2248 +2290:2:2249 +2291:2:2253 +2292:2:2254 +2293:2:2248 +2294:2:2249 +2295:2:2250 +2296:2:2262 +2297:2:2267 +2298:2:2271 +2299:2:2272 +2300:2:2279 +2301:2:2280 +2302:2:2291 +2303:2:2292 +2304:2:2293 +2305:2:2291 +2306:2:2292 +2307:2:2293 +2308:2:2304 +2309:2:2309 +2310:2:2310 +2311:0:4365 +2312:3:3355 +2313:0:4365 +2314:2:2322 +2315:0:4365 +2316:2:1169 +2317:0:4365 +2318:3:3354 +2319:0:4365 +2320:2:1170 +2321:0:4365 +2322:3:3355 +2323:0:4365 +2324:3:3356 +2325:0:4365 +2326:3:3366 +2327:0:4365 +2328:3:2951 +2329:0:4365 +2330:3:2952 +2331:0:4365 +2332:3:2953 +2333:0:4365 +2334:3:2954 +2335:3:2958 +2336:3:2959 +2337:3:2967 +2338:3:2968 +2339:3:2972 +2340:3:2973 +2341:3:2967 +2342:3:2968 +2343:3:2972 +2344:3:2973 +2345:3:2981 +2346:3:2986 +2347:3:2990 +2348:3:2991 +2349:3:2998 +2350:3:2999 +2351:3:3010 +2352:3:3011 +2353:3:3012 +2354:3:3010 +2355:3:3011 +2356:3:3012 +2357:3:3023 +2358:3:3028 +2359:3:3029 +2360:0:4365 +2361:3:3041 +2362:0:4365 +2363:3:3042 +2364:0:4365 +2365:2:1173 +2366:0:4365 +2367:3:3043 +2368:0:4365 +2369:2:1179 +2370:0:4365 +2371:2:1180 +2372:0:4365 +2373:3:3042 +2374:0:4365 +2375:2:1181 +2376:2:1185 +2377:2:1186 +2378:2:1194 +2379:2:1195 +2380:2:1199 +2381:2:1200 +2382:2:1194 +2383:2:1195 +2384:2:1199 +2385:2:1200 +2386:2:1208 +2387:2:1213 +2388:2:1217 +2389:2:1218 +2390:2:1225 +2391:2:1226 +2392:2:1237 +2393:2:1238 +2394:2:1239 +2395:2:1237 +2396:2:1238 +2397:2:1239 +2398:2:1250 +2399:2:1255 +2400:2:1256 +2401:0:4365 +2402:3:3043 +2403:0:4365 +2404:2:1268 +2405:0:4365 +2406:3:3042 +2407:0:4365 +2408:2:1270 +2409:0:4365 +2410:3:3043 +2411:0:4365 +2412:2:1271 +2413:2:1275 +2414:2:1276 +2415:2:1284 +2416:2:1285 +2417:2:1289 +2418:2:1290 +2419:2:1284 +2420:2:1285 +2421:2:1289 +2422:2:1290 +2423:2:1298 +2424:2:1303 +2425:2:1307 +2426:2:1308 +2427:2:1315 +2428:2:1316 +2429:2:1327 +2430:2:1328 +2431:2:1329 +2432:2:1327 +2433:2:1328 +2434:2:1329 +2435:2:1340 +2436:2:1345 +2437:2:1346 +2438:0:4365 +2439:2:1358 +2440:0:4365 +2441:2:1360 +2442:0:4365 +2443:3:3042 +2444:0:4365 +2445:2:1361 +2446:0:4365 +2447:3:3043 +2448:0:4365 +2449:2:1362 +2450:2:1366 +2451:2:1367 +2452:2:1375 +2453:2:1376 +2454:2:1380 +2455:2:1381 +2456:2:1375 +2457:2:1376 +2458:2:1380 +2459:2:1381 +2460:2:1389 +2461:2:1394 +2462:2:1398 +2463:2:1399 +2464:2:1406 +2465:2:1407 +2466:2:1418 +2467:2:1419 +2468:2:1420 +2469:2:1418 +2470:2:1419 +2471:2:1420 +2472:2:1431 +2473:2:1436 +2474:2:1437 +2475:0:4365 +2476:2:1449 +2477:0:4365 +2478:3:3042 +2479:0:4365 +2480:2:1451 +2481:0:4365 +2482:3:3043 +2483:0:4365 +2484:2:1652 +2485:0:4365 +2486:2:1653 +2487:0:4365 +2488:2:1657 +2489:0:4365 +2490:2:1660 +2491:0:4365 +2492:3:3042 +2493:0:4365 +2494:2:1665 +2495:2:1669 +2496:2:1670 +2497:2:1678 +2498:2:1679 +2499:2:1683 +2500:2:1684 +2501:2:1678 +2502:2:1679 +2503:2:1680 +2504:2:1692 +2505:2:1697 +2506:2:1701 +2507:2:1702 +2508:2:1709 +2509:2:1710 +2510:2:1721 +2511:2:1722 +2512:2:1723 +2513:2:1721 +2514:2:1722 +2515:2:1723 +2516:2:1734 +2517:2:1739 +2518:2:1740 +2519:0:4365 +2520:3:3043 +2521:0:4365 +2522:2:1752 +2523:0:4365 +2524:3:3042 +2525:0:4365 +2526:2:1754 +2527:0:4365 +2528:3:3043 +2529:0:4365 +2530:2:1755 +2531:2:1759 +2532:2:1760 +2533:2:1768 +2534:2:1769 +2535:2:1773 +2536:2:1774 +2537:2:1768 +2538:2:1769 +2539:2:1773 +2540:2:1774 +2541:2:1782 +2542:2:1787 +2543:2:1791 +2544:2:1792 +2545:2:1799 +2546:2:1800 +2547:2:1811 +2548:2:1812 +2549:2:1813 +2550:2:1811 +2551:2:1812 +2552:2:1813 +2553:2:1824 +2554:2:1829 +2555:2:1830 +2556:0:4365 +2557:2:1842 +2558:0:4365 +2559:3:3042 +2560:0:4365 +2561:2:1844 +2562:0:4365 +2563:3:3043 +2564:0:4365 +2565:2:1845 +2566:2:1849 +2567:2:1850 +2568:2:1858 +2569:2:1859 +2570:2:1863 +2571:2:1864 +2572:2:1858 +2573:2:1859 +2574:2:1863 +2575:2:1864 +2576:2:1872 +2577:2:1877 +2578:2:1881 +2579:2:1882 +2580:2:1889 +2581:2:1890 +2582:2:1901 +2583:2:1902 +2584:2:1903 +2585:2:1901 +2586:2:1902 +2587:2:1903 +2588:2:1914 +2589:2:1919 +2590:2:1920 +2591:0:4365 +2592:2:1932 +2593:0:4365 +2594:3:3042 +2595:0:4365 +2596:2:1934 +2597:0:4365 +2598:3:3043 +2599:0:4365 +2600:2:1935 +2601:0:4365 +2602:2:1936 +2603:0:4365 +2604:2:2129 +2605:0:4365 +2606:2:2130 +2607:0:4365 +2608:2:2134 +2609:0:4365 +2610:3:3042 +2611:0:4365 +2612:2:2136 +2613:0:4365 +2614:3:3043 +2615:0:4365 +2616:2:2137 +2617:2:2141 +2618:2:2142 +2619:2:2150 +2620:2:2151 +2621:2:2155 +2622:2:2156 +2623:2:2150 +2624:2:2151 +2625:2:2155 +2626:2:2156 +2627:2:2164 +2628:2:2169 +2629:2:2173 +2630:2:2174 +2631:2:2181 +2632:2:2182 +2633:2:2193 +2634:2:2194 +2635:2:2195 +2636:2:2193 +2637:2:2194 +2638:2:2195 +2639:2:2206 +2640:2:2211 +2641:2:2212 +2642:0:4365 +2643:2:2224 +2644:0:4365 +2645:3:3042 +2646:0:4365 +2647:2:2226 +2648:0:4365 +2649:3:3043 +2650:0:4365 +2651:2:2230 +2652:0:4365 +2653:3:3042 +2654:0:4365 +2655:2:2235 +2656:2:2239 +2657:2:2240 +2658:2:2248 +2659:2:2249 +2660:2:2253 +2661:2:2254 +2662:2:2248 +2663:2:2249 +2664:2:2250 +2665:2:2262 +2666:2:2267 +2667:2:2271 +2668:2:2272 +2669:2:2279 +2670:2:2280 +2671:2:2291 +2672:2:2292 +2673:2:2293 +2674:2:2291 +2675:2:2292 +2676:2:2293 +2677:2:2304 +2678:2:2309 +2679:2:2310 +2680:0:4365 +2681:3:3043 +2682:0:4365 +2683:2:2322 +2684:0:4365 +2685:2:1169 +2686:0:4365 +2687:3:3042 +2688:0:4365 +2689:2:1170 +2690:0:4365 +2691:3:3043 +2692:0:4365 +2693:3:3044 +2694:0:4365 +2695:3:3257 +2696:0:4365 +2697:3:3362 +2698:0:4365 +2699:3:3363 +2700:0:4365 +2701:3:3367 +2702:0:4365 +2703:3:3373 +2704:3:3377 +2705:3:3378 +2706:3:3386 +2707:3:3387 +2708:3:3391 +2709:3:3392 +2710:3:3386 +2711:3:3387 +2712:3:3391 +2713:3:3392 +2714:3:3400 +2715:3:3405 +2716:3:3409 +2717:3:3410 +2718:3:3417 +2719:3:3418 +2720:3:3429 +2721:3:3430 +2722:3:3431 +2723:3:3429 +2724:3:3430 +2725:3:3431 +2726:3:3442 +2727:3:3447 +2728:3:3448 +2729:0:4365 +2730:3:3460 +2731:0:4365 +2732:3:3461 +2733:0:4365 +2734:2:1173 +2735:0:4365 +2736:3:3462 +2737:0:4365 +2738:2:1179 +2739:0:4365 +2740:2:1180 +2741:0:4365 +2742:3:3461 +2743:0:4365 +2744:2:1181 +2745:2:1185 +2746:2:1186 +2747:2:1194 +2748:2:1195 +2749:2:1199 +2750:2:1200 +2751:2:1194 +2752:2:1195 +2753:2:1199 +2754:2:1200 +2755:2:1208 +2756:2:1213 +2757:2:1217 +2758:2:1218 +2759:2:1225 +2760:2:1226 +2761:2:1237 +2762:2:1238 +2763:2:1239 +2764:2:1237 +2765:2:1238 +2766:2:1239 +2767:2:1250 +2768:2:1255 +2769:2:1256 +2770:0:4365 +2771:3:3462 +2772:0:4365 +2773:2:1268 +2774:0:4365 +2775:3:3461 +2776:0:4365 +2777:2:1270 +2778:0:4365 +2779:3:3462 +2780:0:4365 +2781:2:1271 +2782:2:1275 +2783:2:1276 +2784:2:1284 +2785:2:1285 +2786:2:1289 +2787:2:1290 +2788:2:1284 +2789:2:1285 +2790:2:1289 +2791:2:1290 +2792:2:1298 +2793:2:1303 +2794:2:1307 +2795:2:1308 +2796:2:1315 +2797:2:1316 +2798:2:1327 +2799:2:1328 +2800:2:1329 +2801:2:1327 +2802:2:1328 +2803:2:1329 +2804:2:1340 +2805:2:1345 +2806:2:1346 +2807:0:4365 +2808:2:1358 +2809:0:4365 +2810:2:1360 +2811:0:4365 +2812:3:3461 +2813:0:4365 +2814:2:1361 +2815:0:4365 +2816:3:3462 +2817:0:4365 +2818:2:1362 +2819:2:1366 +2820:2:1367 +2821:2:1375 +2822:2:1376 +2823:2:1380 +2824:2:1381 +2825:2:1375 +2826:2:1376 +2827:2:1380 +2828:2:1381 +2829:2:1389 +2830:2:1394 +2831:2:1398 +2832:2:1399 +2833:2:1406 +2834:2:1407 +2835:2:1418 +2836:2:1419 +2837:2:1420 +2838:2:1418 +2839:2:1419 +2840:2:1420 +2841:2:1431 +2842:2:1436 +2843:2:1437 +2844:0:4365 +2845:2:1449 +2846:0:4365 +2847:3:3461 +2848:0:4365 +2849:2:1451 +2850:0:4365 +2851:3:3462 +2852:0:4365 +2853:2:1652 +2854:0:4365 +2855:2:1653 +2856:0:4365 +2857:2:1657 +2858:0:4365 +2859:2:1660 +2860:0:4365 +2861:3:3461 +2862:0:4365 +2863:2:1665 +2864:2:1669 +2865:2:1670 +2866:2:1678 +2867:2:1679 +2868:2:1683 +2869:2:1684 +2870:2:1678 +2871:2:1679 +2872:2:1680 +2873:2:1692 +2874:2:1697 +2875:2:1701 +2876:2:1702 +2877:2:1709 +2878:2:1710 +2879:2:1721 +2880:2:1722 +2881:2:1723 +2882:2:1721 +2883:2:1722 +2884:2:1723 +2885:2:1734 +2886:2:1739 +2887:2:1740 +2888:0:4365 +2889:3:3462 +2890:0:4365 +2891:2:1752 +2892:0:4365 +2893:3:3461 +2894:0:4365 +2895:2:1754 +2896:0:4365 +2897:3:3462 +2898:0:4365 +2899:2:1755 +2900:2:1759 +2901:2:1760 +2902:2:1768 +2903:2:1769 +2904:2:1773 +2905:2:1774 +2906:2:1768 +2907:2:1769 +2908:2:1773 +2909:2:1774 +2910:2:1782 +2911:2:1787 +2912:2:1791 +2913:2:1792 +2914:2:1799 +2915:2:1800 +2916:2:1811 +2917:2:1812 +2918:2:1813 +2919:2:1811 +2920:2:1812 +2921:2:1813 +2922:2:1824 +2923:2:1829 +2924:2:1830 +2925:0:4365 +2926:2:1842 +2927:0:4365 +2928:3:3461 +2929:0:4365 +2930:2:1844 +2931:0:4365 +2932:3:3462 +2933:0:4365 +2934:2:1845 +2935:2:1849 +2936:2:1850 +2937:2:1858 +2938:2:1859 +2939:2:1863 +2940:2:1864 +2941:2:1858 +2942:2:1859 +2943:2:1863 +2944:2:1864 +2945:2:1872 +2946:2:1877 +2947:2:1881 +2948:2:1882 +2949:2:1889 +2950:2:1890 +2951:2:1901 +2952:2:1902 +2953:2:1903 +2954:2:1901 +2955:2:1902 +2956:2:1903 +2957:2:1914 +2958:2:1919 +2959:2:1920 +2960:0:4365 +2961:2:1932 +2962:0:4365 +2963:3:3461 +2964:0:4365 +2965:2:1934 +2966:0:4365 +2967:3:3462 +2968:0:4365 +2969:2:1935 +2970:0:4365 +2971:2:1936 +2972:0:4365 +2973:2:2129 +2974:0:4365 +2975:2:2130 +2976:0:4365 +2977:2:2134 +2978:0:4365 +2979:3:3461 +2980:0:4365 +2981:2:2136 +2982:0:4365 +2983:3:3462 +2984:0:4365 +2985:2:2137 +2986:2:2141 +2987:2:2142 +2988:2:2150 +2989:2:2151 +2990:2:2155 +2991:2:2156 +2992:2:2150 +2993:2:2151 +2994:2:2155 +2995:2:2156 +2996:2:2164 +2997:2:2169 +2998:2:2173 +2999:2:2174 +3000:2:2181 +3001:2:2182 +3002:2:2193 +3003:2:2194 +3004:2:2195 +3005:2:2193 +3006:2:2194 +3007:2:2195 +3008:2:2206 +3009:2:2211 +3010:2:2212 +3011:0:4365 +3012:2:2224 +3013:0:4365 +3014:3:3461 +3015:0:4365 +3016:2:2226 +3017:0:4365 +3018:3:3462 +3019:0:4365 +3020:2:2230 +3021:0:4365 +3022:3:3461 +3023:0:4365 +3024:2:2235 +3025:2:2239 +3026:2:2240 +3027:2:2248 +3028:2:2249 +3029:2:2253 +3030:2:2254 +3031:2:2248 +3032:2:2249 +3033:2:2250 +3034:2:2262 +3035:2:2267 +3036:2:2271 +3037:2:2272 +3038:2:2279 +3039:2:2280 +3040:2:2291 +3041:2:2292 +3042:2:2293 +3043:2:2291 +3044:2:2292 +3045:2:2293 +3046:2:2304 +3047:2:2309 +3048:2:2310 +3049:0:4365 +3050:3:3462 +3051:0:4365 +3052:2:2322 +3053:0:4365 +3054:2:1169 +3055:0:4365 +3056:3:3461 +3057:0:4365 +3058:2:1170 +3059:0:4365 +3060:3:3462 +3061:0:4365 +3062:3:3463 +3063:0:4365 +3064:3:3469 +3065:0:4365 +3066:3:3470 +3067:3:3474 +3068:3:3475 +3069:3:3483 +3070:3:3484 +3071:3:3488 +3072:3:3489 +3073:3:3483 +3074:3:3484 +3075:3:3488 +3076:3:3489 +3077:3:3497 +3078:3:3502 +3079:3:3506 +3080:3:3507 +3081:3:3514 +3082:3:3515 +3083:3:3526 +3084:3:3527 +3085:3:3528 +3086:3:3526 +3087:3:3527 +3088:3:3528 +3089:3:3539 +3090:3:3544 +3091:3:3545 +3092:0:4365 +3093:3:3557 +3094:0:4365 +3095:3:3558 +3096:0:4365 +3097:2:1173 +3098:0:4365 +3099:3:3559 +3100:0:4365 +3101:2:1179 +3102:0:4365 +3103:2:1180 +3104:0:4365 +3105:3:3558 +3106:0:4365 +3107:2:1181 +3108:2:1185 +3109:2:1186 +3110:2:1194 +3111:2:1195 +3112:2:1199 +3113:2:1200 +3114:2:1194 +3115:2:1195 +3116:2:1199 +3117:2:1200 +3118:2:1208 +3119:2:1213 +3120:2:1217 +3121:2:1218 +3122:2:1225 +3123:2:1226 +3124:2:1237 +3125:2:1238 +3126:2:1239 +3127:2:1237 +3128:2:1238 +3129:2:1239 +3130:2:1250 +3131:2:1255 +3132:2:1256 +3133:0:4365 +3134:3:3559 +3135:0:4365 +3136:2:1268 +3137:0:4365 +3138:3:3558 +3139:0:4365 +3140:2:1270 +3141:0:4365 +3142:3:3559 +3143:0:4365 +3144:2:1271 +3145:2:1275 +3146:2:1276 +3147:2:1284 +3148:2:1285 +3149:2:1289 +3150:2:1290 +3151:2:1284 +3152:2:1285 +3153:2:1289 +3154:2:1290 +3155:2:1298 +3156:2:1303 +3157:2:1307 +3158:2:1308 +3159:2:1315 +3160:2:1316 +3161:2:1327 +3162:2:1328 +3163:2:1329 +3164:2:1327 +3165:2:1328 +3166:2:1329 +3167:2:1340 +3168:2:1345 +3169:2:1346 +3170:0:4365 +3171:2:1358 +3172:0:4365 +3173:2:1360 +3174:0:4365 +3175:3:3558 +3176:0:4365 +3177:2:1361 +3178:0:4365 +3179:3:3559 +3180:0:4365 +3181:2:1362 +3182:2:1366 +3183:2:1367 +3184:2:1375 +3185:2:1376 +3186:2:1380 +3187:2:1381 +3188:2:1375 +3189:2:1376 +3190:2:1380 +3191:2:1381 +3192:2:1389 +3193:2:1394 +3194:2:1398 +3195:2:1399 +3196:2:1406 +3197:2:1407 +3198:2:1418 +3199:2:1419 +3200:2:1420 +3201:2:1418 +3202:2:1419 +3203:2:1420 +3204:2:1431 +3205:2:1436 +3206:2:1437 +3207:0:4365 +3208:2:1449 +3209:0:4365 +3210:3:3558 +3211:0:4365 +3212:2:1451 +3213:0:4365 +3214:3:3559 +3215:0:4365 +3216:2:1652 +3217:0:4365 +3218:2:1653 +3219:0:4365 +3220:2:1657 +3221:0:4365 +3222:2:1660 +3223:0:4365 +3224:3:3558 +3225:0:4365 +3226:2:1665 +3227:2:1669 +3228:2:1670 +3229:2:1678 +3230:2:1679 +3231:2:1683 +3232:2:1684 +3233:2:1678 +3234:2:1679 +3235:2:1680 +3236:2:1692 +3237:2:1697 +3238:2:1701 +3239:2:1702 +3240:2:1709 +3241:2:1710 +3242:2:1721 +3243:2:1722 +3244:2:1723 +3245:2:1721 +3246:2:1722 +3247:2:1723 +3248:2:1734 +3249:2:1739 +3250:2:1740 +3251:0:4365 +3252:3:3559 +3253:0:4365 +3254:2:1752 +3255:0:4365 +3256:3:3558 +3257:0:4365 +3258:2:1754 +3259:0:4365 +3260:3:3559 +3261:0:4365 +3262:2:1755 +3263:2:1759 +3264:2:1760 +3265:2:1768 +3266:2:1769 +3267:2:1773 +3268:2:1774 +3269:2:1768 +3270:2:1769 +3271:2:1773 +3272:2:1774 +3273:2:1782 +3274:2:1787 +3275:2:1791 +3276:2:1792 +3277:2:1799 +3278:2:1800 +3279:2:1811 +3280:2:1812 +3281:2:1813 +3282:2:1811 +3283:2:1812 +3284:2:1813 +3285:2:1824 +3286:2:1829 +3287:2:1830 +3288:0:4365 +3289:2:1842 +3290:0:4365 +3291:3:3558 +3292:0:4365 +3293:2:1844 +3294:0:4365 +3295:3:3559 +3296:0:4365 +3297:2:1845 +3298:2:1849 +3299:2:1850 +3300:2:1858 +3301:2:1859 +3302:2:1863 +3303:2:1864 +3304:2:1858 +3305:2:1859 +3306:2:1863 +3307:2:1864 +3308:2:1872 +3309:2:1877 +3310:2:1881 +3311:2:1882 +3312:2:1889 +3313:2:1890 +3314:2:1901 +3315:2:1902 +3316:2:1903 +3317:2:1901 +3318:2:1902 +3319:2:1903 +3320:2:1914 +3321:2:1919 +3322:2:1920 +3323:0:4365 +3324:2:1932 +3325:0:4365 +3326:3:3558 +3327:0:4365 +3328:2:1934 +3329:0:4365 +3330:3:3559 +3331:0:4365 +3332:2:1935 +3333:0:4365 +3334:2:1936 +3335:0:4365 +3336:2:2129 +3337:0:4365 +3338:2:2130 +3339:0:4365 +3340:2:2134 +3341:0:4365 +3342:3:3558 +3343:0:4365 +3344:2:2136 +3345:0:4365 +3346:3:3559 +3347:0:4365 +3348:2:2137 +3349:2:2141 +3350:2:2142 +3351:2:2150 +3352:2:2151 +3353:2:2155 +3354:2:2156 +3355:2:2150 +3356:2:2151 +3357:2:2155 +3358:2:2156 +3359:2:2164 +3360:2:2169 +3361:2:2173 +3362:2:2174 +3363:2:2181 +3364:2:2182 +3365:2:2193 +3366:2:2194 +3367:2:2195 +3368:2:2193 +3369:2:2194 +3370:2:2195 +3371:2:2206 +3372:2:2211 +3373:2:2212 +3374:0:4365 +3375:2:2224 +3376:0:4365 +3377:3:3558 +3378:0:4365 +3379:2:2226 +3380:0:4365 +3381:3:3559 +3382:0:4365 +3383:2:2230 +3384:0:4365 +3385:3:3558 +3386:0:4365 +3387:2:2235 +3388:2:2239 +3389:2:2240 +3390:2:2248 +3391:2:2249 +3392:2:2253 +3393:2:2254 +3394:2:2248 +3395:2:2249 +3396:2:2250 +3397:2:2262 +3398:2:2267 +3399:2:2271 +3400:2:2272 +3401:2:2279 +3402:2:2280 +3403:2:2291 +3404:2:2292 +3405:2:2293 +3406:2:2291 +3407:2:2292 +3408:2:2293 +3409:2:2304 +3410:2:2309 +3411:2:2310 +3412:0:4365 +3413:3:3559 +3414:0:4365 +3415:2:2322 +3416:0:4365 +3417:2:1169 +3418:0:4365 +3419:3:3558 +3420:0:4365 +3421:2:1170 +3422:0:4365 +3423:3:3559 +3424:0:4365 +3425:3:3560 +3426:0:4365 +3427:3:3566 +3428:0:4365 +3429:3:3569 +3430:3:3570 +3431:3:3582 +3432:3:3583 +3433:3:3587 +3434:3:3588 +3435:3:3582 +3436:3:3583 +3437:3:3587 +3438:3:3588 +3439:3:3596 +3440:3:3601 +3441:3:3605 +3442:3:3606 +3443:3:3613 +3444:3:3614 +3445:3:3625 +3446:3:3626 +3447:3:3627 +3448:3:3625 +3449:3:3626 +3450:3:3627 +3451:3:3638 +3452:3:3643 +3453:3:3644 +3454:0:4365 +3455:3:3656 +3456:0:4365 +3457:3:3657 +3458:0:4365 +3459:2:1173 +3460:0:4365 +3461:3:3658 +3462:0:4365 +3463:2:1179 +3464:0:4365 +3465:2:1180 +3466:0:4365 +3467:3:3657 +3468:0:4365 +3469:2:1181 +3470:2:1185 +3471:2:1186 +3472:2:1194 +3473:2:1195 +3474:2:1199 +3475:2:1200 +3476:2:1194 +3477:2:1195 +3478:2:1199 +3479:2:1200 +3480:2:1208 +3481:2:1213 +3482:2:1217 +3483:2:1218 +3484:2:1225 +3485:2:1226 +3486:2:1237 +3487:2:1238 +3488:2:1239 +3489:2:1237 +3490:2:1238 +3491:2:1239 +3492:2:1250 +3493:2:1255 +3494:2:1256 +3495:0:4365 +3496:3:3658 +3497:0:4365 +3498:2:1268 +3499:0:4365 +3500:3:3657 +3501:0:4365 +3502:2:1270 +3503:0:4365 +3504:3:3658 +3505:0:4365 +3506:2:1271 +3507:2:1275 +3508:2:1276 +3509:2:1284 +3510:2:1285 +3511:2:1289 +3512:2:1290 +3513:2:1284 +3514:2:1285 +3515:2:1289 +3516:2:1290 +3517:2:1298 +3518:2:1303 +3519:2:1307 +3520:2:1308 +3521:2:1315 +3522:2:1316 +3523:2:1327 +3524:2:1328 +3525:2:1329 +3526:2:1327 +3527:2:1328 +3528:2:1329 +3529:2:1340 +3530:2:1345 +3531:2:1346 +3532:0:4365 +3533:2:1358 +3534:0:4365 +3535:2:1360 +3536:0:4365 +3537:3:3657 +3538:0:4365 +3539:2:1361 +3540:0:4365 +3541:3:3658 +3542:0:4365 +3543:2:1362 +3544:2:1366 +3545:2:1367 +3546:2:1375 +3547:2:1376 +3548:2:1380 +3549:2:1381 +3550:2:1375 +3551:2:1376 +3552:2:1380 +3553:2:1381 +3554:2:1389 +3555:2:1394 +3556:2:1398 +3557:2:1399 +3558:2:1406 +3559:2:1407 +3560:2:1418 +3561:2:1419 +3562:2:1420 +3563:2:1418 +3564:2:1419 +3565:2:1420 +3566:2:1431 +3567:2:1436 +3568:2:1437 +3569:0:4365 +3570:2:1449 +3571:0:4365 +3572:3:3657 +3573:0:4365 +3574:2:1451 +3575:0:4365 +3576:3:3658 +3577:0:4365 +3578:2:1652 +3579:0:4365 +3580:2:1653 +3581:0:4365 +3582:2:1657 +3583:0:4365 +3584:2:1660 +3585:0:4365 +3586:3:3657 +3587:0:4365 +3588:2:1665 +3589:2:1669 +3590:2:1670 +3591:2:1678 +3592:2:1679 +3593:2:1683 +3594:2:1684 +3595:2:1678 +3596:2:1679 +3597:2:1680 +3598:2:1692 +3599:2:1697 +3600:2:1701 +3601:2:1702 +3602:2:1709 +3603:2:1710 +3604:2:1721 +3605:2:1722 +3606:2:1723 +3607:2:1721 +3608:2:1722 +3609:2:1723 +3610:2:1734 +3611:2:1739 +3612:2:1740 +3613:0:4365 +3614:3:3658 +3615:0:4365 +3616:2:1752 +3617:0:4365 +3618:3:3657 +3619:0:4365 +3620:2:1754 +3621:0:4365 +3622:3:3658 +3623:0:4365 +3624:2:1755 +3625:2:1759 +3626:2:1760 +3627:2:1768 +3628:2:1769 +3629:2:1773 +3630:2:1774 +3631:2:1768 +3632:2:1769 +3633:2:1773 +3634:2:1774 +3635:2:1782 +3636:2:1787 +3637:2:1791 +3638:2:1792 +3639:2:1799 +3640:2:1800 +3641:2:1811 +3642:2:1812 +3643:2:1813 +3644:2:1811 +3645:2:1812 +3646:2:1813 +3647:2:1824 +3648:2:1829 +3649:2:1830 +3650:0:4365 +3651:2:1842 +3652:0:4365 +3653:3:3657 +3654:0:4365 +3655:2:1844 +3656:0:4365 +3657:3:3658 +3658:0:4365 +3659:2:1845 +3660:2:1849 +3661:2:1850 +3662:2:1858 +3663:2:1859 +3664:2:1863 +3665:2:1864 +3666:2:1858 +3667:2:1859 +3668:2:1863 +3669:2:1864 +3670:2:1872 +3671:2:1877 +3672:2:1881 +3673:2:1882 +3674:2:1889 +3675:2:1890 +3676:2:1901 +3677:2:1902 +3678:2:1903 +3679:2:1901 +3680:2:1902 +3681:2:1903 +3682:2:1914 +3683:2:1919 +3684:2:1920 +3685:0:4365 +3686:2:1932 +3687:0:4365 +3688:3:3657 +3689:0:4365 +3690:2:1934 +3691:0:4365 +3692:3:3658 +3693:0:4365 +3694:2:1935 +3695:0:4365 +3696:2:1936 +3697:0:4365 +3698:2:2129 +3699:0:4365 +3700:2:2130 +3701:0:4365 +3702:2:2134 +3703:0:4365 +3704:3:3657 +3705:0:4365 +3706:2:2136 +3707:0:4365 +3708:3:3658 +3709:0:4365 +3710:2:2137 +3711:2:2141 +3712:2:2142 +3713:2:2150 +3714:2:2151 +3715:2:2155 +3716:2:2156 +3717:2:2150 +3718:2:2151 +3719:2:2155 +3720:2:2156 +3721:2:2164 +3722:2:2169 +3723:2:2173 +3724:2:2174 +3725:2:2181 +3726:2:2182 +3727:2:2193 +3728:2:2194 +3729:2:2195 +3730:2:2193 +3731:2:2194 +3732:2:2195 +3733:2:2206 +3734:2:2211 +3735:2:2212 +3736:0:4365 +3737:2:2224 +3738:0:4365 +3739:3:3657 +3740:0:4365 +3741:2:2226 +3742:0:4365 +3743:3:3658 +3744:0:4365 +3745:2:2230 +3746:0:4365 +3747:3:3657 +3748:0:4365 +3749:2:2235 +3750:2:2239 +3751:2:2240 +3752:2:2248 +3753:2:2249 +3754:2:2253 +3755:2:2254 +3756:2:2248 +3757:2:2249 +3758:2:2250 +3759:2:2262 +3760:2:2267 +3761:2:2271 +3762:2:2272 +3763:2:2279 +3764:2:2280 +3765:2:2291 +3766:2:2292 +3767:2:2293 +3768:2:2291 +3769:2:2292 +3770:2:2293 +3771:2:2304 +3772:2:2309 +3773:2:2310 +3774:0:4365 +3775:3:3658 +3776:0:4365 +3777:2:2322 +3778:0:4365 +3779:2:1169 +3780:0:4365 +3781:3:3657 +3782:0:4365 +3783:2:1170 +3784:0:4365 +3785:3:3658 +3786:0:4365 +3787:3:3659 +3788:0:4365 +3789:3:3665 +3790:0:4365 +3791:3:3666 +3792:0:4365 +3793:3:3667 +3794:0:4365 +3795:3:3668 +3796:0:4365 +3797:3:3669 +3798:3:3673 +3799:3:3674 +3800:3:3682 +3801:3:3683 +3802:3:3687 +3803:3:3688 +3804:3:3682 +3805:3:3683 +3806:3:3687 +3807:3:3688 +3808:3:3696 +3809:3:3701 +3810:3:3705 +3811:3:3706 +3812:3:3713 +3813:3:3714 +3814:3:3725 +3815:3:3726 +3816:3:3727 +3817:3:3725 +3818:3:3726 +3819:3:3727 +3820:3:3738 +3821:3:3743 +3822:3:3744 +3823:0:4365 +3824:3:3756 +3825:0:4365 +3826:3:3757 +3827:0:4365 +3828:2:1173 +3829:0:4365 +3830:3:3758 +3831:0:4365 +3832:2:1179 +3833:0:4365 +3834:2:1180 +3835:0:4365 +3836:3:3757 +3837:0:4365 +3838:2:1181 +3839:2:1185 +3840:2:1186 +3841:2:1194 +3842:2:1195 +3843:2:1199 +3844:2:1200 +3845:2:1194 +3846:2:1195 +3847:2:1199 +3848:2:1200 +3849:2:1208 +3850:2:1213 +3851:2:1217 +3852:2:1218 +3853:2:1225 +3854:2:1226 +3855:2:1237 +3856:2:1238 +3857:2:1239 +3858:2:1237 +3859:2:1238 +3860:2:1239 +3861:2:1250 +3862:2:1255 +3863:2:1256 +3864:0:4365 +3865:3:3758 +3866:0:4365 +3867:2:1268 +3868:0:4365 +3869:3:3757 +3870:0:4365 +3871:2:1270 +3872:0:4365 +3873:3:3758 +3874:0:4365 +3875:2:1271 +3876:2:1275 +3877:2:1276 +3878:2:1284 +3879:2:1285 +3880:2:1289 +3881:2:1290 +3882:2:1284 +3883:2:1285 +3884:2:1289 +3885:2:1290 +3886:2:1298 +3887:2:1303 +3888:2:1307 +3889:2:1308 +3890:2:1315 +3891:2:1316 +3892:2:1327 +3893:2:1328 +3894:2:1329 +3895:2:1327 +3896:2:1328 +3897:2:1329 +3898:2:1340 +3899:2:1345 +3900:2:1346 +3901:0:4365 +3902:2:1358 +3903:0:4365 +3904:2:1360 +3905:0:4365 +3906:3:3757 +3907:0:4365 +3908:2:1361 +3909:0:4365 +3910:3:3758 +3911:0:4365 +3912:2:1362 +3913:2:1366 +3914:2:1367 +3915:2:1375 +3916:2:1376 +3917:2:1380 +3918:2:1381 +3919:2:1375 +3920:2:1376 +3921:2:1380 +3922:2:1381 +3923:2:1389 +3924:2:1394 +3925:2:1398 +3926:2:1399 +3927:2:1406 +3928:2:1407 +3929:2:1418 +3930:2:1419 +3931:2:1420 +3932:2:1418 +3933:2:1419 +3934:2:1420 +3935:2:1431 +3936:2:1436 +3937:2:1437 +3938:0:4365 +3939:2:1449 +3940:0:4365 +3941:3:3757 +3942:0:4365 +3943:2:1451 +3944:0:4365 +3945:3:3758 +3946:0:4365 +3947:2:1652 +3948:0:4365 +3949:2:1653 +3950:0:4365 +3951:2:1657 +3952:0:4365 +3953:2:1660 +3954:0:4365 +3955:3:3757 +3956:0:4365 +3957:2:1665 +3958:2:1669 +3959:2:1670 +3960:2:1678 +3961:2:1679 +3962:2:1683 +3963:2:1684 +3964:2:1678 +3965:2:1679 +3966:2:1680 +3967:2:1692 +3968:2:1697 +3969:2:1701 +3970:2:1702 +3971:2:1709 +3972:2:1710 +3973:2:1721 +3974:2:1722 +3975:2:1723 +3976:2:1721 +3977:2:1722 +3978:2:1723 +3979:2:1734 +3980:2:1739 +3981:2:1740 +3982:0:4365 +3983:3:3758 +3984:0:4365 +3985:2:1752 +3986:0:4365 +3987:3:3757 +3988:0:4365 +3989:2:1754 +3990:0:4365 +3991:3:3758 +3992:0:4365 +3993:2:1755 +3994:2:1759 +3995:2:1760 +3996:2:1768 +3997:2:1769 +3998:2:1773 +3999:2:1774 +4000:2:1768 +4001:2:1769 +4002:2:1773 +4003:2:1774 +4004:2:1782 +4005:2:1787 +4006:2:1791 +4007:2:1792 +4008:2:1799 +4009:2:1800 +4010:2:1811 +4011:2:1812 +4012:2:1813 +4013:2:1811 +4014:2:1812 +4015:2:1813 +4016:2:1824 +4017:2:1829 +4018:2:1830 +4019:0:4365 +4020:2:1842 +4021:0:4365 +4022:3:3757 +4023:0:4365 +4024:2:1844 +4025:0:4365 +4026:3:3758 +4027:0:4365 +4028:2:1845 +4029:2:1849 +4030:2:1850 +4031:2:1858 +4032:2:1859 +4033:2:1863 +4034:2:1864 +4035:2:1858 +4036:2:1859 +4037:2:1863 +4038:2:1864 +4039:2:1872 +4040:2:1877 +4041:2:1881 +4042:2:1882 +4043:2:1889 +4044:2:1890 +4045:2:1901 +4046:2:1902 +4047:2:1903 +4048:2:1901 +4049:2:1902 +4050:2:1903 +4051:2:1914 +4052:2:1919 +4053:2:1920 +4054:0:4365 +4055:2:1932 +4056:0:4365 +4057:3:3757 +4058:0:4365 +4059:2:1934 +4060:0:4365 +4061:3:3758 +4062:0:4365 +4063:2:1935 +4064:0:4365 +4065:2:1936 +4066:0:4365 +4067:2:2129 +4068:0:4365 +4069:2:2130 +4070:0:4365 +4071:2:2134 +4072:0:4365 +4073:3:3757 +4074:0:4365 +4075:2:2136 +4076:0:4365 +4077:3:3758 +4078:0:4365 +4079:2:2137 +4080:2:2141 +4081:2:2142 +4082:2:2150 +4083:2:2151 +4084:2:2155 +4085:2:2156 +4086:2:2150 +4087:2:2151 +4088:2:2155 +4089:2:2156 +4090:2:2164 +4091:2:2169 +4092:2:2173 +4093:2:2174 +4094:2:2181 +4095:2:2182 +4096:2:2193 +4097:2:2194 +4098:2:2195 +4099:2:2193 +4100:2:2194 +4101:2:2195 +4102:2:2206 +4103:2:2211 +4104:2:2212 +4105:0:4365 +4106:2:2224 +4107:0:4365 +4108:3:3757 +4109:0:4365 +4110:2:2226 +4111:0:4365 +4112:3:3758 +4113:0:4365 +4114:2:2230 +4115:0:4365 +4116:3:3757 +4117:0:4365 +4118:2:2235 +4119:2:2239 +4120:2:2240 +4121:2:2248 +4122:2:2249 +4123:2:2253 +4124:2:2254 +4125:2:2248 +4126:2:2249 +4127:2:2250 +4128:2:2262 +4129:2:2267 +4130:2:2271 +4131:2:2272 +4132:2:2279 +4133:2:2280 +4134:2:2291 +4135:2:2292 +4136:2:2293 +4137:2:2291 +4138:2:2292 +4139:2:2293 +4140:2:2304 +4141:2:2309 +4142:2:2310 +4143:0:4365 +4144:3:3758 +4145:0:4365 +4146:2:2322 +4147:0:4365 +4148:2:1169 +4149:0:4365 +4150:3:3757 +4151:0:4365 +4152:2:1170 +4153:0:4365 +4154:3:3758 +4155:0:4365 +4156:3:3759 +4157:0:4365 +4158:3:3972 +4159:0:4365 +4160:3:3980 +4161:0:4365 +4162:3:3981 +4163:3:3985 +4164:3:3986 +4165:3:3994 +4166:3:3995 +4167:3:3999 +4168:3:4000 +4169:3:3994 +4170:3:3995 +4171:3:3999 +4172:3:4000 +4173:3:4008 +4174:3:4013 +4175:3:4017 +4176:3:4018 +4177:3:4025 +4178:3:4026 +4179:3:4037 +4180:3:4038 +4181:3:4039 +4182:3:4037 +4183:3:4038 +4184:3:4039 +4185:3:4050 +4186:3:4055 +4187:3:4056 +4188:0:4365 +4189:3:4068 +4190:0:4365 +4191:3:4069 +4192:0:4365 +4193:2:1173 +4194:0:4365 +4195:3:4070 +4196:0:4365 +4197:2:1179 +4198:0:4365 +4199:2:1180 +4200:0:4365 +4201:3:4069 +4202:0:4365 +4203:2:1181 +4204:2:1185 +4205:2:1186 +4206:2:1194 +4207:2:1195 +4208:2:1199 +4209:2:1200 +4210:2:1194 +4211:2:1195 +4212:2:1199 +4213:2:1200 +4214:2:1208 +4215:2:1213 +4216:2:1217 +4217:2:1218 +4218:2:1225 +4219:2:1226 +4220:2:1237 +4221:2:1238 +4222:2:1239 +4223:2:1237 +4224:2:1238 +4225:2:1239 +4226:2:1250 +4227:2:1255 +4228:2:1256 +4229:0:4365 +4230:3:4070 +4231:0:4365 +4232:2:1268 +4233:0:4365 +4234:3:4069 +4235:0:4365 +4236:2:1270 +4237:0:4365 +4238:3:4070 +4239:0:4365 +4240:2:1271 +4241:2:1275 +4242:2:1276 +4243:2:1284 +4244:2:1285 +4245:2:1289 +4246:2:1290 +4247:2:1284 +4248:2:1285 +4249:2:1289 +4250:2:1290 +4251:2:1298 +4252:2:1303 +4253:2:1307 +4254:2:1308 +4255:2:1315 +4256:2:1316 +4257:2:1327 +4258:2:1328 +4259:2:1329 +4260:2:1327 +4261:2:1328 +4262:2:1329 +4263:2:1340 +4264:2:1345 +4265:2:1346 +4266:0:4365 +4267:2:1358 +4268:0:4365 +4269:2:1360 +4270:0:4365 +4271:3:4069 +4272:0:4365 +4273:2:1361 +4274:0:4365 +4275:3:4070 +4276:0:4365 +4277:2:1362 +4278:2:1366 +4279:2:1367 +4280:2:1375 +4281:2:1376 +4282:2:1380 +4283:2:1381 +4284:2:1375 +4285:2:1376 +4286:2:1380 +4287:2:1381 +4288:2:1389 +4289:2:1394 +4290:2:1398 +4291:2:1399 +4292:2:1406 +4293:2:1407 +4294:2:1418 +4295:2:1419 +4296:2:1420 +4297:2:1418 +4298:2:1419 +4299:2:1420 +4300:2:1431 +4301:2:1436 +4302:2:1437 +4303:0:4365 +4304:2:1449 +4305:0:4365 +4306:3:4069 +4307:0:4365 +4308:2:1451 +4309:0:4365 +4310:3:4070 +4311:0:4365 +4312:2:1652 +4313:0:4365 +4314:2:1653 +4315:0:4365 +4316:2:1657 +4317:0:4365 +4318:2:1660 +4319:0:4365 +4320:3:4069 +4321:0:4365 +4322:2:1665 +4323:2:1669 +4324:2:1670 +4325:2:1678 +4326:2:1679 +4327:2:1683 +4328:2:1684 +4329:2:1678 +4330:2:1679 +4331:2:1680 +4332:2:1692 +4333:2:1697 +4334:2:1701 +4335:2:1702 +4336:2:1709 +4337:2:1710 +4338:2:1721 +4339:2:1722 +4340:2:1723 +4341:2:1721 +4342:2:1722 +4343:2:1723 +4344:2:1734 +4345:2:1739 +4346:2:1740 +4347:0:4365 +4348:3:4070 +4349:0:4365 +4350:2:1752 +4351:0:4365 +4352:3:4069 +4353:0:4365 +4354:2:1754 +4355:0:4365 +4356:3:4070 +4357:0:4365 +4358:2:1755 +4359:2:1759 +4360:2:1760 +4361:2:1768 +4362:2:1769 +4363:2:1773 +4364:2:1774 +4365:2:1768 +4366:2:1769 +4367:2:1773 +4368:2:1774 +4369:2:1782 +4370:2:1787 +4371:2:1791 +4372:2:1792 +4373:2:1799 +4374:2:1800 +4375:2:1811 +4376:2:1812 +4377:2:1813 +4378:2:1811 +4379:2:1812 +4380:2:1813 +4381:2:1824 +4382:2:1829 +4383:2:1830 +4384:0:4365 +4385:2:1842 +4386:0:4365 +4387:3:4069 +4388:0:4365 +4389:2:1844 +4390:0:4365 +4391:3:4070 +4392:0:4365 +4393:2:1845 +4394:2:1849 +4395:2:1850 +4396:2:1858 +4397:2:1859 +4398:2:1863 +4399:2:1864 +4400:2:1858 +4401:2:1859 +4402:2:1863 +4403:2:1864 +4404:2:1872 +4405:2:1877 +4406:2:1881 +4407:2:1882 +4408:2:1889 +4409:2:1890 +4410:2:1901 +4411:2:1902 +4412:2:1903 +4413:2:1901 +4414:2:1902 +4415:2:1903 +4416:2:1914 +4417:2:1919 +4418:2:1920 +4419:0:4365 +4420:2:1932 +4421:0:4365 +4422:3:4069 +4423:0:4365 +4424:2:1934 +4425:0:4365 +4426:3:4070 +4427:0:4365 +4428:2:1935 +4429:0:4365 +4430:2:1936 +4431:0:4365 +4432:2:2129 +4433:0:4365 +4434:2:2130 +4435:0:4365 +4436:2:2134 +4437:0:4365 +4438:3:4069 +4439:0:4365 +4440:2:2136 +4441:0:4365 +4442:3:4070 +4443:0:4365 +4444:2:2137 +4445:2:2141 +4446:2:2142 +4447:2:2150 +4448:2:2151 +4449:2:2155 +4450:2:2156 +4451:2:2150 +4452:2:2151 +4453:2:2155 +4454:2:2156 +4455:2:2164 +4456:2:2169 +4457:2:2173 +4458:2:2174 +4459:2:2181 +4460:2:2182 +4461:2:2193 +4462:2:2194 +4463:2:2195 +4464:2:2193 +4465:2:2194 +4466:2:2195 +4467:2:2206 +4468:2:2211 +4469:2:2212 +4470:0:4365 +4471:2:2224 +4472:0:4365 +4473:3:4069 +4474:0:4365 +4475:2:2226 +4476:0:4365 +4477:3:4070 +4478:0:4365 +4479:2:2230 +4480:0:4365 +4481:3:4069 +4482:0:4365 +4483:2:2235 +4484:2:2239 +4485:2:2240 +4486:2:2248 +4487:2:2249 +4488:2:2253 +4489:2:2254 +4490:2:2248 +4491:2:2249 +4492:2:2250 +4493:2:2262 +4494:2:2267 +4495:2:2271 +4496:2:2272 +4497:2:2279 +4498:2:2280 +4499:2:2291 +4500:2:2292 +4501:2:2293 +4502:2:2291 +4503:2:2292 +4504:2:2293 +4505:2:2304 +4506:2:2309 +4507:2:2310 +4508:0:4365 +4509:3:4070 +4510:0:4365 +4511:2:2322 +4512:0:4365 +4513:2:1169 +4514:0:4365 +4515:3:4069 +4516:0:4365 +4517:2:1170 +4518:0:4365 +4519:3:4070 +4520:0:4365 +4521:3:4071 +4522:0:4365 +4523:3:4081 +4524:0:4365 +4525:3:3666 +4526:0:4365 +4527:3:3667 +4528:0:4365 +4529:3:3668 +4530:0:4365 +4531:3:3669 +4532:3:3673 +4533:3:3674 +4534:3:3682 +4535:3:3683 +4536:3:3687 +4537:3:3688 +4538:3:3682 +4539:3:3683 +4540:3:3687 +4541:3:3688 +4542:3:3696 +4543:3:3701 +4544:3:3705 +4545:3:3706 +4546:3:3713 +4547:3:3714 +4548:3:3725 +4549:3:3726 +4550:3:3727 +4551:3:3725 +4552:3:3726 +4553:3:3727 +4554:3:3738 +4555:3:3743 +4556:3:3744 +4557:0:4365 +4558:3:3756 +4559:0:4365 +4560:3:3757 +4561:0:4365 +4562:2:1173 +4563:0:4365 +4564:3:3758 +4565:0:4365 +4566:2:1179 +4567:0:4365 +4568:2:1180 +4569:0:4365 +4570:3:3757 +4571:0:4365 +4572:2:1181 +4573:2:1185 +4574:2:1186 +4575:2:1194 +4576:2:1195 +4577:2:1199 +4578:2:1200 +4579:2:1194 +4580:2:1195 +4581:2:1199 +4582:2:1200 +4583:2:1208 +4584:2:1213 +4585:2:1217 +4586:2:1218 +4587:2:1225 +4588:2:1226 +4589:2:1237 +4590:2:1238 +4591:2:1239 +4592:2:1237 +4593:2:1238 +4594:2:1239 +4595:2:1250 +4596:2:1255 +4597:2:1256 +4598:0:4365 +4599:3:3758 +4600:0:4365 +4601:2:1268 +4602:0:4365 +4603:3:3757 +4604:0:4365 +4605:2:1270 +4606:0:4365 +4607:3:3758 +4608:0:4365 +4609:2:1271 +4610:2:1275 +4611:2:1276 +4612:2:1284 +4613:2:1285 +4614:2:1289 +4615:2:1290 +4616:2:1284 +4617:2:1285 +4618:2:1289 +4619:2:1290 +4620:2:1298 +4621:2:1303 +4622:2:1307 +4623:2:1308 +4624:2:1315 +4625:2:1316 +4626:2:1327 +4627:2:1328 +4628:2:1329 +4629:2:1327 +4630:2:1328 +4631:2:1329 +4632:2:1340 +4633:2:1345 +4634:2:1346 +4635:0:4365 +4636:2:1358 +4637:0:4365 +4638:2:1360 +4639:0:4365 +4640:3:3757 +4641:0:4365 +4642:2:1361 +4643:0:4365 +4644:3:3758 +4645:0:4365 +4646:2:1362 +4647:2:1366 +4648:2:1367 +4649:2:1375 +4650:2:1376 +4651:2:1380 +4652:2:1381 +4653:2:1375 +4654:2:1376 +4655:2:1380 +4656:2:1381 +4657:2:1389 +4658:2:1394 +4659:2:1398 +4660:2:1399 +4661:2:1406 +4662:2:1407 +4663:2:1418 +4664:2:1419 +4665:2:1420 +4666:2:1418 +4667:2:1419 +4668:2:1420 +4669:2:1431 +4670:2:1436 +4671:2:1437 +4672:0:4365 +4673:2:1449 +4674:0:4365 +4675:3:3757 +4676:0:4365 +4677:2:1451 +4678:0:4365 +4679:3:3758 +4680:0:4365 +4681:2:1652 +4682:0:4365 +4683:2:1653 +4684:0:4365 +4685:2:1657 +4686:0:4365 +4687:2:1660 +4688:0:4365 +4689:3:3757 +4690:0:4365 +4691:2:1665 +4692:2:1669 +4693:2:1670 +4694:2:1678 +4695:2:1679 +4696:2:1683 +4697:2:1684 +4698:2:1678 +4699:2:1679 +4700:2:1680 +4701:2:1692 +4702:2:1697 +4703:2:1701 +4704:2:1702 +4705:2:1709 +4706:2:1710 +4707:2:1721 +4708:2:1722 +4709:2:1723 +4710:2:1721 +4711:2:1722 +4712:2:1723 +4713:2:1734 +4714:2:1739 +4715:2:1740 +4716:0:4365 +4717:3:3758 +4718:0:4365 +4719:2:1752 +4720:0:4365 +4721:3:3757 +4722:0:4365 +4723:2:1754 +4724:0:4365 +4725:3:3758 +4726:0:4365 +4727:2:1755 +4728:2:1759 +4729:2:1760 +4730:2:1768 +4731:2:1769 +4732:2:1773 +4733:2:1774 +4734:2:1768 +4735:2:1769 +4736:2:1773 +4737:2:1774 +4738:2:1782 +4739:2:1787 +4740:2:1791 +4741:2:1792 +4742:2:1799 +4743:2:1800 +4744:2:1811 +4745:2:1812 +4746:2:1813 +4747:2:1811 +4748:2:1812 +4749:2:1813 +4750:2:1824 +4751:2:1829 +4752:2:1830 +4753:0:4365 +4754:2:1842 +4755:0:4365 +4756:3:3757 +4757:0:4365 +4758:2:1844 +4759:0:4365 +4760:3:3758 +4761:0:4365 +4762:2:1845 +4763:2:1849 +4764:2:1850 +4765:2:1858 +4766:2:1859 +4767:2:1863 +4768:2:1864 +4769:2:1858 +4770:2:1859 +4771:2:1863 +4772:2:1864 +4773:2:1872 +4774:2:1877 +4775:2:1881 +4776:2:1882 +4777:2:1889 +4778:2:1890 +4779:2:1901 +4780:2:1902 +4781:2:1903 +4782:2:1901 +4783:2:1902 +4784:2:1903 +4785:2:1914 +4786:2:1919 +4787:2:1920 +4788:0:4365 +4789:2:1932 +4790:0:4365 +4791:3:3757 +4792:0:4365 +4793:2:1934 +4794:0:4365 +4795:3:3758 +4796:0:4365 +4797:2:1935 +4798:0:4365 +4799:2:1936 +4800:0:4365 +4801:2:2129 +4802:0:4365 +4803:2:2130 +4804:0:4365 +4805:2:2134 +4806:0:4365 +4807:3:3757 +4808:0:4365 +4809:2:2136 +4810:0:4365 +4811:3:3758 +4812:0:4365 +4813:2:2137 +4814:2:2141 +4815:2:2142 +4816:2:2150 +4817:2:2151 +4818:2:2155 +4819:2:2156 +4820:2:2150 +4821:2:2151 +4822:2:2155 +4823:2:2156 +4824:2:2164 +4825:2:2169 +4826:2:2173 +4827:2:2174 +4828:2:2181 +4829:2:2182 +4830:2:2193 +4831:2:2194 +4832:2:2195 +4833:2:2193 +4834:2:2194 +4835:2:2195 +4836:2:2206 +4837:2:2211 +4838:2:2212 +4839:0:4365 +4840:2:2224 +4841:0:4365 +4842:3:3757 +4843:0:4365 +4844:2:2226 +4845:0:4365 +4846:3:3758 +4847:0:4365 +4848:2:2230 +4849:0:4365 +4850:3:3757 +4851:0:4365 +4852:2:2235 +4853:2:2239 +4854:2:2240 +4855:2:2248 +4856:2:2249 +4857:2:2253 +4858:2:2254 +4859:2:2248 +4860:2:2249 +4861:2:2250 +4862:2:2262 +4863:2:2267 +4864:2:2271 +4865:2:2272 +4866:2:2279 +4867:2:2280 +4868:2:2291 +4869:2:2292 +4870:2:2293 +4871:2:2291 +4872:2:2292 +4873:2:2293 +4874:2:2304 +4875:2:2309 +4876:2:2310 +4877:0:4365 +4878:3:3758 +4879:0:4365 +4880:2:2322 +4881:0:4365 +4882:2:1169 +4883:0:4365 +4884:3:3757 +4885:0:4365 +4886:2:1170 +4887:0:4365 +4888:3:3758 +4889:0:4365 +4890:3:3759 +4891:0:4365 +4892:3:3972 +4893:0:4365 +4894:3:4077 +4895:0:4365 +4896:3:4078 +4897:0:4365 +4898:3:4082 +4899:0:4365 +4900:3:4088 +4901:0:4365 +4902:3:4092 +4903:3:4093 +4904:3:4097 +4905:3:4101 +4906:3:4102 +4907:3:4097 +4908:3:4101 +4909:3:4102 +4910:3:4106 +4911:3:4114 +4912:3:4115 +4913:3:4120 +4914:3:4127 +4915:3:4128 +4916:3:4127 +4917:3:4128 +4918:3:4135 +4919:3:4140 +4920:0:4365 +4921:3:4151 +4922:0:4365 +4923:3:4155 +4924:3:4156 +4925:3:4160 +4926:3:4164 +4927:3:4165 +4928:3:4160 +4929:3:4164 +4930:3:4165 +4931:3:4169 +4932:3:4177 +4933:3:4178 +4934:3:4183 +4935:3:4190 +4936:3:4191 +4937:3:4190 +4938:3:4191 +4939:3:4198 +4940:3:4203 +4941:0:4365 +4942:3:4151 +4943:0:4365 +4944:3:4155 +4945:3:4156 +4946:3:4160 +4947:3:4164 +4948:3:4165 +4949:3:4160 +4950:3:4164 +4951:3:4165 +4952:3:4169 +4953:3:4177 +4954:3:4178 +4955:3:4183 +4956:3:4190 +4957:3:4191 +4958:3:4190 +4959:3:4191 +4960:3:4198 +4961:3:4203 +4962:0:4365 +4963:3:4214 +4964:0:4365 +4965:3:4222 +4966:3:4223 +4967:3:4227 +4968:3:4231 +4969:3:4232 +4970:3:4227 +4971:3:4231 +4972:3:4232 +4973:3:4236 +4974:3:4244 +4975:3:4245 +4976:3:4250 +4977:3:4257 +4978:3:4258 +4979:3:4257 +4980:3:4258 +4981:3:4265 +4982:3:4270 +4983:0:4365 +4984:3:4285 +4985:0:4365 +4986:3:4286 +4987:0:4365 +4988:2:1173 +4989:0:4365 +4990:3:4287 +4991:0:4365 +4992:2:1179 +4993:0:4365 +4994:2:1180 +4995:0:4365 +4996:3:4286 +4997:0:4365 +4998:2:1181 +4999:2:1185 +5000:2:1186 +5001:2:1194 +5002:2:1195 +5003:2:1199 +5004:2:1200 +5005:2:1194 +5006:2:1195 +5007:2:1199 +5008:2:1200 +5009:2:1208 +5010:2:1213 +5011:2:1217 +5012:2:1218 +5013:2:1225 +5014:2:1226 +5015:2:1237 +5016:2:1238 +5017:2:1239 +5018:2:1237 +5019:2:1238 +5020:2:1239 +5021:2:1250 +5022:2:1255 +5023:2:1256 +5024:0:4365 +5025:3:4287 +5026:0:4365 +5027:2:1268 +5028:0:4365 +5029:3:4286 +5030:0:4365 +5031:2:1270 +5032:0:4365 +5033:3:4287 +5034:0:4365 +5035:2:1271 +5036:2:1275 +5037:2:1276 +5038:2:1284 +5039:2:1285 +5040:2:1289 +5041:2:1290 +5042:2:1284 +5043:2:1285 +5044:2:1289 +5045:2:1290 +5046:2:1298 +5047:2:1303 +5048:2:1307 +5049:2:1308 +5050:2:1315 +5051:2:1316 +5052:2:1327 +5053:2:1328 +5054:2:1329 +5055:2:1327 +5056:2:1328 +5057:2:1329 +5058:2:1340 +5059:2:1345 +5060:2:1346 +5061:0:4365 +5062:2:1358 +5063:0:4365 +5064:2:1360 +5065:0:4365 +5066:3:4286 +5067:0:4365 +5068:2:1361 +5069:0:4365 +5070:3:4287 +5071:0:4365 +5072:2:1362 +5073:2:1366 +5074:2:1367 +5075:2:1375 +5076:2:1376 +5077:2:1380 +5078:2:1381 +5079:2:1375 +5080:2:1376 +5081:2:1380 +5082:2:1381 +5083:2:1389 +5084:2:1394 +5085:2:1398 +5086:2:1399 +5087:2:1406 +5088:2:1407 +5089:2:1418 +5090:2:1419 +5091:2:1420 +5092:2:1418 +5093:2:1419 +5094:2:1420 +5095:2:1431 +5096:2:1436 +5097:2:1437 +5098:0:4365 +5099:2:1449 +5100:0:4365 +5101:3:4286 +5102:0:4365 +5103:2:1451 +5104:0:4365 +5105:3:4287 +5106:0:4365 +5107:2:1652 +5108:0:4365 +5109:2:1653 +5110:0:4365 +5111:2:1657 +5112:0:4365 +5113:2:1660 +5114:0:4365 +5115:3:4286 +5116:0:4365 +5117:2:1665 +5118:2:1669 +5119:2:1670 +5120:2:1678 +5121:2:1679 +5122:2:1683 +5123:2:1684 +5124:2:1678 +5125:2:1679 +5126:2:1680 +5127:2:1692 +5128:2:1697 +5129:2:1701 +5130:2:1702 +5131:2:1709 +5132:2:1710 +5133:2:1721 +5134:2:1722 +5135:2:1723 +5136:2:1721 +5137:2:1722 +5138:2:1723 +5139:2:1734 +5140:2:1739 +5141:2:1740 +5142:0:4365 +5143:3:4287 +5144:0:4365 +5145:2:1752 +5146:0:4365 +5147:3:4286 +5148:0:4365 +5149:2:1754 +5150:0:4365 +5151:3:4287 +5152:0:4365 +5153:2:1755 +5154:2:1759 +5155:2:1760 +5156:2:1768 +5157:2:1769 +5158:2:1773 +5159:2:1774 +5160:2:1768 +5161:2:1769 +5162:2:1773 +5163:2:1774 +5164:2:1782 +5165:2:1787 +5166:2:1791 +5167:2:1792 +5168:2:1799 +5169:2:1800 +5170:2:1811 +5171:2:1812 +5172:2:1813 +5173:2:1811 +5174:2:1812 +5175:2:1813 +5176:2:1824 +5177:2:1829 +5178:2:1830 +5179:0:4365 +5180:2:1842 +5181:0:4365 +5182:3:4286 +5183:0:4365 +5184:2:1844 +5185:0:4365 +5186:3:4287 +5187:0:4365 +5188:2:1845 +5189:2:1849 +5190:2:1850 +5191:2:1858 +5192:2:1859 +5193:2:1863 +5194:2:1864 +5195:2:1858 +5196:2:1859 +5197:2:1863 +5198:2:1864 +5199:2:1872 +5200:2:1877 +5201:2:1881 +5202:2:1882 +5203:2:1889 +5204:2:1890 +5205:2:1901 +5206:2:1902 +5207:2:1903 +5208:2:1901 +5209:2:1902 +5210:2:1903 +5211:2:1914 +5212:2:1919 +5213:2:1920 +5214:0:4365 +5215:2:1932 +5216:0:4365 +5217:3:4286 +5218:0:4365 +5219:2:1934 +5220:0:4365 +5221:3:4287 +5222:0:4365 +5223:2:1935 +5224:0:4365 +5225:2:1936 +5226:0:4365 +5227:2:2129 +5228:0:4365 +5229:2:2130 +5230:0:4365 +5231:2:2134 +5232:0:4365 +5233:3:4286 +5234:0:4365 +5235:2:2136 +5236:0:4365 +5237:3:4287 +5238:0:4365 +5239:2:2137 +5240:2:2141 +5241:2:2142 +5242:2:2150 +5243:2:2151 +5244:2:2155 +5245:2:2156 +5246:2:2150 +5247:2:2151 +5248:2:2155 +5249:2:2156 +5250:2:2164 +5251:2:2169 +5252:2:2173 +5253:2:2174 +5254:2:2181 +5255:2:2182 +5256:2:2193 +5257:2:2194 +5258:2:2195 +5259:2:2193 +5260:2:2194 +5261:2:2195 +5262:2:2206 +5263:2:2211 +5264:2:2212 +5265:0:4365 +5266:2:2224 +5267:0:4365 +5268:3:4286 +5269:0:4365 +5270:2:2226 +5271:0:4365 +5272:3:4287 +5273:0:4365 +5274:2:2230 +5275:0:4365 +5276:3:4286 +5277:0:4365 +5278:2:2235 +5279:2:2239 +5280:2:2240 +5281:2:2248 +5282:2:2249 +5283:2:2253 +5284:2:2254 +5285:2:2248 +5286:2:2249 +5287:2:2250 +5288:2:2262 +5289:2:2267 +5290:2:2271 +5291:2:2272 +5292:2:2279 +5293:2:2280 +5294:2:2291 +5295:2:2292 +5296:2:2293 +5297:2:2291 +5298:2:2292 +5299:2:2293 +5300:2:2304 +5301:2:2309 +5302:2:2310 +5303:0:4365 +5304:3:4287 +5305:0:4365 +5306:2:2322 +5307:0:4365 +5308:2:1169 +5309:0:4365 +5310:3:4286 +5311:0:4365 +5312:2:1170 +5313:0:4365 +5314:3:4287 +5315:0:4365 +5316:3:4288 +5317:0:4365 +5318:3:4294 +5319:0:4365 +5320:3:4295 +5321:0:4365 +5322:3:2338 +5323:0:4365 +5324:3:2339 +5325:3:2343 +5326:3:2344 +5327:3:2352 +5328:3:2353 +5329:3:2357 +5330:3:2358 +5331:3:2352 +5332:3:2353 +5333:3:2357 +5334:3:2358 +5335:3:2366 +5336:3:2371 +5337:3:2375 +5338:3:2376 +5339:3:2383 +5340:3:2384 +5341:3:2395 +5342:3:2396 +5343:3:2397 +5344:3:2395 +5345:3:2396 +5346:3:2397 +5347:3:2408 +5348:3:2413 +5349:3:2414 +5350:0:4365 +5351:3:2426 +5352:0:4365 +5353:3:2427 +5354:0:4365 +5355:2:1173 +5356:0:4365 +5357:3:2428 +5358:0:4365 +5359:2:1179 +5360:0:4365 +5361:2:1180 +5362:0:4365 +5363:3:2427 +5364:0:4365 +5365:2:1181 +5366:2:1185 +5367:2:1186 +5368:2:1194 +5369:2:1195 +5370:2:1199 +5371:2:1200 +5372:2:1194 +5373:2:1195 +5374:2:1199 +5375:2:1200 +5376:2:1208 +5377:2:1213 +5378:2:1217 +5379:2:1218 +5380:2:1225 +5381:2:1226 +5382:2:1237 +5383:2:1238 +5384:2:1239 +5385:2:1237 +5386:2:1238 +5387:2:1239 +5388:2:1250 +5389:2:1255 +5390:2:1256 +5391:0:4365 +5392:3:2428 +5393:0:4365 +5394:2:1268 +5395:0:4365 +5396:3:2427 +5397:0:4365 +5398:2:1270 +5399:0:4365 +5400:3:2428 +5401:0:4365 +5402:2:1271 +5403:2:1275 +5404:2:1276 +5405:2:1284 +5406:2:1285 +5407:2:1289 +5408:2:1290 +5409:2:1284 +5410:2:1285 +5411:2:1289 +5412:2:1290 +5413:2:1298 +5414:2:1303 +5415:2:1307 +5416:2:1308 +5417:2:1315 +5418:2:1316 +5419:2:1327 +5420:2:1328 +5421:2:1329 +5422:2:1327 +5423:2:1328 +5424:2:1329 +5425:2:1340 +5426:2:1345 +5427:2:1346 +5428:0:4365 +5429:2:1358 +5430:0:4365 +5431:2:1360 +5432:0:4365 +5433:3:2427 +5434:0:4365 +5435:2:1361 +5436:0:4365 +5437:3:2428 +5438:0:4365 +5439:2:1362 +5440:2:1366 +5441:2:1367 +5442:2:1375 +5443:2:1376 +5444:2:1380 +5445:2:1381 +5446:2:1375 +5447:2:1376 +5448:2:1380 +5449:2:1381 +5450:2:1389 +5451:2:1394 +5452:2:1398 +5453:2:1399 +5454:2:1406 +5455:2:1407 +5456:2:1418 +5457:2:1419 +5458:2:1420 +5459:2:1418 +5460:2:1419 +5461:2:1420 +5462:2:1431 +5463:2:1436 +5464:2:1437 +5465:0:4365 +5466:2:1449 +5467:0:4365 +5468:3:2427 +5469:0:4365 +5470:2:1451 +5471:0:4365 +5472:3:2428 +5473:0:4365 +5474:2:1652 +5475:0:4365 +5476:2:1653 +5477:0:4365 +5478:2:1657 +5479:0:4365 +5480:2:1660 +5481:0:4365 +5482:3:2427 +5483:0:4365 +5484:2:1665 +5485:2:1669 +5486:2:1670 +5487:2:1678 +5488:2:1679 +5489:2:1683 +5490:2:1684 +5491:2:1678 +5492:2:1679 +5493:2:1680 +5494:2:1692 +5495:2:1697 +5496:2:1701 +5497:2:1702 +5498:2:1709 +5499:2:1710 +5500:2:1721 +5501:2:1722 +5502:2:1723 +5503:2:1721 +5504:2:1722 +5505:2:1723 +5506:2:1734 +5507:2:1739 +5508:2:1740 +5509:0:4365 +5510:3:2428 +5511:0:4365 +5512:2:1752 +5513:0:4365 +5514:3:2427 +5515:0:4365 +5516:2:1754 +5517:0:4365 +5518:3:2428 +5519:0:4365 +5520:2:1755 +5521:2:1759 +5522:2:1760 +5523:2:1768 +5524:2:1769 +5525:2:1773 +5526:2:1774 +5527:2:1768 +5528:2:1769 +5529:2:1773 +5530:2:1774 +5531:2:1782 +5532:2:1787 +5533:2:1791 +5534:2:1792 +5535:2:1799 +5536:2:1800 +5537:2:1811 +5538:2:1812 +5539:2:1813 +5540:2:1811 +5541:2:1812 +5542:2:1813 +5543:2:1824 +5544:2:1829 +5545:2:1830 +5546:0:4365 +5547:2:1842 +5548:0:4365 +5549:3:2427 +5550:0:4365 +5551:2:1844 +5552:0:4365 +5553:3:2428 +5554:0:4365 +5555:2:1845 +5556:2:1849 +5557:2:1850 +5558:2:1858 +5559:2:1859 +5560:2:1863 +5561:2:1864 +5562:2:1858 +5563:2:1859 +5564:2:1863 +5565:2:1864 +5566:2:1872 +5567:2:1877 +5568:2:1881 +5569:2:1882 +5570:2:1889 +5571:2:1890 +5572:2:1901 +5573:2:1902 +5574:2:1903 +5575:2:1901 +5576:2:1902 +5577:2:1903 +5578:2:1914 +5579:2:1919 +5580:2:1920 +5581:0:4365 +5582:2:1932 +5583:0:4365 +5584:3:2427 +5585:0:4365 +5586:2:1934 +5587:0:4365 +5588:3:2428 +5589:0:4365 +5590:2:1935 +5591:0:4365 +5592:2:1936 +5593:0:4365 +5594:2:2129 +5595:0:4365 +5596:2:2130 +5597:0:4365 +5598:2:2134 +5599:0:4365 +5600:3:2427 +5601:0:4365 +5602:2:2136 +5603:0:4365 +5604:3:2428 +5605:0:4365 +5606:2:2137 +5607:2:2141 +5608:2:2142 +5609:2:2150 +5610:2:2151 +5611:2:2155 +5612:2:2156 +5613:2:2150 +5614:2:2151 +5615:2:2155 +5616:2:2156 +5617:2:2164 +5618:2:2169 +5619:2:2173 +5620:2:2174 +5621:2:2181 +5622:2:2182 +5623:2:2193 +5624:2:2194 +5625:2:2195 +5626:2:2193 +5627:2:2194 +5628:2:2195 +5629:2:2206 +5630:2:2211 +5631:2:2212 +5632:0:4365 +5633:2:2224 +5634:0:4365 +5635:3:2427 +5636:0:4365 +5637:2:2226 +5638:0:4365 +5639:3:2428 +5640:0:4365 +5641:2:2230 +5642:0:4365 +5643:3:2427 +5644:0:4365 +5645:2:2235 +5646:2:2239 +5647:2:2240 +5648:2:2248 +5649:2:2249 +5650:2:2253 +5651:2:2254 +5652:2:2248 +5653:2:2249 +5654:2:2250 +5655:2:2262 +5656:2:2267 +5657:2:2271 +5658:2:2272 +5659:2:2279 +5660:2:2280 +5661:2:2291 +5662:2:2292 +5663:2:2293 +5664:2:2291 +5665:2:2292 +5666:2:2293 +5667:2:2304 +5668:2:2309 +5669:2:2310 +5670:0:4365 +5671:3:2428 +5672:0:4365 +5673:2:2322 +5674:0:4365 +5675:2:1169 +5676:0:4365 +5677:3:2427 +5678:0:4365 +5679:2:1170 +5680:0:4365 +5681:3:2428 +5682:0:4365 +5683:3:2429 +5684:0:4365 +5685:3:2435 +5686:3:2436 +5687:0:4365 +5688:3:2440 +5689:3:2444 +5690:3:2445 +5691:3:2453 +5692:3:2454 +5693:3:2458 +5694:3:2459 +5695:3:2453 +5696:3:2454 +5697:3:2458 +5698:3:2459 +5699:3:2467 +5700:3:2472 +5701:3:2473 +5702:3:2484 +5703:3:2485 +5704:3:2496 +5705:3:2497 +5706:3:2498 +5707:3:2496 +5708:3:2497 +5709:3:2498 +5710:3:2509 +5711:3:2514 +5712:3:2515 +5713:0:4365 +5714:3:2527 +5715:0:4365 +5716:3:2528 +5717:0:4365 +5718:2:1173 +5719:0:4365 +5720:3:2529 +5721:0:4365 +5722:2:1179 +5723:0:4365 +5724:2:1180 +5725:0:4365 +5726:3:2528 +5727:0:4365 +5728:2:1181 +5729:2:1185 +5730:2:1186 +5731:2:1194 +5732:2:1195 +5733:2:1199 +5734:2:1200 +5735:2:1194 +5736:2:1195 +5737:2:1199 +5738:2:1200 +5739:2:1208 +5740:2:1213 +5741:2:1217 +5742:2:1218 +5743:2:1225 +5744:2:1226 +5745:2:1237 +5746:2:1238 +5747:2:1239 +5748:2:1237 +5749:2:1238 +5750:2:1239 +5751:2:1250 +5752:2:1255 +5753:2:1256 +5754:0:4365 +5755:3:2529 +5756:0:4365 +5757:2:1268 +5758:0:4365 +5759:3:2528 +5760:0:4365 +5761:2:1270 +5762:0:4365 +5763:3:2529 +5764:0:4365 +5765:2:1271 +5766:2:1275 +5767:2:1276 +5768:2:1284 +5769:2:1285 +5770:2:1289 +5771:2:1290 +5772:2:1284 +5773:2:1285 +5774:2:1289 +5775:2:1290 +5776:2:1298 +5777:2:1303 +5778:2:1307 +5779:2:1308 +5780:2:1315 +5781:2:1316 +5782:2:1327 +5783:2:1328 +5784:2:1329 +5785:2:1327 +5786:2:1328 +5787:2:1329 +5788:2:1340 +5789:2:1345 +5790:2:1346 +5791:0:4365 +5792:2:1358 +5793:0:4365 +5794:2:1360 +5795:0:4365 +5796:3:2528 +5797:0:4365 +5798:2:1361 +5799:0:4365 +5800:3:2529 +5801:0:4365 +5802:2:1362 +5803:2:1366 +5804:2:1367 +5805:2:1375 +5806:2:1376 +5807:2:1380 +5808:2:1381 +5809:2:1375 +5810:2:1376 +5811:2:1380 +5812:2:1381 +5813:2:1389 +5814:2:1394 +5815:2:1398 +5816:2:1399 +5817:2:1406 +5818:2:1407 +5819:2:1418 +5820:2:1419 +5821:2:1420 +5822:2:1418 +5823:2:1419 +5824:2:1420 +5825:2:1431 +5826:2:1436 +5827:2:1437 +5828:0:4365 +5829:2:1449 +5830:0:4365 +5831:3:2528 +5832:0:4365 +5833:2:1451 +5834:0:4365 +5835:3:2529 +5836:0:4365 +5837:2:1652 +5838:0:4365 +5839:2:1653 +5840:0:4365 +5841:2:1657 +5842:0:4365 +5843:2:1660 +5844:0:4365 +5845:3:2528 +5846:0:4365 +5847:2:1665 +5848:2:1669 +5849:2:1670 +5850:2:1678 +5851:2:1679 +5852:2:1683 +5853:2:1684 +5854:2:1678 +5855:2:1679 +5856:2:1680 +5857:2:1692 +5858:2:1697 +5859:2:1701 +5860:2:1702 +5861:2:1709 +5862:2:1710 +5863:2:1721 +5864:2:1722 +5865:2:1723 +5866:2:1721 +5867:2:1722 +5868:2:1723 +5869:2:1734 +5870:2:1739 +5871:2:1740 +5872:0:4365 +5873:3:2529 +5874:0:4365 +5875:2:1752 +5876:0:4365 +5877:3:2528 +5878:0:4365 +5879:2:1754 +5880:0:4365 +5881:3:2529 +5882:0:4365 +5883:2:1755 +5884:2:1759 +5885:2:1760 +5886:2:1768 +5887:2:1769 +5888:2:1773 +5889:2:1774 +5890:2:1768 +5891:2:1769 +5892:2:1773 +5893:2:1774 +5894:2:1782 +5895:2:1787 +5896:2:1791 +5897:2:1792 +5898:2:1799 +5899:2:1800 +5900:2:1811 +5901:2:1812 +5902:2:1813 +5903:2:1811 +5904:2:1812 +5905:2:1813 +5906:2:1824 +5907:2:1829 +5908:2:1830 +5909:0:4365 +5910:2:1842 +5911:0:4365 +5912:3:2528 +5913:0:4365 +5914:2:1844 +5915:0:4365 +5916:3:2529 +5917:0:4365 +5918:2:1845 +5919:2:1849 +5920:2:1850 +5921:2:1858 +5922:2:1859 +5923:2:1863 +5924:2:1864 +5925:2:1858 +5926:2:1859 +5927:2:1863 +5928:2:1864 +5929:2:1872 +5930:2:1877 +5931:2:1881 +5932:2:1882 +5933:2:1889 +5934:2:1890 +5935:2:1901 +5936:2:1902 +5937:2:1903 +5938:2:1901 +5939:2:1902 +5940:2:1903 +5941:2:1914 +5942:2:1919 +5943:2:1920 +5944:0:4365 +5945:2:1932 +5946:0:4365 +5947:3:2528 +5948:0:4365 +5949:2:1934 +5950:0:4365 +5951:3:2529 +5952:0:4365 +5953:2:1935 +5954:0:4365 +5955:2:1936 +5956:0:4365 +5957:2:2129 +5958:0:4365 +5959:2:2130 +5960:0:4365 +5961:2:2134 +5962:0:4365 +5963:3:2528 +5964:0:4365 +5965:2:2136 +5966:0:4365 +5967:3:2529 +5968:0:4365 +5969:2:2137 +5970:2:2141 +5971:2:2142 +5972:2:2150 +5973:2:2151 +5974:2:2155 +5975:2:2156 +5976:2:2150 +5977:2:2151 +5978:2:2155 +5979:2:2156 +5980:2:2164 +5981:2:2169 +5982:2:2173 +5983:2:2174 +5984:2:2181 +5985:2:2182 +5986:2:2193 +5987:2:2194 +5988:2:2195 +5989:2:2193 +5990:2:2194 +5991:2:2195 +5992:2:2206 +5993:2:2211 +5994:2:2212 +5995:0:4365 +5996:2:2224 +5997:0:4365 +5998:3:2528 +5999:0:4365 +6000:2:2226 +6001:0:4365 +6002:3:2529 +6003:0:4365 +6004:2:2230 +6005:0:4365 +6006:3:2528 +6007:0:4365 +6008:2:2235 +6009:2:2239 +6010:2:2240 +6011:2:2248 +6012:2:2249 +6013:2:2253 +6014:2:2254 +6015:2:2248 +6016:2:2249 +6017:2:2250 +6018:2:2262 +6019:2:2267 +6020:2:2271 +6021:2:2272 +6022:2:2279 +6023:2:2280 +6024:2:2291 +6025:2:2292 +6026:2:2293 +6027:2:2291 +6028:2:2292 +6029:2:2293 +6030:2:2304 +6031:2:2309 +6032:2:2310 +6033:0:4365 +6034:3:2529 +6035:0:4365 +6036:2:2322 +6037:0:4365 +6038:2:1169 +6039:0:4365 +6040:3:2528 +6041:0:4365 +6042:2:1170 +6043:0:4365 +6044:3:2529 +6045:0:4365 +6046:3:2530 +6047:0:4365 +6048:3:2536 +6049:0:4365 +6050:3:2537 +6051:0:4365 +6052:3:2547 +6053:0:4365 +6054:3:2548 +6055:0:4365 +6056:3:2552 +6057:3:2553 +6058:3:2557 +6059:3:2561 +6060:3:2562 +6061:3:2557 +6062:3:2561 +6063:3:2562 +6064:3:2566 +6065:3:2574 +6066:3:2575 +6067:3:2580 +6068:3:2587 +6069:3:2588 +6070:3:2587 +6071:3:2588 +6072:3:2595 +6073:3:2600 +6074:0:4365 +6075:3:2611 +6076:0:4365 +6077:3:2615 +6078:3:2616 +6079:3:2620 +6080:3:2624 +6081:3:2625 +6082:3:2620 +6083:3:2624 +6084:3:2625 +6085:3:2629 +6086:3:2637 +6087:3:2638 +6088:3:2643 +6089:3:2650 +6090:3:2651 +6091:3:2650 +6092:3:2651 +6093:3:2658 +6094:3:2663 +6095:0:4365 +6096:3:2611 +6097:0:4365 +6098:3:2615 +6099:3:2616 +6100:3:2620 +6101:3:2624 +6102:3:2625 +6103:3:2620 +6104:3:2624 +6105:3:2625 +6106:3:2629 +6107:3:2637 +6108:3:2638 +6109:3:2643 +6110:3:2650 +6111:3:2651 +6112:3:2650 +6113:3:2651 +6114:3:2658 +6115:3:2663 +6116:0:4365 +6117:3:2674 +6118:0:4365 +6119:3:2682 +6120:3:2683 +6121:3:2687 +6122:3:2691 +6123:3:2692 +6124:3:2687 +6125:3:2691 +6126:3:2692 +6127:3:2696 +6128:3:2704 +6129:3:2705 +6130:3:2710 +6131:3:2717 +6132:3:2718 +6133:3:2717 +6134:3:2718 +6135:3:2725 +6136:3:2730 +6137:0:4365 +6138:3:2745 +6139:0:4365 +6140:3:2746 +6141:0:4365 +6142:2:1173 +6143:0:4365 +6144:3:2747 +6145:0:4365 +6146:2:1179 +6147:0:4365 +6148:2:1180 +6149:0:4365 +6150:3:2746 +6151:0:4365 +6152:2:1181 +6153:2:1185 +6154:2:1186 +6155:2:1194 +6156:2:1195 +6157:2:1199 +6158:2:1200 +6159:2:1194 +6160:2:1195 +6161:2:1199 +6162:2:1200 +6163:2:1208 +6164:2:1213 +6165:2:1217 +6166:2:1218 +6167:2:1225 +6168:2:1226 +6169:2:1237 +6170:2:1238 +6171:2:1239 +6172:2:1237 +6173:2:1238 +6174:2:1239 +6175:2:1250 +6176:2:1255 +6177:2:1256 +6178:0:4365 +6179:3:2747 +6180:0:4365 +6181:2:1268 +6182:0:4365 +6183:3:2746 +6184:0:4365 +6185:2:1270 +6186:0:4365 +6187:3:2747 +6188:0:4365 +6189:2:1271 +6190:2:1275 +6191:2:1276 +6192:2:1284 +6193:2:1285 +6194:2:1289 +6195:2:1290 +6196:2:1284 +6197:2:1285 +6198:2:1289 +6199:2:1290 +6200:2:1298 +6201:2:1303 +6202:2:1307 +6203:2:1308 +6204:2:1315 +6205:2:1316 +6206:2:1327 +6207:2:1328 +6208:2:1329 +6209:2:1327 +6210:2:1328 +6211:2:1329 +6212:2:1340 +6213:2:1345 +6214:2:1346 +6215:0:4365 +6216:2:1358 +6217:0:4365 +6218:2:1360 +6219:0:4365 +6220:3:2746 +6221:0:4365 +6222:2:1361 +6223:0:4365 +6224:3:2747 +6225:0:4365 +6226:2:1362 +6227:2:1366 +6228:2:1367 +6229:2:1375 +6230:2:1376 +6231:2:1380 +6232:2:1381 +6233:2:1375 +6234:2:1376 +6235:2:1380 +6236:2:1381 +6237:2:1389 +6238:2:1394 +6239:2:1398 +6240:2:1399 +6241:2:1406 +6242:2:1407 +6243:2:1418 +6244:2:1419 +6245:2:1420 +6246:2:1418 +6247:2:1419 +6248:2:1420 +6249:2:1431 +6250:2:1436 +6251:2:1437 +6252:0:4365 +6253:2:1449 +6254:0:4365 +6255:3:2746 +6256:0:4365 +6257:2:1451 +6258:0:4365 +6259:3:2747 +6260:0:4365 +6261:2:1652 +6262:0:4365 +6263:2:1653 +6264:0:4365 +6265:2:1657 +6266:0:4365 +6267:2:1660 +6268:0:4365 +6269:3:2746 +6270:0:4365 +6271:2:1665 +6272:2:1669 +6273:2:1670 +6274:2:1678 +6275:2:1679 +6276:2:1683 +6277:2:1684 +6278:2:1678 +6279:2:1679 +6280:2:1680 +6281:2:1692 +6282:2:1697 +6283:2:1701 +6284:2:1702 +6285:2:1709 +6286:2:1710 +6287:2:1721 +6288:2:1722 +6289:2:1723 +6290:2:1721 +6291:2:1722 +6292:2:1723 +6293:2:1734 +6294:2:1739 +6295:2:1740 +6296:0:4365 +6297:3:2747 +6298:0:4365 +6299:2:1752 +6300:0:4365 +6301:3:2746 +6302:0:4365 +6303:2:1754 +6304:0:4365 +6305:3:2747 +6306:0:4365 +6307:2:1755 +6308:2:1759 +6309:2:1760 +6310:2:1768 +6311:2:1769 +6312:2:1773 +6313:2:1774 +6314:2:1768 +6315:2:1769 +6316:2:1773 +6317:2:1774 +6318:2:1782 +6319:2:1787 +6320:2:1791 +6321:2:1792 +6322:2:1799 +6323:2:1800 +6324:2:1811 +6325:2:1812 +6326:2:1813 +6327:2:1811 +6328:2:1812 +6329:2:1813 +6330:2:1824 +6331:2:1829 +6332:2:1830 +6333:0:4365 +6334:2:1842 +6335:0:4365 +6336:3:2746 +6337:0:4365 +6338:2:1844 +6339:0:4365 +6340:3:2747 +6341:0:4365 +6342:2:1845 +6343:2:1849 +6344:2:1850 +6345:2:1858 +6346:2:1859 +6347:2:1863 +6348:2:1864 +6349:2:1858 +6350:2:1859 +6351:2:1863 +6352:2:1864 +6353:2:1872 +6354:2:1877 +6355:2:1881 +6356:2:1882 +6357:2:1889 +6358:2:1890 +6359:2:1901 +6360:2:1902 +6361:2:1903 +6362:2:1901 +6363:2:1902 +6364:2:1903 +6365:2:1914 +6366:2:1919 +6367:2:1920 +6368:0:4365 +6369:2:1932 +6370:0:4365 +6371:3:2746 +6372:0:4365 +6373:2:1934 +6374:0:4365 +6375:3:2747 +6376:0:4365 +6377:2:1935 +6378:0:4365 +6379:2:1936 +6380:0:4365 +6381:2:2129 +6382:0:4365 +6383:2:2130 +6384:0:4365 +6385:2:2134 +6386:0:4365 +6387:3:2746 +6388:0:4365 +6389:2:2136 +6390:0:4365 +6391:3:2747 +6392:0:4365 +6393:2:2137 +6394:2:2141 +6395:2:2142 +6396:2:2150 +6397:2:2151 +6398:2:2155 +6399:2:2156 +6400:2:2150 +6401:2:2151 +6402:2:2155 +6403:2:2156 +6404:2:2164 +6405:2:2169 +6406:2:2173 +6407:2:2174 +6408:2:2181 +6409:2:2182 +6410:2:2193 +6411:2:2194 +6412:2:2195 +6413:2:2193 +6414:2:2194 +6415:2:2195 +6416:2:2206 +6417:2:2211 +6418:2:2212 +6419:0:4365 +6420:2:2224 +6421:0:4365 +6422:3:2746 +6423:0:4365 +6424:2:2226 +6425:0:4365 +6426:3:2747 +6427:0:4365 +6428:2:2230 +6429:0:4365 +6430:3:2746 +6431:0:4365 +6432:2:2235 +6433:2:2239 +6434:2:2240 +6435:2:2248 +6436:2:2249 +6437:2:2253 +6438:2:2254 +6439:2:2248 +6440:2:2249 +6441:2:2250 +6442:2:2262 +6443:2:2267 +6444:2:2271 +6445:2:2272 +6446:2:2279 +6447:2:2280 +6448:2:2291 +6449:2:2292 +6450:2:2293 +6451:2:2291 +6452:2:2292 +6453:2:2293 +6454:2:2304 +6455:2:2309 +6456:2:2310 +6457:0:4365 +6458:3:2747 +6459:0:4365 +6460:2:2322 +6461:0:4365 +6462:2:1169 +6463:0:4365 +6464:3:2746 +6465:0:4365 +6466:2:1170 +6467:0:4365 +6468:3:2747 +6469:0:4365 +6470:3:2748 +6471:0:4365 +6472:3:2754 +6473:0:4365 +6474:3:2755 +6475:3:2759 +6476:3:2760 +6477:3:2768 +6478:3:2769 +6479:3:2773 +6480:3:2774 +6481:3:2768 +6482:3:2769 +6483:3:2773 +6484:3:2774 +6485:3:2782 +6486:3:2787 +6487:3:2791 +6488:3:2792 +6489:3:2799 +6490:3:2800 +6491:3:2811 +6492:3:2812 +6493:3:2813 +6494:3:2811 +6495:3:2812 +6496:3:2813 +6497:3:2824 +6498:3:2829 +6499:3:2830 +6500:0:4365 +6501:3:2842 +6502:0:4365 +6503:3:2843 +6504:0:4365 +6505:2:1173 +6506:0:4365 +6507:3:2844 +6508:0:4365 +6509:2:1179 +6510:0:4365 +6511:2:1180 +6512:0:4365 +6513:3:2843 +6514:0:4365 +6515:2:1181 +6516:2:1185 +6517:2:1186 +6518:2:1194 +6519:2:1195 +6520:2:1199 +6521:2:1200 +6522:2:1194 +6523:2:1195 +6524:2:1199 +6525:2:1200 +6526:2:1208 +6527:2:1213 +6528:2:1217 +6529:2:1218 +6530:2:1225 +6531:2:1226 +6532:2:1237 +6533:2:1238 +6534:2:1239 +6535:2:1237 +6536:2:1238 +6537:2:1239 +6538:2:1250 +6539:2:1255 +6540:2:1256 +6541:0:4365 +6542:3:2844 +6543:0:4365 +6544:2:1268 +6545:0:4365 +6546:3:2843 +6547:0:4365 +6548:2:1270 +6549:0:4365 +6550:3:2844 +6551:0:4365 +6552:2:1271 +6553:2:1275 +6554:2:1276 +6555:2:1284 +6556:2:1285 +6557:2:1289 +6558:2:1290 +6559:2:1284 +6560:2:1285 +6561:2:1289 +6562:2:1290 +6563:2:1298 +6564:2:1303 +6565:2:1307 +6566:2:1308 +6567:2:1315 +6568:2:1316 +6569:2:1327 +6570:2:1328 +6571:2:1329 +6572:2:1327 +6573:2:1328 +6574:2:1329 +6575:2:1340 +6576:2:1345 +6577:2:1346 +6578:0:4365 +6579:2:1358 +6580:0:4365 +6581:2:1360 +6582:0:4365 +6583:3:2843 +6584:0:4365 +6585:2:1361 +6586:0:4365 +6587:3:2844 +6588:0:4365 +6589:2:1362 +6590:2:1366 +6591:2:1367 +6592:2:1375 +6593:2:1376 +6594:2:1380 +6595:2:1381 +6596:2:1375 +6597:2:1376 +6598:2:1380 +6599:2:1381 +6600:2:1389 +6601:2:1394 +6602:2:1398 +6603:2:1399 +6604:2:1406 +6605:2:1407 +6606:2:1418 +6607:2:1419 +6608:2:1420 +6609:2:1418 +6610:2:1419 +6611:2:1420 +6612:2:1431 +6613:2:1436 +6614:2:1437 +6615:0:4365 +6616:2:1449 +6617:0:4365 +6618:3:2843 +6619:0:4365 +6620:2:1451 +6621:0:4365 +6622:3:2844 +6623:0:4365 +6624:2:1652 +6625:0:4365 +6626:2:1653 +6627:0:4365 +6628:2:1657 +6629:0:4365 +6630:2:1660 +6631:0:4365 +6632:3:2843 +6633:0:4365 +6634:2:1665 +6635:2:1669 +6636:2:1670 +6637:2:1678 +6638:2:1679 +6639:2:1683 +6640:2:1684 +6641:2:1678 +6642:2:1679 +6643:2:1680 +6644:2:1692 +6645:2:1697 +6646:2:1701 +6647:2:1702 +6648:2:1709 +6649:2:1710 +6650:2:1721 +6651:2:1722 +6652:2:1723 +6653:2:1721 +6654:2:1722 +6655:2:1723 +6656:2:1734 +6657:2:1739 +6658:2:1740 +6659:0:4365 +6660:3:2844 +6661:0:4365 +6662:2:1752 +6663:0:4365 +6664:3:2843 +6665:0:4365 +6666:2:1754 +6667:0:4365 +6668:3:2844 +6669:0:4365 +6670:2:1755 +6671:2:1759 +6672:2:1760 +6673:2:1768 +6674:2:1769 +6675:2:1773 +6676:2:1774 +6677:2:1768 +6678:2:1769 +6679:2:1773 +6680:2:1774 +6681:2:1782 +6682:2:1787 +6683:2:1791 +6684:2:1792 +6685:2:1799 +6686:2:1800 +6687:2:1811 +6688:2:1812 +6689:2:1813 +6690:2:1811 +6691:2:1812 +6692:2:1813 +6693:2:1824 +6694:2:1829 +6695:2:1830 +6696:0:4365 +6697:2:1842 +6698:0:4365 +6699:3:2843 +6700:0:4365 +6701:2:1844 +6702:0:4365 +6703:3:2844 +6704:0:4365 +6705:2:1845 +6706:2:1849 +6707:2:1850 +6708:2:1858 +6709:2:1859 +6710:2:1863 +6711:2:1864 +6712:2:1858 +6713:2:1859 +6714:2:1863 +6715:2:1864 +6716:2:1872 +6717:2:1877 +6718:2:1881 +6719:2:1882 +6720:2:1889 +6721:2:1890 +6722:2:1901 +6723:2:1902 +6724:2:1903 +6725:2:1901 +6726:2:1902 +6727:2:1903 +6728:2:1914 +6729:2:1919 +6730:2:1920 +6731:0:4365 +6732:2:1932 +6733:0:4365 +6734:3:2843 +6735:0:4365 +6736:2:1934 +6737:0:4365 +6738:3:2844 +6739:0:4365 +6740:2:1935 +6741:0:4365 +6742:2:1936 +6743:0:4365 +6744:2:2129 +6745:0:4365 +6746:2:2130 +6747:0:4365 +6748:2:2134 +6749:0:4365 +6750:3:2843 +6751:0:4365 +6752:2:2136 +6753:0:4365 +6754:3:2844 +6755:0:4365 +6756:2:2137 +6757:2:2141 +6758:2:2142 +6759:2:2150 +6760:2:2151 +6761:2:2155 +6762:2:2156 +6763:2:2150 +6764:2:2151 +6765:2:2155 +6766:2:2156 +6767:2:2164 +6768:2:2169 +6769:2:2173 +6770:2:2174 +6771:2:2181 +6772:2:2182 +6773:2:2193 +6774:2:2194 +6775:2:2195 +6776:2:2193 +6777:2:2194 +6778:2:2195 +6779:2:2206 +6780:2:2211 +6781:2:2212 +6782:0:4365 +6783:2:2224 +6784:0:4365 +6785:3:2843 +6786:0:4365 +6787:2:2226 +6788:0:4365 +6789:3:2844 +6790:0:4365 +6791:2:2230 +6792:0:4365 +6793:3:2843 +6794:0:4365 +6795:2:2235 +6796:2:2239 +6797:2:2240 +6798:2:2248 +6799:2:2249 +6800:2:2253 +6801:2:2254 +6802:2:2248 +6803:2:2249 +6804:2:2250 +6805:2:2262 +6806:2:2267 +6807:2:2271 +6808:2:2272 +6809:2:2279 +6810:2:2280 +6811:2:2291 +6812:2:2292 +6813:2:2293 +6814:2:2291 +6815:2:2292 +6816:2:2293 +6817:2:2304 +6818:2:2309 +6819:2:2310 +6820:0:4365 +6821:3:2844 +6822:0:4365 +6823:2:2322 +6824:0:4365 +6825:2:1169 +6826:0:4365 +6827:3:2843 +6828:0:4365 +6829:2:1170 +6830:0:4365 +6831:3:2844 +6832:0:4365 +6833:3:2845 +6834:0:4365 +6835:3:2851 +6836:0:4365 +6837:3:2854 +6838:3:2855 +6839:3:2867 +6840:3:2868 +6841:3:2872 +6842:3:2873 +6843:3:2867 +6844:3:2868 +6845:3:2872 +6846:3:2873 +6847:3:2881 +6848:3:2886 +6849:3:2890 +6850:3:2891 +6851:3:2898 +6852:3:2899 +6853:3:2910 +6854:3:2911 +6855:3:2912 +6856:3:2910 +6857:3:2911 +6858:3:2912 +6859:3:2923 +6860:3:2928 +6861:3:2929 +6862:0:4365 +6863:3:2941 +6864:0:4365 +6865:3:2942 +6866:0:4365 +6867:2:1173 +6868:0:4365 +6869:3:2943 +6870:0:4365 +6871:2:1179 +6872:0:4365 +6873:2:1180 +6874:0:4365 +6875:3:2942 +6876:0:4365 +6877:2:1181 +6878:2:1185 +6879:2:1186 +6880:2:1194 +6881:2:1195 +6882:2:1199 +6883:2:1200 +6884:2:1194 +6885:2:1195 +6886:2:1199 +6887:2:1200 +6888:2:1208 +6889:2:1213 +6890:2:1217 +6891:2:1218 +6892:2:1225 +6893:2:1226 +6894:2:1237 +6895:2:1238 +6896:2:1239 +6897:2:1237 +6898:2:1238 +6899:2:1239 +6900:2:1250 +6901:2:1255 +6902:2:1256 +6903:0:4365 +6904:3:2943 +6905:0:4365 +6906:2:1268 +6907:0:4365 +6908:3:2942 +6909:0:4365 +6910:2:1270 +6911:0:4365 +6912:3:2943 +6913:0:4365 +6914:2:1271 +6915:2:1275 +6916:2:1276 +6917:2:1284 +6918:2:1285 +6919:2:1289 +6920:2:1290 +6921:2:1284 +6922:2:1285 +6923:2:1289 +6924:2:1290 +6925:2:1298 +6926:2:1303 +6927:2:1307 +6928:2:1308 +6929:2:1315 +6930:2:1316 +6931:2:1327 +6932:2:1328 +6933:2:1329 +6934:2:1327 +6935:2:1328 +6936:2:1329 +6937:2:1340 +6938:2:1345 +6939:2:1346 +6940:0:4365 +6941:2:1358 +6942:0:4365 +6943:2:1360 +6944:0:4365 +6945:3:2942 +6946:0:4365 +6947:2:1361 +6948:0:4365 +6949:3:2943 +6950:0:4365 +6951:2:1362 +6952:2:1366 +6953:2:1367 +6954:2:1375 +6955:2:1376 +6956:2:1380 +6957:2:1381 +6958:2:1375 +6959:2:1376 +6960:2:1380 +6961:2:1381 +6962:2:1389 +6963:2:1394 +6964:2:1398 +6965:2:1399 +6966:2:1406 +6967:2:1407 +6968:2:1418 +6969:2:1419 +6970:2:1420 +6971:2:1418 +6972:2:1419 +6973:2:1420 +6974:2:1431 +6975:2:1436 +6976:2:1437 +6977:0:4365 +6978:2:1449 +6979:0:4365 +6980:3:2942 +6981:0:4365 +6982:2:1451 +6983:0:4365 +6984:3:2943 +6985:0:4365 +6986:2:1652 +6987:0:4365 +6988:2:1653 +6989:0:4365 +6990:2:1657 +6991:0:4365 +6992:2:1660 +6993:0:4365 +6994:3:2942 +6995:0:4365 +6996:2:1665 +6997:2:1669 +6998:2:1670 +6999:2:1678 +7000:2:1679 +7001:2:1683 +7002:2:1684 +7003:2:1678 +7004:2:1679 +7005:2:1680 +7006:2:1692 +7007:2:1697 +7008:2:1701 +7009:2:1702 +7010:2:1709 +7011:2:1710 +7012:2:1721 +7013:2:1722 +7014:2:1723 +7015:2:1721 +7016:2:1722 +7017:2:1723 +7018:2:1734 +7019:2:1739 +7020:2:1740 +7021:0:4365 +7022:3:2943 +7023:0:4365 +7024:2:1752 +7025:0:4365 +7026:3:2942 +7027:0:4365 +7028:2:1754 +7029:0:4365 +7030:3:2943 +7031:0:4365 +7032:2:1755 +7033:2:1759 +7034:2:1760 +7035:2:1768 +7036:2:1769 +7037:2:1773 +7038:2:1774 +7039:2:1768 +7040:2:1769 +7041:2:1773 +7042:2:1774 +7043:2:1782 +7044:2:1787 +7045:2:1791 +7046:2:1792 +7047:2:1799 +7048:2:1800 +7049:2:1811 +7050:2:1812 +7051:2:1813 +7052:2:1811 +7053:2:1812 +7054:2:1813 +7055:2:1824 +7056:2:1829 +7057:2:1830 +7058:0:4365 +7059:2:1842 +7060:0:4365 +7061:3:2942 +7062:0:4365 +7063:2:1844 +7064:0:4365 +7065:3:2943 +7066:0:4365 +7067:2:1845 +7068:2:1849 +7069:2:1850 +7070:2:1858 +7071:2:1859 +7072:2:1863 +7073:2:1864 +7074:2:1858 +7075:2:1859 +7076:2:1863 +7077:2:1864 +7078:2:1872 +7079:2:1877 +7080:2:1881 +7081:2:1882 +7082:2:1889 +7083:2:1890 +7084:2:1901 +7085:2:1902 +7086:2:1903 +7087:2:1901 +7088:2:1902 +7089:2:1903 +7090:2:1914 +7091:2:1919 +7092:2:1920 +7093:0:4365 +7094:2:1932 +7095:0:4365 +7096:3:2942 +7097:0:4365 +7098:2:1934 +7099:0:4365 +7100:3:2943 +7101:0:4365 +7102:2:1935 +7103:0:4365 +7104:2:1936 +7105:0:4365 +7106:2:2129 +7107:0:4365 +7108:2:2130 +7109:0:4365 +7110:2:2134 +7111:0:4365 +7112:3:2942 +7113:0:4365 +7114:2:2136 +7115:0:4365 +7116:3:2943 +7117:0:4365 +7118:2:2137 +7119:2:2141 +7120:2:2142 +7121:2:2150 +7122:2:2151 +7123:2:2155 +7124:2:2156 +7125:2:2150 +7126:2:2151 +7127:2:2155 +7128:2:2156 +7129:2:2164 +7130:2:2169 +7131:2:2173 +7132:2:2174 +7133:2:2181 +7134:2:2182 +7135:2:2193 +7136:2:2194 +7137:2:2195 +7138:2:2193 +7139:2:2194 +7140:2:2195 +7141:2:2206 +7142:2:2211 +7143:2:2212 +7144:0:4365 +7145:2:2224 +7146:0:4365 +7147:3:2942 +7148:0:4365 +7149:2:2226 +7150:0:4365 +7151:3:2943 +7152:0:4365 +7153:2:2230 +7154:0:4365 +7155:3:2942 +7156:0:4365 +7157:2:2235 +7158:2:2239 +7159:2:2240 +7160:2:2248 +7161:2:2249 +7162:2:2253 +7163:2:2254 +7164:2:2248 +7165:2:2249 +7166:2:2250 +7167:2:2262 +7168:2:2267 +7169:2:2271 +7170:2:2272 +7171:2:2279 +7172:2:2280 +7173:2:2291 +7174:2:2292 +7175:2:2293 +7176:2:2291 +7177:2:2292 +7178:2:2293 +7179:2:2304 +7180:2:2309 +7181:2:2310 +7182:0:4365 +7183:3:2943 +7184:0:4365 +7185:2:2322 +7186:0:4365 +7187:2:1169 +7188:0:4365 +7189:3:2942 +7190:0:4365 +7191:2:1170 +7192:0:4365 +7193:3:2943 +7194:0:4365 +7195:3:2944 +7196:0:4365 +7197:3:2950 +7198:0:4365 +7199:3:2951 +7200:0:4365 +7201:3:2952 +7202:0:4365 +7203:3:2953 +7204:0:4365 +7205:3:2954 +7206:3:2958 +7207:3:2959 +7208:3:2967 +7209:3:2968 +7210:3:2972 +7211:3:2973 +7212:3:2967 +7213:3:2968 +7214:3:2972 +7215:3:2973 +7216:3:2981 +7217:3:2986 +7218:3:2990 +7219:3:2991 +7220:3:2998 +7221:3:2999 +7222:3:3010 +7223:3:3011 +7224:3:3012 +7225:3:3010 +7226:3:3011 +7227:3:3012 +7228:3:3023 +7229:3:3028 +7230:3:3029 +7231:0:4365 +7232:3:3041 +7233:0:4365 +7234:3:3042 +7235:0:4365 +7236:2:1173 +7237:0:4365 +7238:3:3043 +7239:0:4365 +7240:2:1179 +7241:0:4365 +7242:2:1180 +7243:0:4365 +7244:3:3042 +7245:0:4365 +7246:2:1181 +7247:2:1185 +7248:2:1186 +7249:2:1194 +7250:2:1195 +7251:2:1199 +7252:2:1200 +7253:2:1194 +7254:2:1195 +7255:2:1199 +7256:2:1200 +7257:2:1208 +7258:2:1213 +7259:2:1217 +7260:2:1218 +7261:2:1225 +7262:2:1226 +7263:2:1237 +7264:2:1238 +7265:2:1239 +7266:2:1237 +7267:2:1238 +7268:2:1239 +7269:2:1250 +7270:2:1255 +7271:2:1256 +7272:0:4365 +7273:3:3043 +7274:0:4365 +7275:2:1268 +7276:0:4365 +7277:3:3042 +7278:0:4365 +7279:2:1270 +7280:0:4365 +7281:3:3043 +7282:0:4365 +7283:2:1271 +7284:2:1275 +7285:2:1276 +7286:2:1284 +7287:2:1285 +7288:2:1289 +7289:2:1290 +7290:2:1284 +7291:2:1285 +7292:2:1289 +7293:2:1290 +7294:2:1298 +7295:2:1303 +7296:2:1307 +7297:2:1308 +7298:2:1315 +7299:2:1316 +7300:2:1327 +7301:2:1328 +7302:2:1329 +7303:2:1327 +7304:2:1328 +7305:2:1329 +7306:2:1340 +7307:2:1345 +7308:2:1346 +7309:0:4365 +7310:2:1358 +7311:0:4365 +7312:2:1360 +7313:0:4365 +7314:3:3042 +7315:0:4365 +7316:2:1361 +7317:0:4365 +7318:3:3043 +7319:0:4365 +7320:2:1362 +7321:2:1366 +7322:2:1367 +7323:2:1375 +7324:2:1376 +7325:2:1380 +7326:2:1381 +7327:2:1375 +7328:2:1376 +7329:2:1380 +7330:2:1381 +7331:2:1389 +7332:2:1394 +7333:2:1398 +7334:2:1399 +7335:2:1406 +7336:2:1407 +7337:2:1418 +7338:2:1419 +7339:2:1420 +7340:2:1418 +7341:2:1419 +7342:2:1420 +7343:2:1431 +7344:2:1436 +7345:2:1437 +7346:0:4365 +7347:2:1449 +7348:0:4365 +7349:3:3042 +7350:0:4365 +7351:2:1451 +7352:0:4365 +7353:3:3043 +7354:0:4365 +7355:2:1652 +7356:0:4365 +7357:2:1653 +7358:0:4365 +7359:2:1657 +7360:0:4365 +7361:2:1660 +7362:0:4365 +7363:3:3042 +7364:0:4365 +7365:2:1665 +7366:2:1669 +7367:2:1670 +7368:2:1678 +7369:2:1679 +7370:2:1683 +7371:2:1684 +7372:2:1678 +7373:2:1679 +7374:2:1680 +7375:2:1692 +7376:2:1697 +7377:2:1701 +7378:2:1702 +7379:2:1709 +7380:2:1710 +7381:2:1721 +7382:2:1722 +7383:2:1723 +7384:2:1721 +7385:2:1722 +7386:2:1723 +7387:2:1734 +7388:2:1739 +7389:2:1740 +7390:0:4365 +7391:3:3043 +7392:0:4365 +7393:2:1752 +7394:0:4365 +7395:3:3042 +7396:0:4365 +7397:2:1754 +7398:0:4365 +7399:3:3043 +7400:0:4365 +7401:2:1755 +7402:2:1759 +7403:2:1760 +7404:2:1768 +7405:2:1769 +7406:2:1773 +7407:2:1774 +7408:2:1768 +7409:2:1769 +7410:2:1773 +7411:2:1774 +7412:2:1782 +7413:2:1787 +7414:2:1791 +7415:2:1792 +7416:2:1799 +7417:2:1800 +7418:2:1811 +7419:2:1812 +7420:2:1813 +7421:2:1811 +7422:2:1812 +7423:2:1813 +7424:2:1824 +7425:2:1829 +7426:2:1830 +7427:0:4365 +7428:2:1842 +7429:0:4365 +7430:3:3042 +7431:0:4365 +7432:2:1844 +7433:0:4365 +7434:3:3043 +7435:0:4365 +7436:2:1845 +7437:2:1849 +7438:2:1850 +7439:2:1858 +7440:2:1859 +7441:2:1863 +7442:2:1864 +7443:2:1858 +7444:2:1859 +7445:2:1863 +7446:2:1864 +7447:2:1872 +7448:2:1877 +7449:2:1881 +7450:2:1882 +7451:2:1889 +7452:2:1890 +7453:2:1901 +7454:2:1902 +7455:2:1903 +7456:2:1901 +7457:2:1902 +7458:2:1903 +7459:2:1914 +7460:2:1919 +7461:2:1920 +7462:0:4365 +7463:2:1932 +7464:0:4365 +7465:3:3042 +7466:0:4365 +7467:2:1934 +7468:0:4365 +7469:3:3043 +7470:0:4365 +7471:2:1935 +7472:0:4365 +7473:2:1936 +7474:0:4365 +7475:2:2129 +7476:0:4365 +7477:2:2130 +7478:0:4365 +7479:2:2134 +7480:0:4365 +7481:3:3042 +7482:0:4365 +7483:2:2136 +7484:0:4365 +7485:3:3043 +7486:0:4365 +7487:2:2137 +7488:2:2141 +7489:2:2142 +7490:2:2150 +7491:2:2151 +7492:2:2155 +7493:2:2156 +7494:2:2150 +7495:2:2151 +7496:2:2155 +7497:2:2156 +7498:2:2164 +7499:2:2169 +7500:2:2173 +7501:2:2174 +7502:2:2181 +7503:2:2182 +7504:2:2193 +7505:2:2194 +7506:2:2195 +7507:2:2193 +7508:2:2194 +7509:2:2195 +7510:2:2206 +7511:2:2211 +7512:2:2212 +7513:0:4365 +7514:2:2224 +7515:0:4365 +7516:3:3042 +7517:0:4365 +7518:2:2226 +7519:0:4365 +7520:3:3043 +7521:0:4365 +7522:2:2230 +7523:0:4365 +7524:3:3042 +7525:0:4365 +7526:2:2235 +7527:2:2239 +7528:2:2240 +7529:2:2248 +7530:2:2249 +7531:2:2253 +7532:2:2254 +7533:2:2248 +7534:2:2249 +7535:2:2250 +7536:2:2262 +7537:2:2267 +7538:2:2271 +7539:2:2272 +7540:2:2279 +7541:2:2280 +7542:2:2291 +7543:2:2292 +7544:2:2293 +7545:2:2291 +7546:2:2292 +7547:2:2293 +7548:2:2304 +7549:2:2309 +7550:2:2310 +7551:0:4365 +7552:3:3043 +7553:0:4365 +7554:2:2322 +7555:0:4365 +7556:2:1169 +7557:0:4365 +7558:3:3042 +7559:0:4365 +7560:2:1170 +7561:0:4365 +7562:3:3043 +7563:0:4365 +7564:3:3044 +7565:0:4365 +7566:3:3257 +7567:0:4365 +7568:3:3265 +7569:0:4365 +7570:3:3266 +7571:3:3270 +7572:3:3271 +7573:3:3279 +7574:3:3280 +7575:3:3284 +7576:3:3285 +7577:3:3279 +7578:3:3280 +7579:3:3284 +7580:3:3285 +7581:3:3293 +7582:3:3298 +7583:3:3302 +7584:3:3303 +7585:3:3310 +7586:3:3311 +7587:3:3322 +7588:3:3323 +7589:3:3324 +7590:3:3322 +7591:3:3323 +7592:3:3324 +7593:3:3335 +7594:3:3340 +7595:3:3341 +7596:0:4365 +7597:3:3353 +7598:0:4365 +7599:3:3354 +7600:0:4365 +7601:2:1173 +7602:0:4365 +7603:3:3355 +7604:0:4365 +7605:2:1179 +7606:0:4365 +7607:2:1180 +7608:0:4365 +7609:3:3354 +7610:0:4365 +7611:2:1181 +7612:2:1185 +7613:2:1186 +7614:2:1194 +7615:2:1195 +7616:2:1199 +7617:2:1200 +7618:2:1194 +7619:2:1195 +7620:2:1199 +7621:2:1200 +7622:2:1208 +7623:2:1213 +7624:2:1217 +7625:2:1218 +7626:2:1225 +7627:2:1226 +7628:2:1237 +7629:2:1238 +7630:2:1239 +7631:2:1237 +7632:2:1238 +7633:2:1239 +7634:2:1250 +7635:2:1255 +7636:2:1256 +7637:0:4365 +7638:3:3355 +7639:0:4365 +7640:2:1268 +7641:0:4365 +7642:3:3354 +7643:0:4365 +7644:2:1270 +7645:0:4365 +7646:3:3355 +7647:0:4365 +7648:2:1271 +7649:2:1275 +7650:2:1276 +7651:2:1284 +7652:2:1285 +7653:2:1289 +7654:2:1290 +7655:2:1284 +7656:2:1285 +7657:2:1289 +7658:2:1290 +7659:2:1298 +7660:2:1303 +7661:2:1307 +7662:2:1308 +7663:2:1315 +7664:2:1316 +7665:2:1327 +7666:2:1328 +7667:2:1329 +7668:2:1327 +7669:2:1328 +7670:2:1329 +7671:2:1340 +7672:2:1345 +7673:2:1346 +7674:0:4365 +7675:2:1358 +7676:0:4365 +7677:2:1360 +7678:0:4365 +7679:3:3354 +7680:0:4365 +7681:2:1361 +7682:0:4365 +7683:3:3355 +7684:0:4365 +7685:2:1362 +7686:2:1366 +7687:2:1367 +7688:2:1375 +7689:2:1376 +7690:2:1380 +7691:2:1381 +7692:2:1375 +7693:2:1376 +7694:2:1380 +7695:2:1381 +7696:2:1389 +7697:2:1394 +7698:2:1398 +7699:2:1399 +7700:2:1406 +7701:2:1407 +7702:2:1418 +7703:2:1419 +7704:2:1420 +7705:2:1418 +7706:2:1419 +7707:2:1420 +7708:2:1431 +7709:2:1436 +7710:2:1437 +7711:0:4365 +7712:2:1449 +7713:0:4365 +7714:3:3354 +7715:0:4365 +7716:2:1451 +7717:0:4365 +7718:3:3355 +7719:0:4365 +7720:2:1652 +7721:0:4365 +7722:2:1653 +7723:0:4365 +7724:2:1657 +7725:0:4365 +7726:2:1660 +7727:0:4365 +7728:3:3354 +7729:0:4365 +7730:2:1665 +7731:2:1669 +7732:2:1670 +7733:2:1678 +7734:2:1679 +7735:2:1683 +7736:2:1684 +7737:2:1678 +7738:2:1679 +7739:2:1680 +7740:2:1692 +7741:2:1697 +7742:2:1701 +7743:2:1702 +7744:2:1709 +7745:2:1710 +7746:2:1721 +7747:2:1722 +7748:2:1723 +7749:2:1721 +7750:2:1722 +7751:2:1723 +7752:2:1734 +7753:2:1739 +7754:2:1740 +7755:0:4365 +7756:3:3355 +7757:0:4365 +7758:2:1752 +7759:0:4365 +7760:3:3354 +7761:0:4365 +7762:2:1754 +7763:0:4365 +7764:3:3355 +7765:0:4365 +7766:2:1755 +7767:2:1759 +7768:2:1760 +7769:2:1768 +7770:2:1769 +7771:2:1773 +7772:2:1774 +7773:2:1768 +7774:2:1769 +7775:2:1773 +7776:2:1774 +7777:2:1782 +7778:2:1787 +7779:2:1791 +7780:2:1792 +7781:2:1799 +7782:2:1800 +7783:2:1811 +7784:2:1812 +7785:2:1813 +7786:2:1811 +7787:2:1812 +7788:2:1813 +7789:2:1824 +7790:2:1829 +7791:2:1830 +7792:0:4365 +7793:2:1842 +7794:0:4365 +7795:3:3354 +7796:0:4365 +7797:2:1844 +7798:0:4365 +7799:3:3355 +7800:0:4365 +7801:2:1845 +7802:2:1849 +7803:2:1850 +7804:2:1858 +7805:2:1859 +7806:2:1863 +7807:2:1864 +7808:2:1858 +7809:2:1859 +7810:2:1863 +7811:2:1864 +7812:2:1872 +7813:2:1877 +7814:2:1881 +7815:2:1882 +7816:2:1889 +7817:2:1890 +7818:2:1901 +7819:2:1902 +7820:2:1903 +7821:2:1901 +7822:2:1902 +7823:2:1903 +7824:2:1914 +7825:2:1919 +7826:2:1920 +7827:0:4365 +7828:2:1932 +7829:0:4365 +7830:3:3354 +7831:0:4365 +7832:2:1934 +7833:0:4365 +7834:3:3355 +7835:0:4365 +7836:2:1935 +7837:0:4365 +7838:2:1936 +7839:0:4365 +7840:2:2129 +7841:0:4365 +7842:2:2130 +7843:0:4365 +7844:2:2134 +7845:0:4365 +7846:3:3354 +7847:0:4365 +7848:2:2136 +7849:0:4365 +7850:3:3355 +7851:0:4365 +7852:2:2137 +7853:2:2141 +7854:2:2142 +7855:2:2150 +7856:2:2151 +7857:2:2155 +7858:2:2156 +7859:2:2150 +7860:2:2151 +7861:2:2155 +7862:2:2156 +7863:2:2164 +7864:2:2169 +7865:2:2173 +7866:2:2174 +7867:2:2181 +7868:2:2182 +7869:2:2193 +7870:2:2194 +7871:2:2195 +7872:2:2193 +7873:2:2194 +7874:2:2195 +7875:2:2206 +7876:2:2211 +7877:2:2212 +7878:0:4365 +7879:2:2224 +7880:0:4365 +7881:3:3354 +7882:0:4365 +7883:2:2226 +7884:0:4365 +7885:3:3355 +7886:0:4365 +7887:2:2230 +7888:0:4365 +7889:3:3354 +7890:0:4365 +7891:2:2235 +7892:2:2239 +7893:2:2240 +7894:2:2248 +7895:2:2249 +7896:2:2253 +7897:2:2254 +7898:2:2248 +7899:2:2249 +7900:2:2250 +7901:2:2262 +7902:2:2267 +7903:2:2271 +7904:2:2272 +7905:2:2279 +7906:2:2280 +7907:2:2291 +7908:2:2292 +7909:2:2293 +7910:2:2291 +7911:2:2292 +7912:2:2293 +7913:2:2304 +7914:2:2309 +7915:2:2310 +7916:0:4365 +7917:3:3355 +7918:0:4365 +7919:2:2322 +7920:0:4365 +7921:2:1169 +7922:0:4365 +7923:3:3354 +7924:0:4365 +7925:2:1170 +7926:0:4365 +7927:3:3355 +7928:0:4365 +7929:3:3356 +7930:0:4365 +7931:3:3366 +7932:0:4365 +7933:3:2951 +7934:0:4365 +7935:3:2952 +7936:0:4365 +7937:3:2953 +7938:0:4365 +7939:3:2954 +7940:3:2958 +7941:3:2959 +7942:3:2967 +7943:3:2968 +7944:3:2972 +7945:3:2973 +7946:3:2967 +7947:3:2968 +7948:3:2972 +7949:3:2973 +7950:3:2981 +7951:3:2986 +7952:3:2990 +7953:3:2991 +7954:3:2998 +7955:3:2999 +7956:3:3010 +7957:3:3011 +7958:3:3012 +7959:3:3010 +7960:3:3011 +7961:3:3012 +7962:3:3023 +7963:3:3028 +7964:3:3029 +7965:0:4365 +7966:3:3041 +7967:0:4365 +7968:3:3042 +7969:0:4365 +7970:2:1173 +7971:0:4365 +7972:3:3043 +7973:0:4365 +7974:2:1179 +7975:0:4365 +7976:2:1180 +7977:0:4365 +7978:3:3042 +7979:0:4365 +7980:2:1181 +7981:2:1185 +7982:2:1186 +7983:2:1194 +7984:2:1195 +7985:2:1199 +7986:2:1200 +7987:2:1194 +7988:2:1195 +7989:2:1199 +7990:2:1200 +7991:2:1208 +7992:2:1213 +7993:2:1217 +7994:2:1218 +7995:2:1225 +7996:2:1226 +7997:2:1237 +7998:2:1238 +7999:2:1239 +8000:2:1237 +8001:2:1238 +8002:2:1239 +8003:2:1250 +8004:2:1255 +8005:2:1256 +8006:0:4365 +8007:3:3043 +8008:0:4365 +8009:2:1268 +8010:0:4365 +8011:3:3042 +8012:0:4365 +8013:2:1270 +8014:0:4365 +8015:3:3043 +8016:0:4365 +8017:2:1271 +8018:2:1275 +8019:2:1276 +8020:2:1284 +8021:2:1285 +8022:2:1289 +8023:2:1290 +8024:2:1284 +8025:2:1285 +8026:2:1289 +8027:2:1290 +8028:2:1298 +8029:2:1303 +8030:2:1307 +8031:2:1308 +8032:2:1315 +8033:2:1316 +8034:2:1327 +8035:2:1328 +8036:2:1329 +8037:2:1327 +8038:2:1328 +8039:2:1329 +8040:2:1340 +8041:2:1345 +8042:2:1346 +8043:0:4365 +8044:2:1358 +8045:0:4365 +8046:2:1360 +8047:0:4365 +8048:3:3042 +8049:0:4365 +8050:2:1361 +8051:0:4365 +8052:3:3043 +8053:0:4365 +8054:2:1362 +8055:2:1366 +8056:2:1367 +8057:2:1375 +8058:2:1376 +8059:2:1380 +8060:2:1381 +8061:2:1375 +8062:2:1376 +8063:2:1380 +8064:2:1381 +8065:2:1389 +8066:2:1394 +8067:2:1398 +8068:2:1399 +8069:2:1406 +8070:2:1407 +8071:2:1418 +8072:2:1419 +8073:2:1420 +8074:2:1418 +8075:2:1419 +8076:2:1420 +8077:2:1431 +8078:2:1436 +8079:2:1437 +8080:0:4365 +8081:2:1449 +8082:0:4365 +8083:3:3042 +8084:0:4365 +8085:2:1451 +8086:0:4365 +8087:3:3043 +8088:0:4365 +8089:2:1652 +8090:0:4365 +8091:2:1653 +8092:0:4365 +8093:2:1657 +8094:0:4365 +8095:2:1660 +8096:0:4365 +8097:3:3042 +8098:0:4365 +8099:2:1665 +8100:2:1669 +8101:2:1670 +8102:2:1678 +8103:2:1679 +8104:2:1683 +8105:2:1684 +8106:2:1678 +8107:2:1679 +8108:2:1680 +8109:2:1692 +8110:2:1697 +8111:2:1701 +8112:2:1702 +8113:2:1709 +8114:2:1710 +8115:2:1721 +8116:2:1722 +8117:2:1723 +8118:2:1721 +8119:2:1722 +8120:2:1723 +8121:2:1734 +8122:2:1739 +8123:2:1740 +8124:0:4365 +8125:3:3043 +8126:0:4365 +8127:2:1752 +8128:0:4365 +8129:3:3042 +8130:0:4365 +8131:2:1754 +8132:0:4365 +8133:3:3043 +8134:0:4365 +8135:2:1755 +8136:2:1759 +8137:2:1760 +8138:2:1768 +8139:2:1769 +8140:2:1773 +8141:2:1774 +8142:2:1768 +8143:2:1769 +8144:2:1773 +8145:2:1774 +8146:2:1782 +8147:2:1787 +8148:2:1791 +8149:2:1792 +8150:2:1799 +8151:2:1800 +8152:2:1811 +8153:2:1812 +8154:2:1813 +8155:2:1811 +8156:2:1812 +8157:2:1813 +8158:2:1824 +8159:2:1829 +8160:2:1830 +8161:0:4365 +8162:2:1842 +8163:0:4365 +8164:3:3042 +8165:0:4365 +8166:2:1844 +8167:0:4365 +8168:3:3043 +8169:0:4365 +8170:2:1845 +8171:2:1849 +8172:2:1850 +8173:2:1858 +8174:2:1859 +8175:2:1863 +8176:2:1864 +8177:2:1858 +8178:2:1859 +8179:2:1863 +8180:2:1864 +8181:2:1872 +8182:2:1877 +8183:2:1881 +8184:2:1882 +8185:2:1889 +8186:2:1890 +8187:2:1901 +8188:2:1902 +8189:2:1903 +8190:2:1901 +8191:2:1902 +8192:2:1903 +8193:2:1914 +8194:2:1919 +8195:2:1920 +8196:0:4365 +8197:2:1932 +8198:0:4365 +8199:3:3042 +8200:0:4365 +8201:2:1934 +8202:0:4365 +8203:3:3043 +8204:0:4365 +8205:2:1935 +8206:0:4365 +8207:2:1936 +8208:0:4365 +8209:2:2129 +8210:0:4365 +8211:2:2130 +8212:0:4365 +8213:2:2134 +8214:0:4365 +8215:3:3042 +8216:0:4365 +8217:2:2136 +8218:0:4365 +8219:3:3043 +8220:0:4365 +8221:2:2137 +8222:2:2141 +8223:2:2142 +8224:2:2150 +8225:2:2151 +8226:2:2155 +8227:2:2156 +8228:2:2150 +8229:2:2151 +8230:2:2155 +8231:2:2156 +8232:2:2164 +8233:2:2169 +8234:2:2173 +8235:2:2174 +8236:2:2181 +8237:2:2182 +8238:2:2193 +8239:2:2194 +8240:2:2195 +8241:2:2193 +8242:2:2194 +8243:2:2195 +8244:2:2206 +8245:2:2211 +8246:2:2212 +8247:0:4365 +8248:2:2224 +8249:0:4365 +8250:3:3042 +8251:0:4365 +8252:2:2226 +8253:0:4365 +8254:3:3043 +8255:0:4365 +8256:2:2230 +8257:0:4365 +8258:3:3042 +8259:0:4365 +8260:2:2235 +8261:2:2239 +8262:2:2240 +8263:2:2248 +8264:2:2249 +8265:2:2253 +8266:2:2254 +8267:2:2248 +8268:2:2249 +8269:2:2250 +8270:2:2262 +8271:2:2267 +8272:2:2271 +8273:2:2272 +8274:2:2279 +8275:2:2280 +8276:2:2291 +8277:2:2292 +8278:2:2293 +8279:2:2291 +8280:2:2292 +8281:2:2293 +8282:2:2304 +8283:2:2309 +8284:2:2310 +8285:0:4365 +8286:3:3043 +8287:0:4365 +8288:2:2322 +8289:0:4365 +8290:2:1169 +8291:0:4365 +8292:3:3042 +8293:0:4365 +8294:2:1170 +8295:0:4365 +8296:3:3043 +8297:0:4365 +8298:3:3044 +8299:0:4365 +8300:3:3257 +8301:0:4365 +8302:3:3362 +8303:0:4365 +8304:3:3363 +8305:0:4365 +8306:3:3367 +8307:0:4365 +8308:3:3373 +8309:3:3377 +8310:3:3378 +8311:3:3386 +8312:3:3387 +8313:3:3391 +8314:3:3392 +8315:3:3386 +8316:3:3387 +8317:3:3391 +8318:3:3392 +8319:3:3400 +8320:3:3405 +8321:3:3409 +8322:3:3410 +8323:3:3417 +8324:3:3418 +8325:3:3429 +8326:3:3430 +8327:3:3431 +8328:3:3429 +8329:3:3430 +8330:3:3431 +8331:3:3442 +8332:3:3447 +8333:3:3448 +8334:0:4365 +8335:3:3460 +8336:0:4365 +8337:3:3461 +8338:0:4365 +8339:2:1173 +8340:0:4365 +8341:3:3462 +8342:0:4365 +8343:2:1179 +8344:0:4365 +8345:2:1180 +8346:0:4365 +8347:3:3461 +8348:0:4365 +8349:2:1181 +8350:2:1185 +8351:2:1186 +8352:2:1194 +8353:2:1195 +8354:2:1199 +8355:2:1200 +8356:2:1194 +8357:2:1195 +8358:2:1199 +8359:2:1200 +8360:2:1208 +8361:2:1213 +8362:2:1217 +8363:2:1218 +8364:2:1225 +8365:2:1226 +8366:2:1237 +8367:2:1238 +8368:2:1239 +8369:2:1237 +8370:2:1238 +8371:2:1239 +8372:2:1250 +8373:2:1255 +8374:2:1256 +8375:0:4365 +8376:3:3462 +8377:0:4365 +8378:2:1268 +8379:0:4365 +8380:3:3461 +8381:0:4365 +8382:2:1270 +8383:0:4365 +8384:3:3462 +8385:0:4365 +8386:2:1271 +8387:2:1275 +8388:2:1276 +8389:2:1284 +8390:2:1285 +8391:2:1289 +8392:2:1290 +8393:2:1284 +8394:2:1285 +8395:2:1289 +8396:2:1290 +8397:2:1298 +8398:2:1303 +8399:2:1307 +8400:2:1308 +8401:2:1315 +8402:2:1316 +8403:2:1327 +8404:2:1328 +8405:2:1329 +8406:2:1327 +8407:2:1328 +8408:2:1329 +8409:2:1340 +8410:2:1345 +8411:2:1346 +8412:0:4365 +8413:2:1358 +8414:0:4365 +8415:2:1360 +8416:0:4365 +8417:3:3461 +8418:0:4365 +8419:2:1361 +8420:0:4365 +8421:3:3462 +8422:0:4365 +8423:2:1362 +8424:2:1366 +8425:2:1367 +8426:2:1375 +8427:2:1376 +8428:2:1380 +8429:2:1381 +8430:2:1375 +8431:2:1376 +8432:2:1380 +8433:2:1381 +8434:2:1389 +8435:2:1394 +8436:2:1398 +8437:2:1399 +8438:2:1406 +8439:2:1407 +8440:2:1418 +8441:2:1419 +8442:2:1420 +8443:2:1418 +8444:2:1419 +8445:2:1420 +8446:2:1431 +8447:2:1436 +8448:2:1437 +8449:0:4365 +8450:2:1449 +8451:0:4365 +8452:3:3461 +8453:0:4365 +8454:2:1451 +8455:0:4365 +8456:3:3462 +8457:0:4365 +8458:2:1652 +8459:0:4365 +8460:2:1653 +8461:0:4365 +8462:2:1657 +8463:0:4365 +8464:2:1660 +8465:0:4365 +8466:3:3461 +8467:0:4365 +8468:2:1665 +8469:2:1669 +8470:2:1670 +8471:2:1678 +8472:2:1679 +8473:2:1683 +8474:2:1684 +8475:2:1678 +8476:2:1679 +8477:2:1680 +8478:2:1692 +8479:2:1697 +8480:2:1701 +8481:2:1702 +8482:2:1709 +8483:2:1710 +8484:2:1721 +8485:2:1722 +8486:2:1723 +8487:2:1721 +8488:2:1722 +8489:2:1723 +8490:2:1734 +8491:2:1739 +8492:2:1740 +8493:0:4365 +8494:3:3462 +8495:0:4365 +8496:2:1752 +8497:0:4365 +8498:3:3461 +8499:0:4365 +8500:2:1754 +8501:0:4365 +8502:3:3462 +8503:0:4365 +8504:2:1755 +8505:2:1759 +8506:2:1760 +8507:2:1768 +8508:2:1769 +8509:2:1773 +8510:2:1774 +8511:2:1768 +8512:2:1769 +8513:2:1773 +8514:2:1774 +8515:2:1782 +8516:2:1787 +8517:2:1791 +8518:2:1792 +8519:2:1799 +8520:2:1800 +8521:2:1811 +8522:2:1812 +8523:2:1813 +8524:2:1811 +8525:2:1812 +8526:2:1813 +8527:2:1824 +8528:2:1829 +8529:2:1830 +8530:0:4365 +8531:2:1842 +8532:0:4365 +8533:3:3461 +8534:0:4365 +8535:2:1844 +8536:0:4365 +8537:3:3462 +8538:0:4365 +8539:2:1845 +8540:2:1849 +8541:2:1850 +8542:2:1858 +8543:2:1859 +8544:2:1863 +8545:2:1864 +8546:2:1858 +8547:2:1859 +8548:2:1863 +8549:2:1864 +8550:2:1872 +8551:2:1877 +8552:2:1881 +8553:2:1882 +8554:2:1889 +8555:2:1890 +8556:2:1901 +8557:2:1902 +8558:2:1903 +8559:2:1901 +8560:2:1902 +8561:2:1903 +8562:2:1914 +8563:2:1919 +8564:2:1920 +8565:0:4365 +8566:2:1932 +8567:0:4365 +8568:3:3461 +8569:0:4365 +8570:2:1934 +8571:0:4365 +8572:3:3462 +8573:0:4365 +8574:2:1935 +8575:0:4365 +8576:2:1936 +8577:0:4365 +8578:2:2129 +8579:0:4365 +8580:2:2130 +8581:0:4365 +8582:2:2134 +8583:0:4365 +8584:3:3461 +8585:0:4365 +8586:2:2136 +8587:0:4365 +8588:3:3462 +8589:0:4365 +8590:2:2137 +8591:2:2141 +8592:2:2142 +8593:2:2150 +8594:2:2151 +8595:2:2155 +8596:2:2156 +8597:2:2150 +8598:2:2151 +8599:2:2155 +8600:2:2156 +8601:2:2164 +8602:2:2169 +8603:2:2173 +8604:2:2174 +8605:2:2181 +8606:2:2182 +8607:2:2193 +8608:2:2194 +8609:2:2195 +8610:2:2193 +8611:2:2194 +8612:2:2195 +8613:2:2206 +8614:2:2211 +8615:2:2212 +8616:0:4365 +8617:2:2224 +8618:0:4365 +8619:3:3461 +8620:0:4365 +8621:2:2226 +8622:0:4365 +8623:3:3462 +8624:0:4365 +8625:2:2230 +8626:0:4365 +8627:3:3461 +8628:0:4365 +8629:2:2235 +8630:2:2239 +8631:2:2240 +8632:2:2248 +8633:2:2249 +8634:2:2253 +8635:2:2254 +8636:2:2248 +8637:2:2249 +8638:2:2250 +8639:2:2262 +8640:2:2267 +8641:2:2271 +8642:2:2272 +8643:2:2279 +8644:2:2280 +8645:2:2291 +8646:2:2292 +8647:2:2293 +8648:2:2291 +8649:2:2292 +8650:2:2293 +8651:2:2304 +8652:2:2309 +8653:2:2310 +8654:0:4365 +8655:3:3462 +8656:0:4365 +8657:2:2322 +8658:0:4365 +8659:2:1169 +8660:0:4365 +8661:3:3461 +8662:0:4365 +8663:2:1170 +8664:0:4365 +8665:3:3462 +8666:0:4365 +8667:3:3463 +8668:0:4365 +8669:3:3469 +8670:0:4365 +8671:3:3470 +8672:3:3474 +8673:3:3475 +8674:3:3483 +8675:3:3484 +8676:3:3488 +8677:3:3489 +8678:3:3483 +8679:3:3484 +8680:3:3488 +8681:3:3489 +8682:3:3497 +8683:3:3502 +8684:3:3506 +8685:3:3507 +8686:3:3514 +8687:3:3515 +8688:3:3526 +8689:3:3527 +8690:3:3528 +8691:3:3526 +8692:3:3527 +8693:3:3528 +8694:3:3539 +8695:3:3544 +8696:3:3545 +8697:0:4365 +8698:3:3557 +8699:0:4365 +8700:3:3558 +8701:0:4365 +8702:2:1173 +8703:0:4365 +8704:3:3559 +8705:0:4365 +8706:2:1179 +8707:0:4365 +8708:2:1180 +8709:0:4365 +8710:3:3558 +8711:0:4365 +8712:2:1181 +8713:2:1185 +8714:2:1186 +8715:2:1194 +8716:2:1195 +8717:2:1199 +8718:2:1200 +8719:2:1194 +8720:2:1195 +8721:2:1199 +8722:2:1200 +8723:2:1208 +8724:2:1213 +8725:2:1217 +8726:2:1218 +8727:2:1225 +8728:2:1226 +8729:2:1237 +8730:2:1238 +8731:2:1239 +8732:2:1237 +8733:2:1238 +8734:2:1239 +8735:2:1250 +8736:2:1255 +8737:2:1256 +8738:0:4365 +8739:3:3559 +8740:0:4365 +8741:2:1268 +8742:0:4365 +8743:3:3558 +8744:0:4365 +8745:2:1270 +8746:0:4365 +8747:3:3559 +8748:0:4365 +8749:2:1271 +8750:2:1275 +8751:2:1276 +8752:2:1284 +8753:2:1285 +8754:2:1289 +8755:2:1290 +8756:2:1284 +8757:2:1285 +8758:2:1289 +8759:2:1290 +8760:2:1298 +8761:2:1303 +8762:2:1307 +8763:2:1308 +8764:2:1315 +8765:2:1316 +8766:2:1327 +8767:2:1328 +8768:2:1329 +8769:2:1327 +8770:2:1328 +8771:2:1329 +8772:2:1340 +8773:2:1345 +8774:2:1346 +8775:0:4365 +8776:2:1358 +8777:0:4365 +8778:2:1360 +8779:0:4365 +8780:3:3558 +8781:0:4365 +8782:2:1361 +8783:0:4365 +8784:3:3559 +8785:0:4365 +8786:2:1362 +8787:2:1366 +8788:2:1367 +8789:2:1375 +8790:2:1376 +8791:2:1380 +8792:2:1381 +8793:2:1375 +8794:2:1376 +8795:2:1380 +8796:2:1381 +8797:2:1389 +8798:2:1394 +8799:2:1398 +8800:2:1399 +8801:2:1406 +8802:2:1407 +8803:2:1418 +8804:2:1419 +8805:2:1420 +8806:2:1418 +8807:2:1419 +8808:2:1420 +8809:2:1431 +8810:2:1436 +8811:2:1437 +8812:0:4365 +8813:2:1449 +8814:0:4365 +8815:3:3558 +8816:0:4365 +8817:2:1451 +8818:0:4365 +8819:3:3559 +8820:0:4365 +8821:2:1652 +8822:0:4365 +8823:2:1653 +8824:0:4365 +8825:2:1657 +8826:0:4365 +8827:2:1660 +8828:0:4365 +8829:3:3558 +8830:0:4365 +8831:2:1665 +8832:2:1669 +8833:2:1670 +8834:2:1678 +8835:2:1679 +8836:2:1683 +8837:2:1684 +8838:2:1678 +8839:2:1679 +8840:2:1680 +8841:2:1692 +8842:2:1697 +8843:2:1701 +8844:2:1702 +8845:2:1709 +8846:2:1710 +8847:2:1721 +8848:2:1722 +8849:2:1723 +8850:2:1721 +8851:2:1722 +8852:2:1723 +8853:2:1734 +8854:2:1739 +8855:2:1740 +8856:0:4365 +8857:3:3559 +8858:0:4365 +8859:2:1752 +8860:0:4365 +8861:3:3558 +8862:0:4365 +8863:2:1754 +8864:0:4365 +8865:3:3559 +8866:0:4365 +8867:2:1755 +8868:2:1759 +8869:2:1760 +8870:2:1768 +8871:2:1769 +8872:2:1773 +8873:2:1774 +8874:2:1768 +8875:2:1769 +8876:2:1773 +8877:2:1774 +8878:2:1782 +8879:2:1787 +8880:2:1791 +8881:2:1792 +8882:2:1799 +8883:2:1800 +8884:2:1811 +8885:2:1812 +8886:2:1813 +8887:2:1811 +8888:2:1812 +8889:2:1813 +8890:2:1824 +8891:2:1829 +8892:2:1830 +8893:0:4365 +8894:2:1842 +8895:0:4365 +8896:3:3558 +8897:0:4365 +8898:2:1844 +8899:0:4365 +8900:3:3559 +8901:0:4365 +8902:2:1845 +8903:2:1849 +8904:2:1850 +8905:2:1858 +8906:2:1859 +8907:2:1863 +8908:2:1864 +8909:2:1858 +8910:2:1859 +8911:2:1863 +8912:2:1864 +8913:2:1872 +8914:2:1877 +8915:2:1881 +8916:2:1882 +8917:2:1889 +8918:2:1890 +8919:2:1901 +8920:2:1902 +8921:2:1903 +8922:2:1901 +8923:2:1902 +8924:2:1903 +8925:2:1914 +8926:2:1919 +8927:2:1920 +8928:0:4365 +8929:2:1932 +8930:0:4365 +8931:3:3558 +8932:0:4365 +8933:2:1934 +8934:0:4365 +8935:3:3559 +8936:0:4365 +8937:2:1935 +8938:0:4365 +8939:2:1936 +8940:0:4365 +8941:2:2129 +8942:0:4365 +8943:2:2130 +8944:0:4365 +8945:2:2134 +8946:0:4365 +8947:3:3558 +8948:0:4365 +8949:2:2136 +8950:0:4365 +8951:3:3559 +8952:0:4365 +8953:2:2137 +8954:2:2141 +8955:2:2142 +8956:2:2150 +8957:2:2151 +8958:2:2155 +8959:2:2156 +8960:2:2150 +8961:2:2151 +8962:2:2155 +8963:2:2156 +8964:2:2164 +8965:2:2169 +8966:2:2173 +8967:2:2174 +8968:2:2181 +8969:2:2182 +8970:2:2193 +8971:2:2194 +8972:2:2195 +8973:2:2193 +8974:2:2194 +8975:2:2195 +8976:2:2206 +8977:2:2211 +8978:2:2212 +8979:0:4365 +8980:2:2224 +8981:0:4365 +8982:3:3558 +8983:0:4365 +8984:2:2226 +8985:0:4365 +8986:3:3559 +8987:0:4365 +8988:2:2230 +8989:0:4365 +8990:3:3558 +8991:0:4365 +8992:2:2235 +8993:2:2239 +8994:2:2240 +8995:2:2248 +8996:2:2249 +8997:2:2253 +8998:2:2254 +8999:2:2248 +9000:2:2249 +9001:2:2250 +9002:2:2262 +9003:2:2267 +9004:2:2271 +9005:2:2272 +9006:2:2279 +9007:2:2280 +9008:2:2291 +9009:2:2292 +9010:2:2293 +9011:2:2291 +9012:2:2292 +9013:2:2293 +9014:2:2304 +9015:2:2309 +9016:2:2310 +9017:0:4365 +9018:3:3559 +9019:0:4365 +9020:2:2322 +9021:0:4365 +9022:2:1169 +9023:0:4365 +9024:3:3558 +9025:0:4365 +9026:2:1170 +9027:0:4365 +9028:3:3559 +9029:0:4365 +9030:3:3560 +9031:0:4365 +9032:3:3566 +9033:0:4365 +9034:3:3569 +9035:3:3570 +9036:3:3582 +9037:3:3583 +9038:3:3587 +9039:3:3588 +9040:3:3582 +9041:3:3583 +9042:3:3587 +9043:3:3588 +9044:3:3596 +9045:3:3601 +9046:3:3605 +9047:3:3606 +9048:3:3613 +9049:3:3614 +9050:3:3625 +9051:3:3626 +9052:3:3627 +9053:3:3625 +9054:3:3626 +9055:3:3627 +9056:3:3638 +9057:3:3643 +9058:3:3644 +9059:0:4365 +9060:3:3656 +9061:0:4365 +9062:3:3657 +9063:0:4365 +9064:2:1173 +9065:0:4365 +9066:3:3658 +9067:0:4365 +9068:2:1179 +9069:0:4365 +9070:2:1180 +9071:0:4365 +9072:3:3657 +9073:0:4365 +9074:2:1181 +9075:2:1185 +9076:2:1186 +9077:2:1194 +9078:2:1195 +9079:2:1199 +9080:2:1200 +9081:2:1194 +9082:2:1195 +9083:2:1199 +9084:2:1200 +9085:2:1208 +9086:2:1213 +9087:2:1217 +9088:2:1218 +9089:2:1225 +9090:2:1226 +9091:2:1237 +9092:2:1238 +9093:2:1239 +9094:2:1237 +9095:2:1238 +9096:2:1239 +9097:2:1250 +9098:2:1255 +9099:2:1256 +9100:0:4365 +9101:3:3658 +9102:0:4365 +9103:2:1268 +9104:0:4365 +9105:3:3657 +9106:0:4365 +9107:2:1270 +9108:0:4365 +9109:3:3658 +9110:0:4365 +9111:2:1271 +9112:2:1275 +9113:2:1276 +9114:2:1284 +9115:2:1285 +9116:2:1289 +9117:2:1290 +9118:2:1284 +9119:2:1285 +9120:2:1289 +9121:2:1290 +9122:2:1298 +9123:2:1303 +9124:2:1307 +9125:2:1308 +9126:2:1315 +9127:2:1316 +9128:2:1327 +9129:2:1328 +9130:2:1329 +9131:2:1327 +9132:2:1328 +9133:2:1329 +9134:2:1340 +9135:2:1345 +9136:2:1346 +9137:0:4365 +9138:2:1358 +9139:0:4365 +9140:2:1360 +9141:0:4365 +9142:3:3657 +9143:0:4365 +9144:2:1361 +9145:0:4365 +9146:3:3658 +9147:0:4365 +9148:2:1362 +9149:2:1366 +9150:2:1367 +9151:2:1375 +9152:2:1376 +9153:2:1380 +9154:2:1381 +9155:2:1375 +9156:2:1376 +9157:2:1380 +9158:2:1381 +9159:2:1389 +9160:2:1394 +9161:2:1398 +9162:2:1399 +9163:2:1406 +9164:2:1407 +9165:2:1418 +9166:2:1419 +9167:2:1420 +9168:2:1418 +9169:2:1419 +9170:2:1420 +9171:2:1431 +9172:2:1436 +9173:2:1437 +9174:0:4365 +9175:2:1449 +9176:0:4365 +9177:3:3657 +9178:0:4365 +9179:2:1451 +9180:0:4365 +9181:3:3658 +9182:0:4365 +9183:2:1652 +9184:0:4365 +9185:2:1653 +9186:0:4365 +9187:2:1657 +9188:0:4365 +9189:2:1660 +9190:0:4365 +9191:3:3657 +9192:0:4365 +9193:2:1665 +9194:2:1669 +9195:2:1670 +9196:2:1678 +9197:2:1679 +9198:2:1683 +9199:2:1684 +9200:2:1678 +9201:2:1679 +9202:2:1680 +9203:2:1692 +9204:2:1697 +9205:2:1701 +9206:2:1702 +9207:2:1709 +9208:2:1710 +9209:2:1721 +9210:2:1722 +9211:2:1723 +9212:2:1721 +9213:2:1722 +9214:2:1723 +9215:2:1734 +9216:2:1739 +9217:2:1740 +9218:0:4365 +9219:3:3658 +9220:0:4365 +9221:2:1752 +9222:0:4365 +9223:3:3657 +9224:0:4365 +9225:2:1754 +9226:0:4365 +9227:3:3658 +9228:0:4365 +9229:2:1755 +9230:2:1759 +9231:2:1760 +9232:2:1768 +9233:2:1769 +9234:2:1773 +9235:2:1774 +9236:2:1768 +9237:2:1769 +9238:2:1773 +9239:2:1774 +9240:2:1782 +9241:2:1787 +9242:2:1791 +9243:2:1792 +9244:2:1799 +9245:2:1800 +9246:2:1811 +9247:2:1812 +9248:2:1813 +9249:2:1811 +9250:2:1812 +9251:2:1813 +9252:2:1824 +9253:2:1829 +9254:2:1830 +9255:0:4365 +9256:2:1842 +9257:0:4365 +9258:3:3657 +9259:0:4365 +9260:2:1844 +9261:0:4365 +9262:3:3658 +9263:0:4365 +9264:2:1845 +9265:2:1849 +9266:2:1850 +9267:2:1858 +9268:2:1859 +9269:2:1863 +9270:2:1864 +9271:2:1858 +9272:2:1859 +9273:2:1863 +9274:2:1864 +9275:2:1872 +9276:2:1877 +9277:2:1881 +9278:2:1882 +9279:2:1889 +9280:2:1890 +9281:2:1901 +9282:2:1902 +9283:2:1903 +9284:2:1901 +9285:2:1902 +9286:2:1903 +9287:2:1914 +9288:2:1919 +9289:2:1920 +9290:0:4365 +9291:2:1932 +9292:0:4365 +9293:3:3657 +9294:0:4365 +9295:2:1934 +9296:0:4365 +9297:3:3658 +9298:0:4365 +9299:2:1935 +9300:0:4365 +9301:2:1936 +9302:0:4365 +9303:2:2129 +9304:0:4365 +9305:2:2130 +9306:0:4365 +9307:2:2134 +9308:0:4365 +9309:3:3657 +9310:0:4365 +9311:2:2136 +9312:0:4365 +9313:3:3658 +9314:0:4365 +9315:2:2137 +9316:2:2141 +9317:2:2142 +9318:2:2150 +9319:2:2151 +9320:2:2155 +9321:2:2156 +9322:2:2150 +9323:2:2151 +9324:2:2155 +9325:2:2156 +9326:2:2164 +9327:2:2169 +9328:2:2173 +9329:2:2174 +9330:2:2181 +9331:2:2182 +9332:2:2193 +9333:2:2194 +9334:2:2195 +9335:2:2193 +9336:2:2194 +9337:2:2195 +9338:2:2206 +9339:2:2211 +9340:2:2212 +9341:0:4365 +9342:2:2224 +9343:0:4365 +9344:3:3657 +9345:0:4365 +9346:2:2226 +9347:0:4365 +9348:3:3658 +9349:0:4365 +9350:2:2230 +9351:0:4365 +9352:3:3657 +9353:0:4365 +9354:2:2235 +9355:2:2239 +9356:2:2240 +9357:2:2248 +9358:2:2249 +9359:2:2253 +9360:2:2254 +9361:2:2248 +9362:2:2249 +9363:2:2250 +9364:2:2262 +9365:2:2267 +9366:2:2271 +9367:2:2272 +9368:2:2279 +9369:2:2280 +9370:2:2291 +9371:2:2292 +9372:2:2293 +9373:2:2291 +9374:2:2292 +9375:2:2293 +9376:2:2304 +9377:2:2309 +9378:2:2310 +9379:0:4365 +9380:3:3658 +9381:0:4365 +9382:2:2322 +9383:0:4365 +9384:2:1169 +9385:0:4365 +9386:3:3657 +9387:0:4365 +9388:2:1170 +9389:0:4365 +9390:3:3658 +9391:0:4365 +9392:3:3659 +9393:0:4365 +9394:3:3665 +9395:0:4365 +9396:3:3666 +9397:0:4365 +9398:3:3667 +9399:0:4365 +9400:3:3668 +9401:0:4365 +9402:3:3669 +9403:3:3673 +9404:3:3674 +9405:3:3682 +9406:3:3683 +9407:3:3687 +9408:3:3688 +9409:3:3682 +9410:3:3683 +9411:3:3687 +9412:3:3688 +9413:3:3696 +9414:3:3701 +9415:3:3705 +9416:3:3706 +9417:3:3713 +9418:3:3714 +9419:3:3725 +9420:3:3726 +9421:3:3727 +9422:3:3725 +9423:3:3726 +9424:3:3727 +9425:3:3738 +9426:3:3743 +9427:3:3744 +9428:0:4365 +9429:3:3756 +9430:0:4365 +9431:3:3757 +9432:0:4365 +9433:2:1173 +9434:0:4365 +9435:3:3758 +9436:0:4365 +9437:2:1179 +9438:0:4365 +9439:2:1180 +9440:0:4365 +9441:3:3757 +9442:0:4365 +9443:2:1181 +9444:2:1185 +9445:2:1186 +9446:2:1194 +9447:2:1195 +9448:2:1199 +9449:2:1200 +9450:2:1194 +9451:2:1195 +9452:2:1199 +9453:2:1200 +9454:2:1208 +9455:2:1213 +9456:2:1217 +9457:2:1218 +9458:2:1225 +9459:2:1226 +9460:2:1237 +9461:2:1238 +9462:2:1239 +9463:2:1237 +9464:2:1238 +9465:2:1239 +9466:2:1250 +9467:2:1255 +9468:2:1256 +9469:0:4365 +9470:3:3758 +9471:0:4365 +9472:2:1268 +9473:0:4365 +9474:3:3757 +9475:0:4365 +9476:2:1270 +9477:0:4365 +9478:3:3758 +9479:0:4365 +9480:2:1271 +9481:2:1275 +9482:2:1276 +9483:2:1284 +9484:2:1285 +9485:2:1289 +9486:2:1290 +9487:2:1284 +9488:2:1285 +9489:2:1289 +9490:2:1290 +9491:2:1298 +9492:2:1303 +9493:2:1307 +9494:2:1308 +9495:2:1315 +9496:2:1316 +9497:2:1327 +9498:2:1328 +9499:2:1329 +9500:2:1327 +9501:2:1328 +9502:2:1329 +9503:2:1340 +9504:2:1345 +9505:2:1346 +9506:0:4365 +9507:2:1358 +9508:0:4365 +9509:2:1360 +9510:0:4365 +9511:3:3757 +9512:0:4365 +9513:2:1361 +9514:0:4365 +9515:3:3758 +9516:0:4365 +9517:2:1362 +9518:2:1366 +9519:2:1367 +9520:2:1375 +9521:2:1376 +9522:2:1380 +9523:2:1381 +9524:2:1375 +9525:2:1376 +9526:2:1380 +9527:2:1381 +9528:2:1389 +9529:2:1394 +9530:2:1398 +9531:2:1399 +9532:2:1406 +9533:2:1407 +9534:2:1418 +9535:2:1419 +9536:2:1420 +9537:2:1418 +9538:2:1419 +9539:2:1420 +9540:2:1431 +9541:2:1436 +9542:2:1437 +9543:0:4365 +9544:2:1449 +9545:0:4365 +9546:3:3757 +9547:0:4365 +9548:2:1451 +9549:0:4365 +9550:3:3758 +9551:0:4365 +9552:2:1652 +9553:0:4365 +9554:2:1653 +9555:0:4365 +9556:2:1657 +9557:0:4365 +9558:2:1660 +9559:0:4365 +9560:3:3757 +9561:0:4365 +9562:2:1665 +9563:2:1669 +9564:2:1670 +9565:2:1678 +9566:2:1679 +9567:2:1683 +9568:2:1684 +9569:2:1678 +9570:2:1679 +9571:2:1680 +9572:2:1692 +9573:2:1697 +9574:2:1701 +9575:2:1702 +9576:2:1709 +9577:2:1710 +9578:2:1721 +9579:2:1722 +9580:2:1723 +9581:2:1721 +9582:2:1722 +9583:2:1723 +9584:2:1734 +9585:2:1739 +9586:2:1740 +9587:0:4365 +9588:3:3758 +9589:0:4365 +9590:2:1752 +9591:0:4365 +9592:3:3757 +9593:0:4365 +9594:2:1754 +9595:0:4365 +9596:3:3758 +9597:0:4365 +9598:2:1755 +9599:2:1759 +9600:2:1760 +9601:2:1768 +9602:2:1769 +9603:2:1773 +9604:2:1774 +9605:2:1768 +9606:2:1769 +9607:2:1773 +9608:2:1774 +9609:2:1782 +9610:2:1787 +9611:2:1791 +9612:2:1792 +9613:2:1799 +9614:2:1800 +9615:2:1811 +9616:2:1812 +9617:2:1813 +9618:2:1811 +9619:2:1812 +9620:2:1813 +9621:2:1824 +9622:2:1829 +9623:2:1830 +9624:0:4365 +9625:2:1842 +9626:0:4365 +9627:3:3757 +9628:0:4365 +9629:2:1844 +9630:0:4365 +9631:3:3758 +9632:0:4365 +9633:2:1845 +9634:2:1849 +9635:2:1850 +9636:2:1858 +9637:2:1859 +9638:2:1863 +9639:2:1864 +9640:2:1858 +9641:2:1859 +9642:2:1863 +9643:2:1864 +9644:2:1872 +9645:2:1877 +9646:2:1881 +9647:2:1882 +9648:2:1889 +9649:2:1890 +9650:2:1901 +9651:2:1902 +9652:2:1903 +9653:2:1901 +9654:2:1902 +9655:2:1903 +9656:2:1914 +9657:2:1919 +9658:2:1920 +9659:0:4365 +9660:2:1932 +9661:0:4365 +9662:3:3757 +9663:0:4365 +9664:2:1934 +9665:0:4365 +9666:3:3758 +9667:0:4365 +9668:2:1935 +9669:0:4365 +9670:2:1936 +9671:0:4365 +9672:2:2129 +9673:0:4365 +9674:2:2130 +9675:0:4365 +9676:2:2134 +9677:0:4365 +9678:3:3757 +9679:0:4365 +9680:2:2136 +9681:0:4365 +9682:3:3758 +9683:0:4365 +9684:2:2137 +9685:2:2141 +9686:2:2142 +9687:2:2150 +9688:2:2151 +9689:2:2155 +9690:2:2156 +9691:2:2150 +9692:2:2151 +9693:2:2155 +9694:2:2156 +9695:2:2164 +9696:2:2169 +9697:2:2173 +9698:2:2174 +9699:2:2181 +9700:2:2182 +9701:2:2193 +9702:2:2194 +9703:2:2195 +9704:2:2193 +9705:2:2194 +9706:2:2195 +9707:2:2206 +9708:2:2211 +9709:2:2212 +9710:0:4365 +9711:2:2224 +9712:0:4365 +9713:3:3757 +9714:0:4365 +9715:2:2226 +9716:0:4365 +9717:3:3758 +9718:0:4365 +9719:2:2230 +9720:0:4365 +9721:3:3757 +9722:0:4365 +9723:2:2235 +9724:2:2239 +9725:2:2240 +9726:2:2248 +9727:2:2249 +9728:2:2253 +9729:2:2254 +9730:2:2248 +9731:2:2249 +9732:2:2250 +9733:2:2262 +9734:2:2267 +9735:2:2271 +9736:2:2272 +9737:2:2279 +9738:2:2280 +9739:2:2291 +9740:2:2292 +9741:2:2293 +9742:2:2291 +9743:2:2292 +9744:2:2293 +9745:2:2304 +9746:2:2309 +9747:2:2310 +9748:0:4365 +9749:3:3758 +9750:0:4365 +9751:2:2322 +9752:0:4365 +9753:2:1169 +9754:0:4365 +9755:3:3757 +9756:0:4365 +9757:2:1170 +9758:0:4365 +9759:3:3758 +9760:0:4365 +9761:3:3759 +9762:0:4365 +9763:3:3972 +9764:0:4365 +9765:3:3980 +9766:0:4365 +9767:3:3981 +9768:3:3985 +9769:3:3986 +9770:3:3994 +9771:3:3995 +9772:3:3999 +9773:3:4000 +9774:3:3994 +9775:3:3995 +9776:3:3999 +9777:3:4000 +9778:3:4008 +9779:3:4013 +9780:3:4017 +9781:3:4018 +9782:3:4025 +9783:3:4026 +9784:3:4037 +9785:3:4038 +9786:3:4039 +9787:3:4037 +9788:3:4038 +9789:3:4039 +9790:3:4050 +9791:3:4055 +9792:3:4056 +9793:0:4365 +9794:3:4068 +9795:0:4365 +9796:3:4069 +9797:0:4365 +9798:2:1173 +9799:0:4365 +9800:3:4070 +9801:0:4365 +9802:2:1179 +9803:0:4365 +9804:2:1180 +9805:0:4365 +9806:3:4069 +9807:0:4365 +9808:2:1181 +9809:2:1185 +9810:2:1186 +9811:2:1194 +9812:2:1195 +9813:2:1199 +9814:2:1200 +9815:2:1194 +9816:2:1195 +9817:2:1199 +9818:2:1200 +9819:2:1208 +9820:2:1213 +9821:2:1217 +9822:2:1218 +9823:2:1225 +9824:2:1226 +9825:2:1237 +9826:2:1238 +9827:2:1239 +9828:2:1237 +9829:2:1238 +9830:2:1239 +9831:2:1250 +9832:2:1255 +9833:2:1256 +9834:0:4365 +9835:3:4070 +9836:0:4365 +9837:2:1268 +9838:0:4365 +9839:3:4069 +9840:0:4365 +9841:2:1270 +9842:0:4365 +9843:3:4070 +9844:0:4365 +9845:2:1271 +9846:2:1275 +9847:2:1276 +9848:2:1284 +9849:2:1285 +9850:2:1289 +9851:2:1290 +9852:2:1284 +9853:2:1285 +9854:2:1289 +9855:2:1290 +9856:2:1298 +9857:2:1303 +9858:2:1307 +9859:2:1308 +9860:2:1315 +9861:2:1316 +9862:2:1327 +9863:2:1328 +9864:2:1329 +9865:2:1327 +9866:2:1328 +9867:2:1329 +9868:2:1340 +9869:2:1345 +9870:2:1346 +9871:0:4365 +9872:2:1358 +9873:0:4365 +9874:2:1360 +9875:0:4365 +9876:3:4069 +9877:0:4365 +9878:2:1361 +9879:0:4365 +9880:3:4070 +9881:0:4365 +9882:2:1362 +9883:2:1366 +9884:2:1367 +9885:2:1375 +9886:2:1376 +9887:2:1380 +9888:2:1381 +9889:2:1375 +9890:2:1376 +9891:2:1380 +9892:2:1381 +9893:2:1389 +9894:2:1394 +9895:2:1398 +9896:2:1399 +9897:2:1406 +9898:2:1407 +9899:2:1418 +9900:2:1419 +9901:2:1420 +9902:2:1418 +9903:2:1419 +9904:2:1420 +9905:2:1431 +9906:2:1436 +9907:2:1437 +9908:0:4365 +9909:2:1449 +9910:0:4365 +9911:3:4069 +9912:0:4365 +9913:2:1451 +9914:0:4365 +9915:3:4070 +9916:0:4365 +9917:2:1652 +9918:0:4365 +9919:2:1653 +9920:0:4365 +9921:2:1657 +9922:0:4365 +9923:2:1660 +9924:0:4365 +9925:3:4069 +9926:0:4365 +9927:2:1665 +9928:2:1669 +9929:2:1670 +9930:2:1678 +9931:2:1679 +9932:2:1683 +9933:2:1684 +9934:2:1678 +9935:2:1679 +9936:2:1680 +9937:2:1692 +9938:2:1697 +9939:2:1701 +9940:2:1702 +9941:2:1709 +9942:2:1710 +9943:2:1721 +9944:2:1722 +9945:2:1723 +9946:2:1721 +9947:2:1722 +9948:2:1723 +9949:2:1734 +9950:2:1739 +9951:2:1740 +9952:0:4365 +9953:3:4070 +9954:0:4365 +9955:2:1752 +9956:0:4365 +9957:3:4069 +9958:0:4365 +9959:2:1754 +9960:0:4365 +9961:3:4070 +9962:0:4365 +9963:2:1755 +9964:2:1759 +9965:2:1760 +9966:2:1768 +9967:2:1769 +9968:2:1773 +9969:2:1774 +9970:2:1768 +9971:2:1769 +9972:2:1773 +9973:2:1774 +9974:2:1782 +9975:2:1787 +9976:2:1791 +9977:2:1792 +9978:2:1799 +9979:2:1800 +9980:2:1811 +9981:2:1812 +9982:2:1813 +9983:2:1811 +9984:2:1812 +9985:2:1813 +9986:2:1824 +9987:2:1829 +9988:2:1830 +9989:0:4365 +9990:2:1842 +9991:0:4365 +9992:3:4069 +9993:0:4365 +9994:2:1844 +9995:0:4365 +9996:3:4070 +9997:0:4365 +9998:2:1845 +9999:2:1849 +10000:2:1850 +10001:2:1858 +10002:2:1859 +10003:2:1863 +10004:2:1864 +10005:2:1858 +10006:2:1859 +10007:2:1863 +10008:2:1864 +10009:2:1872 +10010:2:1877 +10011:2:1881 +10012:2:1882 +10013:2:1889 +10014:2:1890 +10015:2:1901 +10016:2:1902 +10017:2:1903 +10018:2:1901 +10019:2:1902 +10020:2:1903 +10021:2:1914 +10022:2:1919 +10023:2:1920 +10024:0:4365 +10025:2:1932 +10026:0:4365 +10027:3:4069 +10028:0:4365 +10029:2:1934 +10030:0:4365 +10031:3:4070 +10032:0:4365 +10033:2:1935 +10034:0:4365 +10035:2:1936 +10036:0:4365 +10037:2:2129 +10038:0:4365 +10039:2:2130 +10040:0:4365 +10041:2:2134 +10042:0:4365 +10043:3:4069 +10044:0:4365 +10045:2:2136 +10046:0:4365 +10047:3:4070 +10048:0:4365 +10049:2:2137 +10050:2:2141 +10051:2:2142 +10052:2:2150 +10053:2:2151 +10054:2:2155 +10055:2:2156 +10056:2:2150 +10057:2:2151 +10058:2:2155 +10059:2:2156 +10060:2:2164 +10061:2:2169 +10062:2:2173 +10063:2:2174 +10064:2:2181 +10065:2:2182 +10066:2:2193 +10067:2:2194 +10068:2:2195 +10069:2:2193 +10070:2:2194 +10071:2:2195 +10072:2:2206 +10073:2:2211 +10074:2:2212 +10075:0:4365 +10076:2:2224 +10077:0:4365 +10078:3:4069 +10079:0:4365 +10080:2:2226 +10081:0:4365 +10082:3:4070 +10083:0:4365 +10084:2:2230 +10085:0:4365 +10086:3:4069 +10087:0:4365 +10088:2:2235 +10089:2:2239 +10090:2:2240 +10091:2:2248 +10092:2:2249 +10093:2:2253 +10094:2:2254 +10095:2:2248 +10096:2:2249 +10097:2:2250 +10098:2:2262 +10099:2:2267 +10100:2:2271 +10101:2:2272 +10102:2:2279 +10103:2:2280 +10104:2:2291 +10105:2:2292 +10106:2:2293 +10107:2:2291 +10108:2:2292 +10109:2:2293 +10110:2:2304 +10111:2:2309 +10112:2:2310 +10113:0:4365 +10114:3:4070 +10115:0:4365 +10116:2:2322 +10117:0:4365 +10118:2:1169 +10119:0:4365 +10120:3:4069 +10121:0:4365 +10122:2:1170 +10123:0:4365 +10124:3:4070 +10125:0:4365 +10126:3:4071 +10127:0:4365 +10128:3:4081 +10129:0:4365 +10130:3:3666 +10131:0:4365 +10132:3:3667 +10133:0:4365 +10134:3:3668 +10135:0:4365 +10136:3:3669 +10137:3:3673 +10138:3:3674 +10139:3:3682 +10140:3:3683 +10141:3:3687 +10142:3:3688 +10143:3:3682 +10144:3:3683 +10145:3:3687 +10146:3:3688 +10147:3:3696 +10148:3:3701 +10149:3:3705 +10150:3:3706 +10151:3:3713 +10152:3:3714 +10153:3:3725 +10154:3:3726 +10155:3:3727 +10156:3:3725 +10157:3:3726 +10158:3:3727 +10159:3:3738 +10160:3:3743 +10161:3:3744 +10162:0:4365 +10163:3:3756 +10164:0:4365 +10165:3:3757 +10166:0:4365 +10167:2:1173 +10168:0:4365 +10169:3:3758 +10170:0:4365 +10171:2:1179 +10172:0:4365 +10173:2:1180 +10174:0:4365 +10175:3:3757 +10176:0:4365 +10177:2:1181 +10178:2:1185 +10179:2:1186 +10180:2:1194 +10181:2:1195 +10182:2:1199 +10183:2:1200 +10184:2:1194 +10185:2:1195 +10186:2:1199 +10187:2:1200 +10188:2:1208 +10189:2:1213 +10190:2:1217 +10191:2:1218 +10192:2:1225 +10193:2:1226 +10194:2:1237 +10195:2:1238 +10196:2:1239 +10197:2:1237 +10198:2:1238 +10199:2:1239 +10200:2:1250 +10201:2:1255 +10202:2:1256 +10203:0:4365 +10204:3:3758 +10205:0:4365 +10206:2:1268 +10207:0:4365 +10208:3:3757 +10209:0:4365 +10210:2:1270 +10211:0:4365 +10212:3:3758 +10213:0:4365 +10214:2:1271 +10215:2:1275 +10216:2:1276 +10217:2:1284 +10218:2:1285 +10219:2:1289 +10220:2:1290 +10221:2:1284 +10222:2:1285 +10223:2:1289 +10224:2:1290 +10225:2:1298 +10226:2:1303 +10227:2:1307 +10228:2:1308 +10229:2:1315 +10230:2:1316 +10231:2:1327 +10232:2:1328 +10233:2:1329 +10234:2:1327 +10235:2:1328 +10236:2:1329 +10237:2:1340 +10238:2:1345 +10239:2:1346 +10240:0:4365 +10241:2:1358 +10242:0:4365 +10243:2:1360 +10244:0:4365 +10245:3:3757 +10246:0:4365 +10247:2:1361 +10248:0:4365 +10249:3:3758 +10250:0:4365 +10251:2:1362 +10252:2:1366 +10253:2:1367 +10254:2:1375 +10255:2:1376 +10256:2:1380 +10257:2:1381 +10258:2:1375 +10259:2:1376 +10260:2:1380 +10261:2:1381 +10262:2:1389 +10263:2:1394 +10264:2:1398 +10265:2:1399 +10266:2:1406 +10267:2:1407 +10268:2:1418 +10269:2:1419 +10270:2:1420 +10271:2:1418 +10272:2:1419 +10273:2:1420 +10274:2:1431 +10275:2:1436 +10276:2:1437 +10277:0:4365 +10278:2:1449 +10279:0:4365 +10280:3:3757 +10281:0:4365 +10282:2:1451 +10283:0:4365 +10284:3:3758 +10285:0:4365 +10286:2:1652 +10287:0:4365 +10288:2:1653 +10289:0:4365 +10290:2:1657 +10291:0:4365 +10292:2:1660 +10293:0:4365 +10294:3:3757 +10295:0:4365 +10296:2:1665 +10297:2:1669 +10298:2:1670 +10299:2:1678 +10300:2:1679 +10301:2:1683 +10302:2:1684 +10303:2:1678 +10304:2:1679 +10305:2:1680 +10306:2:1692 +10307:2:1697 +10308:2:1701 +10309:2:1702 +10310:2:1709 +10311:2:1710 +10312:2:1721 +10313:2:1722 +10314:2:1723 +10315:2:1721 +10316:2:1722 +10317:2:1723 +10318:2:1734 +10319:2:1739 +10320:2:1740 +10321:0:4365 +10322:3:3758 +10323:0:4365 +10324:2:1752 +10325:0:4365 +10326:3:3757 +10327:0:4365 +10328:2:1754 +10329:0:4365 +10330:3:3758 +10331:0:4365 +10332:2:1755 +10333:2:1759 +10334:2:1760 +10335:2:1768 +10336:2:1769 +10337:2:1773 +10338:2:1774 +10339:2:1768 +10340:2:1769 +10341:2:1773 +10342:2:1774 +10343:2:1782 +10344:2:1787 +10345:2:1791 +10346:2:1792 +10347:2:1799 +10348:2:1800 +10349:2:1811 +10350:2:1812 +10351:2:1813 +10352:2:1811 +10353:2:1812 +10354:2:1813 +10355:2:1824 +10356:2:1829 +10357:2:1830 +10358:0:4365 +10359:2:1842 +10360:0:4365 +10361:3:3757 +10362:0:4365 +10363:2:1844 +10364:0:4365 +10365:3:3758 +10366:0:4365 +10367:2:1845 +10368:2:1849 +10369:2:1850 +10370:2:1858 +10371:2:1859 +10372:2:1863 +10373:2:1864 +10374:2:1858 +10375:2:1859 +10376:2:1863 +10377:2:1864 +10378:2:1872 +10379:2:1877 +10380:2:1881 +10381:2:1882 +10382:2:1889 +10383:2:1890 +10384:2:1901 +10385:2:1902 +10386:2:1903 +10387:2:1901 +10388:2:1902 +10389:2:1903 +10390:2:1914 +10391:2:1919 +10392:2:1920 +10393:0:4365 +10394:2:1932 +10395:0:4365 +10396:3:3757 +10397:0:4365 +10398:2:1934 +10399:0:4365 +10400:3:3758 +10401:0:4365 +10402:2:1935 +10403:0:4365 +10404:2:1936 +10405:0:4365 +10406:2:2129 +10407:0:4365 +10408:2:2130 +10409:0:4365 +10410:2:2134 +10411:0:4365 +10412:3:3757 +10413:0:4365 +10414:2:2136 +10415:0:4365 +10416:3:3758 +10417:0:4365 +10418:2:2137 +10419:2:2141 +10420:2:2142 +10421:2:2150 +10422:2:2151 +10423:2:2155 +10424:2:2156 +10425:2:2150 +10426:2:2151 +10427:2:2155 +10428:2:2156 +10429:2:2164 +10430:2:2169 +10431:2:2173 +10432:2:2174 +10433:2:2181 +10434:2:2182 +10435:2:2193 +10436:2:2194 +10437:2:2195 +10438:2:2193 +10439:2:2194 +10440:2:2195 +10441:2:2206 +10442:2:2211 +10443:2:2212 +10444:0:4365 +10445:2:2224 +10446:0:4365 +10447:3:3757 +10448:0:4365 +10449:2:2226 +10450:0:4365 +10451:3:3758 +10452:0:4365 +10453:2:2230 +10454:0:4365 +10455:3:3757 +10456:0:4365 +10457:2:2235 +10458:2:2239 +10459:2:2240 +10460:2:2248 +10461:2:2249 +10462:2:2253 +10463:2:2254 +10464:2:2248 +10465:2:2249 +10466:2:2250 +10467:2:2262 +10468:2:2267 +10469:2:2271 +10470:2:2272 +10471:2:2279 +10472:2:2280 +10473:2:2291 +10474:2:2292 +10475:2:2293 +10476:2:2291 +10477:2:2292 +10478:2:2293 +10479:2:2304 +10480:2:2309 +10481:2:2310 +10482:0:4365 +10483:3:3758 +10484:0:4365 +10485:2:2322 +10486:0:4365 +10487:2:1169 +10488:0:4365 +10489:3:3757 +10490:0:4365 +10491:2:1170 +10492:0:4365 +10493:3:3758 +10494:0:4365 +10495:3:3759 +10496:0:4365 +10497:3:3972 +10498:0:4365 +10499:3:4077 +10500:0:4365 +10501:3:4078 +10502:0:4365 +10503:3:4082 +10504:0:4365 +10505:3:4088 +10506:0:4365 +10507:3:4092 +10508:3:4093 +10509:3:4097 +10510:3:4101 +10511:3:4102 +10512:3:4097 +10513:3:4101 +10514:3:4102 +10515:3:4106 +10516:3:4114 +10517:3:4115 +10518:3:4120 +10519:3:4127 +10520:3:4128 +10521:3:4127 +10522:3:4128 +10523:3:4135 +10524:3:4140 +10525:0:4365 +10526:3:4151 +10527:0:4365 +10528:3:4155 +10529:3:4156 +10530:3:4160 +10531:3:4164 +10532:3:4165 +10533:3:4160 +10534:3:4164 +10535:3:4165 +10536:3:4169 +10537:3:4177 +10538:3:4178 +10539:3:4183 +10540:3:4190 +10541:3:4191 +10542:3:4190 +10543:3:4191 +10544:3:4198 +10545:3:4203 +10546:0:4365 +10547:3:4151 +10548:0:4365 +10549:3:4155 +10550:3:4156 +10551:3:4160 +10552:3:4164 +10553:3:4165 +10554:3:4160 +10555:3:4164 +10556:3:4165 +10557:3:4169 +10558:3:4177 +10559:3:4178 +10560:3:4183 +10561:3:4190 +10562:3:4191 +10563:3:4190 +10564:3:4191 +10565:3:4198 +10566:3:4203 +10567:0:4365 +10568:3:4214 +10569:0:4365 +10570:3:4222 +10571:3:4223 +10572:3:4227 +10573:3:4231 +10574:3:4232 +10575:3:4227 +10576:3:4231 +10577:3:4232 +10578:3:4236 +10579:3:4244 +10580:3:4245 +10581:3:4250 +10582:3:4257 +10583:3:4258 +10584:3:4257 +10585:3:4258 +10586:3:4265 +10587:3:4270 +10588:0:4365 +10589:3:4285 +10590:0:4365 +10591:3:4286 +10592:0:4365 +10593:2:1173 +10594:0:4365 +10595:3:4287 +10596:0:4365 +10597:2:1179 +10598:0:4365 +10599:2:1180 +10600:0:4365 +10601:3:4286 +10602:0:4365 +10603:2:1181 +10604:2:1185 +10605:2:1186 +10606:2:1194 +10607:2:1195 +10608:2:1199 +10609:2:1200 +10610:2:1194 +10611:2:1195 +10612:2:1199 +10613:2:1200 +10614:2:1208 +10615:2:1213 +10616:2:1217 +10617:2:1218 +10618:2:1225 +10619:2:1226 +10620:2:1237 +10621:2:1238 +10622:2:1239 +10623:2:1237 +10624:2:1238 +10625:2:1239 +10626:2:1250 +10627:2:1255 +10628:2:1256 +10629:0:4365 +10630:3:4287 +10631:0:4365 +10632:2:1268 +10633:0:4365 +10634:3:4286 +10635:0:4365 +10636:2:1270 +10637:0:4365 +10638:3:4287 +10639:0:4365 +10640:2:1271 +10641:2:1275 +10642:2:1276 +10643:2:1284 +10644:2:1285 +10645:2:1289 +10646:2:1290 +10647:2:1284 +10648:2:1285 +10649:2:1289 +10650:2:1290 +10651:2:1298 +10652:2:1303 +10653:2:1307 +10654:2:1308 +10655:2:1315 +10656:2:1316 +10657:2:1327 +10658:2:1328 +10659:2:1329 +10660:2:1327 +10661:2:1328 +10662:2:1329 +10663:2:1340 +10664:2:1345 +10665:2:1346 +10666:0:4365 +10667:2:1358 +10668:0:4365 +10669:2:1360 +10670:0:4365 +10671:3:4286 +10672:0:4365 +10673:2:1361 +10674:0:4365 +10675:3:4287 +10676:0:4365 +10677:2:1362 +10678:2:1366 +10679:2:1367 +10680:2:1375 +10681:2:1376 +10682:2:1380 +10683:2:1381 +10684:2:1375 +10685:2:1376 +10686:2:1380 +10687:2:1381 +10688:2:1389 +10689:2:1394 +10690:2:1398 +10691:2:1399 +10692:2:1406 +10693:2:1407 +10694:2:1418 +10695:2:1419 +10696:2:1420 +10697:2:1418 +10698:2:1419 +10699:2:1420 +10700:2:1431 +10701:2:1436 +10702:2:1437 +10703:0:4365 +10704:2:1449 +10705:0:4365 +10706:3:4286 +10707:0:4365 +10708:2:1451 +10709:0:4365 +10710:3:4287 +10711:0:4365 +10712:2:1652 +10713:0:4365 +10714:2:1653 +10715:0:4365 +10716:2:1657 +10717:0:4365 +10718:2:1660 +10719:0:4365 +10720:3:4286 +10721:0:4365 +10722:2:1665 +10723:2:1669 +10724:2:1670 +10725:2:1678 +10726:2:1679 +10727:2:1683 +10728:2:1684 +10729:2:1678 +10730:2:1679 +10731:2:1680 +10732:2:1692 +10733:2:1697 +10734:2:1701 +10735:2:1702 +10736:2:1709 +10737:2:1710 +10738:2:1721 +10739:2:1722 +10740:2:1723 +10741:2:1721 +10742:2:1722 +10743:2:1723 +10744:2:1734 +10745:2:1739 +10746:2:1740 +10747:0:4365 +10748:3:4287 +10749:0:4365 +10750:2:1752 +10751:0:4365 +10752:3:4286 +10753:0:4365 +10754:2:1754 +10755:0:4365 +10756:3:4287 +10757:0:4365 +10758:2:1755 +10759:2:1759 +10760:2:1760 +10761:2:1768 +10762:2:1769 +10763:2:1773 +10764:2:1774 +10765:2:1768 +10766:2:1769 +10767:2:1773 +10768:2:1774 +10769:2:1782 +10770:2:1787 +10771:2:1791 +10772:2:1792 +10773:2:1799 +10774:2:1800 +10775:2:1811 +10776:2:1812 +10777:2:1813 +10778:2:1811 +10779:2:1812 +10780:2:1813 +10781:2:1824 +10782:2:1829 +10783:2:1830 +10784:0:4365 +10785:2:1842 +10786:0:4365 +10787:3:4286 +10788:0:4365 +10789:2:1844 +10790:0:4365 +10791:3:4287 +10792:0:4365 +10793:2:1845 +10794:2:1849 +10795:2:1850 +10796:2:1858 +10797:2:1859 +10798:2:1863 +10799:2:1864 +10800:2:1858 +10801:2:1859 +10802:2:1863 +10803:2:1864 +10804:2:1872 +10805:2:1877 +10806:2:1881 +10807:2:1882 +10808:2:1889 +10809:2:1890 +10810:2:1901 +10811:2:1902 +10812:2:1903 +10813:2:1901 +10814:2:1902 +10815:2:1903 +10816:2:1914 +10817:2:1919 +10818:2:1920 +10819:0:4365 +10820:2:1932 +10821:0:4365 +10822:3:4286 +10823:0:4365 +10824:2:1934 +10825:0:4365 +10826:3:4287 +10827:0:4365 +10828:2:1935 +10829:0:4365 +10830:2:1936 +10831:0:4365 +10832:2:2129 +10833:0:4365 +10834:2:2130 +10835:0:4365 +10836:2:2134 +10837:0:4365 +10838:3:4286 +10839:0:4365 +10840:2:2136 +10841:0:4365 +10842:3:4287 +10843:0:4365 +10844:2:2137 +10845:2:2141 +10846:2:2142 +10847:2:2150 +10848:2:2151 +10849:2:2155 +10850:2:2156 +10851:2:2150 +10852:2:2151 +10853:2:2155 +10854:2:2156 +10855:2:2164 +10856:2:2169 +10857:2:2173 +10858:2:2174 +10859:2:2181 +10860:2:2182 +10861:2:2193 +10862:2:2194 +10863:2:2195 +10864:2:2193 +10865:2:2194 +10866:2:2195 +10867:2:2206 +10868:2:2211 +10869:2:2212 +10870:0:4365 +10871:2:2224 +10872:0:4365 +10873:3:4286 +10874:0:4365 +10875:2:2226 +10876:0:4365 +10877:3:4287 +10878:0:4365 +10879:2:2230 +10880:0:4365 +10881:3:4286 +10882:0:4365 +10883:2:2235 +10884:2:2239 +10885:2:2240 +10886:2:2248 +10887:2:2249 +10888:2:2253 +10889:2:2254 +10890:2:2248 +10891:2:2249 +10892:2:2250 +10893:2:2262 +10894:2:2267 +10895:2:2271 +10896:2:2272 +10897:2:2279 +10898:2:2280 +10899:2:2291 +10900:2:2292 +10901:2:2293 +10902:2:2291 +10903:2:2292 +10904:2:2293 +10905:2:2304 +10906:2:2309 +10907:2:2310 +10908:0:4365 +10909:3:4287 +10910:0:4365 +10911:2:2322 +10912:0:4365 +10913:2:1169 +10914:0:4365 +10915:3:4286 +10916:0:4365 +10917:2:1170 +10918:0:4365 +10919:3:4287 +10920:0:4365 +10921:3:4288 +10922:0:4365 +10923:3:4294 +10924:0:4365 +10925:3:4295 +10926:0:4365 +10927:3:2338 +10928:0:4365 +10929:3:2339 +10930:3:2343 +10931:3:2344 +10932:3:2352 +10933:3:2353 +10934:3:2357 +10935:3:2358 +10936:3:2352 +10937:3:2353 +10938:3:2357 +10939:3:2358 +10940:3:2366 +10941:3:2371 +10942:3:2375 +10943:3:2376 +10944:3:2383 +10945:3:2384 +10946:3:2395 +10947:3:2396 +10948:3:2397 +10949:3:2395 +10950:3:2396 +10951:3:2397 +10952:3:2408 +10953:3:2413 +10954:3:2414 +10955:0:4365 +10956:3:2426 +10957:0:4365 +10958:3:2427 +10959:0:4365 +10960:2:1173 +10961:0:4365 +10962:3:2428 +10963:0:4365 +10964:2:1179 +10965:0:4365 +10966:2:1180 +10967:0:4365 +10968:3:2427 +10969:0:4365 +10970:2:1181 +10971:2:1185 +10972:2:1186 +10973:2:1194 +10974:2:1195 +10975:2:1199 +10976:2:1200 +10977:2:1194 +10978:2:1195 +10979:2:1199 +10980:2:1200 +10981:2:1208 +10982:2:1213 +10983:2:1217 +10984:2:1218 +10985:2:1225 +10986:2:1226 +10987:2:1237 +10988:2:1238 +10989:2:1239 +10990:2:1237 +10991:2:1238 +10992:2:1239 +10993:2:1250 +10994:2:1255 +10995:2:1256 +10996:0:4365 +10997:3:2428 +10998:0:4365 +10999:2:1268 +11000:0:4365 +11001:3:2427 +11002:0:4365 +11003:2:1270 +11004:0:4365 +11005:3:2428 +11006:0:4365 +11007:2:1271 +11008:2:1275 +11009:2:1276 +11010:2:1284 +11011:2:1285 +11012:2:1289 +11013:2:1290 +11014:2:1284 +11015:2:1285 +11016:2:1289 +11017:2:1290 +11018:2:1298 +11019:2:1303 +11020:2:1307 +11021:2:1308 +11022:2:1315 +11023:2:1316 +11024:2:1327 +11025:2:1328 +11026:2:1329 +11027:2:1327 +11028:2:1328 +11029:2:1329 +11030:2:1340 +11031:2:1345 +11032:2:1346 +11033:0:4365 +11034:2:1358 +11035:0:4365 +11036:2:1360 +11037:0:4365 +11038:3:2427 +11039:0:4365 +11040:2:1361 +11041:0:4365 +11042:3:2428 +11043:0:4365 +11044:2:1362 +11045:2:1366 +11046:2:1367 +11047:2:1375 +11048:2:1376 +11049:2:1380 +11050:2:1381 +11051:2:1375 +11052:2:1376 +11053:2:1380 +11054:2:1381 +11055:2:1389 +11056:2:1394 +11057:2:1398 +11058:2:1399 +11059:2:1406 +11060:2:1407 +11061:2:1418 +11062:2:1419 +11063:2:1420 +11064:2:1418 +11065:2:1419 +11066:2:1420 +11067:2:1431 +11068:2:1436 +11069:2:1437 +11070:0:4365 +11071:2:1449 +11072:0:4365 +11073:3:2427 +11074:0:4365 +11075:2:1451 +11076:0:4365 +11077:3:2428 +11078:0:4365 +11079:2:1652 +11080:0:4365 +11081:2:1653 +11082:0:4365 +11083:2:1657 +11084:0:4365 +11085:2:1660 +11086:0:4365 +11087:3:2427 +11088:0:4365 +11089:2:1665 +11090:2:1669 +11091:2:1670 +11092:2:1678 +11093:2:1679 +11094:2:1683 +11095:2:1684 +11096:2:1678 +11097:2:1679 +11098:2:1680 +11099:2:1692 +11100:2:1697 +11101:2:1701 +11102:2:1702 +11103:2:1709 +11104:2:1710 +11105:2:1721 +11106:2:1722 +11107:2:1723 +11108:2:1721 +11109:2:1722 +11110:2:1723 +11111:2:1734 +11112:2:1739 +11113:2:1740 +11114:0:4365 +11115:3:2428 +11116:0:4365 +11117:2:1752 +11118:0:4365 +11119:3:2427 +11120:0:4365 +11121:2:1754 +11122:0:4365 +11123:3:2428 +11124:0:4365 +11125:2:1755 +11126:2:1759 +11127:2:1760 +11128:2:1768 +11129:2:1769 +11130:2:1773 +11131:2:1774 +11132:2:1768 +11133:2:1769 +11134:2:1773 +11135:2:1774 +11136:2:1782 +11137:2:1787 +11138:2:1791 +11139:2:1792 +11140:2:1799 +11141:2:1800 +11142:2:1811 +11143:2:1812 +11144:2:1813 +11145:2:1811 +11146:2:1812 +11147:2:1813 +11148:2:1824 +11149:2:1829 +11150:2:1830 +11151:0:4365 +11152:2:1842 +11153:0:4365 +11154:3:2427 +11155:0:4365 +11156:2:1844 +11157:0:4363 +11158:3:2428 +11159:0:4369 diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.define b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.define new file mode 100644 index 0000000..136ef67 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.define @@ -0,0 +1,2 @@ +#define NO_RMB +#define NO_WMB diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.log b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.log new file mode 100644 index 0000000..c420e43 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.log @@ -0,0 +1,266 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_free_no_mb.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 745) +pan: claim violated! (at depth 2071) +pan: wrote .input.spin.trail + +(Spin Version 5.1.7 -- 23 December 2008) +Warning: Search not completed + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 72 byte, depth reached 5140, errors: 1 + 264561 states, stored + 3902374 states, matched + 4166935 transitions (= stored+matched) + 15172302 atomic steps +hash conflicts: 196282 (resolved) + +Stats on memory usage (in Megabytes): + 25.231 equivalent memory usage for states (stored*(State-vector + overhead)) + 16.681 actual memory usage for states (compression: 66.12%) + state-vector as stored = 38 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 482.365 total actual memory usage + +unreached in proctype urcu_reader + line 400, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 61, "(1)" + line 419, "pan.___", state 91, "(1)" + line 400, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 151, "(1)" + line 419, "pan.___", state 181, "(1)" + line 400, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 242, "(1)" + line 419, "pan.___", state 272, "(1)" + line 400, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 331, "(1)" + line 409, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 360, "(1)" + line 419, "pan.___", state 390, "(1)" + line 541, "pan.___", state 414, "-end-" + (18 of 414 states) +unreached in proctype urcu_writer + line 400, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 20, "(1)" + line 404, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 34, "(1)" + line 404, "pan.___", state 35, "(1)" + line 404, "pan.___", state 35, "(1)" + line 402, "pan.___", state 40, "((i<1))" + line 402, "pan.___", state 40, "((i>=1))" + line 409, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 59, "(1)" + line 410, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 60, "else" + line 410, "pan.___", state 63, "(1)" + line 410, "pan.___", state 64, "(1)" + line 410, "pan.___", state 64, "(1)" + line 414, "pan.___", state 72, "(1)" + line 414, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 73, "else" + line 414, "pan.___", state 76, "(1)" + line 414, "pan.___", state 77, "(1)" + line 414, "pan.___", state 77, "(1)" + line 412, "pan.___", state 82, "((i<1))" + line 412, "pan.___", state 82, "((i>=1))" + line 419, "pan.___", state 89, "(1)" + line 419, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 90, "else" + line 419, "pan.___", state 93, "(1)" + line 419, "pan.___", state 94, "(1)" + line 419, "pan.___", state 94, "(1)" + line 421, "pan.___", state 97, "(1)" + line 421, "pan.___", state 97, "(1)" + line 370, "pan.___", state 99, "(1)" + line 640, "pan.___", state 103, "cached_generation_ptr.val[_pid] = (old_gen+1)" + line 638, "pan.___", state 104, "old_gen = cached_generation_ptr.val[_pid]" + line 400, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 114, "(1)" + line 404, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 128, "(1)" + line 404, "pan.___", state 129, "(1)" + line 404, "pan.___", state 129, "(1)" + line 410, "pan.___", state 153, "(1)" + line 414, "pan.___", state 166, "(1)" + line 421, "pan.___", state 191, "(1)" + line 421, "pan.___", state 191, "(1)" + line 653, "pan.___", state 199, "(1)" + line 400, "pan.___", state 209, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 223, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 254, "(1)" + line 414, "pan.___", state 267, "(1)" + line 400, "pan.___", state 300, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 314, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 345, "(1)" + line 414, "pan.___", state 358, "(1)" + line 400, "pan.___", state 395, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 409, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 440, "(1)" + line 414, "pan.___", state 453, "(1)" + line 400, "pan.___", state 488, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 502, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 533, "(1)" + line 414, "pan.___", state 546, "(1)" + line 400, "pan.___", state 582, "(1)" + line 404, "pan.___", state 594, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 638, "(1)" + line 404, "pan.___", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 731, "(1)" + line 404, "pan.___", state 777, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 795, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 821, "(1)" + line 419, "pan.___", state 838, "(1)" + line 404, "pan.___", state 868, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 886, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 912, "(1)" + line 419, "pan.___", state 929, "(1)" + line 404, "pan.___", state 963, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 981, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 1007, "(1)" + line 419, "pan.___", state 1024, "(1)" + line 400, "pan.___", state 1050, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 1052, "(1)" + line 400, "pan.___", state 1053, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 400, "pan.___", state 1053, "else" + line 400, "pan.___", state 1056, "(1)" + line 404, "pan.___", state 1064, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 1066, "(1)" + line 404, "pan.___", state 1067, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 404, "pan.___", state 1067, "else" + line 404, "pan.___", state 1070, "(1)" + line 404, "pan.___", state 1071, "(1)" + line 404, "pan.___", state 1071, "(1)" + line 402, "pan.___", state 1076, "((i<1))" + line 402, "pan.___", state 1076, "((i>=1))" + line 409, "pan.___", state 1082, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 1095, "(1)" + line 410, "pan.___", state 1096, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 1096, "else" + line 410, "pan.___", state 1099, "(1)" + line 410, "pan.___", state 1100, "(1)" + line 410, "pan.___", state 1100, "(1)" + line 414, "pan.___", state 1108, "(1)" + line 414, "pan.___", state 1109, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 1109, "else" + line 414, "pan.___", state 1112, "(1)" + line 414, "pan.___", state 1113, "(1)" + line 414, "pan.___", state 1113, "(1)" + line 412, "pan.___", state 1118, "((i<1))" + line 412, "pan.___", state 1118, "((i>=1))" + line 419, "pan.___", state 1125, "(1)" + line 419, "pan.___", state 1126, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 1126, "else" + line 419, "pan.___", state 1129, "(1)" + line 419, "pan.___", state 1130, "(1)" + line 419, "pan.___", state 1130, "(1)" + line 421, "pan.___", state 1133, "(1)" + line 421, "pan.___", state 1133, "(1)" + line 404, "pan.___", state 1164, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 1208, "(1)" + line 404, "pan.___", state 1254, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 1298, "(1)" + line 400, "pan.___", state 1334, "(1)" + line 404, "pan.___", state 1346, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 1390, "(1)" + line 404, "pan.___", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 1483, "(1)" + line 404, "pan.___", state 1529, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 1547, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 1573, "(1)" + line 419, "pan.___", state 1590, "(1)" + line 404, "pan.___", state 1620, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 1638, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 1664, "(1)" + line 419, "pan.___", state 1681, "(1)" + line 404, "pan.___", state 1715, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 1733, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 1759, "(1)" + line 419, "pan.___", state 1776, "(1)" + line 400, "pan.___", state 1802, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 1804, "(1)" + line 400, "pan.___", state 1805, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 400, "pan.___", state 1805, "else" + line 400, "pan.___", state 1808, "(1)" + line 404, "pan.___", state 1816, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 1818, "(1)" + line 404, "pan.___", state 1819, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 404, "pan.___", state 1819, "else" + line 404, "pan.___", state 1822, "(1)" + line 404, "pan.___", state 1823, "(1)" + line 404, "pan.___", state 1823, "(1)" + line 402, "pan.___", state 1828, "((i<1))" + line 402, "pan.___", state 1828, "((i>=1))" + line 409, "pan.___", state 1834, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 1847, "(1)" + line 410, "pan.___", state 1848, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 1848, "else" + line 410, "pan.___", state 1851, "(1)" + line 410, "pan.___", state 1852, "(1)" + line 410, "pan.___", state 1852, "(1)" + line 414, "pan.___", state 1860, "(1)" + line 414, "pan.___", state 1861, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 1861, "else" + line 414, "pan.___", state 1864, "(1)" + line 414, "pan.___", state 1865, "(1)" + line 414, "pan.___", state 1865, "(1)" + line 412, "pan.___", state 1870, "((i<1))" + line 412, "pan.___", state 1870, "((i>=1))" + line 419, "pan.___", state 1877, "(1)" + line 419, "pan.___", state 1878, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 1878, "else" + line 419, "pan.___", state 1881, "(1)" + line 419, "pan.___", state 1882, "(1)" + line 419, "pan.___", state 1882, "(1)" + line 421, "pan.___", state 1885, "(1)" + line 421, "pan.___", state 1885, "(1)" + line 404, "pan.___", state 1916, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 1960, "(1)" + line 404, "pan.___", state 2007, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 2051, "(1)" + line 404, "pan.___", state 2102, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 2146, "(1)" + line 703, "pan.___", state 2192, "-end-" + (144 of 2192 states) +unreached in proctype :init: + line 710, "pan.___", state 9, "((j<2))" + line 710, "pan.___", state 9, "((j>=2))" + line 711, "pan.___", state 20, "((j<2))" + line 711, "pan.___", state 20, "((j>=2))" + line 716, "pan.___", state 33, "((j<2))" + line 716, "pan.___", state 33, "((j>=2))" + (3 of 46 states) +unreached in proctype :never: + line 750, "pan.___", state 8, "-end-" + (1 of 8 states) + +pan: elapsed time 3.37 seconds +pan: rate 78504.748 states/second +pan: avg transition delay 8.0875e-07 usec +cp .input.spin urcu_free_no_mb.spin.input +cp .input.spin.trail urcu_free_no_mb.spin.input.trail +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.spin.input b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.spin.input new file mode 100644 index 0000000..3831d86 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.spin.input @@ -0,0 +1,724 @@ +#define NO_RMB +#define NO_WMB + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +//#define TEST_SIGNAL +//#define TEST_SIGNAL_ON_READ +//#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 1 +//#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.spin.input.trail b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.spin.input.trail new file mode 100644 index 0000000..7b2040a --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.spin.input.trail @@ -0,0 +1,2074 @@ +-2:3:-2 +-4:-4:-4 +1:0:2654 +2:3:2606 +3:3:2609 +4:3:2609 +5:3:2612 +6:3:2620 +7:3:2620 +8:3:2623 +9:3:2629 +10:3:2633 +11:3:2633 +12:3:2636 +13:3:2644 +14:3:2648 +15:3:2649 +16:0:2654 +17:3:2651 +18:0:2654 +19:2:416 +20:0:2654 +21:2:422 +22:0:2654 +23:2:423 +24:0:2654 +25:2:424 +26:2:428 +27:2:429 +28:2:437 +29:2:438 +30:2:442 +31:2:443 +32:2:451 +33:2:456 +34:2:460 +35:2:461 +36:2:468 +37:2:469 +38:2:480 +39:2:481 +40:2:482 +41:2:493 +42:2:498 +43:2:499 +44:0:2654 +45:2:511 +46:0:2654 +47:2:513 +48:2:514 +49:0:2654 +50:2:518 +51:2:522 +52:2:523 +53:2:531 +54:2:532 +55:2:536 +56:2:537 +57:2:545 +58:2:550 +59:2:551 +60:2:562 +61:2:563 +62:2:574 +63:2:575 +64:2:576 +65:2:587 +66:2:592 +67:2:593 +68:0:2654 +69:2:605 +70:0:2654 +71:2:607 +72:0:2654 +73:2:608 +74:0:2654 +75:2:618 +76:0:2654 +77:2:619 +78:2:623 +79:2:624 +80:2:632 +81:2:633 +82:2:637 +83:2:638 +84:2:646 +85:2:651 +86:2:655 +87:2:656 +88:2:663 +89:2:664 +90:2:675 +91:2:676 +92:2:677 +93:2:688 +94:2:693 +95:2:694 +96:0:2654 +97:2:709 +98:0:2654 +99:2:710 +100:2:714 +101:2:715 +102:2:723 +103:2:724 +104:2:728 +105:2:729 +106:2:737 +107:2:742 +108:2:746 +109:2:747 +110:2:754 +111:2:755 +112:2:766 +113:2:767 +114:2:768 +115:2:779 +116:2:784 +117:2:785 +118:0:2654 +119:2:800 +120:0:2654 +121:2:805 +122:2:809 +123:2:810 +124:2:818 +125:2:819 +126:2:823 +127:2:824 +128:2:832 +129:2:837 +130:2:841 +131:2:842 +132:2:849 +133:2:850 +134:2:861 +135:2:862 +136:2:863 +137:2:874 +138:2:879 +139:2:880 +140:0:2654 +141:2:895 +142:0:2654 +143:2:897 +144:0:2654 +145:2:898 +146:2:902 +147:2:903 +148:2:911 +149:2:912 +150:2:916 +151:2:917 +152:2:925 +153:2:930 +154:2:934 +155:2:935 +156:2:942 +157:2:943 +158:2:954 +159:2:955 +160:2:956 +161:2:967 +162:2:972 +163:2:973 +164:0:2654 +165:2:985 +166:0:2654 +167:2:987 +168:0:2654 +169:2:990 +170:2:991 +171:2:1003 +172:2:1004 +173:2:1008 +174:2:1009 +175:2:1017 +176:2:1022 +177:2:1026 +178:2:1027 +179:2:1034 +180:2:1035 +181:2:1046 +182:2:1047 +183:2:1048 +184:2:1059 +185:2:1064 +186:2:1065 +187:0:2654 +188:2:1077 +189:0:2654 +190:2:1079 +191:0:2654 +192:2:1080 +193:0:2654 +194:2:1081 +195:0:2654 +196:2:1082 +197:0:2654 +198:2:1083 +199:2:1087 +200:2:1088 +201:2:1096 +202:2:1097 +203:2:1101 +204:2:1102 +205:2:1110 +206:2:1115 +207:2:1119 +208:2:1120 +209:2:1127 +210:2:1128 +211:2:1139 +212:2:1140 +213:2:1141 +214:2:1152 +215:2:1157 +216:2:1158 +217:0:2654 +218:2:1170 +219:0:2654 +220:2:1451 +221:0:2654 +222:2:1549 +223:0:2654 +224:2:1550 +225:0:2654 +226:2:1554 +227:0:2654 +228:2:1560 +229:2:1564 +230:2:1565 +231:2:1573 +232:2:1574 +233:2:1578 +234:2:1579 +235:2:1587 +236:2:1592 +237:2:1596 +238:2:1597 +239:2:1604 +240:2:1605 +241:2:1616 +242:2:1617 +243:2:1618 +244:2:1629 +245:2:1634 +246:2:1635 +247:0:2654 +248:2:1647 +249:0:2654 +250:2:1649 +251:0:2654 +252:2:1650 +253:2:1654 +254:2:1655 +255:2:1663 +256:2:1664 +257:2:1668 +258:2:1669 +259:2:1677 +260:2:1682 +261:2:1686 +262:2:1687 +263:2:1694 +264:2:1695 +265:2:1706 +266:2:1707 +267:2:1708 +268:2:1719 +269:2:1724 +270:2:1725 +271:0:2654 +272:2:1737 +273:0:2654 +274:2:1739 +275:0:2654 +276:2:1742 +277:2:1743 +278:2:1755 +279:2:1756 +280:2:1760 +281:2:1761 +282:2:1769 +283:2:1774 +284:2:1778 +285:2:1779 +286:2:1786 +287:2:1787 +288:2:1798 +289:2:1799 +290:2:1800 +291:2:1811 +292:2:1816 +293:2:1817 +294:0:2654 +295:2:1829 +296:0:2654 +297:2:1831 +298:0:2654 +299:2:1832 +300:0:2654 +301:2:1833 +302:0:2654 +303:2:1834 +304:0:2654 +305:2:1835 +306:2:1839 +307:2:1840 +308:2:1848 +309:2:1849 +310:2:1853 +311:2:1854 +312:2:1862 +313:2:1867 +314:2:1871 +315:2:1872 +316:2:1879 +317:2:1880 +318:2:1891 +319:2:1892 +320:2:1893 +321:2:1904 +322:2:1909 +323:2:1910 +324:0:2654 +325:2:1922 +326:0:2654 +327:2:2203 +328:0:2654 +329:2:2301 +330:0:2654 +331:2:2302 +332:0:2654 +333:2:2306 +334:0:2654 +335:2:2312 +336:2:2316 +337:2:2317 +338:2:2325 +339:2:2326 +340:2:2330 +341:2:2331 +342:2:2339 +343:2:2344 +344:2:2348 +345:2:2349 +346:2:2356 +347:2:2357 +348:2:2368 +349:2:2369 +350:2:2370 +351:2:2381 +352:2:2386 +353:2:2387 +354:0:2654 +355:2:2402 +356:0:2654 +357:2:2403 +358:2:2407 +359:2:2408 +360:2:2416 +361:2:2417 +362:2:2421 +363:2:2422 +364:2:2430 +365:2:2435 +366:2:2439 +367:2:2440 +368:2:2447 +369:2:2448 +370:2:2459 +371:2:2460 +372:2:2461 +373:2:2472 +374:2:2477 +375:2:2478 +376:0:2654 +377:2:2493 +378:0:2654 +379:2:2498 +380:2:2502 +381:2:2503 +382:2:2511 +383:2:2512 +384:2:2516 +385:2:2517 +386:2:2525 +387:2:2530 +388:2:2534 +389:2:2535 +390:2:2542 +391:2:2543 +392:2:2554 +393:2:2555 +394:2:2556 +395:2:2567 +396:2:2572 +397:2:2573 +398:0:2654 +399:2:2588 +400:0:2654 +401:2:2590 +402:0:2654 +403:2:2591 +404:0:2654 +405:2:423 +406:0:2654 +407:2:424 +408:2:428 +409:2:429 +410:2:437 +411:2:438 +412:2:442 +413:2:443 +414:2:451 +415:2:456 +416:2:460 +417:2:461 +418:2:468 +419:2:469 +420:2:480 +421:2:481 +422:2:482 +423:2:493 +424:2:498 +425:2:499 +426:0:2654 +427:2:511 +428:0:2654 +429:2:513 +430:2:514 +431:0:2654 +432:2:518 +433:2:522 +434:2:523 +435:2:531 +436:2:532 +437:2:536 +438:2:537 +439:2:545 +440:2:550 +441:2:551 +442:2:562 +443:2:563 +444:2:574 +445:2:575 +446:2:576 +447:2:587 +448:2:592 +449:2:593 +450:0:2654 +451:2:605 +452:0:2654 +453:2:607 +454:0:2654 +455:2:608 +456:0:2654 +457:2:618 +458:0:2654 +459:2:619 +460:2:623 +461:2:624 +462:2:632 +463:2:633 +464:2:637 +465:2:638 +466:2:646 +467:2:651 +468:2:655 +469:2:656 +470:2:663 +471:2:664 +472:2:675 +473:2:676 +474:2:677 +475:2:688 +476:2:693 +477:2:694 +478:0:2654 +479:2:709 +480:0:2654 +481:2:710 +482:2:714 +483:2:715 +484:2:723 +485:2:724 +486:2:728 +487:2:729 +488:2:737 +489:2:742 +490:2:746 +491:2:747 +492:2:754 +493:2:755 +494:2:766 +495:2:767 +496:2:768 +497:2:779 +498:2:784 +499:2:785 +500:0:2654 +501:2:800 +502:0:2654 +503:2:805 +504:2:809 +505:2:810 +506:2:818 +507:2:819 +508:2:823 +509:2:824 +510:2:832 +511:2:837 +512:2:841 +513:2:842 +514:2:849 +515:2:850 +516:2:861 +517:2:862 +518:2:863 +519:2:874 +520:2:879 +521:2:880 +522:0:2654 +523:2:895 +524:0:2654 +525:2:897 +526:0:2654 +527:2:898 +528:2:902 +529:2:903 +530:2:911 +531:2:912 +532:2:916 +533:2:917 +534:2:925 +535:2:930 +536:2:934 +537:2:935 +538:2:942 +539:2:943 +540:2:954 +541:2:955 +542:2:956 +543:2:967 +544:2:972 +545:2:973 +546:0:2654 +547:2:985 +548:0:2654 +549:2:987 +550:0:2654 +551:2:990 +552:2:991 +553:2:1003 +554:2:1004 +555:2:1008 +556:2:1009 +557:2:1017 +558:2:1022 +559:2:1026 +560:2:1027 +561:2:1034 +562:2:1035 +563:2:1046 +564:2:1047 +565:2:1048 +566:2:1059 +567:2:1064 +568:2:1065 +569:0:2654 +570:2:1077 +571:0:2654 +572:2:1079 +573:0:2654 +574:2:1080 +575:0:2654 +576:2:1081 +577:0:2654 +578:2:1082 +579:0:2654 +580:2:1083 +581:2:1087 +582:2:1088 +583:2:1096 +584:2:1097 +585:2:1101 +586:2:1102 +587:2:1110 +588:2:1115 +589:2:1119 +590:2:1120 +591:2:1127 +592:2:1128 +593:2:1139 +594:2:1140 +595:2:1141 +596:2:1152 +597:2:1157 +598:2:1158 +599:0:2654 +600:2:1170 +601:0:2654 +602:2:1451 +603:0:2654 +604:2:1549 +605:0:2654 +606:2:1550 +607:0:2654 +608:2:1554 +609:0:2654 +610:2:1560 +611:2:1564 +612:2:1565 +613:2:1573 +614:2:1574 +615:2:1578 +616:2:1579 +617:2:1587 +618:2:1592 +619:2:1596 +620:2:1597 +621:2:1604 +622:2:1605 +623:2:1616 +624:2:1617 +625:2:1618 +626:2:1629 +627:2:1634 +628:2:1635 +629:0:2654 +630:2:1647 +631:0:2654 +632:2:1649 +633:0:2654 +634:2:1650 +635:2:1654 +636:2:1655 +637:2:1663 +638:2:1664 +639:2:1668 +640:2:1669 +641:2:1677 +642:2:1682 +643:2:1686 +644:2:1687 +645:2:1694 +646:2:1695 +647:2:1706 +648:2:1707 +649:2:1708 +650:2:1719 +651:2:1724 +652:2:1725 +653:0:2654 +654:2:1737 +655:0:2654 +656:2:1739 +657:0:2654 +658:2:1742 +659:2:1743 +660:2:1755 +661:2:1756 +662:2:1760 +663:2:1761 +664:2:1769 +665:2:1774 +666:2:1778 +667:2:1779 +668:2:1786 +669:2:1787 +670:2:1798 +671:2:1799 +672:2:1800 +673:2:1811 +674:2:1816 +675:2:1817 +676:0:2654 +677:2:1829 +678:0:2654 +679:2:1831 +680:0:2654 +681:2:1832 +682:0:2654 +683:2:1833 +684:0:2654 +685:2:1834 +686:0:2654 +687:2:1835 +688:2:1839 +689:2:1840 +690:2:1848 +691:2:1849 +692:2:1853 +693:2:1854 +694:2:1862 +695:2:1867 +696:2:1871 +697:2:1872 +698:2:1879 +699:2:1880 +700:2:1891 +701:2:1892 +702:2:1893 +703:2:1904 +704:2:1909 +705:2:1910 +706:0:2654 +707:2:1922 +708:0:2654 +709:2:2203 +710:0:2654 +711:2:2301 +712:0:2654 +713:2:2302 +714:0:2654 +715:2:2306 +716:0:2654 +717:2:2312 +718:2:2316 +719:2:2317 +720:2:2325 +721:2:2326 +722:2:2330 +723:2:2331 +724:2:2339 +725:2:2344 +726:2:2348 +727:2:2349 +728:2:2356 +729:2:2357 +730:2:2368 +731:2:2369 +732:2:2370 +733:2:2381 +734:2:2386 +735:2:2387 +736:0:2654 +737:2:2402 +738:0:2654 +739:2:2403 +740:2:2407 +741:2:2408 +742:2:2416 +743:2:2417 +744:2:2421 +745:2:2422 +746:2:2430 +747:2:2435 +748:2:2439 +749:2:2440 +750:2:2447 +751:2:2448 +752:2:2459 +753:2:2460 +754:2:2461 +755:2:2472 +756:2:2477 +757:2:2478 +758:0:2654 +759:2:2493 +760:0:2654 +761:2:2498 +762:2:2502 +763:2:2503 +764:2:2511 +765:2:2512 +766:2:2516 +767:2:2517 +768:2:2525 +769:2:2530 +770:2:2534 +771:2:2535 +772:2:2542 +773:2:2543 +774:2:2554 +775:2:2555 +776:2:2556 +777:2:2567 +778:2:2572 +779:2:2573 +780:0:2654 +781:2:2588 +782:0:2654 +783:2:2590 +784:0:2654 +785:2:2591 +786:0:2654 +787:2:423 +788:0:2654 +789:2:424 +790:2:428 +791:2:429 +792:2:437 +793:2:438 +794:2:442 +795:2:443 +796:2:451 +797:2:456 +798:2:460 +799:2:461 +800:2:468 +801:2:469 +802:2:480 +803:2:481 +804:2:482 +805:2:493 +806:2:498 +807:2:499 +808:0:2654 +809:2:511 +810:0:2654 +811:2:513 +812:2:514 +813:0:2654 +814:2:518 +815:2:522 +816:2:523 +817:2:531 +818:2:532 +819:2:536 +820:2:537 +821:2:545 +822:2:550 +823:2:551 +824:2:562 +825:2:563 +826:2:574 +827:2:575 +828:2:576 +829:2:587 +830:2:592 +831:2:593 +832:0:2654 +833:2:605 +834:0:2654 +835:2:607 +836:0:2654 +837:2:608 +838:0:2654 +839:2:618 +840:0:2654 +841:2:619 +842:2:623 +843:2:624 +844:2:632 +845:2:633 +846:2:637 +847:2:638 +848:2:646 +849:2:651 +850:2:655 +851:2:656 +852:2:663 +853:2:664 +854:2:675 +855:2:676 +856:2:677 +857:2:688 +858:2:693 +859:2:694 +860:0:2654 +861:2:709 +862:0:2654 +863:2:710 +864:2:714 +865:2:715 +866:2:723 +867:2:724 +868:2:728 +869:2:729 +870:2:737 +871:2:742 +872:2:746 +873:2:747 +874:2:754 +875:2:755 +876:2:766 +877:2:767 +878:2:768 +879:2:779 +880:2:784 +881:2:785 +882:0:2654 +883:2:800 +884:0:2654 +885:2:805 +886:2:809 +887:2:810 +888:2:818 +889:2:819 +890:2:823 +891:2:824 +892:2:832 +893:2:837 +894:2:841 +895:2:842 +896:2:849 +897:2:850 +898:2:861 +899:2:862 +900:2:863 +901:2:874 +902:2:879 +903:2:880 +904:0:2654 +905:2:895 +906:0:2654 +907:2:897 +908:0:2654 +909:2:898 +910:2:902 +911:2:903 +912:2:911 +913:2:912 +914:2:916 +915:2:917 +916:2:925 +917:2:930 +918:2:934 +919:2:935 +920:2:942 +921:2:943 +922:2:954 +923:2:955 +924:2:956 +925:2:967 +926:2:972 +927:2:973 +928:0:2654 +929:2:985 +930:0:2654 +931:2:987 +932:0:2654 +933:2:990 +934:2:991 +935:2:1003 +936:2:1004 +937:2:1008 +938:2:1009 +939:2:1017 +940:2:1022 +941:2:1026 +942:2:1027 +943:2:1034 +944:2:1035 +945:2:1046 +946:2:1047 +947:2:1048 +948:2:1059 +949:2:1064 +950:2:1065 +951:0:2654 +952:2:1077 +953:0:2654 +954:2:1079 +955:0:2654 +956:2:1080 +957:0:2654 +958:2:1081 +959:0:2654 +960:2:1082 +961:0:2654 +962:2:1083 +963:2:1087 +964:2:1088 +965:2:1096 +966:2:1097 +967:2:1101 +968:2:1102 +969:2:1110 +970:2:1115 +971:2:1119 +972:2:1120 +973:2:1127 +974:2:1128 +975:2:1139 +976:2:1140 +977:2:1141 +978:2:1152 +979:2:1157 +980:2:1158 +981:0:2654 +982:2:1170 +983:0:2654 +984:2:1451 +985:0:2654 +986:2:1549 +987:0:2654 +988:2:1550 +989:0:2654 +990:2:1554 +991:0:2654 +992:2:1560 +993:2:1564 +994:2:1565 +995:2:1573 +996:2:1574 +997:2:1578 +998:2:1579 +999:2:1587 +1000:2:1592 +1001:2:1596 +1002:2:1597 +1003:2:1604 +1004:2:1605 +1005:2:1616 +1006:2:1617 +1007:2:1618 +1008:2:1629 +1009:2:1634 +1010:2:1635 +1011:0:2654 +1012:2:1647 +1013:0:2654 +1014:2:1649 +1015:0:2654 +1016:2:1650 +1017:2:1654 +1018:2:1655 +1019:2:1663 +1020:2:1664 +1021:2:1668 +1022:2:1669 +1023:2:1677 +1024:2:1682 +1025:2:1686 +1026:2:1687 +1027:2:1694 +1028:2:1695 +1029:2:1706 +1030:2:1707 +1031:2:1708 +1032:2:1719 +1033:2:1724 +1034:2:1725 +1035:0:2654 +1036:2:1737 +1037:0:2654 +1038:2:1739 +1039:0:2654 +1040:2:1742 +1041:2:1743 +1042:2:1755 +1043:2:1756 +1044:2:1760 +1045:2:1761 +1046:2:1769 +1047:2:1774 +1048:2:1778 +1049:2:1779 +1050:2:1786 +1051:2:1787 +1052:2:1798 +1053:2:1799 +1054:2:1800 +1055:2:1811 +1056:2:1816 +1057:2:1817 +1058:0:2654 +1059:2:1829 +1060:0:2654 +1061:2:1831 +1062:0:2654 +1063:2:1832 +1064:0:2654 +1065:2:1833 +1066:0:2654 +1067:2:1834 +1068:0:2654 +1069:2:1835 +1070:2:1839 +1071:2:1840 +1072:2:1848 +1073:2:1849 +1074:2:1853 +1075:2:1854 +1076:2:1862 +1077:2:1867 +1078:2:1871 +1079:2:1872 +1080:2:1879 +1081:2:1880 +1082:2:1891 +1083:2:1892 +1084:2:1893 +1085:2:1904 +1086:2:1909 +1087:2:1910 +1088:0:2654 +1089:2:1922 +1090:0:2654 +1091:2:2203 +1092:0:2654 +1093:2:2301 +1094:0:2654 +1095:2:2302 +1096:0:2654 +1097:2:2306 +1098:0:2654 +1099:2:2312 +1100:2:2316 +1101:2:2317 +1102:2:2325 +1103:2:2326 +1104:2:2330 +1105:2:2331 +1106:2:2339 +1107:2:2344 +1108:2:2348 +1109:2:2349 +1110:2:2356 +1111:2:2357 +1112:2:2368 +1113:2:2369 +1114:2:2370 +1115:2:2381 +1116:2:2386 +1117:2:2387 +1118:0:2654 +1119:2:2402 +1120:0:2654 +1121:2:2403 +1122:2:2407 +1123:2:2408 +1124:2:2416 +1125:2:2417 +1126:2:2421 +1127:2:2422 +1128:2:2430 +1129:2:2435 +1130:2:2439 +1131:2:2440 +1132:2:2447 +1133:2:2448 +1134:2:2459 +1135:2:2460 +1136:2:2461 +1137:2:2472 +1138:2:2477 +1139:2:2478 +1140:0:2654 +1141:2:2493 +1142:0:2654 +1143:2:2498 +1144:2:2502 +1145:2:2503 +1146:2:2511 +1147:2:2512 +1148:2:2516 +1149:2:2517 +1150:2:2525 +1151:2:2530 +1152:2:2534 +1153:2:2535 +1154:2:2542 +1155:2:2543 +1156:2:2554 +1157:2:2555 +1158:2:2556 +1159:2:2567 +1160:2:2572 +1161:2:2573 +1162:0:2654 +1163:2:2588 +1164:0:2654 +1165:2:2590 +1166:0:2654 +1167:2:2591 +1168:0:2654 +1169:2:423 +1170:0:2654 +1171:2:424 +1172:2:428 +1173:2:429 +1174:2:437 +1175:2:438 +1176:2:442 +1177:2:443 +1178:2:451 +1179:2:456 +1180:2:460 +1181:2:461 +1182:2:468 +1183:2:469 +1184:2:480 +1185:2:481 +1186:2:482 +1187:2:493 +1188:2:498 +1189:2:499 +1190:0:2654 +1191:2:511 +1192:0:2654 +1193:2:513 +1194:2:514 +1195:0:2654 +1196:2:518 +1197:2:522 +1198:2:523 +1199:2:531 +1200:2:532 +1201:2:536 +1202:2:537 +1203:2:545 +1204:2:550 +1205:2:551 +1206:2:562 +1207:2:563 +1208:2:574 +1209:2:575 +1210:2:576 +1211:2:587 +1212:2:592 +1213:2:593 +1214:0:2654 +1215:2:605 +1216:0:2654 +1217:2:607 +1218:0:2654 +1219:2:608 +1220:0:2654 +1221:2:618 +1222:0:2654 +1223:2:619 +1224:2:623 +1225:2:624 +1226:2:632 +1227:2:633 +1228:2:637 +1229:2:638 +1230:2:646 +1231:2:651 +1232:2:655 +1233:2:656 +1234:2:663 +1235:2:664 +1236:2:675 +1237:2:676 +1238:2:677 +1239:2:688 +1240:2:693 +1241:2:694 +1242:0:2654 +1243:2:709 +1244:0:2654 +1245:2:710 +1246:2:714 +1247:2:715 +1248:2:723 +1249:2:724 +1250:2:728 +1251:2:729 +1252:2:737 +1253:2:742 +1254:2:746 +1255:2:747 +1256:2:754 +1257:2:755 +1258:2:766 +1259:2:767 +1260:2:768 +1261:2:779 +1262:2:784 +1263:2:785 +1264:0:2654 +1265:2:800 +1266:0:2654 +1267:2:805 +1268:2:809 +1269:2:810 +1270:2:818 +1271:2:819 +1272:2:823 +1273:2:824 +1274:2:832 +1275:2:837 +1276:2:841 +1277:2:842 +1278:2:849 +1279:2:850 +1280:2:861 +1281:2:862 +1282:2:863 +1283:2:874 +1284:2:879 +1285:2:880 +1286:0:2654 +1287:2:895 +1288:0:2654 +1289:2:897 +1290:0:2654 +1291:2:898 +1292:2:902 +1293:2:903 +1294:2:911 +1295:2:912 +1296:2:916 +1297:2:917 +1298:2:925 +1299:2:930 +1300:2:934 +1301:2:935 +1302:2:942 +1303:2:943 +1304:2:954 +1305:2:955 +1306:2:956 +1307:2:967 +1308:2:972 +1309:2:973 +1310:0:2654 +1311:2:985 +1312:0:2654 +1313:2:987 +1314:0:2654 +1315:2:990 +1316:2:991 +1317:2:1003 +1318:2:1004 +1319:2:1008 +1320:2:1009 +1321:2:1017 +1322:2:1022 +1323:2:1026 +1324:2:1027 +1325:2:1034 +1326:2:1035 +1327:2:1046 +1328:2:1047 +1329:2:1048 +1330:2:1059 +1331:2:1064 +1332:2:1065 +1333:0:2654 +1334:2:1077 +1335:0:2654 +1336:2:1079 +1337:0:2654 +1338:2:1080 +1339:0:2654 +1340:2:1081 +1341:0:2654 +1342:2:1082 +1343:0:2654 +1344:2:1083 +1345:2:1087 +1346:2:1088 +1347:2:1096 +1348:2:1097 +1349:2:1101 +1350:2:1102 +1351:2:1110 +1352:2:1115 +1353:2:1119 +1354:2:1120 +1355:2:1127 +1356:2:1128 +1357:2:1139 +1358:2:1140 +1359:2:1141 +1360:2:1152 +1361:2:1157 +1362:2:1158 +1363:0:2654 +1364:2:1170 +1365:0:2654 +1366:2:1451 +1367:0:2654 +1368:2:1549 +1369:0:2654 +1370:2:1550 +1371:0:2654 +1372:2:1554 +1373:0:2654 +1374:2:1560 +1375:2:1564 +1376:2:1565 +1377:2:1573 +1378:2:1574 +1379:2:1578 +1380:2:1579 +1381:2:1587 +1382:2:1592 +1383:2:1596 +1384:2:1597 +1385:2:1604 +1386:2:1605 +1387:2:1616 +1388:2:1617 +1389:2:1618 +1390:2:1629 +1391:2:1634 +1392:2:1635 +1393:0:2654 +1394:2:1647 +1395:0:2654 +1396:2:1649 +1397:0:2654 +1398:2:1650 +1399:2:1654 +1400:2:1655 +1401:2:1663 +1402:2:1664 +1403:2:1668 +1404:2:1669 +1405:2:1677 +1406:2:1682 +1407:2:1686 +1408:2:1687 +1409:2:1694 +1410:2:1695 +1411:2:1706 +1412:2:1707 +1413:2:1708 +1414:2:1719 +1415:2:1724 +1416:2:1725 +1417:0:2654 +1418:2:1737 +1419:0:2654 +1420:2:1739 +1421:0:2654 +1422:2:1742 +1423:2:1743 +1424:2:1755 +1425:2:1756 +1426:2:1760 +1427:2:1761 +1428:2:1769 +1429:2:1774 +1430:2:1778 +1431:2:1779 +1432:2:1786 +1433:2:1787 +1434:2:1798 +1435:2:1799 +1436:2:1800 +1437:2:1811 +1438:2:1816 +1439:2:1817 +1440:0:2654 +1441:2:1829 +1442:0:2654 +1443:2:1831 +1444:0:2654 +1445:2:1832 +1446:0:2654 +1447:2:1833 +1448:0:2654 +1449:2:1834 +1450:0:2654 +1451:2:1835 +1452:2:1839 +1453:2:1840 +1454:2:1848 +1455:2:1849 +1456:2:1853 +1457:2:1854 +1458:2:1862 +1459:2:1867 +1460:2:1871 +1461:2:1872 +1462:2:1879 +1463:2:1880 +1464:2:1891 +1465:2:1892 +1466:2:1893 +1467:2:1904 +1468:2:1909 +1469:2:1910 +1470:0:2654 +1471:2:1922 +1472:0:2654 +1473:2:2203 +1474:0:2654 +1475:2:2301 +1476:0:2654 +1477:2:2302 +1478:0:2654 +1479:2:2306 +1480:0:2654 +1481:2:2312 +1482:2:2316 +1483:2:2317 +1484:2:2325 +1485:2:2326 +1486:2:2330 +1487:2:2331 +1488:2:2339 +1489:2:2344 +1490:2:2348 +1491:2:2349 +1492:2:2356 +1493:2:2357 +1494:2:2368 +1495:2:2369 +1496:2:2370 +1497:2:2381 +1498:2:2386 +1499:2:2387 +1500:0:2654 +1501:2:2402 +1502:0:2654 +1503:2:2403 +1504:2:2407 +1505:2:2408 +1506:2:2416 +1507:2:2417 +1508:2:2421 +1509:2:2422 +1510:2:2430 +1511:2:2435 +1512:2:2439 +1513:2:2440 +1514:2:2447 +1515:2:2448 +1516:2:2459 +1517:2:2460 +1518:2:2461 +1519:2:2472 +1520:2:2477 +1521:2:2478 +1522:0:2654 +1523:2:2493 +1524:0:2654 +1525:2:2498 +1526:2:2502 +1527:2:2503 +1528:2:2511 +1529:2:2512 +1530:2:2516 +1531:2:2517 +1532:2:2525 +1533:2:2530 +1534:2:2534 +1535:2:2535 +1536:2:2542 +1537:2:2543 +1538:2:2554 +1539:2:2555 +1540:2:2556 +1541:2:2567 +1542:2:2572 +1543:2:2573 +1544:0:2654 +1545:2:2588 +1546:0:2654 +1547:2:2590 +1548:0:2654 +1549:2:2591 +1550:0:2654 +1551:2:423 +1552:0:2654 +1553:2:424 +1554:2:428 +1555:2:429 +1556:2:437 +1557:2:438 +1558:2:442 +1559:2:443 +1560:2:451 +1561:2:456 +1562:2:460 +1563:2:461 +1564:2:468 +1565:2:469 +1566:2:480 +1567:2:481 +1568:2:482 +1569:2:493 +1570:2:498 +1571:2:499 +1572:0:2654 +1573:2:511 +1574:0:2654 +1575:2:513 +1576:2:514 +1577:0:2654 +1578:2:518 +1579:2:522 +1580:2:523 +1581:2:531 +1582:2:532 +1583:2:536 +1584:2:537 +1585:2:545 +1586:2:558 +1587:2:559 +1588:2:562 +1589:2:563 +1590:2:574 +1591:2:575 +1592:2:576 +1593:2:587 +1594:2:592 +1595:2:595 +1596:2:596 +1597:0:2654 +1598:2:605 +1599:0:2654 +1600:2:607 +1601:0:2654 +1602:2:608 +1603:0:2654 +1604:2:618 +1605:0:2654 +1606:2:619 +1607:2:623 +1608:2:624 +1609:2:632 +1610:2:633 +1611:2:637 +1612:2:638 +1613:2:646 +1614:2:659 +1615:2:660 +1616:2:663 +1617:2:664 +1618:2:675 +1619:2:676 +1620:2:677 +1621:2:688 +1622:2:693 +1623:2:696 +1624:2:697 +1625:0:2654 +1626:2:709 +1627:0:2654 +1628:2:710 +1629:2:714 +1630:2:715 +1631:2:723 +1632:2:724 +1633:2:728 +1634:2:729 +1635:2:737 +1636:2:750 +1637:2:751 +1638:2:754 +1639:2:755 +1640:2:766 +1641:2:767 +1642:2:768 +1643:2:779 +1644:2:784 +1645:2:787 +1646:2:788 +1647:0:2654 +1648:2:800 +1649:0:2654 +1650:2:805 +1651:2:809 +1652:2:810 +1653:2:818 +1654:2:819 +1655:2:823 +1656:2:824 +1657:2:832 +1658:2:845 +1659:2:846 +1660:2:849 +1661:2:850 +1662:2:861 +1663:2:862 +1664:2:863 +1665:2:874 +1666:2:879 +1667:2:882 +1668:2:883 +1669:0:2654 +1670:2:895 +1671:0:2654 +1672:2:897 +1673:0:2654 +1674:2:898 +1675:2:902 +1676:2:903 +1677:2:911 +1678:2:912 +1679:2:916 +1680:2:917 +1681:2:925 +1682:2:938 +1683:2:939 +1684:2:942 +1685:2:943 +1686:2:954 +1687:2:955 +1688:2:956 +1689:2:967 +1690:2:972 +1691:2:975 +1692:2:976 +1693:0:2654 +1694:2:985 +1695:0:2654 +1696:2:987 +1697:0:2654 +1698:2:990 +1699:2:991 +1700:2:1003 +1701:2:1004 +1702:2:1008 +1703:2:1009 +1704:2:1017 +1705:2:1030 +1706:2:1031 +1707:2:1034 +1708:2:1035 +1709:2:1046 +1710:2:1047 +1711:2:1048 +1712:2:1059 +1713:2:1064 +1714:2:1067 +1715:2:1068 +1716:0:2654 +1717:2:1077 +1718:0:2654 +1719:2:1079 +1720:0:2654 +1721:2:1080 +1722:0:2654 +1723:2:1081 +1724:0:2654 +1725:2:1082 +1726:0:2654 +1727:2:1083 +1728:2:1087 +1729:2:1088 +1730:2:1096 +1731:2:1097 +1732:2:1101 +1733:2:1102 +1734:2:1110 +1735:2:1123 +1736:2:1124 +1737:2:1127 +1738:2:1128 +1739:2:1139 +1740:2:1140 +1741:2:1141 +1742:2:1152 +1743:2:1157 +1744:2:1160 +1745:2:1161 +1746:0:2654 +1747:2:1170 +1748:0:2654 +1749:2:1451 +1750:0:2654 +1751:2:1549 +1752:0:2654 +1753:2:1550 +1754:0:2654 +1755:2:1554 +1756:0:2654 +1757:2:1560 +1758:2:1564 +1759:2:1565 +1760:2:1573 +1761:2:1574 +1762:2:1578 +1763:2:1579 +1764:2:1587 +1765:2:1600 +1766:2:1601 +1767:2:1604 +1768:2:1605 +1769:2:1616 +1770:2:1617 +1771:2:1618 +1772:2:1629 +1773:2:1634 +1774:2:1637 +1775:2:1638 +1776:0:2654 +1777:2:1647 +1778:0:2654 +1779:2:1649 +1780:0:2654 +1781:2:1650 +1782:2:1654 +1783:2:1655 +1784:2:1663 +1785:2:1664 +1786:2:1668 +1787:2:1669 +1788:2:1677 +1789:2:1690 +1790:2:1691 +1791:2:1694 +1792:2:1695 +1793:2:1706 +1794:2:1707 +1795:2:1708 +1796:2:1719 +1797:2:1724 +1798:2:1727 +1799:2:1728 +1800:0:2654 +1801:2:1737 +1802:0:2654 +1803:2:1739 +1804:0:2654 +1805:2:1742 +1806:2:1743 +1807:2:1755 +1808:2:1756 +1809:2:1760 +1810:2:1761 +1811:2:1769 +1812:2:1782 +1813:2:1783 +1814:2:1786 +1815:2:1787 +1816:2:1798 +1817:2:1799 +1818:2:1800 +1819:2:1811 +1820:2:1816 +1821:2:1819 +1822:2:1820 +1823:0:2654 +1824:2:1829 +1825:0:2654 +1826:2:1831 +1827:0:2654 +1828:2:1832 +1829:0:2654 +1830:2:1833 +1831:0:2654 +1832:2:1834 +1833:0:2654 +1834:2:1835 +1835:2:1839 +1836:2:1840 +1837:2:1848 +1838:2:1849 +1839:2:1853 +1840:2:1854 +1841:2:1862 +1842:2:1875 +1843:2:1876 +1844:2:1879 +1845:2:1880 +1846:2:1891 +1847:2:1892 +1848:2:1893 +1849:2:1904 +1850:2:1909 +1851:2:1912 +1852:2:1913 +1853:0:2654 +1854:2:1922 +1855:0:2654 +1856:2:2203 +1857:0:2654 +1858:2:2301 +1859:0:2654 +1860:2:2302 +1861:0:2654 +1862:2:2306 +1863:0:2654 +1864:2:2312 +1865:2:2316 +1866:2:2317 +1867:2:2325 +1868:2:2326 +1869:2:2330 +1870:2:2331 +1871:2:2339 +1872:2:2352 +1873:2:2353 +1874:2:2356 +1875:2:2357 +1876:2:2368 +1877:2:2369 +1878:2:2370 +1879:2:2381 +1880:2:2386 +1881:2:2389 +1882:2:2390 +1883:0:2654 +1884:2:2402 +1885:0:2654 +1886:2:2403 +1887:2:2407 +1888:2:2408 +1889:2:2416 +1890:2:2417 +1891:2:2421 +1892:2:2422 +1893:2:2430 +1894:2:2443 +1895:2:2444 +1896:2:2447 +1897:2:2448 +1898:2:2459 +1899:2:2460 +1900:2:2461 +1901:2:2472 +1902:2:2477 +1903:2:2480 +1904:2:2481 +1905:0:2654 +1906:2:2493 +1907:0:2654 +1908:2:2498 +1909:2:2502 +1910:2:2503 +1911:2:2511 +1912:2:2512 +1913:2:2516 +1914:2:2517 +1915:2:2525 +1916:2:2538 +1917:2:2539 +1918:2:2542 +1919:2:2543 +1920:2:2554 +1921:2:2555 +1922:2:2556 +1923:2:2567 +1924:2:2572 +1925:2:2575 +1926:2:2576 +1927:0:2654 +1928:2:2588 +1929:0:2654 +1930:2:2590 +1931:0:2654 +1932:2:2591 +1933:0:2654 +1934:2:2594 +1935:0:2654 +1936:2:2599 +1937:0:2654 +1938:1:2 +1939:0:2654 +1940:2:2600 +1941:0:2654 +1942:1:8 +1943:0:2654 +1944:2:2599 +1945:0:2654 +1946:1:9 +1947:0:2654 +1948:2:2600 +1949:0:2654 +1950:1:10 +1951:0:2654 +1952:2:2599 +1953:0:2654 +1954:1:11 +1955:0:2654 +1956:2:2600 +1957:0:2654 +1958:1:12 +1959:1:16 +1960:1:17 +1961:1:25 +1962:1:26 +1963:1:30 +1964:1:31 +1965:1:39 +1966:1:44 +1967:1:48 +1968:1:49 +1969:1:56 +1970:1:57 +1971:1:68 +1972:1:69 +1973:1:70 +1974:1:81 +1975:1:86 +1976:1:87 +1977:0:2654 +1978:2:2599 +1979:0:2654 +1980:1:99 +1981:0:2654 +1982:2:2600 +1983:0:2654 +1984:1:101 +1985:0:2654 +1986:2:2599 +1987:0:2654 +1988:1:102 +1989:1:106 +1990:1:107 +1991:1:115 +1992:1:116 +1993:1:120 +1994:1:121 +1995:1:129 +1996:1:134 +1997:1:138 +1998:1:139 +1999:1:146 +2000:1:147 +2001:1:158 +2002:1:159 +2003:1:160 +2004:1:171 +2005:1:176 +2006:1:177 +2007:0:2654 +2008:2:2600 +2009:0:2654 +2010:1:189 +2011:0:2654 +2012:2:2599 +2013:0:2654 +2014:1:191 +2015:0:2654 +2016:2:2600 +2017:0:2654 +2018:1:192 +2019:0:2654 +2020:2:2599 +2021:0:2654 +2022:1:193 +2023:1:197 +2024:1:198 +2025:1:206 +2026:1:207 +2027:1:211 +2028:1:212 +2029:1:220 +2030:1:225 +2031:1:229 +2032:1:230 +2033:1:237 +2034:1:238 +2035:1:249 +2036:1:250 +2037:1:251 +2038:1:262 +2039:1:267 +2040:1:268 +2041:0:2654 +2042:2:2600 +2043:0:2654 +2044:1:280 +2045:0:2654 +2046:2:2599 +2047:0:2654 +2048:1:282 +2049:0:2654 +2050:2:2600 +2051:0:2654 +2052:1:291 +2053:0:2654 +2054:2:2599 +2055:0:2654 +2056:1:293 +2057:0:2654 +2058:2:2600 +2059:0:2654 +2060:1:296 +2061:0:2654 +2062:2:2599 +2063:0:2654 +2064:1:301 +2065:0:2654 +2066:2:2600 +2067:0:2654 +2068:1:302 +2069:0:2652 +2070:2:2599 +2071:0:2658 +2072:0:2654 diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.define b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.define new file mode 100644 index 0000000..73e61a4 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.define @@ -0,0 +1 @@ +#define NO_RMB diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.log b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.log new file mode 100644 index 0000000..439c78e --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.log @@ -0,0 +1,265 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_free_no_rmb.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 744) +pan: claim violated! (at depth 1726) +pan: wrote .input.spin.trail + +(Spin Version 5.1.7 -- 23 December 2008) +Warning: Search not completed + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 3264, errors: 1 + 229629 states, stored + 2119227 states, matched + 2348856 transitions (= stored+matched) + 8294746 atomic steps +hash conflicts: 96242 (resolved) + +Stats on memory usage (in Megabytes): + 18.395 equivalent memory usage for states (stored*(State-vector + overhead)) + 14.410 actual memory usage for states (compression: 78.34%) + state-vector as stored = 38 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 480.119 total actual memory usage + +unreached in proctype urcu_reader + line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 61, "(1)" + line 418, "pan.___", state 91, "(1)" + line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 151, "(1)" + line 418, "pan.___", state 181, "(1)" + line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 242, "(1)" + line 418, "pan.___", state 272, "(1)" + line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 360, "(1)" + line 418, "pan.___", state 390, "(1)" + line 540, "pan.___", state 414, "-end-" + (17 of 414 states) +unreached in proctype urcu_writer + line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 399, "pan.___", state 20, "(1)" + line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 34, "(1)" + line 403, "pan.___", state 35, "(1)" + line 403, "pan.___", state 35, "(1)" + line 401, "pan.___", state 40, "((i<1))" + line 401, "pan.___", state 40, "((i>=1))" + line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 59, "(1)" + line 409, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 60, "else" + line 409, "pan.___", state 63, "(1)" + line 409, "pan.___", state 64, "(1)" + line 409, "pan.___", state 64, "(1)" + line 413, "pan.___", state 72, "(1)" + line 413, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 73, "else" + line 413, "pan.___", state 76, "(1)" + line 413, "pan.___", state 77, "(1)" + line 413, "pan.___", state 77, "(1)" + line 411, "pan.___", state 82, "((i<1))" + line 411, "pan.___", state 82, "((i>=1))" + line 418, "pan.___", state 89, "(1)" + line 418, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 90, "else" + line 418, "pan.___", state 93, "(1)" + line 418, "pan.___", state 94, "(1)" + line 418, "pan.___", state 94, "(1)" + line 420, "pan.___", state 97, "(1)" + line 420, "pan.___", state 97, "(1)" + line 369, "pan.___", state 99, "(1)" + line 639, "pan.___", state 103, "cached_generation_ptr.val[_pid] = (old_gen+1)" + line 637, "pan.___", state 104, "old_gen = cached_generation_ptr.val[_pid]" + line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 399, "pan.___", state 114, "(1)" + line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 128, "(1)" + line 403, "pan.___", state 129, "(1)" + line 403, "pan.___", state 129, "(1)" + line 409, "pan.___", state 153, "(1)" + line 413, "pan.___", state 166, "(1)" + line 420, "pan.___", state 191, "(1)" + line 420, "pan.___", state 191, "(1)" + line 652, "pan.___", state 199, "(1)" + line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 175, "pan.___", state 243, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 408, "pan.___", state 746, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 759, "(1)" + line 409, "pan.___", state 760, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 760, "else" + line 409, "pan.___", state 763, "(1)" + line 409, "pan.___", state 764, "(1)" + line 409, "pan.___", state 764, "(1)" + line 413, "pan.___", state 772, "(1)" + line 413, "pan.___", state 773, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 773, "else" + line 413, "pan.___", state 776, "(1)" + line 413, "pan.___", state 777, "(1)" + line 413, "pan.___", state 777, "(1)" + line 411, "pan.___", state 782, "((i<1))" + line 411, "pan.___", state 782, "((i>=1))" + line 418, "pan.___", state 789, "(1)" + line 418, "pan.___", state 790, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 790, "else" + line 418, "pan.___", state 793, "(1)" + line 418, "pan.___", state 794, "(1)" + line 418, "pan.___", state 794, "(1)" + line 420, "pan.___", state 797, "(1)" + line 420, "pan.___", state 797, "(1)" + line 403, "pan.___", state 828, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 846, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 872, "(1)" + line 418, "pan.___", state 889, "(1)" + line 403, "pan.___", state 918, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 936, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 962, "(1)" + line 418, "pan.___", state 979, "(1)" + line 399, "pan.___", state 998, "(1)" + line 403, "pan.___", state 1010, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1028, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1054, "(1)" + line 418, "pan.___", state 1071, "(1)" + line 403, "pan.___", state 1103, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1121, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1147, "(1)" + line 418, "pan.___", state 1164, "(1)" + line 179, "pan.___", state 1187, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 183, "pan.___", state 1200, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 175, "pan.___", state 1213, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 408, "pan.___", state 1330, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 1343, "(1)" + line 409, "pan.___", state 1344, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 1344, "else" + line 409, "pan.___", state 1347, "(1)" + line 409, "pan.___", state 1348, "(1)" + line 409, "pan.___", state 1348, "(1)" + line 413, "pan.___", state 1356, "(1)" + line 413, "pan.___", state 1357, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 1357, "else" + line 413, "pan.___", state 1360, "(1)" + line 413, "pan.___", state 1361, "(1)" + line 413, "pan.___", state 1361, "(1)" + line 411, "pan.___", state 1366, "((i<1))" + line 411, "pan.___", state 1366, "((i>=1))" + line 418, "pan.___", state 1373, "(1)" + line 418, "pan.___", state 1374, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 1374, "else" + line 418, "pan.___", state 1377, "(1)" + line 418, "pan.___", state 1378, "(1)" + line 418, "pan.___", state 1378, "(1)" + line 420, "pan.___", state 1381, "(1)" + line 420, "pan.___", state 1381, "(1)" + line 179, "pan.___", state 1406, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 183, "pan.___", state 1419, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 175, "pan.___", state 1432, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=2))" + line 710, "pan.___", state 20, "((j<2))" + line 710, "pan.___", state 20, "((j>=2))" + line 715, "pan.___", state 33, "((j<2))" + line 715, "pan.___", state 33, "((j>=2))" + (3 of 46 states) +unreached in proctype :never: + line 749, "pan.___", state 8, "-end-" + (1 of 8 states) + +pan: elapsed time 1.88 seconds +pan: rate 122143.09 states/second +pan: avg transition delay 8.0039e-07 usec +cp .input.spin urcu_free_no_rmb.spin.input +cp .input.spin.trail urcu_free_no_rmb.spin.input.trail +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.spin.input b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.spin.input new file mode 100644 index 0000000..6ccb255 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.spin.input @@ -0,0 +1,723 @@ +#define NO_RMB + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +//#define TEST_SIGNAL +//#define TEST_SIGNAL_ON_READ +//#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 1 +//#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.spin.input.trail b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.spin.input.trail new file mode 100644 index 0000000..90f91e2 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.spin.input.trail @@ -0,0 +1,1729 @@ +-2:3:-2 +-4:-4:-4 +1:0:1982 +2:3:1934 +3:3:1937 +4:3:1937 +5:3:1940 +6:3:1948 +7:3:1948 +8:3:1951 +9:3:1957 +10:3:1961 +11:3:1961 +12:3:1964 +13:3:1972 +14:3:1976 +15:3:1977 +16:0:1982 +17:3:1979 +18:0:1982 +19:2:416 +20:0:1982 +21:2:422 +22:0:1982 +23:2:423 +24:0:1982 +25:2:424 +26:2:428 +27:2:429 +28:2:437 +29:2:438 +30:2:442 +31:2:443 +32:2:451 +33:2:456 +34:2:460 +35:2:461 +36:2:468 +37:2:469 +38:2:480 +39:2:481 +40:2:482 +41:2:493 +42:2:498 +43:2:499 +44:0:1982 +45:2:511 +46:0:1982 +47:2:513 +48:2:514 +49:0:1982 +50:2:518 +51:2:522 +52:2:523 +53:2:531 +54:2:532 +55:2:536 +56:2:537 +57:2:545 +58:2:550 +59:2:551 +60:2:562 +61:2:563 +62:2:574 +63:2:575 +64:2:576 +65:2:587 +66:2:592 +67:2:593 +68:0:1982 +69:2:605 +70:0:1982 +71:2:607 +72:0:1982 +73:2:608 +74:0:1982 +75:2:618 +76:0:1982 +77:2:622 +78:2:623 +79:2:627 +80:2:631 +81:2:632 +82:2:636 +83:2:644 +84:2:645 +85:0:1982 +86:2:653 +87:0:1982 +88:2:657 +89:2:658 +90:2:662 +91:2:666 +92:2:667 +93:2:671 +94:2:679 +95:2:680 +96:0:1982 +97:2:688 +98:0:1982 +99:2:696 +100:2:697 +101:2:701 +102:2:705 +103:2:706 +104:2:710 +105:2:718 +106:2:719 +107:0:1982 +108:2:727 +109:0:1982 +110:2:729 +111:0:1982 +112:2:730 +113:2:734 +114:2:735 +115:2:743 +116:2:744 +117:2:748 +118:2:749 +119:2:757 +120:2:762 +121:2:766 +122:2:767 +123:2:774 +124:2:775 +125:2:786 +126:2:787 +127:2:788 +128:2:799 +129:2:804 +130:2:805 +131:0:1982 +132:2:817 +133:0:1982 +134:2:819 +135:0:1982 +136:2:822 +137:2:823 +138:2:835 +139:2:836 +140:2:840 +141:2:841 +142:2:849 +143:2:854 +144:2:858 +145:2:859 +146:2:866 +147:2:867 +148:2:878 +149:2:879 +150:2:880 +151:2:891 +152:2:896 +153:2:897 +154:0:1982 +155:2:909 +156:0:1982 +157:2:911 +158:0:1982 +159:2:912 +160:0:1982 +161:2:913 +162:0:1982 +163:2:914 +164:0:1982 +165:2:915 +166:2:919 +167:2:920 +168:2:928 +169:2:929 +170:2:933 +171:2:934 +172:2:942 +173:2:947 +174:2:951 +175:2:952 +176:2:959 +177:2:960 +178:2:971 +179:2:972 +180:2:973 +181:2:984 +182:2:989 +183:2:990 +184:0:1982 +185:2:1002 +186:0:1982 +187:2:1115 +188:0:1982 +189:2:1213 +190:0:1982 +191:2:1214 +192:0:1982 +193:2:1218 +194:0:1982 +195:2:1224 +196:2:1228 +197:2:1229 +198:2:1237 +199:2:1238 +200:2:1242 +201:2:1243 +202:2:1251 +203:2:1256 +204:2:1260 +205:2:1261 +206:2:1268 +207:2:1269 +208:2:1280 +209:2:1281 +210:2:1282 +211:2:1293 +212:2:1298 +213:2:1299 +214:0:1982 +215:2:1311 +216:0:1982 +217:2:1313 +218:0:1982 +219:2:1314 +220:2:1318 +221:2:1319 +222:2:1327 +223:2:1328 +224:2:1332 +225:2:1333 +226:2:1341 +227:2:1346 +228:2:1350 +229:2:1351 +230:2:1358 +231:2:1359 +232:2:1370 +233:2:1371 +234:2:1372 +235:2:1383 +236:2:1388 +237:2:1389 +238:0:1982 +239:2:1401 +240:0:1982 +241:2:1403 +242:0:1982 +243:2:1406 +244:2:1407 +245:2:1419 +246:2:1420 +247:2:1424 +248:2:1425 +249:2:1433 +250:2:1438 +251:2:1442 +252:2:1443 +253:2:1450 +254:2:1451 +255:2:1462 +256:2:1463 +257:2:1464 +258:2:1475 +259:2:1480 +260:2:1481 +261:0:1982 +262:2:1493 +263:0:1982 +264:2:1495 +265:0:1982 +266:2:1496 +267:0:1982 +268:2:1497 +269:0:1982 +270:2:1498 +271:0:1982 +272:2:1499 +273:2:1503 +274:2:1504 +275:2:1512 +276:2:1513 +277:2:1517 +278:2:1518 +279:2:1526 +280:2:1531 +281:2:1535 +282:2:1536 +283:2:1543 +284:2:1544 +285:2:1555 +286:2:1556 +287:2:1557 +288:2:1568 +289:2:1573 +290:2:1574 +291:0:1982 +292:2:1586 +293:0:1982 +294:2:1699 +295:0:1982 +296:2:1797 +297:0:1982 +298:2:1798 +299:0:1982 +300:2:1802 +301:0:1982 +302:2:1811 +303:2:1812 +304:2:1816 +305:2:1820 +306:2:1821 +307:2:1825 +308:2:1833 +309:2:1834 +310:0:1982 +311:2:1842 +312:0:1982 +313:2:1846 +314:2:1847 +315:2:1851 +316:2:1855 +317:2:1856 +318:2:1860 +319:2:1868 +320:2:1869 +321:0:1982 +322:2:1877 +323:0:1982 +324:2:1885 +325:2:1886 +326:2:1890 +327:2:1894 +328:2:1895 +329:2:1899 +330:2:1907 +331:2:1908 +332:0:1982 +333:2:1916 +334:0:1982 +335:2:1918 +336:0:1982 +337:2:1919 +338:0:1982 +339:2:423 +340:0:1982 +341:2:424 +342:2:428 +343:2:429 +344:2:437 +345:2:438 +346:2:442 +347:2:443 +348:2:451 +349:2:456 +350:2:460 +351:2:461 +352:2:468 +353:2:469 +354:2:480 +355:2:481 +356:2:482 +357:2:493 +358:2:498 +359:2:499 +360:0:1982 +361:2:511 +362:0:1982 +363:2:513 +364:2:514 +365:0:1982 +366:2:518 +367:2:522 +368:2:523 +369:2:531 +370:2:532 +371:2:536 +372:2:537 +373:2:545 +374:2:550 +375:2:551 +376:2:562 +377:2:563 +378:2:574 +379:2:575 +380:2:576 +381:2:587 +382:2:592 +383:2:593 +384:0:1982 +385:2:605 +386:0:1982 +387:2:607 +388:0:1982 +389:2:608 +390:0:1982 +391:2:618 +392:0:1982 +393:2:622 +394:2:623 +395:2:627 +396:2:631 +397:2:632 +398:2:636 +399:2:644 +400:2:645 +401:0:1982 +402:2:653 +403:0:1982 +404:2:657 +405:2:658 +406:2:662 +407:2:666 +408:2:667 +409:2:671 +410:2:679 +411:2:680 +412:0:1982 +413:2:688 +414:0:1982 +415:2:696 +416:2:697 +417:2:701 +418:2:705 +419:2:706 +420:2:710 +421:2:718 +422:2:719 +423:0:1982 +424:2:727 +425:0:1982 +426:2:729 +427:0:1982 +428:2:730 +429:2:734 +430:2:735 +431:2:743 +432:2:744 +433:2:748 +434:2:749 +435:2:757 +436:2:762 +437:2:766 +438:2:767 +439:2:774 +440:2:775 +441:2:786 +442:2:787 +443:2:788 +444:2:799 +445:2:804 +446:2:805 +447:0:1982 +448:2:817 +449:0:1982 +450:2:819 +451:0:1982 +452:2:822 +453:2:823 +454:2:835 +455:2:836 +456:2:840 +457:2:841 +458:2:849 +459:2:854 +460:2:858 +461:2:859 +462:2:866 +463:2:867 +464:2:878 +465:2:879 +466:2:880 +467:2:891 +468:2:896 +469:2:897 +470:0:1982 +471:2:909 +472:0:1982 +473:2:911 +474:0:1982 +475:2:912 +476:0:1982 +477:2:913 +478:0:1982 +479:2:914 +480:0:1982 +481:2:915 +482:2:919 +483:2:920 +484:2:928 +485:2:929 +486:2:933 +487:2:934 +488:2:942 +489:2:947 +490:2:951 +491:2:952 +492:2:959 +493:2:960 +494:2:971 +495:2:972 +496:2:973 +497:2:984 +498:2:989 +499:2:990 +500:0:1982 +501:2:1002 +502:0:1982 +503:2:1115 +504:0:1982 +505:2:1213 +506:0:1982 +507:2:1214 +508:0:1982 +509:2:1218 +510:0:1982 +511:2:1224 +512:2:1228 +513:2:1229 +514:2:1237 +515:2:1238 +516:2:1242 +517:2:1243 +518:2:1251 +519:2:1256 +520:2:1260 +521:2:1261 +522:2:1268 +523:2:1269 +524:2:1280 +525:2:1281 +526:2:1282 +527:2:1293 +528:2:1298 +529:2:1299 +530:0:1982 +531:2:1311 +532:0:1982 +533:2:1313 +534:0:1982 +535:2:1314 +536:2:1318 +537:2:1319 +538:2:1327 +539:2:1328 +540:2:1332 +541:2:1333 +542:2:1341 +543:2:1346 +544:2:1350 +545:2:1351 +546:2:1358 +547:2:1359 +548:2:1370 +549:2:1371 +550:2:1372 +551:2:1383 +552:2:1388 +553:2:1389 +554:0:1982 +555:2:1401 +556:0:1982 +557:2:1403 +558:0:1982 +559:2:1406 +560:2:1407 +561:2:1419 +562:2:1420 +563:2:1424 +564:2:1425 +565:2:1433 +566:2:1438 +567:2:1442 +568:2:1443 +569:2:1450 +570:2:1451 +571:2:1462 +572:2:1463 +573:2:1464 +574:2:1475 +575:2:1480 +576:2:1481 +577:0:1982 +578:2:1493 +579:0:1982 +580:2:1495 +581:0:1982 +582:2:1496 +583:0:1982 +584:2:1497 +585:0:1982 +586:2:1498 +587:0:1982 +588:2:1499 +589:2:1503 +590:2:1504 +591:2:1512 +592:2:1513 +593:2:1517 +594:2:1518 +595:2:1526 +596:2:1531 +597:2:1535 +598:2:1536 +599:2:1543 +600:2:1544 +601:2:1555 +602:2:1556 +603:2:1557 +604:2:1568 +605:2:1573 +606:2:1574 +607:0:1982 +608:2:1586 +609:0:1982 +610:2:1699 +611:0:1982 +612:2:1797 +613:0:1982 +614:2:1798 +615:0:1982 +616:2:1802 +617:0:1982 +618:2:1811 +619:2:1812 +620:2:1816 +621:2:1820 +622:2:1821 +623:2:1825 +624:2:1833 +625:2:1834 +626:0:1982 +627:2:1842 +628:0:1982 +629:2:1846 +630:2:1847 +631:2:1851 +632:2:1855 +633:2:1856 +634:2:1860 +635:2:1868 +636:2:1869 +637:0:1982 +638:2:1877 +639:0:1982 +640:2:1885 +641:2:1886 +642:2:1890 +643:2:1894 +644:2:1895 +645:2:1899 +646:2:1907 +647:2:1908 +648:0:1982 +649:2:1916 +650:0:1982 +651:2:1918 +652:0:1982 +653:2:1919 +654:0:1982 +655:2:423 +656:0:1982 +657:2:424 +658:2:428 +659:2:429 +660:2:437 +661:2:438 +662:2:442 +663:2:443 +664:2:451 +665:2:456 +666:2:460 +667:2:461 +668:2:468 +669:2:469 +670:2:480 +671:2:481 +672:2:482 +673:2:493 +674:2:498 +675:2:499 +676:0:1982 +677:2:511 +678:0:1982 +679:2:513 +680:2:514 +681:0:1982 +682:2:518 +683:2:522 +684:2:523 +685:2:531 +686:2:532 +687:2:536 +688:2:537 +689:2:545 +690:2:550 +691:2:551 +692:2:562 +693:2:563 +694:2:574 +695:2:575 +696:2:576 +697:2:587 +698:2:592 +699:2:593 +700:0:1982 +701:2:605 +702:0:1982 +703:2:607 +704:0:1982 +705:2:608 +706:0:1982 +707:2:618 +708:0:1982 +709:2:622 +710:2:623 +711:2:627 +712:2:631 +713:2:632 +714:2:636 +715:2:644 +716:2:645 +717:0:1982 +718:2:653 +719:0:1982 +720:2:657 +721:2:658 +722:2:662 +723:2:666 +724:2:667 +725:2:671 +726:2:679 +727:2:680 +728:0:1982 +729:2:688 +730:0:1982 +731:2:696 +732:2:697 +733:2:701 +734:2:705 +735:2:706 +736:2:710 +737:2:718 +738:2:719 +739:0:1982 +740:2:727 +741:0:1982 +742:2:729 +743:0:1982 +744:2:730 +745:2:734 +746:2:735 +747:2:743 +748:2:744 +749:2:748 +750:2:749 +751:2:757 +752:2:762 +753:2:766 +754:2:767 +755:2:774 +756:2:775 +757:2:786 +758:2:787 +759:2:788 +760:2:799 +761:2:804 +762:2:805 +763:0:1982 +764:2:817 +765:0:1982 +766:2:819 +767:0:1982 +768:2:822 +769:2:823 +770:2:835 +771:2:836 +772:2:840 +773:2:841 +774:2:849 +775:2:854 +776:2:858 +777:2:859 +778:2:866 +779:2:867 +780:2:878 +781:2:879 +782:2:880 +783:2:891 +784:2:896 +785:2:897 +786:0:1982 +787:2:909 +788:0:1982 +789:2:911 +790:0:1982 +791:2:912 +792:0:1982 +793:2:913 +794:0:1982 +795:2:914 +796:0:1982 +797:2:915 +798:2:919 +799:2:920 +800:2:928 +801:2:929 +802:2:933 +803:2:934 +804:2:942 +805:2:947 +806:2:951 +807:2:952 +808:2:959 +809:2:960 +810:2:971 +811:2:972 +812:2:973 +813:2:984 +814:2:989 +815:2:990 +816:0:1982 +817:2:1002 +818:0:1982 +819:2:1115 +820:0:1982 +821:2:1213 +822:0:1982 +823:2:1214 +824:0:1982 +825:2:1218 +826:0:1982 +827:2:1224 +828:2:1228 +829:2:1229 +830:2:1237 +831:2:1238 +832:2:1242 +833:2:1243 +834:2:1251 +835:2:1256 +836:2:1260 +837:2:1261 +838:2:1268 +839:2:1269 +840:2:1280 +841:2:1281 +842:2:1282 +843:2:1293 +844:2:1298 +845:2:1299 +846:0:1982 +847:2:1311 +848:0:1982 +849:2:1313 +850:0:1982 +851:2:1314 +852:2:1318 +853:2:1319 +854:2:1327 +855:2:1328 +856:2:1332 +857:2:1333 +858:2:1341 +859:2:1346 +860:2:1350 +861:2:1351 +862:2:1358 +863:2:1359 +864:2:1370 +865:2:1371 +866:2:1372 +867:2:1383 +868:2:1388 +869:2:1389 +870:0:1982 +871:2:1401 +872:0:1982 +873:2:1403 +874:0:1982 +875:2:1406 +876:2:1407 +877:2:1419 +878:2:1420 +879:2:1424 +880:2:1425 +881:2:1433 +882:2:1438 +883:2:1442 +884:2:1443 +885:2:1450 +886:2:1451 +887:2:1462 +888:2:1463 +889:2:1464 +890:2:1475 +891:2:1480 +892:2:1481 +893:0:1982 +894:2:1493 +895:0:1982 +896:2:1495 +897:0:1982 +898:2:1496 +899:0:1982 +900:2:1497 +901:0:1982 +902:2:1498 +903:0:1982 +904:2:1499 +905:2:1503 +906:2:1504 +907:2:1512 +908:2:1513 +909:2:1517 +910:2:1518 +911:2:1526 +912:2:1531 +913:2:1535 +914:2:1536 +915:2:1543 +916:2:1544 +917:2:1555 +918:2:1556 +919:2:1557 +920:2:1568 +921:2:1573 +922:2:1574 +923:0:1982 +924:2:1586 +925:0:1982 +926:2:1699 +927:0:1982 +928:2:1797 +929:0:1982 +930:2:1798 +931:0:1982 +932:2:1802 +933:0:1982 +934:2:1811 +935:2:1812 +936:2:1816 +937:2:1820 +938:2:1821 +939:2:1825 +940:2:1833 +941:2:1834 +942:0:1982 +943:2:1842 +944:0:1982 +945:2:1846 +946:2:1847 +947:2:1851 +948:2:1855 +949:2:1856 +950:2:1860 +951:2:1868 +952:2:1869 +953:0:1982 +954:2:1877 +955:0:1982 +956:2:1885 +957:2:1886 +958:2:1890 +959:2:1894 +960:2:1895 +961:2:1899 +962:2:1907 +963:2:1908 +964:0:1982 +965:2:1916 +966:0:1982 +967:2:1918 +968:0:1982 +969:2:1919 +970:0:1982 +971:2:423 +972:0:1982 +973:2:424 +974:2:428 +975:2:429 +976:2:437 +977:2:438 +978:2:442 +979:2:443 +980:2:451 +981:2:456 +982:2:460 +983:2:461 +984:2:468 +985:2:469 +986:2:480 +987:2:481 +988:2:482 +989:2:493 +990:2:498 +991:2:499 +992:0:1982 +993:2:511 +994:0:1982 +995:2:513 +996:2:514 +997:0:1982 +998:2:518 +999:2:522 +1000:2:523 +1001:2:531 +1002:2:532 +1003:2:536 +1004:2:537 +1005:2:545 +1006:2:550 +1007:2:551 +1008:2:562 +1009:2:563 +1010:2:574 +1011:2:575 +1012:2:576 +1013:2:587 +1014:2:592 +1015:2:593 +1016:0:1982 +1017:2:605 +1018:0:1982 +1019:2:607 +1020:0:1982 +1021:2:608 +1022:0:1982 +1023:2:618 +1024:0:1982 +1025:2:622 +1026:2:623 +1027:2:627 +1028:2:631 +1029:2:632 +1030:2:636 +1031:2:644 +1032:2:645 +1033:0:1982 +1034:2:653 +1035:0:1982 +1036:2:657 +1037:2:658 +1038:2:662 +1039:2:666 +1040:2:667 +1041:2:671 +1042:2:679 +1043:2:680 +1044:0:1982 +1045:2:688 +1046:0:1982 +1047:2:696 +1048:2:697 +1049:2:701 +1050:2:705 +1051:2:706 +1052:2:710 +1053:2:718 +1054:2:719 +1055:0:1982 +1056:2:727 +1057:0:1982 +1058:2:729 +1059:0:1982 +1060:2:730 +1061:2:734 +1062:2:735 +1063:2:743 +1064:2:744 +1065:2:748 +1066:2:749 +1067:2:757 +1068:2:762 +1069:2:766 +1070:2:767 +1071:2:774 +1072:2:775 +1073:2:786 +1074:2:787 +1075:2:788 +1076:2:799 +1077:2:804 +1078:2:805 +1079:0:1982 +1080:2:817 +1081:0:1982 +1082:2:819 +1083:0:1982 +1084:2:822 +1085:2:823 +1086:2:835 +1087:2:836 +1088:2:840 +1089:2:841 +1090:2:849 +1091:2:854 +1092:2:858 +1093:2:859 +1094:2:866 +1095:2:867 +1096:2:878 +1097:2:879 +1098:2:880 +1099:2:891 +1100:2:896 +1101:2:897 +1102:0:1982 +1103:2:909 +1104:0:1982 +1105:2:911 +1106:0:1982 +1107:2:912 +1108:0:1982 +1109:2:913 +1110:0:1982 +1111:2:914 +1112:0:1982 +1113:2:915 +1114:2:919 +1115:2:920 +1116:2:928 +1117:2:929 +1118:2:933 +1119:2:934 +1120:2:942 +1121:2:947 +1122:2:951 +1123:2:952 +1124:2:959 +1125:2:960 +1126:2:971 +1127:2:972 +1128:2:973 +1129:2:984 +1130:2:989 +1131:2:990 +1132:0:1982 +1133:2:1002 +1134:0:1982 +1135:2:1115 +1136:0:1982 +1137:2:1213 +1138:0:1982 +1139:2:1214 +1140:0:1982 +1141:2:1218 +1142:0:1982 +1143:2:1224 +1144:2:1228 +1145:2:1229 +1146:2:1237 +1147:2:1238 +1148:2:1242 +1149:2:1243 +1150:2:1251 +1151:2:1256 +1152:2:1260 +1153:2:1261 +1154:2:1268 +1155:2:1269 +1156:2:1280 +1157:2:1281 +1158:2:1282 +1159:2:1293 +1160:2:1298 +1161:2:1299 +1162:0:1982 +1163:2:1311 +1164:0:1982 +1165:2:1313 +1166:0:1982 +1167:2:1314 +1168:2:1318 +1169:2:1319 +1170:2:1327 +1171:2:1328 +1172:2:1332 +1173:2:1333 +1174:2:1341 +1175:2:1346 +1176:2:1350 +1177:2:1351 +1178:2:1358 +1179:2:1359 +1180:2:1370 +1181:2:1371 +1182:2:1372 +1183:2:1383 +1184:2:1388 +1185:2:1389 +1186:0:1982 +1187:2:1401 +1188:0:1982 +1189:2:1403 +1190:0:1982 +1191:2:1406 +1192:2:1407 +1193:2:1419 +1194:2:1420 +1195:2:1424 +1196:2:1425 +1197:2:1433 +1198:2:1438 +1199:2:1442 +1200:2:1443 +1201:2:1450 +1202:2:1451 +1203:2:1462 +1204:2:1463 +1205:2:1464 +1206:2:1475 +1207:2:1480 +1208:2:1481 +1209:0:1982 +1210:2:1493 +1211:0:1982 +1212:2:1495 +1213:0:1982 +1214:2:1496 +1215:0:1982 +1216:2:1497 +1217:0:1982 +1218:2:1498 +1219:0:1982 +1220:2:1499 +1221:2:1503 +1222:2:1504 +1223:2:1512 +1224:2:1513 +1225:2:1517 +1226:2:1518 +1227:2:1526 +1228:2:1531 +1229:2:1535 +1230:2:1536 +1231:2:1543 +1232:2:1544 +1233:2:1555 +1234:2:1556 +1235:2:1557 +1236:2:1568 +1237:2:1573 +1238:2:1574 +1239:0:1982 +1240:2:1586 +1241:0:1982 +1242:2:1699 +1243:0:1982 +1244:2:1797 +1245:0:1982 +1246:2:1798 +1247:0:1982 +1248:2:1802 +1249:0:1982 +1250:2:1811 +1251:2:1812 +1252:2:1816 +1253:2:1820 +1254:2:1821 +1255:2:1825 +1256:2:1833 +1257:2:1834 +1258:0:1982 +1259:2:1842 +1260:0:1982 +1261:2:1846 +1262:2:1847 +1263:2:1851 +1264:2:1855 +1265:2:1856 +1266:2:1860 +1267:2:1868 +1268:2:1869 +1269:0:1982 +1270:2:1877 +1271:0:1982 +1272:2:1885 +1273:2:1886 +1274:2:1890 +1275:2:1894 +1276:2:1895 +1277:2:1899 +1278:2:1907 +1279:2:1908 +1280:0:1982 +1281:2:1916 +1282:0:1982 +1283:2:1918 +1284:0:1982 +1285:2:1919 +1286:0:1982 +1287:2:423 +1288:0:1982 +1289:2:424 +1290:2:428 +1291:2:429 +1292:2:437 +1293:2:438 +1294:2:442 +1295:2:443 +1296:2:451 +1297:2:456 +1298:2:460 +1299:2:461 +1300:2:468 +1301:2:469 +1302:2:480 +1303:2:481 +1304:2:482 +1305:2:493 +1306:2:498 +1307:2:499 +1308:0:1982 +1309:2:511 +1310:0:1982 +1311:2:513 +1312:2:514 +1313:0:1982 +1314:2:518 +1315:2:522 +1316:2:523 +1317:2:531 +1318:2:532 +1319:2:536 +1320:2:537 +1321:2:545 +1322:2:558 +1323:2:559 +1324:2:562 +1325:2:563 +1326:2:574 +1327:2:575 +1328:2:576 +1329:2:587 +1330:2:592 +1331:2:595 +1332:2:596 +1333:0:1982 +1334:2:605 +1335:0:1982 +1336:2:607 +1337:0:1982 +1338:2:608 +1339:0:1982 +1340:2:618 +1341:0:1982 +1342:1:2 +1343:0:1982 +1344:1:8 +1345:0:1982 +1346:1:9 +1347:0:1982 +1348:1:10 +1349:0:1982 +1350:1:11 +1351:0:1982 +1352:1:12 +1353:1:16 +1354:1:17 +1355:1:25 +1356:1:26 +1357:1:30 +1358:1:31 +1359:1:39 +1360:1:44 +1361:1:48 +1362:1:49 +1363:1:56 +1364:1:57 +1365:1:68 +1366:1:69 +1367:1:70 +1368:1:81 +1369:1:86 +1370:1:87 +1371:0:1982 +1372:1:99 +1373:0:1982 +1374:2:622 +1375:2:623 +1376:2:627 +1377:2:631 +1378:2:632 +1379:2:636 +1380:2:641 +1381:0:1982 +1382:2:653 +1383:0:1982 +1384:2:657 +1385:2:658 +1386:2:662 +1387:2:666 +1388:2:667 +1389:2:671 +1390:2:679 +1391:2:680 +1392:0:1982 +1393:2:688 +1394:0:1982 +1395:2:696 +1396:2:697 +1397:2:701 +1398:2:705 +1399:2:706 +1400:2:710 +1401:2:718 +1402:2:719 +1403:0:1982 +1404:2:727 +1405:0:1982 +1406:2:729 +1407:0:1982 +1408:2:730 +1409:2:734 +1410:2:735 +1411:2:743 +1412:2:744 +1413:2:748 +1414:2:749 +1415:2:757 +1416:2:762 +1417:2:766 +1418:2:767 +1419:2:774 +1420:2:775 +1421:2:786 +1422:2:787 +1423:2:788 +1424:2:799 +1425:2:804 +1426:2:805 +1427:0:1982 +1428:2:817 +1429:0:1982 +1430:2:819 +1431:0:1982 +1432:2:822 +1433:2:823 +1434:2:835 +1435:2:836 +1436:2:840 +1437:2:841 +1438:2:849 +1439:2:854 +1440:2:858 +1441:2:859 +1442:2:866 +1443:2:867 +1444:2:878 +1445:2:879 +1446:2:880 +1447:2:891 +1448:2:896 +1449:2:897 +1450:0:1982 +1451:2:909 +1452:0:1982 +1453:2:911 +1454:0:1982 +1455:2:912 +1456:0:1982 +1457:2:913 +1458:0:1982 +1459:2:914 +1460:0:1982 +1461:2:915 +1462:2:919 +1463:2:920 +1464:2:928 +1465:2:929 +1466:2:933 +1467:2:934 +1468:2:942 +1469:2:947 +1470:2:951 +1471:2:952 +1472:2:959 +1473:2:960 +1474:2:971 +1475:2:972 +1476:2:973 +1477:2:984 +1478:2:989 +1479:2:990 +1480:0:1982 +1481:2:1002 +1482:0:1982 +1483:2:1115 +1484:0:1982 +1485:2:1213 +1486:0:1982 +1487:2:1214 +1488:0:1982 +1489:2:1218 +1490:0:1982 +1491:2:1224 +1492:2:1228 +1493:2:1229 +1494:2:1237 +1495:2:1238 +1496:2:1242 +1497:2:1243 +1498:2:1251 +1499:2:1256 +1500:2:1260 +1501:2:1261 +1502:2:1268 +1503:2:1269 +1504:2:1280 +1505:2:1281 +1506:2:1282 +1507:2:1293 +1508:2:1298 +1509:2:1299 +1510:0:1982 +1511:2:1311 +1512:0:1982 +1513:2:1313 +1514:0:1982 +1515:2:1314 +1516:2:1318 +1517:2:1319 +1518:2:1327 +1519:2:1328 +1520:2:1332 +1521:2:1333 +1522:2:1341 +1523:2:1346 +1524:2:1350 +1525:2:1351 +1526:2:1358 +1527:2:1359 +1528:2:1370 +1529:2:1371 +1530:2:1372 +1531:2:1383 +1532:2:1388 +1533:2:1389 +1534:0:1982 +1535:2:1401 +1536:0:1982 +1537:2:1403 +1538:0:1982 +1539:2:1406 +1540:2:1407 +1541:2:1419 +1542:2:1420 +1543:2:1424 +1544:2:1425 +1545:2:1433 +1546:2:1438 +1547:2:1442 +1548:2:1443 +1549:2:1450 +1550:2:1451 +1551:2:1462 +1552:2:1463 +1553:2:1464 +1554:2:1475 +1555:2:1480 +1556:2:1481 +1557:0:1982 +1558:2:1493 +1559:0:1982 +1560:2:1495 +1561:0:1982 +1562:2:1496 +1563:0:1982 +1564:2:1497 +1565:0:1982 +1566:2:1498 +1567:0:1982 +1568:2:1499 +1569:2:1503 +1570:2:1504 +1571:2:1512 +1572:2:1513 +1573:2:1517 +1574:2:1518 +1575:2:1526 +1576:2:1531 +1577:2:1535 +1578:2:1536 +1579:2:1543 +1580:2:1544 +1581:2:1555 +1582:2:1556 +1583:2:1557 +1584:2:1568 +1585:2:1573 +1586:2:1574 +1587:0:1982 +1588:2:1586 +1589:0:1982 +1590:2:1699 +1591:0:1982 +1592:2:1797 +1593:0:1982 +1594:2:1798 +1595:0:1982 +1596:2:1802 +1597:0:1982 +1598:2:1811 +1599:2:1812 +1600:2:1816 +1601:2:1820 +1602:2:1821 +1603:2:1825 +1604:2:1833 +1605:2:1834 +1606:0:1982 +1607:2:1842 +1608:0:1982 +1609:2:1846 +1610:2:1847 +1611:2:1851 +1612:2:1855 +1613:2:1856 +1614:2:1860 +1615:2:1868 +1616:2:1869 +1617:0:1982 +1618:2:1877 +1619:0:1982 +1620:2:1885 +1621:2:1886 +1622:2:1890 +1623:2:1894 +1624:2:1895 +1625:2:1899 +1626:2:1907 +1627:2:1908 +1628:0:1982 +1629:2:1916 +1630:0:1982 +1631:2:1918 +1632:0:1982 +1633:2:1919 +1634:0:1982 +1635:2:1922 +1636:0:1982 +1637:2:1927 +1638:0:1982 +1639:1:101 +1640:0:1982 +1641:2:1928 +1642:0:1982 +1643:1:102 +1644:1:106 +1645:1:107 +1646:1:115 +1647:1:116 +1648:1:120 +1649:1:121 +1650:1:129 +1651:1:134 +1652:1:138 +1653:1:139 +1654:1:146 +1655:1:147 +1656:1:158 +1657:1:159 +1658:1:160 +1659:1:171 +1660:1:183 +1661:1:184 +1662:0:1982 +1663:2:1927 +1664:0:1982 +1665:1:189 +1666:0:1982 +1667:2:1928 +1668:0:1982 +1669:1:191 +1670:0:1982 +1671:2:1927 +1672:0:1982 +1673:1:192 +1674:0:1982 +1675:2:1928 +1676:0:1982 +1677:1:193 +1678:1:197 +1679:1:198 +1680:1:206 +1681:1:207 +1682:1:211 +1683:1:212 +1684:1:220 +1685:1:225 +1686:1:229 +1687:1:230 +1688:1:237 +1689:1:238 +1690:1:249 +1691:1:250 +1692:1:251 +1693:1:262 +1694:1:274 +1695:1:275 +1696:0:1982 +1697:2:1927 +1698:0:1982 +1699:1:280 +1700:0:1982 +1701:2:1928 +1702:0:1982 +1703:1:282 +1704:0:1982 +1705:2:1927 +1706:0:1982 +1707:1:291 +1708:0:1982 +1709:2:1928 +1710:0:1982 +1711:1:293 +1712:0:1982 +1713:2:1927 +1714:0:1982 +1715:1:296 +1716:0:1982 +1717:2:1928 +1718:0:1982 +1719:1:301 +1720:0:1982 +1721:2:1927 +1722:0:1982 +1723:1:302 +1724:0:1980 +1725:2:1928 +1726:0:1986 +1727:2:1429 diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.define b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.define new file mode 100644 index 0000000..710f29d --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.define @@ -0,0 +1 @@ +#define NO_WMB diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.log b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.log new file mode 100644 index 0000000..abf7b83 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.log @@ -0,0 +1,294 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_free_no_wmb.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 744) +pan: claim violated! (at depth 1614) +pan: wrote .input.spin.trail + +(Spin Version 5.1.7 -- 23 December 2008) +Warning: Search not completed + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 2823, errors: 1 + 81228 states, stored + 752552 states, matched + 833780 transitions (= stored+matched) + 2934533 atomic steps +hash conflicts: 10835 (resolved) + +Stats on memory usage (in Megabytes): + 6.507 equivalent memory usage for states (stored*(State-vector + overhead)) + 5.330 actual memory usage for states (compression: 81.92%) + state-vector as stored = 41 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 471.037 total actual memory usage + +unreached in proctype urcu_reader + line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 61, "(1)" + line 418, "pan.___", state 91, "(1)" + line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 151, "(1)" + line 418, "pan.___", state 181, "(1)" + line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 242, "(1)" + line 418, "pan.___", state 272, "(1)" + line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 331, "(1)" + line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 360, "(1)" + line 418, "pan.___", state 390, "(1)" + line 540, "pan.___", state 414, "-end-" + (18 of 414 states) +unreached in proctype urcu_writer + line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 399, "pan.___", state 20, "(1)" + line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 34, "(1)" + line 403, "pan.___", state 35, "(1)" + line 403, "pan.___", state 35, "(1)" + line 401, "pan.___", state 40, "((i<1))" + line 401, "pan.___", state 40, "((i>=1))" + line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 59, "(1)" + line 409, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 60, "else" + line 409, "pan.___", state 63, "(1)" + line 409, "pan.___", state 64, "(1)" + line 409, "pan.___", state 64, "(1)" + line 413, "pan.___", state 72, "(1)" + line 413, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 73, "else" + line 413, "pan.___", state 76, "(1)" + line 413, "pan.___", state 77, "(1)" + line 413, "pan.___", state 77, "(1)" + line 411, "pan.___", state 82, "((i<1))" + line 411, "pan.___", state 82, "((i>=1))" + line 418, "pan.___", state 89, "(1)" + line 418, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 90, "else" + line 418, "pan.___", state 93, "(1)" + line 418, "pan.___", state 94, "(1)" + line 418, "pan.___", state 94, "(1)" + line 420, "pan.___", state 97, "(1)" + line 420, "pan.___", state 97, "(1)" + line 369, "pan.___", state 99, "(1)" + line 639, "pan.___", state 103, "cached_generation_ptr.val[_pid] = (old_gen+1)" + line 637, "pan.___", state 104, "old_gen = cached_generation_ptr.val[_pid]" + line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 399, "pan.___", state 114, "(1)" + line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 128, "(1)" + line 403, "pan.___", state 129, "(1)" + line 403, "pan.___", state 129, "(1)" + line 401, "pan.___", state 134, "((i<1))" + line 401, "pan.___", state 134, "((i>=1))" + line 409, "pan.___", state 153, "(1)" + line 409, "pan.___", state 154, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 154, "else" + line 409, "pan.___", state 157, "(1)" + line 409, "pan.___", state 158, "(1)" + line 409, "pan.___", state 158, "(1)" + line 413, "pan.___", state 166, "(1)" + line 413, "pan.___", state 167, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 167, "else" + line 413, "pan.___", state 170, "(1)" + line 413, "pan.___", state 171, "(1)" + line 413, "pan.___", state 171, "(1)" + line 411, "pan.___", state 176, "((i<1))" + line 411, "pan.___", state 176, "((i>=1))" + line 418, "pan.___", state 183, "(1)" + line 418, "pan.___", state 184, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 184, "else" + line 418, "pan.___", state 187, "(1)" + line 418, "pan.___", state 188, "(1)" + line 418, "pan.___", state 188, "(1)" + line 420, "pan.___", state 191, "(1)" + line 420, "pan.___", state 191, "(1)" + line 369, "pan.___", state 193, "(1)" + line 652, "pan.___", state 199, "(1)" + line 646, "pan.___", state 202, "((write_lock==0))" + line 646, "pan.___", state 202, "else" + line 644, "pan.___", state 203, "(1)" + line 160, "pan.___", state 209, "(1)" + line 164, "pan.___", state 217, "(1)" + line 164, "pan.___", state 218, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 164, "pan.___", state 218, "else" + line 162, "pan.___", state 223, "((j<1))" + line 162, "pan.___", state 223, "((j>=1))" + line 168, "pan.___", state 229, "(1)" + line 168, "pan.___", state 230, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 168, "pan.___", state 230, "else" + line 160, "pan.___", state 241, "(1)" + line 168, "pan.___", state 261, "(1)" + line 160, "pan.___", state 277, "(1)" + line 164, "pan.___", state 285, "(1)" + line 168, "pan.___", state 297, "(1)" + line 399, "pan.___", state 311, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 325, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 343, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 356, "(1)" + line 413, "pan.___", state 369, "(1)" + line 418, "pan.___", state 386, "(1)" + line 399, "pan.___", state 405, "(1)" + line 403, "pan.___", state 417, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 435, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 461, "(1)" + line 418, "pan.___", state 478, "(1)" + line 403, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 554, "(1)" + line 418, "pan.___", state 571, "(1)" + line 164, "pan.___", state 594, "(1)" + line 168, "pan.___", state 606, "(1)" + line 160, "pan.___", state 618, "(1)" + line 168, "pan.___", state 638, "(1)" + line 164, "pan.___", state 662, "(1)" + line 168, "pan.___", state 674, "(1)" + line 399, "pan.___", state 696, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 399, "pan.___", state 698, "(1)" + line 399, "pan.___", state 699, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 399, "pan.___", state 699, "else" + line 399, "pan.___", state 702, "(1)" + line 403, "pan.___", state 710, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 712, "(1)" + line 403, "pan.___", state 713, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 403, "pan.___", state 713, "else" + line 403, "pan.___", state 716, "(1)" + line 403, "pan.___", state 717, "(1)" + line 403, "pan.___", state 717, "(1)" + line 401, "pan.___", state 722, "((i<1))" + line 401, "pan.___", state 722, "((i>=1))" + line 408, "pan.___", state 728, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 741, "(1)" + line 409, "pan.___", state 742, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 742, "else" + line 409, "pan.___", state 745, "(1)" + line 409, "pan.___", state 746, "(1)" + line 409, "pan.___", state 746, "(1)" + line 413, "pan.___", state 754, "(1)" + line 413, "pan.___", state 755, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 755, "else" + line 413, "pan.___", state 758, "(1)" + line 413, "pan.___", state 759, "(1)" + line 413, "pan.___", state 759, "(1)" + line 411, "pan.___", state 764, "((i<1))" + line 411, "pan.___", state 764, "((i>=1))" + line 418, "pan.___", state 771, "(1)" + line 418, "pan.___", state 772, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 772, "else" + line 418, "pan.___", state 775, "(1)" + line 418, "pan.___", state 776, "(1)" + line 418, "pan.___", state 776, "(1)" + line 420, "pan.___", state 779, "(1)" + line 420, "pan.___", state 779, "(1)" + line 403, "pan.___", state 810, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 828, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 854, "(1)" + line 418, "pan.___", state 871, "(1)" + line 403, "pan.___", state 900, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 918, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 944, "(1)" + line 418, "pan.___", state 961, "(1)" + line 399, "pan.___", state 980, "(1)" + line 403, "pan.___", state 992, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1010, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1036, "(1)" + line 418, "pan.___", state 1053, "(1)" + line 403, "pan.___", state 1085, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1103, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1129, "(1)" + line 418, "pan.___", state 1146, "(1)" + line 164, "pan.___", state 1169, "(1)" + line 168, "pan.___", state 1181, "(1)" + line 160, "pan.___", state 1193, "(1)" + line 168, "pan.___", state 1213, "(1)" + line 164, "pan.___", state 1237, "(1)" + line 168, "pan.___", state 1249, "(1)" + line 399, "pan.___", state 1271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 399, "pan.___", state 1273, "(1)" + line 399, "pan.___", state 1274, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 399, "pan.___", state 1274, "else" + line 399, "pan.___", state 1277, "(1)" + line 403, "pan.___", state 1285, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 1287, "(1)" + line 403, "pan.___", state 1288, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 403, "pan.___", state 1288, "else" + line 403, "pan.___", state 1291, "(1)" + line 403, "pan.___", state 1292, "(1)" + line 403, "pan.___", state 1292, "(1)" + line 401, "pan.___", state 1297, "((i<1))" + line 401, "pan.___", state 1297, "((i>=1))" + line 408, "pan.___", state 1303, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 1316, "(1)" + line 409, "pan.___", state 1317, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 1317, "else" + line 409, "pan.___", state 1320, "(1)" + line 409, "pan.___", state 1321, "(1)" + line 409, "pan.___", state 1321, "(1)" + line 413, "pan.___", state 1329, "(1)" + line 413, "pan.___", state 1330, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 1330, "else" + line 413, "pan.___", state 1333, "(1)" + line 413, "pan.___", state 1334, "(1)" + line 413, "pan.___", state 1334, "(1)" + line 411, "pan.___", state 1339, "((i<1))" + line 411, "pan.___", state 1339, "((i>=1))" + line 418, "pan.___", state 1346, "(1)" + line 418, "pan.___", state 1347, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 1347, "else" + line 418, "pan.___", state 1350, "(1)" + line 418, "pan.___", state 1351, "(1)" + line 418, "pan.___", state 1351, "(1)" + line 420, "pan.___", state 1354, "(1)" + line 420, "pan.___", state 1354, "(1)" + line 164, "pan.___", state 1379, "(1)" + line 168, "pan.___", state 1391, "(1)" + line 160, "pan.___", state 1403, "(1)" + line 168, "pan.___", state 1423, "(1)" + line 164, "pan.___", state 1447, "(1)" + line 168, "pan.___", state 1459, "(1)" + line 702, "pan.___", state 1484, "-end-" + (160 of 1484 states) +unreached in proctype :init: + line 709, "pan.___", state 9, "((j<2))" + line 709, "pan.___", state 9, "((j>=2))" + line 710, "pan.___", state 20, "((j<2))" + line 710, "pan.___", state 20, "((j>=2))" + line 715, "pan.___", state 33, "((j<2))" + line 715, "pan.___", state 33, "((j>=2))" + (3 of 46 states) +unreached in proctype :never: + line 749, "pan.___", state 8, "-end-" + (1 of 8 states) + +pan: elapsed time 0.66 seconds +pan: rate 123072.73 states/second +pan: avg transition delay 7.9158e-07 usec +cp .input.spin urcu_free_no_wmb.spin.input +cp .input.spin.trail urcu_free_no_wmb.spin.input.trail +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.spin.input b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.spin.input new file mode 100644 index 0000000..df3cc4b --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.spin.input @@ -0,0 +1,723 @@ +#define NO_WMB + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +//#define TEST_SIGNAL +//#define TEST_SIGNAL_ON_READ +//#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 1 +//#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.spin.input.trail b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.spin.input.trail new file mode 100644 index 0000000..fe987f0 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.spin.input.trail @@ -0,0 +1,1617 @@ +-2:3:-2 +-4:-4:-4 +1:0:1946 +2:3:1898 +3:3:1901 +4:3:1901 +5:3:1904 +6:3:1912 +7:3:1912 +8:3:1915 +9:3:1921 +10:3:1925 +11:3:1925 +12:3:1928 +13:3:1936 +14:3:1940 +15:3:1941 +16:0:1946 +17:3:1943 +18:0:1946 +19:2:416 +20:0:1946 +21:2:422 +22:0:1946 +23:2:423 +24:0:1946 +25:2:424 +26:2:428 +27:2:429 +28:2:437 +29:2:438 +30:2:442 +31:2:443 +32:2:451 +33:2:456 +34:2:460 +35:2:461 +36:2:468 +37:2:469 +38:2:480 +39:2:481 +40:2:482 +41:2:493 +42:2:498 +43:2:499 +44:0:1946 +45:2:511 +46:0:1946 +47:2:513 +48:2:514 +49:0:1946 +50:2:518 +51:2:522 +52:2:523 +53:2:531 +54:2:532 +55:2:536 +56:2:537 +57:2:545 +58:2:550 +59:2:551 +60:2:562 +61:2:563 +62:2:574 +63:2:575 +64:2:576 +65:2:587 +66:2:592 +67:2:593 +68:0:1946 +69:2:605 +70:0:1946 +71:2:607 +72:0:1946 +73:2:608 +74:0:1946 +75:2:618 +76:0:1946 +77:2:619 +78:2:626 +79:2:627 +80:2:634 +81:2:639 +82:0:1946 +83:2:650 +84:0:1946 +85:2:651 +86:2:658 +87:2:659 +88:2:666 +89:2:671 +90:0:1946 +91:2:682 +92:0:1946 +93:2:687 +94:2:694 +95:2:695 +96:2:702 +97:2:707 +98:0:1946 +99:2:718 +100:0:1946 +101:2:720 +102:0:1946 +103:2:721 +104:2:725 +105:2:726 +106:2:734 +107:2:735 +108:2:739 +109:2:740 +110:2:748 +111:2:753 +112:2:757 +113:2:758 +114:2:765 +115:2:766 +116:2:777 +117:2:778 +118:2:779 +119:2:790 +120:2:795 +121:2:796 +122:0:1946 +123:2:808 +124:0:1946 +125:2:810 +126:0:1946 +127:2:813 +128:2:814 +129:2:826 +130:2:827 +131:2:831 +132:2:832 +133:2:840 +134:2:845 +135:2:849 +136:2:850 +137:2:857 +138:2:858 +139:2:869 +140:2:870 +141:2:871 +142:2:882 +143:2:887 +144:2:888 +145:0:1946 +146:2:900 +147:0:1946 +148:2:902 +149:0:1946 +150:2:903 +151:0:1946 +152:2:904 +153:0:1946 +154:2:905 +155:0:1946 +156:2:906 +157:2:910 +158:2:911 +159:2:919 +160:2:920 +161:2:924 +162:2:925 +163:2:933 +164:2:938 +165:2:942 +166:2:943 +167:2:950 +168:2:951 +169:2:962 +170:2:963 +171:2:964 +172:2:975 +173:2:980 +174:2:981 +175:0:1946 +176:2:993 +177:0:1946 +178:2:1097 +179:0:1946 +180:2:1195 +181:0:1946 +182:2:1196 +183:0:1946 +184:2:1200 +185:0:1946 +186:2:1206 +187:2:1210 +188:2:1211 +189:2:1219 +190:2:1220 +191:2:1224 +192:2:1225 +193:2:1233 +194:2:1238 +195:2:1242 +196:2:1243 +197:2:1250 +198:2:1251 +199:2:1262 +200:2:1263 +201:2:1264 +202:2:1275 +203:2:1280 +204:2:1281 +205:0:1946 +206:2:1293 +207:0:1946 +208:2:1295 +209:0:1946 +210:2:1296 +211:2:1300 +212:2:1301 +213:2:1309 +214:2:1310 +215:2:1314 +216:2:1315 +217:2:1323 +218:2:1328 +219:2:1332 +220:2:1333 +221:2:1340 +222:2:1341 +223:2:1352 +224:2:1353 +225:2:1354 +226:2:1365 +227:2:1370 +228:2:1371 +229:0:1946 +230:2:1383 +231:0:1946 +232:2:1385 +233:0:1946 +234:2:1388 +235:2:1389 +236:2:1401 +237:2:1402 +238:2:1406 +239:2:1407 +240:2:1415 +241:2:1420 +242:2:1424 +243:2:1425 +244:2:1432 +245:2:1433 +246:2:1444 +247:2:1445 +248:2:1446 +249:2:1457 +250:2:1462 +251:2:1463 +252:0:1946 +253:2:1475 +254:0:1946 +255:2:1477 +256:0:1946 +257:2:1478 +258:0:1946 +259:2:1479 +260:0:1946 +261:2:1480 +262:0:1946 +263:2:1481 +264:2:1485 +265:2:1486 +266:2:1494 +267:2:1495 +268:2:1499 +269:2:1500 +270:2:1508 +271:2:1513 +272:2:1517 +273:2:1518 +274:2:1525 +275:2:1526 +276:2:1537 +277:2:1538 +278:2:1539 +279:2:1550 +280:2:1555 +281:2:1556 +282:0:1946 +283:2:1568 +284:0:1946 +285:2:1672 +286:0:1946 +287:2:1770 +288:0:1946 +289:2:1771 +290:0:1946 +291:2:1775 +292:0:1946 +293:2:1781 +294:2:1788 +295:2:1789 +296:2:1796 +297:2:1801 +298:0:1946 +299:2:1812 +300:0:1946 +301:2:1813 +302:2:1820 +303:2:1821 +304:2:1828 +305:2:1833 +306:0:1946 +307:2:1844 +308:0:1946 +309:2:1849 +310:2:1856 +311:2:1857 +312:2:1864 +313:2:1869 +314:0:1946 +315:2:1880 +316:0:1946 +317:2:1882 +318:0:1946 +319:2:1883 +320:0:1946 +321:2:423 +322:0:1946 +323:2:424 +324:2:428 +325:2:429 +326:2:437 +327:2:438 +328:2:442 +329:2:443 +330:2:451 +331:2:456 +332:2:460 +333:2:461 +334:2:468 +335:2:469 +336:2:480 +337:2:481 +338:2:482 +339:2:493 +340:2:498 +341:2:499 +342:0:1946 +343:2:511 +344:0:1946 +345:2:513 +346:2:514 +347:0:1946 +348:2:518 +349:2:522 +350:2:523 +351:2:531 +352:2:532 +353:2:536 +354:2:537 +355:2:545 +356:2:550 +357:2:551 +358:2:562 +359:2:563 +360:2:574 +361:2:575 +362:2:576 +363:2:587 +364:2:592 +365:2:593 +366:0:1946 +367:2:605 +368:0:1946 +369:2:607 +370:0:1946 +371:2:608 +372:0:1946 +373:2:618 +374:0:1946 +375:2:619 +376:2:626 +377:2:627 +378:2:634 +379:2:639 +380:0:1946 +381:2:650 +382:0:1946 +383:2:651 +384:2:658 +385:2:659 +386:2:666 +387:2:671 +388:0:1946 +389:2:682 +390:0:1946 +391:2:687 +392:2:694 +393:2:695 +394:2:702 +395:2:707 +396:0:1946 +397:2:718 +398:0:1946 +399:2:720 +400:0:1946 +401:2:721 +402:2:725 +403:2:726 +404:2:734 +405:2:735 +406:2:739 +407:2:740 +408:2:748 +409:2:753 +410:2:757 +411:2:758 +412:2:765 +413:2:766 +414:2:777 +415:2:778 +416:2:779 +417:2:790 +418:2:795 +419:2:796 +420:0:1946 +421:2:808 +422:0:1946 +423:2:810 +424:0:1946 +425:2:813 +426:2:814 +427:2:826 +428:2:827 +429:2:831 +430:2:832 +431:2:840 +432:2:845 +433:2:849 +434:2:850 +435:2:857 +436:2:858 +437:2:869 +438:2:870 +439:2:871 +440:2:882 +441:2:887 +442:2:888 +443:0:1946 +444:2:900 +445:0:1946 +446:2:902 +447:0:1946 +448:2:903 +449:0:1946 +450:2:904 +451:0:1946 +452:2:905 +453:0:1946 +454:2:906 +455:2:910 +456:2:911 +457:2:919 +458:2:920 +459:2:924 +460:2:925 +461:2:933 +462:2:938 +463:2:942 +464:2:943 +465:2:950 +466:2:951 +467:2:962 +468:2:963 +469:2:964 +470:2:975 +471:2:980 +472:2:981 +473:0:1946 +474:2:993 +475:0:1946 +476:2:1097 +477:0:1946 +478:2:1195 +479:0:1946 +480:2:1196 +481:0:1946 +482:2:1200 +483:0:1946 +484:2:1206 +485:2:1210 +486:2:1211 +487:2:1219 +488:2:1220 +489:2:1224 +490:2:1225 +491:2:1233 +492:2:1238 +493:2:1242 +494:2:1243 +495:2:1250 +496:2:1251 +497:2:1262 +498:2:1263 +499:2:1264 +500:2:1275 +501:2:1280 +502:2:1281 +503:0:1946 +504:2:1293 +505:0:1946 +506:2:1295 +507:0:1946 +508:2:1296 +509:2:1300 +510:2:1301 +511:2:1309 +512:2:1310 +513:2:1314 +514:2:1315 +515:2:1323 +516:2:1328 +517:2:1332 +518:2:1333 +519:2:1340 +520:2:1341 +521:2:1352 +522:2:1353 +523:2:1354 +524:2:1365 +525:2:1370 +526:2:1371 +527:0:1946 +528:2:1383 +529:0:1946 +530:2:1385 +531:0:1946 +532:2:1388 +533:2:1389 +534:2:1401 +535:2:1402 +536:2:1406 +537:2:1407 +538:2:1415 +539:2:1420 +540:2:1424 +541:2:1425 +542:2:1432 +543:2:1433 +544:2:1444 +545:2:1445 +546:2:1446 +547:2:1457 +548:2:1462 +549:2:1463 +550:0:1946 +551:2:1475 +552:0:1946 +553:2:1477 +554:0:1946 +555:2:1478 +556:0:1946 +557:2:1479 +558:0:1946 +559:2:1480 +560:0:1946 +561:2:1481 +562:2:1485 +563:2:1486 +564:2:1494 +565:2:1495 +566:2:1499 +567:2:1500 +568:2:1508 +569:2:1513 +570:2:1517 +571:2:1518 +572:2:1525 +573:2:1526 +574:2:1537 +575:2:1538 +576:2:1539 +577:2:1550 +578:2:1555 +579:2:1556 +580:0:1946 +581:2:1568 +582:0:1946 +583:2:1672 +584:0:1946 +585:2:1770 +586:0:1946 +587:2:1771 +588:0:1946 +589:2:1775 +590:0:1946 +591:2:1781 +592:2:1788 +593:2:1789 +594:2:1796 +595:2:1801 +596:0:1946 +597:2:1812 +598:0:1946 +599:2:1813 +600:2:1820 +601:2:1821 +602:2:1828 +603:2:1833 +604:0:1946 +605:2:1844 +606:0:1946 +607:2:1849 +608:2:1856 +609:2:1857 +610:2:1864 +611:2:1869 +612:0:1946 +613:2:1880 +614:0:1946 +615:2:1882 +616:0:1946 +617:2:1883 +618:0:1946 +619:2:423 +620:0:1946 +621:2:424 +622:2:428 +623:2:429 +624:2:437 +625:2:438 +626:2:442 +627:2:443 +628:2:451 +629:2:456 +630:2:460 +631:2:461 +632:2:468 +633:2:469 +634:2:480 +635:2:481 +636:2:482 +637:2:493 +638:2:498 +639:2:499 +640:0:1946 +641:2:511 +642:0:1946 +643:2:513 +644:2:514 +645:0:1946 +646:2:518 +647:2:522 +648:2:523 +649:2:531 +650:2:532 +651:2:536 +652:2:537 +653:2:545 +654:2:550 +655:2:551 +656:2:562 +657:2:563 +658:2:574 +659:2:575 +660:2:576 +661:2:587 +662:2:592 +663:2:593 +664:0:1946 +665:2:605 +666:0:1946 +667:2:607 +668:0:1946 +669:2:608 +670:0:1946 +671:2:618 +672:0:1946 +673:2:619 +674:2:626 +675:2:627 +676:2:634 +677:2:639 +678:0:1946 +679:2:650 +680:0:1946 +681:2:651 +682:2:658 +683:2:659 +684:2:666 +685:2:671 +686:0:1946 +687:2:682 +688:0:1946 +689:2:687 +690:2:694 +691:2:695 +692:2:702 +693:2:707 +694:0:1946 +695:2:718 +696:0:1946 +697:2:720 +698:0:1946 +699:2:721 +700:2:725 +701:2:726 +702:2:734 +703:2:735 +704:2:739 +705:2:740 +706:2:748 +707:2:753 +708:2:757 +709:2:758 +710:2:765 +711:2:766 +712:2:777 +713:2:778 +714:2:779 +715:2:790 +716:2:795 +717:2:796 +718:0:1946 +719:2:808 +720:0:1946 +721:2:810 +722:0:1946 +723:2:813 +724:2:814 +725:2:826 +726:2:827 +727:2:831 +728:2:832 +729:2:840 +730:2:845 +731:2:849 +732:2:850 +733:2:857 +734:2:858 +735:2:869 +736:2:870 +737:2:871 +738:2:882 +739:2:887 +740:2:888 +741:0:1946 +742:2:900 +743:0:1946 +744:2:902 +745:0:1946 +746:2:903 +747:0:1946 +748:2:904 +749:0:1946 +750:2:905 +751:0:1946 +752:2:906 +753:2:910 +754:2:911 +755:2:919 +756:2:920 +757:2:924 +758:2:925 +759:2:933 +760:2:938 +761:2:942 +762:2:943 +763:2:950 +764:2:951 +765:2:962 +766:2:963 +767:2:964 +768:2:975 +769:2:980 +770:2:981 +771:0:1946 +772:2:993 +773:0:1946 +774:2:1097 +775:0:1946 +776:2:1195 +777:0:1946 +778:2:1196 +779:0:1946 +780:2:1200 +781:0:1946 +782:2:1206 +783:2:1210 +784:2:1211 +785:2:1219 +786:2:1220 +787:2:1224 +788:2:1225 +789:2:1233 +790:2:1238 +791:2:1242 +792:2:1243 +793:2:1250 +794:2:1251 +795:2:1262 +796:2:1263 +797:2:1264 +798:2:1275 +799:2:1280 +800:2:1281 +801:0:1946 +802:2:1293 +803:0:1946 +804:2:1295 +805:0:1946 +806:2:1296 +807:2:1300 +808:2:1301 +809:2:1309 +810:2:1310 +811:2:1314 +812:2:1315 +813:2:1323 +814:2:1328 +815:2:1332 +816:2:1333 +817:2:1340 +818:2:1341 +819:2:1352 +820:2:1353 +821:2:1354 +822:2:1365 +823:2:1370 +824:2:1371 +825:0:1946 +826:2:1383 +827:0:1946 +828:2:1385 +829:0:1946 +830:2:1388 +831:2:1389 +832:2:1401 +833:2:1402 +834:2:1406 +835:2:1407 +836:2:1415 +837:2:1420 +838:2:1424 +839:2:1425 +840:2:1432 +841:2:1433 +842:2:1444 +843:2:1445 +844:2:1446 +845:2:1457 +846:2:1462 +847:2:1463 +848:0:1946 +849:2:1475 +850:0:1946 +851:2:1477 +852:0:1946 +853:2:1478 +854:0:1946 +855:2:1479 +856:0:1946 +857:2:1480 +858:0:1946 +859:2:1481 +860:2:1485 +861:2:1486 +862:2:1494 +863:2:1495 +864:2:1499 +865:2:1500 +866:2:1508 +867:2:1513 +868:2:1517 +869:2:1518 +870:2:1525 +871:2:1526 +872:2:1537 +873:2:1538 +874:2:1539 +875:2:1550 +876:2:1555 +877:2:1556 +878:0:1946 +879:2:1568 +880:0:1946 +881:2:1672 +882:0:1946 +883:2:1770 +884:0:1946 +885:2:1771 +886:0:1946 +887:2:1775 +888:0:1946 +889:2:1781 +890:2:1788 +891:2:1789 +892:2:1796 +893:2:1801 +894:0:1946 +895:2:1812 +896:0:1946 +897:2:1813 +898:2:1820 +899:2:1821 +900:2:1828 +901:2:1833 +902:0:1946 +903:2:1844 +904:0:1946 +905:2:1849 +906:2:1856 +907:2:1857 +908:2:1864 +909:2:1869 +910:0:1946 +911:2:1880 +912:0:1946 +913:2:1882 +914:0:1946 +915:2:1883 +916:0:1946 +917:2:423 +918:0:1946 +919:2:424 +920:2:428 +921:2:429 +922:2:437 +923:2:438 +924:2:442 +925:2:443 +926:2:451 +927:2:456 +928:2:460 +929:2:461 +930:2:468 +931:2:469 +932:2:480 +933:2:481 +934:2:482 +935:2:493 +936:2:498 +937:2:499 +938:0:1946 +939:2:511 +940:0:1946 +941:2:513 +942:2:514 +943:0:1946 +944:2:518 +945:2:522 +946:2:523 +947:2:531 +948:2:532 +949:2:536 +950:2:537 +951:2:545 +952:2:550 +953:2:551 +954:2:562 +955:2:563 +956:2:574 +957:2:575 +958:2:576 +959:2:587 +960:2:592 +961:2:593 +962:0:1946 +963:2:605 +964:0:1946 +965:2:607 +966:0:1946 +967:2:608 +968:0:1946 +969:2:618 +970:0:1946 +971:2:619 +972:2:626 +973:2:627 +974:2:634 +975:2:639 +976:0:1946 +977:2:650 +978:0:1946 +979:2:651 +980:2:658 +981:2:659 +982:2:666 +983:2:671 +984:0:1946 +985:2:682 +986:0:1946 +987:2:687 +988:2:694 +989:2:695 +990:2:702 +991:2:707 +992:0:1946 +993:2:718 +994:0:1946 +995:2:720 +996:0:1946 +997:2:721 +998:2:725 +999:2:726 +1000:2:734 +1001:2:735 +1002:2:739 +1003:2:740 +1004:2:748 +1005:2:753 +1006:2:757 +1007:2:758 +1008:2:765 +1009:2:766 +1010:2:777 +1011:2:778 +1012:2:779 +1013:2:790 +1014:2:795 +1015:2:796 +1016:0:1946 +1017:2:808 +1018:0:1946 +1019:2:810 +1020:0:1946 +1021:2:813 +1022:2:814 +1023:2:826 +1024:2:827 +1025:2:831 +1026:2:832 +1027:2:840 +1028:2:845 +1029:2:849 +1030:2:850 +1031:2:857 +1032:2:858 +1033:2:869 +1034:2:870 +1035:2:871 +1036:2:882 +1037:2:887 +1038:2:888 +1039:0:1946 +1040:2:900 +1041:0:1946 +1042:2:902 +1043:0:1946 +1044:2:903 +1045:0:1946 +1046:2:904 +1047:0:1946 +1048:2:905 +1049:0:1946 +1050:2:906 +1051:2:910 +1052:2:911 +1053:2:919 +1054:2:920 +1055:2:924 +1056:2:925 +1057:2:933 +1058:2:938 +1059:2:942 +1060:2:943 +1061:2:950 +1062:2:951 +1063:2:962 +1064:2:963 +1065:2:964 +1066:2:975 +1067:2:980 +1068:2:981 +1069:0:1946 +1070:2:993 +1071:0:1946 +1072:2:1097 +1073:0:1946 +1074:2:1195 +1075:0:1946 +1076:2:1196 +1077:0:1946 +1078:2:1200 +1079:0:1946 +1080:2:1206 +1081:2:1210 +1082:2:1211 +1083:2:1219 +1084:2:1220 +1085:2:1224 +1086:2:1225 +1087:2:1233 +1088:2:1238 +1089:2:1242 +1090:2:1243 +1091:2:1250 +1092:2:1251 +1093:2:1262 +1094:2:1263 +1095:2:1264 +1096:2:1275 +1097:2:1280 +1098:2:1281 +1099:0:1946 +1100:2:1293 +1101:0:1946 +1102:2:1295 +1103:0:1946 +1104:2:1296 +1105:2:1300 +1106:2:1301 +1107:2:1309 +1108:2:1310 +1109:2:1314 +1110:2:1315 +1111:2:1323 +1112:2:1328 +1113:2:1332 +1114:2:1333 +1115:2:1340 +1116:2:1341 +1117:2:1352 +1118:2:1353 +1119:2:1354 +1120:2:1365 +1121:2:1370 +1122:2:1371 +1123:0:1946 +1124:2:1383 +1125:0:1946 +1126:2:1385 +1127:0:1946 +1128:2:1388 +1129:2:1389 +1130:2:1401 +1131:2:1402 +1132:2:1406 +1133:2:1407 +1134:2:1415 +1135:2:1420 +1136:2:1424 +1137:2:1425 +1138:2:1432 +1139:2:1433 +1140:2:1444 +1141:2:1445 +1142:2:1446 +1143:2:1457 +1144:2:1462 +1145:2:1463 +1146:0:1946 +1147:2:1475 +1148:0:1946 +1149:2:1477 +1150:0:1946 +1151:2:1478 +1152:0:1946 +1153:2:1479 +1154:0:1946 +1155:2:1480 +1156:0:1946 +1157:2:1481 +1158:2:1485 +1159:2:1486 +1160:2:1494 +1161:2:1495 +1162:2:1499 +1163:2:1500 +1164:2:1508 +1165:2:1513 +1166:2:1517 +1167:2:1518 +1168:2:1525 +1169:2:1526 +1170:2:1537 +1171:2:1538 +1172:2:1539 +1173:2:1550 +1174:2:1555 +1175:2:1556 +1176:0:1946 +1177:2:1568 +1178:0:1946 +1179:2:1672 +1180:0:1946 +1181:2:1770 +1182:0:1946 +1183:2:1771 +1184:0:1946 +1185:2:1775 +1186:0:1946 +1187:2:1781 +1188:2:1788 +1189:2:1789 +1190:2:1796 +1191:2:1801 +1192:0:1946 +1193:2:1812 +1194:0:1946 +1195:2:1813 +1196:2:1820 +1197:2:1821 +1198:2:1828 +1199:2:1833 +1200:0:1946 +1201:2:1844 +1202:0:1946 +1203:2:1849 +1204:2:1856 +1205:2:1857 +1206:2:1864 +1207:2:1869 +1208:0:1946 +1209:2:1880 +1210:0:1946 +1211:2:1882 +1212:0:1946 +1213:2:1883 +1214:0:1946 +1215:2:423 +1216:0:1946 +1217:2:424 +1218:2:428 +1219:2:429 +1220:2:437 +1221:2:438 +1222:2:442 +1223:2:443 +1224:2:451 +1225:2:456 +1226:2:460 +1227:2:461 +1228:2:468 +1229:2:469 +1230:2:480 +1231:2:481 +1232:2:482 +1233:2:493 +1234:2:498 +1235:2:499 +1236:0:1946 +1237:2:511 +1238:0:1946 +1239:2:513 +1240:2:514 +1241:0:1946 +1242:2:518 +1243:2:522 +1244:2:523 +1245:2:531 +1246:2:532 +1247:2:536 +1248:2:537 +1249:2:545 +1250:2:550 +1251:2:551 +1252:2:562 +1253:2:563 +1254:2:574 +1255:2:575 +1256:2:576 +1257:2:587 +1258:2:592 +1259:2:593 +1260:0:1946 +1261:2:605 +1262:0:1946 +1263:2:607 +1264:0:1946 +1265:2:608 +1266:0:1946 +1267:2:618 +1268:0:1946 +1269:2:619 +1270:2:626 +1271:2:627 +1272:2:634 +1273:2:639 +1274:0:1946 +1275:2:650 +1276:0:1946 +1277:1:2 +1278:0:1946 +1279:1:8 +1280:0:1946 +1281:1:9 +1282:0:1946 +1283:1:10 +1284:0:1946 +1285:1:11 +1286:0:1946 +1287:1:12 +1288:1:16 +1289:1:17 +1290:1:25 +1291:1:26 +1292:1:30 +1293:1:31 +1294:1:39 +1295:1:44 +1296:1:48 +1297:1:49 +1298:1:56 +1299:1:57 +1300:1:68 +1301:1:69 +1302:1:70 +1303:1:81 +1304:1:93 +1305:1:94 +1306:0:1946 +1307:1:99 +1308:0:1946 +1309:1:101 +1310:0:1946 +1311:1:102 +1312:1:106 +1313:1:107 +1314:1:115 +1315:1:116 +1316:1:120 +1317:1:121 +1318:1:129 +1319:1:134 +1320:1:138 +1321:1:139 +1322:1:146 +1323:1:147 +1324:1:158 +1325:1:159 +1326:1:160 +1327:1:171 +1328:1:183 +1329:1:184 +1330:0:1946 +1331:1:189 +1332:0:1946 +1333:1:191 +1334:0:1946 +1335:1:192 +1336:0:1946 +1337:1:193 +1338:1:197 +1339:1:198 +1340:1:206 +1341:1:207 +1342:1:211 +1343:1:212 +1344:1:220 +1345:1:225 +1346:1:229 +1347:1:230 +1348:1:237 +1349:1:238 +1350:1:249 +1351:1:250 +1352:1:251 +1353:1:262 +1354:1:274 +1355:1:275 +1356:0:1946 +1357:1:280 +1358:0:1946 +1359:1:282 +1360:0:1946 +1361:1:291 +1362:0:1946 +1363:1:293 +1364:0:1946 +1365:1:296 +1366:0:1946 +1367:1:301 +1368:0:1946 +1369:2:651 +1370:2:658 +1371:2:661 +1372:2:662 +1373:2:666 +1374:2:671 +1375:0:1946 +1376:2:682 +1377:0:1946 +1378:2:687 +1379:2:694 +1380:2:695 +1381:2:702 +1382:2:707 +1383:0:1946 +1384:2:718 +1385:0:1946 +1386:2:720 +1387:0:1946 +1388:2:721 +1389:2:725 +1390:2:726 +1391:2:734 +1392:2:735 +1393:2:739 +1394:2:740 +1395:2:748 +1396:2:753 +1397:2:757 +1398:2:758 +1399:2:765 +1400:2:766 +1401:2:777 +1402:2:778 +1403:2:779 +1404:2:790 +1405:2:795 +1406:2:796 +1407:0:1946 +1408:2:808 +1409:0:1946 +1410:2:810 +1411:0:1946 +1412:2:813 +1413:2:814 +1414:2:826 +1415:2:827 +1416:2:831 +1417:2:832 +1418:2:840 +1419:2:845 +1420:2:849 +1421:2:850 +1422:2:857 +1423:2:858 +1424:2:869 +1425:2:870 +1426:2:871 +1427:2:882 +1428:2:887 +1429:2:888 +1430:0:1946 +1431:2:900 +1432:0:1946 +1433:2:902 +1434:0:1946 +1435:2:903 +1436:0:1946 +1437:2:904 +1438:0:1946 +1439:2:905 +1440:0:1946 +1441:2:906 +1442:2:910 +1443:2:911 +1444:2:919 +1445:2:920 +1446:2:924 +1447:2:925 +1448:2:933 +1449:2:938 +1450:2:942 +1451:2:943 +1452:2:950 +1453:2:951 +1454:2:962 +1455:2:963 +1456:2:964 +1457:2:975 +1458:2:980 +1459:2:981 +1460:0:1946 +1461:2:993 +1462:0:1946 +1463:2:1097 +1464:0:1946 +1465:2:1195 +1466:0:1946 +1467:2:1196 +1468:0:1946 +1469:2:1200 +1470:0:1946 +1471:2:1206 +1472:2:1210 +1473:2:1211 +1474:2:1219 +1475:2:1220 +1476:2:1224 +1477:2:1225 +1478:2:1233 +1479:2:1238 +1480:2:1242 +1481:2:1243 +1482:2:1250 +1483:2:1251 +1484:2:1262 +1485:2:1263 +1486:2:1264 +1487:2:1275 +1488:2:1280 +1489:2:1281 +1490:0:1946 +1491:2:1293 +1492:0:1946 +1493:2:1295 +1494:0:1946 +1495:2:1296 +1496:2:1300 +1497:2:1301 +1498:2:1309 +1499:2:1310 +1500:2:1314 +1501:2:1315 +1502:2:1323 +1503:2:1328 +1504:2:1332 +1505:2:1333 +1506:2:1340 +1507:2:1341 +1508:2:1352 +1509:2:1353 +1510:2:1354 +1511:2:1365 +1512:2:1370 +1513:2:1371 +1514:0:1946 +1515:2:1383 +1516:0:1946 +1517:2:1385 +1518:0:1946 +1519:2:1388 +1520:2:1389 +1521:2:1401 +1522:2:1402 +1523:2:1406 +1524:2:1407 +1525:2:1415 +1526:2:1420 +1527:2:1424 +1528:2:1425 +1529:2:1432 +1530:2:1433 +1531:2:1444 +1532:2:1445 +1533:2:1446 +1534:2:1457 +1535:2:1462 +1536:2:1463 +1537:0:1946 +1538:2:1475 +1539:0:1946 +1540:2:1477 +1541:0:1946 +1542:2:1478 +1543:0:1946 +1544:2:1479 +1545:0:1946 +1546:2:1480 +1547:0:1946 +1548:2:1481 +1549:2:1485 +1550:2:1486 +1551:2:1494 +1552:2:1495 +1553:2:1499 +1554:2:1500 +1555:2:1508 +1556:2:1513 +1557:2:1517 +1558:2:1518 +1559:2:1525 +1560:2:1526 +1561:2:1537 +1562:2:1538 +1563:2:1539 +1564:2:1550 +1565:2:1555 +1566:2:1556 +1567:0:1946 +1568:2:1568 +1569:0:1946 +1570:2:1672 +1571:0:1946 +1572:2:1770 +1573:0:1946 +1574:2:1771 +1575:0:1946 +1576:2:1775 +1577:0:1946 +1578:2:1781 +1579:2:1788 +1580:2:1789 +1581:2:1796 +1582:2:1801 +1583:0:1946 +1584:2:1812 +1585:0:1946 +1586:2:1813 +1587:2:1820 +1588:2:1823 +1589:2:1824 +1590:2:1828 +1591:2:1833 +1592:0:1946 +1593:2:1844 +1594:0:1946 +1595:2:1849 +1596:2:1856 +1597:2:1857 +1598:2:1864 +1599:2:1869 +1600:0:1946 +1601:2:1880 +1602:0:1946 +1603:2:1882 +1604:0:1946 +1605:2:1883 +1606:0:1946 +1607:2:1886 +1608:0:1946 +1609:2:1891 +1610:0:1946 +1611:1:302 +1612:0:1944 +1613:2:1892 +1614:0:1950 +1615:1:244 diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.define b/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.define new file mode 100644 index 0000000..5e642ef --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.define @@ -0,0 +1 @@ +#define SINGLE_FLIP diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.log b/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.log new file mode 100644 index 0000000..16843a5 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.log @@ -0,0 +1,197 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define >> pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_free_single_flip.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 744) +pan: claim violated! (at depth 1316) +pan: wrote .input.spin.trail + +(Spin Version 5.1.7 -- 23 December 2008) +Warning: Search not completed + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness disabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 2045, errors: 1 + 52434 states, stored + 479392 states, matched + 531826 transitions (= stored+matched) + 1926196 atomic steps +hash conflicts: 6594 (resolved) + +Stats on memory usage (in Megabytes): + 4.200 equivalent memory usage for states (stored*(State-vector + overhead)) + 3.608 actual memory usage for states (compression: 85.89%) + state-vector as stored = 44 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 469.279 total actual memory usage + +unreached in proctype urcu_reader + line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 61, "(1)" + line 418, "pan.___", state 91, "(1)" + line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 151, "(1)" + line 418, "pan.___", state 181, "(1)" + line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 242, "(1)" + line 418, "pan.___", state 272, "(1)" + line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 360, "(1)" + line 418, "pan.___", state 390, "(1)" + line 540, "pan.___", state 414, "-end-" + (17 of 414 states) +unreached in proctype urcu_writer + line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 59, "(1)" + line 413, "pan.___", state 72, "(1)" + line 418, "pan.___", state 89, "(1)" + line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 153, "(1)" + line 413, "pan.___", state 166, "(1)" + line 652, "pan.___", state 199, "(1)" + line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 160, "pan.___", state 240, "(1)" + line 164, "pan.___", state 248, "(1)" + line 168, "pan.___", state 260, "(1)" + line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 927, "(1)" + line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 928, "else" + line 409, "pan.___", state 931, "(1)" + line 409, "pan.___", state 932, "(1)" + line 409, "pan.___", state 932, "(1)" + line 413, "pan.___", state 940, "(1)" + line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 941, "else" + line 413, "pan.___", state 944, "(1)" + line 413, "pan.___", state 945, "(1)" + line 413, "pan.___", state 945, "(1)" + line 411, "pan.___", state 950, "((i<1))" + line 411, "pan.___", state 950, "((i>=1))" + line 418, "pan.___", state 957, "(1)" + line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 958, "else" + line 418, "pan.___", state 961, "(1)" + line 418, "pan.___", state 962, "(1)" + line 418, "pan.___", state 962, "(1)" + line 420, "pan.___", state 965, "(1)" + line 420, "pan.___", state 965, "(1)" + line 179, "pan.___", state 990, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 183, "pan.___", state 1003, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 160, "pan.___", state 1013, "(1)" + line 164, "pan.___", state 1021, "(1)" + line 168, "pan.___", state 1033, "(1)" + line 175, "pan.___", state 1044, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=2))" + line 710, "pan.___", state 20, "((j<2))" + line 710, "pan.___", state 20, "((j>=2))" + line 715, "pan.___", state 33, "((j<2))" + line 715, "pan.___", state 33, "((j>=2))" + (3 of 46 states) +unreached in proctype :never: + line 749, "pan.___", state 8, "-end-" + (1 of 8 states) + +pan: elapsed time 0.43 seconds +pan: rate 121939.53 states/second +pan: avg transition delay 8.0854e-07 usec +cp .input.spin urcu_free_single_flip.spin.input +cp .input.spin.trail urcu_free_single_flip.spin.input.trail +make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.spin.input b/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.spin.input new file mode 100644 index 0000000..bb95a2d --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.spin.input @@ -0,0 +1,723 @@ +#define SINGLE_FLIP + +#define read_free_race (read_generation[0] == last_free_gen) +#define read_free (free_done && data_access[0]) + +//#define TEST_SIGNAL +//#define TEST_SIGNAL_ON_READ +//#define TEST_SIGNAL_ON_WRITE + +#define RCU_GP_CTR_BIT (1 << 7) +#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) + +#ifndef READER_NEST_LEVEL +#define READER_NEST_LEVEL 1 +//#define READER_NEST_LEVEL 2 +#endif + +#define REMOTE_BARRIERS +/* + * mem.spin: Promela code to validate memory barriers with OOO memory. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (c) 2009 Mathieu Desnoyers + */ + +/* Promela validation variables. */ + +/* specific defines "included" here */ +/* DEFINES file "included" here */ + +/* All signal readers have same PID and uses same reader variable */ +#ifdef TEST_SIGNAL_ON_WRITE + +#define NR_READERS 1 /* the writer is also a signal reader */ +#define NR_WRITERS 1 + +#define NR_PROCS 1 + +#define get_pid() (0) + +#elif defined(TEST_SIGNAL_ON_READ) + +#define get_pid() ((_pid < 2) -> 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.spin.input.trail b/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.spin.input.trail new file mode 100644 index 0000000..a3f64a1 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.spin.input.trail @@ -0,0 +1,1319 @@ +-2:3:-2 +-4:-4:-4 +1:0:1650 +2:3:1602 +3:3:1605 +4:3:1605 +5:3:1608 +6:3:1616 +7:3:1616 +8:3:1619 +9:3:1625 +10:3:1629 +11:3:1629 +12:3:1632 +13:3:1640 +14:3:1644 +15:3:1645 +16:0:1650 +17:3:1647 +18:0:1650 +19:2:416 +20:0:1650 +21:2:422 +22:0:1650 +23:2:423 +24:0:1650 +25:2:424 +26:2:428 +27:2:429 +28:2:437 +29:2:438 +30:2:442 +31:2:443 +32:2:451 +33:2:456 +34:2:460 +35:2:461 +36:2:468 +37:2:469 +38:2:480 +39:2:481 +40:2:482 +41:2:493 +42:2:498 +43:2:499 +44:0:1650 +45:2:511 +46:0:1650 +47:2:513 +48:2:514 +49:0:1650 +50:2:518 +51:2:522 +52:2:523 +53:2:531 +54:2:532 +55:2:536 +56:2:537 +57:2:545 +58:2:550 +59:2:551 +60:2:562 +61:2:563 +62:2:574 +63:2:575 +64:2:576 +65:2:587 +66:2:592 +67:2:593 +68:0:1650 +69:2:605 +70:0:1650 +71:2:607 +72:0:1650 +73:2:608 +74:0:1650 +75:2:618 +76:0:1650 +77:2:622 +78:2:623 +79:2:627 +80:2:631 +81:2:632 +82:2:636 +83:2:644 +84:2:645 +85:2:650 +86:2:657 +87:2:658 +88:2:665 +89:2:670 +90:0:1650 +91:2:681 +92:0:1650 +93:2:685 +94:2:686 +95:2:690 +96:2:694 +97:2:695 +98:2:699 +99:2:707 +100:2:708 +101:2:713 +102:2:720 +103:2:721 +104:2:728 +105:2:733 +106:0:1650 +107:2:744 +108:0:1650 +109:2:752 +110:2:753 +111:2:757 +112:2:761 +113:2:762 +114:2:766 +115:2:774 +116:2:775 +117:2:780 +118:2:787 +119:2:788 +120:2:795 +121:2:800 +122:0:1650 +123:2:811 +124:0:1650 +125:2:813 +126:0:1650 +127:2:814 +128:2:818 +129:2:819 +130:2:827 +131:2:828 +132:2:832 +133:2:833 +134:2:841 +135:2:846 +136:2:850 +137:2:851 +138:2:858 +139:2:859 +140:2:870 +141:2:871 +142:2:872 +143:2:883 +144:2:888 +145:2:889 +146:0:1650 +147:2:901 +148:0:1650 +149:2:903 +150:0:1650 +151:2:906 +152:2:907 +153:2:919 +154:2:920 +155:2:924 +156:2:925 +157:2:933 +158:2:938 +159:2:942 +160:2:943 +161:2:950 +162:2:951 +163:2:962 +164:2:963 +165:2:964 +166:2:975 +167:2:980 +168:2:981 +169:0:1650 +170:2:993 +171:0:1650 +172:2:995 +173:0:1650 +174:2:996 +175:0:1650 +176:2:997 +177:0:1650 +178:2:998 +179:0:1650 +180:2:999 +181:2:1003 +182:2:1004 +183:2:1012 +184:2:1013 +185:2:1017 +186:2:1018 +187:2:1026 +188:2:1031 +189:2:1035 +190:2:1036 +191:2:1043 +192:2:1044 +193:2:1055 +194:2:1056 +195:2:1057 +196:2:1068 +197:2:1073 +198:2:1074 +199:0:1650 +200:2:1086 +201:0:1650 +202:2:1283 +203:0:1650 +204:2:1381 +205:0:1650 +206:2:1382 +207:0:1650 +208:2:1386 +209:0:1650 +210:2:1395 +211:2:1396 +212:2:1400 +213:2:1404 +214:2:1405 +215:2:1409 +216:2:1417 +217:2:1418 +218:2:1423 +219:2:1430 +220:2:1431 +221:2:1438 +222:2:1443 +223:0:1650 +224:2:1454 +225:0:1650 +226:2:1458 +227:2:1459 +228:2:1463 +229:2:1467 +230:2:1468 +231:2:1472 +232:2:1480 +233:2:1481 +234:2:1486 +235:2:1493 +236:2:1494 +237:2:1501 +238:2:1506 +239:0:1650 +240:2:1517 +241:0:1650 +242:2:1525 +243:2:1526 +244:2:1530 +245:2:1534 +246:2:1535 +247:2:1539 +248:2:1547 +249:2:1548 +250:2:1553 +251:2:1560 +252:2:1561 +253:2:1568 +254:2:1573 +255:0:1650 +256:2:1584 +257:0:1650 +258:2:1586 +259:0:1650 +260:2:1587 +261:0:1650 +262:2:423 +263:0:1650 +264:2:424 +265:2:428 +266:2:429 +267:2:437 +268:2:438 +269:2:442 +270:2:443 +271:2:451 +272:2:456 +273:2:460 +274:2:461 +275:2:468 +276:2:469 +277:2:480 +278:2:481 +279:2:482 +280:2:493 +281:2:498 +282:2:499 +283:0:1650 +284:2:511 +285:0:1650 +286:2:513 +287:2:514 +288:0:1650 +289:2:518 +290:2:522 +291:2:523 +292:2:531 +293:2:532 +294:2:536 +295:2:537 +296:2:545 +297:2:550 +298:2:551 +299:2:562 +300:2:563 +301:2:574 +302:2:575 +303:2:576 +304:2:587 +305:2:592 +306:2:593 +307:0:1650 +308:2:605 +309:0:1650 +310:2:607 +311:0:1650 +312:2:608 +313:0:1650 +314:2:618 +315:0:1650 +316:2:622 +317:2:623 +318:2:627 +319:2:631 +320:2:632 +321:2:636 +322:2:644 +323:2:645 +324:2:650 +325:2:657 +326:2:658 +327:2:665 +328:2:670 +329:0:1650 +330:2:681 +331:0:1650 +332:2:685 +333:2:686 +334:2:690 +335:2:694 +336:2:695 +337:2:699 +338:2:707 +339:2:708 +340:2:713 +341:2:720 +342:2:721 +343:2:728 +344:2:733 +345:0:1650 +346:2:744 +347:0:1650 +348:2:752 +349:2:753 +350:2:757 +351:2:761 +352:2:762 +353:2:766 +354:2:774 +355:2:775 +356:2:780 +357:2:787 +358:2:788 +359:2:795 +360:2:800 +361:0:1650 +362:2:811 +363:0:1650 +364:2:813 +365:0:1650 +366:2:814 +367:2:818 +368:2:819 +369:2:827 +370:2:828 +371:2:832 +372:2:833 +373:2:841 +374:2:846 +375:2:850 +376:2:851 +377:2:858 +378:2:859 +379:2:870 +380:2:871 +381:2:872 +382:2:883 +383:2:888 +384:2:889 +385:0:1650 +386:2:901 +387:0:1650 +388:2:903 +389:0:1650 +390:2:906 +391:2:907 +392:2:919 +393:2:920 +394:2:924 +395:2:925 +396:2:933 +397:2:938 +398:2:942 +399:2:943 +400:2:950 +401:2:951 +402:2:962 +403:2:963 +404:2:964 +405:2:975 +406:2:980 +407:2:981 +408:0:1650 +409:2:993 +410:0:1650 +411:2:995 +412:0:1650 +413:2:996 +414:0:1650 +415:2:997 +416:0:1650 +417:2:998 +418:0:1650 +419:2:999 +420:2:1003 +421:2:1004 +422:2:1012 +423:2:1013 +424:2:1017 +425:2:1018 +426:2:1026 +427:2:1031 +428:2:1035 +429:2:1036 +430:2:1043 +431:2:1044 +432:2:1055 +433:2:1056 +434:2:1057 +435:2:1068 +436:2:1073 +437:2:1074 +438:0:1650 +439:2:1086 +440:0:1650 +441:2:1283 +442:0:1650 +443:2:1381 +444:0:1650 +445:2:1382 +446:0:1650 +447:2:1386 +448:0:1650 +449:2:1395 +450:2:1396 +451:2:1400 +452:2:1404 +453:2:1405 +454:2:1409 +455:2:1417 +456:2:1418 +457:2:1423 +458:2:1430 +459:2:1431 +460:2:1438 +461:2:1443 +462:0:1650 +463:2:1454 +464:0:1650 +465:2:1458 +466:2:1459 +467:2:1463 +468:2:1467 +469:2:1468 +470:2:1472 +471:2:1480 +472:2:1481 +473:2:1486 +474:2:1493 +475:2:1494 +476:2:1501 +477:2:1506 +478:0:1650 +479:2:1517 +480:0:1650 +481:2:1525 +482:2:1526 +483:2:1530 +484:2:1534 +485:2:1535 +486:2:1539 +487:2:1547 +488:2:1548 +489:2:1553 +490:2:1560 +491:2:1561 +492:2:1568 +493:2:1573 +494:0:1650 +495:2:1584 +496:0:1650 +497:2:1586 +498:0:1650 +499:2:1587 +500:0:1650 +501:2:423 +502:0:1650 +503:2:424 +504:2:428 +505:2:429 +506:2:437 +507:2:438 +508:2:442 +509:2:443 +510:2:451 +511:2:456 +512:2:460 +513:2:461 +514:2:468 +515:2:469 +516:2:480 +517:2:481 +518:2:482 +519:2:493 +520:2:498 +521:2:499 +522:0:1650 +523:2:511 +524:0:1650 +525:2:513 +526:2:514 +527:0:1650 +528:2:518 +529:2:522 +530:2:523 +531:2:531 +532:2:532 +533:2:536 +534:2:537 +535:2:545 +536:2:550 +537:2:551 +538:2:562 +539:2:563 +540:2:574 +541:2:575 +542:2:576 +543:2:587 +544:2:592 +545:2:593 +546:0:1650 +547:2:605 +548:0:1650 +549:2:607 +550:0:1650 +551:2:608 +552:0:1650 +553:2:618 +554:0:1650 +555:2:622 +556:2:623 +557:2:627 +558:2:631 +559:2:632 +560:2:636 +561:2:644 +562:2:645 +563:2:650 +564:2:657 +565:2:658 +566:2:665 +567:2:670 +568:0:1650 +569:2:681 +570:0:1650 +571:2:685 +572:2:686 +573:2:690 +574:2:694 +575:2:695 +576:2:699 +577:2:707 +578:2:708 +579:2:713 +580:2:720 +581:2:721 +582:2:728 +583:2:733 +584:0:1650 +585:2:744 +586:0:1650 +587:2:752 +588:2:753 +589:2:757 +590:2:761 +591:2:762 +592:2:766 +593:2:774 +594:2:775 +595:2:780 +596:2:787 +597:2:788 +598:2:795 +599:2:800 +600:0:1650 +601:2:811 +602:0:1650 +603:2:813 +604:0:1650 +605:2:814 +606:2:818 +607:2:819 +608:2:827 +609:2:828 +610:2:832 +611:2:833 +612:2:841 +613:2:846 +614:2:850 +615:2:851 +616:2:858 +617:2:859 +618:2:870 +619:2:871 +620:2:872 +621:2:883 +622:2:888 +623:2:889 +624:0:1650 +625:2:901 +626:0:1650 +627:2:903 +628:0:1650 +629:2:906 +630:2:907 +631:2:919 +632:2:920 +633:2:924 +634:2:925 +635:2:933 +636:2:938 +637:2:942 +638:2:943 +639:2:950 +640:2:951 +641:2:962 +642:2:963 +643:2:964 +644:2:975 +645:2:980 +646:2:981 +647:0:1650 +648:2:993 +649:0:1650 +650:2:995 +651:0:1650 +652:2:996 +653:0:1650 +654:2:997 +655:0:1650 +656:2:998 +657:0:1650 +658:2:999 +659:2:1003 +660:2:1004 +661:2:1012 +662:2:1013 +663:2:1017 +664:2:1018 +665:2:1026 +666:2:1031 +667:2:1035 +668:2:1036 +669:2:1043 +670:2:1044 +671:2:1055 +672:2:1056 +673:2:1057 +674:2:1068 +675:2:1073 +676:2:1074 +677:0:1650 +678:2:1086 +679:0:1650 +680:2:1283 +681:0:1650 +682:2:1381 +683:0:1650 +684:2:1382 +685:0:1650 +686:2:1386 +687:0:1650 +688:2:1395 +689:2:1396 +690:2:1400 +691:2:1404 +692:2:1405 +693:2:1409 +694:2:1417 +695:2:1418 +696:2:1423 +697:2:1430 +698:2:1431 +699:2:1438 +700:2:1443 +701:0:1650 +702:2:1454 +703:0:1650 +704:2:1458 +705:2:1459 +706:2:1463 +707:2:1467 +708:2:1468 +709:2:1472 +710:2:1480 +711:2:1481 +712:2:1486 +713:2:1493 +714:2:1494 +715:2:1501 +716:2:1506 +717:0:1650 +718:2:1517 +719:0:1650 +720:2:1525 +721:2:1526 +722:2:1530 +723:2:1534 +724:2:1535 +725:2:1539 +726:2:1547 +727:2:1548 +728:2:1553 +729:2:1560 +730:2:1561 +731:2:1568 +732:2:1573 +733:0:1650 +734:2:1584 +735:0:1650 +736:2:1586 +737:0:1650 +738:2:1587 +739:0:1650 +740:2:423 +741:0:1650 +742:2:424 +743:2:428 +744:2:429 +745:2:437 +746:2:438 +747:2:442 +748:2:443 +749:2:451 +750:2:456 +751:2:460 +752:2:461 +753:2:468 +754:2:469 +755:2:480 +756:2:481 +757:2:482 +758:2:493 +759:2:498 +760:2:499 +761:0:1650 +762:2:511 +763:0:1650 +764:2:513 +765:2:514 +766:0:1650 +767:2:518 +768:2:522 +769:2:523 +770:2:531 +771:2:532 +772:2:536 +773:2:537 +774:2:545 +775:2:550 +776:2:551 +777:2:562 +778:2:563 +779:2:574 +780:2:575 +781:2:576 +782:2:587 +783:2:592 +784:2:593 +785:0:1650 +786:2:605 +787:0:1650 +788:2:607 +789:0:1650 +790:2:608 +791:0:1650 +792:2:618 +793:0:1650 +794:2:622 +795:2:623 +796:2:627 +797:2:631 +798:2:632 +799:2:636 +800:2:644 +801:2:645 +802:2:650 +803:2:657 +804:2:658 +805:2:665 +806:2:670 +807:0:1650 +808:2:681 +809:0:1650 +810:2:685 +811:2:686 +812:2:690 +813:2:694 +814:2:695 +815:2:699 +816:2:707 +817:2:708 +818:2:713 +819:2:720 +820:2:721 +821:2:728 +822:2:733 +823:0:1650 +824:2:744 +825:0:1650 +826:2:752 +827:2:753 +828:2:757 +829:2:761 +830:2:762 +831:2:766 +832:2:774 +833:2:775 +834:2:780 +835:2:787 +836:2:788 +837:2:795 +838:2:800 +839:0:1650 +840:2:811 +841:0:1650 +842:2:813 +843:0:1650 +844:2:814 +845:2:818 +846:2:819 +847:2:827 +848:2:828 +849:2:832 +850:2:833 +851:2:841 +852:2:846 +853:2:850 +854:2:851 +855:2:858 +856:2:859 +857:2:870 +858:2:871 +859:2:872 +860:2:883 +861:2:888 +862:2:889 +863:0:1650 +864:2:901 +865:0:1650 +866:2:903 +867:0:1650 +868:2:906 +869:2:907 +870:2:919 +871:2:920 +872:2:924 +873:2:925 +874:2:933 +875:2:938 +876:2:942 +877:2:943 +878:2:950 +879:2:951 +880:2:962 +881:2:963 +882:2:964 +883:2:975 +884:2:980 +885:2:981 +886:0:1650 +887:2:993 +888:0:1650 +889:2:995 +890:0:1650 +891:2:996 +892:0:1650 +893:2:997 +894:0:1650 +895:2:998 +896:0:1650 +897:2:999 +898:2:1003 +899:2:1004 +900:2:1012 +901:2:1013 +902:2:1017 +903:2:1018 +904:2:1026 +905:2:1031 +906:2:1035 +907:2:1036 +908:2:1043 +909:2:1044 +910:2:1055 +911:2:1056 +912:2:1057 +913:2:1068 +914:2:1073 +915:2:1074 +916:0:1650 +917:2:1086 +918:0:1650 +919:2:1283 +920:0:1650 +921:2:1381 +922:0:1650 +923:2:1382 +924:0:1650 +925:2:1386 +926:0:1650 +927:2:1395 +928:2:1396 +929:2:1400 +930:2:1404 +931:2:1405 +932:2:1409 +933:2:1417 +934:2:1418 +935:2:1423 +936:2:1430 +937:2:1431 +938:2:1438 +939:2:1443 +940:0:1650 +941:2:1454 +942:0:1650 +943:1:2 +944:0:1650 +945:1:8 +946:0:1650 +947:1:9 +948:0:1650 +949:1:10 +950:0:1650 +951:1:11 +952:0:1650 +953:1:12 +954:1:16 +955:1:17 +956:1:25 +957:1:26 +958:1:30 +959:1:31 +960:1:39 +961:1:44 +962:1:48 +963:1:49 +964:1:63 +965:1:64 +966:1:68 +967:1:69 +968:1:70 +969:1:81 +970:1:86 +971:1:87 +972:0:1650 +973:1:99 +974:0:1650 +975:1:101 +976:0:1650 +977:1:102 +978:1:106 +979:1:107 +980:1:115 +981:1:116 +982:1:120 +983:1:121 +984:1:129 +985:1:134 +986:1:138 +987:1:139 +988:1:153 +989:1:154 +990:1:158 +991:1:159 +992:1:160 +993:1:171 +994:1:176 +995:1:177 +996:0:1650 +997:1:189 +998:0:1650 +999:1:191 +1000:0:1650 +1001:1:192 +1002:0:1650 +1003:2:1458 +1004:2:1459 +1005:2:1463 +1006:2:1467 +1007:2:1468 +1008:2:1472 +1009:2:1480 +1010:2:1481 +1011:2:1486 +1012:2:1493 +1013:2:1494 +1014:2:1501 +1015:2:1506 +1016:0:1650 +1017:2:1517 +1018:0:1650 +1019:2:1525 +1020:2:1526 +1021:2:1530 +1022:2:1534 +1023:2:1535 +1024:2:1539 +1025:2:1547 +1026:2:1548 +1027:2:1553 +1028:2:1560 +1029:2:1561 +1030:2:1568 +1031:2:1573 +1032:0:1650 +1033:2:1584 +1034:0:1650 +1035:2:1586 +1036:0:1650 +1037:2:1587 +1038:0:1650 +1039:2:423 +1040:0:1650 +1041:2:424 +1042:2:428 +1043:2:429 +1044:2:437 +1045:2:438 +1046:2:442 +1047:2:443 +1048:2:451 +1049:2:456 +1050:2:460 +1051:2:461 +1052:2:468 +1053:2:469 +1054:2:480 +1055:2:481 +1056:2:482 +1057:2:493 +1058:2:498 +1059:2:499 +1060:0:1650 +1061:2:511 +1062:0:1650 +1063:2:513 +1064:2:514 +1065:0:1650 +1066:2:518 +1067:2:522 +1068:2:523 +1069:2:531 +1070:2:532 +1071:2:536 +1072:2:537 +1073:2:545 +1074:2:550 +1075:2:551 +1076:2:562 +1077:2:563 +1078:2:574 +1079:2:575 +1080:2:576 +1081:2:587 +1082:2:592 +1083:2:593 +1084:0:1650 +1085:2:605 +1086:0:1650 +1087:2:607 +1088:0:1650 +1089:2:608 +1090:0:1650 +1091:2:618 +1092:0:1650 +1093:2:622 +1094:2:623 +1095:2:627 +1096:2:631 +1097:2:632 +1098:2:636 +1099:2:644 +1100:2:645 +1101:2:650 +1102:2:657 +1103:2:658 +1104:2:665 +1105:2:670 +1106:0:1650 +1107:2:681 +1108:0:1650 +1109:1:193 +1110:1:197 +1111:1:198 +1112:1:206 +1113:1:207 +1114:1:211 +1115:1:212 +1116:1:220 +1117:1:225 +1118:1:229 +1119:1:230 +1120:1:237 +1121:1:238 +1122:1:249 +1123:1:250 +1124:1:251 +1125:1:262 +1126:1:274 +1127:1:275 +1128:0:1650 +1129:1:280 +1130:0:1650 +1131:1:282 +1132:0:1650 +1133:1:291 +1134:0:1650 +1135:1:293 +1136:0:1650 +1137:1:296 +1138:0:1650 +1139:1:301 +1140:0:1650 +1141:2:685 +1142:2:686 +1143:2:690 +1144:2:691 +1145:2:699 +1146:2:707 +1147:2:708 +1148:2:713 +1149:2:720 +1150:2:721 +1151:2:728 +1152:2:733 +1153:0:1650 +1154:2:744 +1155:0:1650 +1156:2:752 +1157:2:753 +1158:2:757 +1159:2:761 +1160:2:762 +1161:2:766 +1162:2:774 +1163:2:775 +1164:2:780 +1165:2:787 +1166:2:788 +1167:2:795 +1168:2:800 +1169:0:1650 +1170:2:811 +1171:0:1650 +1172:2:813 +1173:0:1650 +1174:2:814 +1175:2:818 +1176:2:819 +1177:2:827 +1178:2:828 +1179:2:832 +1180:2:833 +1181:2:841 +1182:2:846 +1183:2:850 +1184:2:851 +1185:2:858 +1186:2:859 +1187:2:870 +1188:2:871 +1189:2:872 +1190:2:883 +1191:2:888 +1192:2:889 +1193:0:1650 +1194:2:901 +1195:0:1650 +1196:2:903 +1197:0:1650 +1198:2:906 +1199:2:907 +1200:2:919 +1201:2:920 +1202:2:924 +1203:2:925 +1204:2:933 +1205:2:938 +1206:2:942 +1207:2:943 +1208:2:950 +1209:2:951 +1210:2:962 +1211:2:963 +1212:2:964 +1213:2:975 +1214:2:980 +1215:2:981 +1216:0:1650 +1217:2:993 +1218:0:1650 +1219:2:995 +1220:0:1650 +1221:2:996 +1222:0:1650 +1223:2:997 +1224:0:1650 +1225:2:998 +1226:0:1650 +1227:2:999 +1228:2:1003 +1229:2:1004 +1230:2:1012 +1231:2:1013 +1232:2:1017 +1233:2:1018 +1234:2:1026 +1235:2:1031 +1236:2:1035 +1237:2:1036 +1238:2:1043 +1239:2:1044 +1240:2:1055 +1241:2:1056 +1242:2:1057 +1243:2:1068 +1244:2:1073 +1245:2:1074 +1246:0:1650 +1247:2:1086 +1248:0:1650 +1249:2:1283 +1250:0:1650 +1251:2:1381 +1252:0:1650 +1253:2:1382 +1254:0:1650 +1255:2:1386 +1256:0:1650 +1257:2:1395 +1258:2:1396 +1259:2:1400 +1260:2:1404 +1261:2:1405 +1262:2:1409 +1263:2:1417 +1264:2:1418 +1265:2:1423 +1266:2:1430 +1267:2:1431 +1268:2:1438 +1269:2:1443 +1270:0:1650 +1271:2:1454 +1272:0:1650 +1273:2:1458 +1274:2:1459 +1275:2:1463 +1276:2:1467 +1277:2:1468 +1278:2:1472 +1279:2:1480 +1280:2:1481 +1281:2:1486 +1282:2:1493 +1283:2:1494 +1284:2:1501 +1285:2:1506 +1286:0:1650 +1287:2:1517 +1288:0:1650 +1289:2:1525 +1290:2:1526 +1291:2:1530 +1292:2:1534 +1293:2:1535 +1294:2:1539 +1295:2:1547 +1296:2:1548 +1297:2:1553 +1298:2:1560 +1299:2:1561 +1300:2:1568 +1301:2:1573 +1302:0:1650 +1303:2:1584 +1304:0:1650 +1305:2:1586 +1306:0:1650 +1307:2:1587 +1308:0:1650 +1309:2:1590 +1310:0:1650 +1311:2:1595 +1312:0:1650 +1313:1:302 +1314:0:1648 +1315:2:1596 +1316:0:1654 +1317:1:34 diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_progress.ltl b/formal-model/urcu/result-standard-execution-nonest/urcu_progress.ltl new file mode 100644 index 0000000..8718641 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_progress.ltl @@ -0,0 +1 @@ +([] <> !np_) diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_reader.define b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_reader.define new file mode 100644 index 0000000..ff3f783 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_reader.define @@ -0,0 +1 @@ +#define READER_PROGRESS diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_reader.log b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_reader.log new file mode 100644 index 0000000..8835ef4 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_reader.log @@ -0,0 +1,264 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define > pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_progress_reader.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -f -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 744) +depth 15: Claim reached state 9 (line 749) +depth 1767: Claim reached state 9 (line 748) +Depth= 2582 States= 1e+06 Transitions= 1.91e+07 Memory= 498.674 t= 16.1 R= 6e+04 +Depth= 2582 States= 2e+06 Transitions= 3.89e+07 Memory= 531.096 t= 33 R= 6e+04 +Depth= 2582 States= 3e+06 Transitions= 5.89e+07 Memory= 563.518 t= 50.5 R= 6e+04 +pan: resizing hashtable to -w22.. done + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness enabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 2582, errors: 0 + 1743405 states, stored (3.27749e+06 visited) + 60942540 states, matched + 64220033 transitions (= visited+matched) +2.3877948e+08 atomic steps +hash conflicts: 25318829 (resolved) + +Stats on memory usage (in Megabytes): + 139.662 equivalent memory usage for states (stored*(State-vector + overhead)) + 113.924 actual memory usage for states (compression: 81.57%) + state-vector as stored = 41 byte + 28 byte overhead + 32.000 memory used for hash table (-w22) + 457.764 memory used for DFS stack (-m10000000) + 603.623 total actual memory usage + +unreached in proctype urcu_reader + line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 61, "(1)" + line 418, "pan.___", state 91, "(1)" + line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 151, "(1)" + line 418, "pan.___", state 181, "(1)" + line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 242, "(1)" + line 418, "pan.___", state 272, "(1)" + line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 360, "(1)" + line 418, "pan.___", state 390, "(1)" + line 540, "pan.___", state 414, "-end-" + (17 of 414 states) +unreached in proctype urcu_writer + line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 59, "(1)" + line 413, "pan.___", state 72, "(1)" + line 418, "pan.___", state 89, "(1)" + line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 153, "(1)" + line 413, "pan.___", state 166, "(1)" + line 652, "pan.___", state 199, "(1)" + line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 160, "pan.___", state 240, "(1)" + line 164, "pan.___", state 248, "(1)" + line 168, "pan.___", state 260, "(1)" + line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 927, "(1)" + line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 928, "else" + line 409, "pan.___", state 931, "(1)" + line 409, "pan.___", state 932, "(1)" + line 409, "pan.___", state 932, "(1)" + line 413, "pan.___", state 940, "(1)" + line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 941, "else" + line 413, "pan.___", state 944, "(1)" + line 413, "pan.___", state 945, "(1)" + line 413, "pan.___", state 945, "(1)" + line 411, "pan.___", state 950, "((i<1))" + line 411, "pan.___", state 950, "((i>=1))" + line 418, "pan.___", state 957, "(1)" + line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 958, "else" + line 418, "pan.___", state 961, "(1)" + line 418, "pan.___", state 962, "(1)" + line 418, "pan.___", state 962, "(1)" + line 420, "pan.___", state 965, "(1)" + line 420, "pan.___", state 965, "(1)" + line 403, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1040, "(1)" + line 418, "pan.___", state 1057, "(1)" + line 403, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1130, "(1)" + line 418, "pan.___", state 1147, "(1)" + line 399, "pan.___", state 1166, "(1)" + line 403, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1222, "(1)" + line 418, "pan.___", state 1239, "(1)" + line 403, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1315, "(1)" + line 418, "pan.___", state 1332, "(1)" + line 179, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 183, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 160, "pan.___", state 1378, "(1)" + line 164, "pan.___", state 1386, "(1)" + line 168, "pan.___", state 1398, "(1)" + line 175, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 408, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 1595, "(1)" + line 409, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 1596, "else" + line 409, "pan.___", state 1599, "(1)" + line 409, "pan.___", state 1600, "(1)" + line 409, "pan.___", state 1600, "(1)" + line 413, "pan.___", state 1608, "(1)" + line 413, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 1609, "else" + line 413, "pan.___", state 1612, "(1)" + line 413, "pan.___", state 1613, "(1)" + line 413, "pan.___", state 1613, "(1)" + line 411, "pan.___", state 1618, "((i<1))" + line 411, "pan.___", state 1618, "((i>=1))" + line 418, "pan.___", state 1625, "(1)" + line 418, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 1626, "else" + line 418, "pan.___", state 1629, "(1)" + line 418, "pan.___", state 1630, "(1)" + line 418, "pan.___", state 1630, "(1)" + line 420, "pan.___", state 1633, "(1)" + line 420, "pan.___", state 1633, "(1)" + line 179, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 183, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 160, "pan.___", state 1681, "(1)" + line 164, "pan.___", state 1689, "(1)" + line 168, "pan.___", state 1701, "(1)" + line 175, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_reader.spin.input.trail b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_reader.spin.input.trail new file mode 100644 index 0000000..7c42af1 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_reader.spin.input.trail @@ -0,0 +1,1270 @@ +-2:4:-2 +-4:-4:-4 +1:0:4401 +2:4:4353 +3:4:4356 +4:4:4356 +5:4:4359 +6:4:4367 +7:4:4367 +8:4:4370 +9:4:4376 +10:4:4380 +11:4:4380 +12:4:4383 +13:4:4391 +14:4:4395 +15:4:4396 +16:0:4401 +17:4:4398 +18:0:4401 +19:3:2479 +20:0:4401 +21:3:2485 +22:0:4401 +23:3:2486 +24:0:4401 +25:3:2487 +26:3:2491 +27:3:2492 +28:3:2500 +29:3:2501 +30:3:2505 +31:3:2506 +32:3:2514 +33:3:2519 +34:3:2523 +35:3:2524 +36:3:2531 +37:3:2532 +38:3:2543 +39:3:2544 +40:3:2545 +41:3:2556 +42:3:2561 +43:3:2562 +44:0:4401 +45:3:2574 +46:0:4401 +47:3:2576 +48:3:2577 +49:0:4401 +50:3:2581 +51:3:2585 +52:3:2586 +53:3:2594 +54:3:2595 +55:3:2599 +56:3:2600 +57:3:2608 +58:3:2613 +59:3:2614 +60:3:2625 +61:3:2626 +62:3:2637 +63:3:2638 +64:3:2639 +65:3:2650 +66:3:2655 +67:3:2656 +68:0:4401 +69:3:2668 +70:0:4401 +71:3:2670 +72:0:4401 +73:3:2671 +74:0:4401 +75:3:2681 +76:0:4401 +77:3:2682 +78:0:4401 +79:3:2686 +80:3:2687 +81:3:2691 +82:3:2695 +83:3:2696 +84:3:2700 +85:3:2708 +86:3:2709 +87:3:2714 +88:3:2721 +89:3:2722 +90:3:2729 +91:3:2734 +92:0:4401 +93:3:2745 +94:0:4401 +95:3:2749 +96:3:2750 +97:3:2754 +98:3:2758 +99:3:2759 +100:3:2763 +101:3:2771 +102:3:2772 +103:3:2777 +104:3:2784 +105:3:2785 +106:3:2792 +107:3:2797 +108:0:4401 +109:3:2808 +110:0:4401 +111:3:2816 +112:3:2817 +113:3:2821 +114:3:2825 +115:3:2826 +116:3:2830 +117:3:2838 +118:3:2839 +119:3:2844 +120:3:2851 +121:3:2852 +122:3:2859 +123:3:2864 +124:0:4401 +125:3:2879 +126:0:4401 +127:3:2881 +128:0:4401 +129:3:2882 +130:3:2886 +131:3:2887 +132:3:2895 +133:3:2896 +134:3:2900 +135:3:2901 +136:3:2909 +137:3:2914 +138:3:2918 +139:3:2919 +140:3:2926 +141:3:2927 +142:3:2938 +143:3:2939 +144:3:2940 +145:3:2951 +146:3:2956 +147:3:2957 +148:0:4401 +149:3:2969 +150:0:4401 +151:3:2971 +152:0:4401 +153:3:2974 +154:3:2975 +155:3:2987 +156:3:2988 +157:3:2992 +158:3:2993 +159:3:3001 +160:3:3006 +161:3:3010 +162:3:3011 +163:3:3018 +164:3:3019 +165:3:3030 +166:3:3031 +167:3:3032 +168:3:3043 +169:3:3048 +170:3:3049 +171:0:4401 +172:3:3061 +173:0:4401 +174:3:3063 +175:0:4401 +176:3:3064 +177:0:4401 +178:3:3065 +179:0:4401 +180:3:3066 +181:0:4401 +182:3:3067 +183:3:3071 +184:3:3072 +185:3:3080 +186:3:3081 +187:3:3085 +188:3:3086 +189:3:3094 +190:3:3099 +191:3:3103 +192:3:3104 +193:3:3111 +194:3:3112 +195:3:3123 +196:3:3124 +197:3:3125 +198:3:3136 +199:3:3141 +200:3:3142 +201:0:4401 +202:3:3154 +203:0:4401 +204:3:3356 +205:0:4401 +206:3:3454 +207:0:4401 +208:3:3455 +209:0:4401 +210:3:3459 +211:0:4401 +212:3:3465 +213:3:3469 +214:3:3470 +215:3:3478 +216:3:3479 +217:3:3483 +218:3:3484 +219:3:3492 +220:3:3497 +221:3:3501 +222:3:3502 +223:3:3509 +224:3:3510 +225:3:3521 +226:3:3522 +227:3:3523 +228:3:3534 +229:3:3539 +230:3:3540 +231:0:4401 +232:3:3552 +233:0:4401 +234:3:3554 +235:0:4401 +236:3:3555 +237:3:3559 +238:3:3560 +239:3:3568 +240:3:3569 +241:3:3573 +242:3:3574 +243:3:3582 +244:3:3587 +245:3:3591 +246:3:3592 +247:3:3599 +248:3:3600 +249:3:3611 +250:3:3612 +251:3:3613 +252:3:3624 +253:3:3629 +254:3:3630 +255:0:4401 +256:3:3642 +257:0:4401 +258:3:3644 +259:0:4401 +260:3:3647 +261:3:3648 +262:3:3660 +263:3:3661 +264:3:3665 +265:3:3666 +266:3:3674 +267:3:3679 +268:3:3683 +269:3:3684 +270:3:3691 +271:3:3692 +272:3:3703 +273:3:3704 +274:3:3705 +275:3:3716 +276:3:3721 +277:3:3722 +278:0:4401 +279:3:3734 +280:0:4401 +281:3:3736 +282:0:4401 +283:3:3737 +284:0:4401 +285:3:3738 +286:0:4401 +287:3:3739 +288:0:4401 +289:3:3740 +290:3:3744 +291:3:3745 +292:3:3753 +293:3:3754 +294:3:3758 +295:3:3759 +296:3:3767 +297:3:3772 +298:3:3776 +299:3:3777 +300:3:3784 +301:3:3785 +302:3:3796 +303:3:3797 +304:3:3798 +305:3:3809 +306:3:3814 +307:3:3815 +308:0:4401 +309:3:3827 +310:0:4401 +311:3:4029 +312:0:4401 +313:3:4127 +314:0:4401 +315:3:4128 +316:0:4401 +317:3:4132 +318:0:4401 +319:3:4138 +320:0:4401 +321:3:4142 +322:3:4143 +323:3:4147 +324:3:4151 +325:3:4152 +326:3:4156 +327:3:4164 +328:3:4165 +329:3:4170 +330:3:4177 +331:3:4178 +332:3:4185 +333:3:4190 +334:0:4401 +335:3:4201 +336:0:4401 +337:3:4205 +338:3:4206 +339:3:4210 +340:3:4214 +341:3:4215 +342:3:4219 +343:3:4227 +344:3:4228 +345:3:4233 +346:3:4240 +347:3:4241 +348:3:4248 +349:3:4253 +350:0:4401 +351:3:4264 +352:0:4401 +353:3:4272 +354:3:4273 +355:3:4277 +356:3:4281 +357:3:4282 +358:3:4286 +359:3:4294 +360:3:4295 +361:3:4300 +362:3:4307 +363:3:4308 +364:3:4315 +365:3:4320 +366:0:4401 +367:3:4335 +368:0:4401 +369:3:4337 +370:0:4401 +371:3:4338 +372:0:4401 +373:3:2486 +374:0:4401 +375:3:2487 +376:3:2491 +377:3:2492 +378:3:2500 +379:3:2501 +380:3:2505 +381:3:2506 +382:3:2514 +383:3:2519 +384:3:2523 +385:3:2524 +386:3:2531 +387:3:2532 +388:3:2543 +389:3:2544 +390:3:2545 +391:3:2556 +392:3:2561 +393:3:2562 +394:0:4401 +395:3:2574 +396:0:4401 +397:3:2576 +398:3:2577 +399:0:4401 +400:3:2581 +401:3:2585 +402:3:2586 +403:3:2594 +404:3:2595 +405:3:2599 +406:3:2600 +407:3:2608 +408:3:2613 +409:3:2614 +410:3:2625 +411:3:2626 +412:3:2637 +413:3:2638 +414:3:2639 +415:3:2650 +416:3:2655 +417:3:2656 +418:0:4401 +419:3:2668 +420:0:4401 +421:3:2670 +422:0:4401 +423:3:2671 +424:0:4401 +425:3:2681 +426:0:4401 +427:3:2682 +428:0:4401 +429:3:2686 +430:3:2687 +431:3:2691 +432:3:2695 +433:3:2696 +434:3:2700 +435:3:2708 +436:3:2709 +437:3:2714 +438:3:2721 +439:3:2722 +440:3:2729 +441:3:2734 +442:0:4401 +443:3:2745 +444:0:4401 +445:3:2749 +446:3:2750 +447:3:2754 +448:3:2758 +449:3:2759 +450:3:2763 +451:3:2771 +452:3:2772 +453:3:2777 +454:3:2784 +455:3:2785 +456:3:2792 +457:3:2797 +458:0:4401 +459:3:2808 +460:0:4401 +461:3:2816 +462:3:2817 +463:3:2821 +464:3:2825 +465:3:2826 +466:3:2830 +467:3:2838 +468:3:2839 +469:3:2844 +470:3:2851 +471:3:2852 +472:3:2859 +473:3:2864 +474:0:4401 +475:3:2879 +476:0:4401 +477:3:2881 +478:0:4401 +479:3:2882 +480:3:2886 +481:3:2887 +482:3:2895 +483:3:2896 +484:3:2900 +485:3:2901 +486:3:2909 +487:3:2914 +488:3:2918 +489:3:2919 +490:3:2926 +491:3:2927 +492:3:2938 +493:3:2939 +494:3:2940 +495:3:2951 +496:3:2956 +497:3:2957 +498:0:4401 +499:3:2969 +500:0:4401 +501:3:2971 +502:0:4401 +503:3:2974 +504:3:2975 +505:3:2987 +506:3:2988 +507:3:2992 +508:3:2993 +509:3:3001 +510:3:3006 +511:3:3010 +512:3:3011 +513:3:3018 +514:3:3019 +515:3:3030 +516:3:3031 +517:3:3032 +518:3:3043 +519:3:3048 +520:3:3049 +521:0:4401 +522:3:3061 +523:0:4401 +524:3:3063 +525:0:4401 +526:3:3064 +527:0:4401 +528:3:3065 +529:0:4401 +530:3:3066 +531:0:4401 +532:3:3067 +533:3:3071 +534:3:3072 +535:3:3080 +536:3:3081 +537:3:3085 +538:3:3086 +539:3:3094 +540:3:3099 +541:3:3103 +542:3:3104 +543:3:3111 +544:3:3112 +545:3:3123 +546:3:3124 +547:3:3125 +548:3:3136 +549:3:3141 +550:3:3142 +551:0:4401 +552:3:3154 +553:0:4401 +554:3:3356 +555:0:4401 +556:3:3454 +557:0:4401 +558:3:3455 +559:0:4401 +560:3:3459 +561:0:4401 +562:3:3465 +563:3:3469 +564:3:3470 +565:3:3478 +566:3:3479 +567:3:3483 +568:3:3484 +569:3:3492 +570:3:3497 +571:3:3501 +572:3:3502 +573:3:3509 +574:3:3510 +575:3:3521 +576:3:3522 +577:3:3523 +578:3:3534 +579:3:3539 +580:3:3540 +581:0:4401 +582:3:3552 +583:0:4401 +584:3:3554 +585:0:4401 +586:3:3555 +587:3:3559 +588:3:3560 +589:3:3568 +590:3:3569 +591:3:3573 +592:3:3574 +593:3:3582 +594:3:3587 +595:3:3591 +596:3:3592 +597:3:3599 +598:3:3600 +599:3:3611 +600:3:3612 +601:3:3613 +602:3:3624 +603:3:3629 +604:3:3630 +605:0:4401 +606:3:3642 +607:0:4401 +608:3:3644 +609:0:4401 +610:3:3647 +611:3:3648 +612:3:3660 +613:3:3661 +614:3:3665 +615:3:3666 +616:3:3674 +617:3:3679 +618:3:3683 +619:3:3684 +620:3:3691 +621:3:3692 +622:3:3703 +623:3:3704 +624:3:3705 +625:3:3716 +626:3:3721 +627:3:3722 +628:0:4401 +629:3:3734 +630:0:4401 +631:3:3736 +632:0:4401 +633:3:3737 +634:0:4401 +635:3:3738 +636:0:4401 +637:3:3739 +638:0:4401 +639:3:3740 +640:3:3744 +641:3:3745 +642:3:3753 +643:3:3754 +644:3:3758 +645:3:3759 +646:3:3767 +647:3:3772 +648:3:3776 +649:3:3777 +650:3:3784 +651:3:3785 +652:3:3796 +653:3:3797 +654:3:3798 +655:3:3809 +656:3:3814 +657:3:3815 +658:0:4401 +659:3:3827 +660:0:4401 +661:3:4029 +662:0:4401 +663:3:4127 +664:0:4401 +665:3:4128 +666:0:4401 +667:3:4132 +668:0:4401 +669:3:4138 +670:0:4401 +671:3:4142 +672:3:4143 +673:3:4147 +674:3:4151 +675:3:4152 +676:3:4156 +677:3:4164 +678:3:4165 +679:3:4170 +680:3:4177 +681:3:4178 +682:3:4185 +683:3:4190 +684:0:4401 +685:3:4201 +686:0:4401 +687:3:4205 +688:3:4206 +689:3:4210 +690:3:4214 +691:3:4215 +692:3:4219 +693:3:4227 +694:3:4228 +695:3:4233 +696:3:4240 +697:3:4241 +698:3:4248 +699:3:4253 +700:0:4401 +701:3:4264 +702:0:4401 +703:3:4272 +704:3:4273 +705:3:4277 +706:3:4281 +707:3:4282 +708:3:4286 +709:3:4294 +710:3:4295 +711:3:4300 +712:3:4307 +713:3:4308 +714:3:4315 +715:3:4320 +716:0:4401 +717:3:4335 +718:0:4401 +719:3:4337 +720:0:4401 +721:3:4338 +722:0:4401 +723:3:2486 +724:0:4401 +725:3:2487 +726:3:2491 +727:3:2492 +728:3:2500 +729:3:2501 +730:3:2505 +731:3:2506 +732:3:2514 +733:3:2519 +734:3:2523 +735:3:2524 +736:3:2531 +737:3:2532 +738:3:2543 +739:3:2544 +740:3:2545 +741:3:2556 +742:3:2561 +743:3:2562 +744:0:4401 +745:3:2574 +746:0:4401 +747:3:2576 +748:3:2577 +749:0:4401 +750:3:2581 +751:3:2585 +752:3:2586 +753:3:2594 +754:3:2595 +755:3:2599 +756:3:2600 +757:3:2608 +758:3:2613 +759:3:2614 +760:3:2625 +761:3:2626 +762:3:2637 +763:3:2638 +764:3:2639 +765:3:2650 +766:3:2655 +767:3:2656 +768:0:4401 +769:3:2668 +770:0:4401 +771:3:2670 +772:0:4401 +773:3:2671 +774:0:4401 +775:3:2681 +776:0:4401 +777:3:2682 +778:0:4401 +779:3:2686 +780:3:2687 +781:3:2691 +782:3:2695 +783:3:2696 +784:3:2700 +785:3:2708 +786:3:2709 +787:3:2714 +788:3:2721 +789:3:2722 +790:3:2729 +791:3:2734 +792:0:4401 +793:3:2745 +794:0:4401 +795:3:2749 +796:3:2750 +797:3:2754 +798:3:2758 +799:3:2759 +800:3:2763 +801:3:2771 +802:3:2772 +803:3:2777 +804:3:2784 +805:3:2785 +806:3:2792 +807:3:2797 +808:0:4401 +809:3:2808 +810:0:4401 +811:3:2816 +812:3:2817 +813:3:2821 +814:3:2825 +815:3:2826 +816:3:2830 +817:3:2838 +818:3:2839 +819:3:2844 +820:3:2851 +821:3:2852 +822:3:2859 +823:3:2864 +824:0:4401 +825:3:2879 +826:0:4401 +827:3:2881 +828:0:4401 +829:3:2882 +830:3:2886 +831:3:2887 +832:3:2895 +833:3:2896 +834:3:2900 +835:3:2901 +836:3:2909 +837:3:2914 +838:3:2918 +839:3:2919 +840:3:2926 +841:3:2927 +842:3:2938 +843:3:2939 +844:3:2940 +845:3:2951 +846:3:2956 +847:3:2957 +848:0:4401 +849:3:2969 +850:0:4401 +851:3:2971 +852:0:4401 +853:3:2974 +854:3:2975 +855:3:2987 +856:3:2988 +857:3:2992 +858:3:2993 +859:3:3001 +860:3:3006 +861:3:3010 +862:3:3011 +863:3:3018 +864:3:3019 +865:3:3030 +866:3:3031 +867:3:3032 +868:3:3043 +869:3:3048 +870:3:3049 +871:0:4401 +872:3:3061 +873:0:4401 +874:3:3063 +875:0:4401 +876:3:3064 +877:0:4401 +878:3:3065 +879:0:4401 +880:3:3066 +881:0:4401 +882:3:3067 +883:3:3071 +884:3:3072 +885:3:3080 +886:3:3081 +887:3:3085 +888:3:3086 +889:3:3094 +890:3:3099 +891:3:3103 +892:3:3104 +893:3:3111 +894:3:3112 +895:3:3123 +896:3:3124 +897:3:3125 +898:3:3136 +899:3:3141 +900:3:3142 +901:0:4401 +902:3:3154 +903:0:4401 +904:3:3356 +905:0:4401 +906:3:3454 +907:0:4401 +908:3:3455 +909:0:4401 +910:3:3459 +911:0:4401 +912:3:3465 +913:3:3469 +914:3:3470 +915:3:3478 +916:3:3479 +917:3:3483 +918:3:3484 +919:3:3492 +920:3:3497 +921:3:3501 +922:3:3502 +923:3:3509 +924:3:3510 +925:3:3521 +926:3:3522 +927:3:3523 +928:3:3534 +929:3:3539 +930:3:3540 +931:0:4401 +932:3:3552 +933:0:4401 +934:3:3554 +935:0:4401 +936:3:3555 +937:3:3559 +938:3:3560 +939:3:3568 +940:3:3569 +941:3:3573 +942:3:3574 +943:3:3582 +944:3:3587 +945:3:3591 +946:3:3592 +947:3:3599 +948:3:3600 +949:3:3611 +950:3:3612 +951:3:3613 +952:3:3624 +953:3:3629 +954:3:3630 +955:0:4401 +956:3:3642 +957:0:4401 +958:3:3644 +959:0:4401 +960:3:3647 +961:3:3648 +962:3:3660 +963:3:3661 +964:3:3665 +965:3:3666 +966:3:3674 +967:3:3679 +968:3:3683 +969:3:3684 +970:3:3691 +971:3:3692 +972:3:3703 +973:3:3704 +974:3:3705 +975:3:3716 +976:3:3721 +977:3:3722 +978:0:4401 +979:3:3734 +980:0:4401 +981:3:3736 +982:0:4401 +983:3:3737 +984:0:4401 +985:3:3738 +986:0:4401 +987:3:3739 +988:0:4401 +989:3:3740 +990:3:3744 +991:3:3745 +992:3:3753 +993:3:3754 +994:3:3758 +995:3:3759 +996:3:3767 +997:3:3772 +998:3:3776 +999:3:3777 +1000:3:3784 +1001:3:3785 +1002:3:3796 +1003:3:3797 +1004:3:3798 +1005:3:3809 +1006:3:3814 +1007:3:3815 +1008:0:4401 +1009:3:3827 +1010:0:4401 +1011:3:4029 +1012:0:4401 +1013:3:4127 +1014:0:4401 +1015:3:4128 +1016:0:4401 +1017:3:4132 +1018:0:4401 +1019:3:4138 +1020:0:4401 +1021:3:4142 +1022:3:4143 +1023:3:4147 +1024:3:4151 +1025:3:4152 +1026:3:4156 +1027:3:4164 +1028:3:4165 +1029:3:4170 +1030:3:4177 +1031:3:4178 +1032:3:4185 +1033:3:4190 +1034:0:4401 +1035:3:4201 +1036:0:4401 +1037:3:4205 +1038:3:4206 +1039:3:4210 +1040:3:4214 +1041:3:4215 +1042:3:4219 +1043:3:4227 +1044:3:4228 +1045:3:4233 +1046:3:4240 +1047:3:4241 +1048:3:4248 +1049:3:4253 +1050:0:4401 +1051:3:4264 +1052:0:4401 +1053:3:4272 +1054:3:4273 +1055:3:4277 +1056:3:4281 +1057:3:4282 +1058:3:4286 +1059:3:4294 +1060:3:4295 +1061:3:4300 +1062:3:4307 +1063:3:4308 +1064:3:4315 +1065:3:4320 +1066:0:4401 +1067:3:4335 +1068:0:4401 +1069:3:4337 +1070:0:4401 +1071:3:4338 +1072:0:4401 +1073:3:4341 +1074:0:4401 +1075:3:4346 +1076:0:4401 +1077:2:1236 +1078:0:4401 +1079:3:4347 +1080:0:4401 +1081:2:1242 +1082:0:4401 +1083:3:4346 +1084:0:4401 +1085:2:1243 +1086:0:4401 +1087:3:4347 +1088:0:4401 +1089:2:1244 +1090:0:4401 +1091:3:4346 +1092:0:4401 +1093:2:1245 +1094:0:4401 +1095:3:4347 +1096:0:4401 +1097:1:2 +1098:0:4401 +1099:3:4346 +1100:0:4401 +1101:2:1246 +1102:0:4401 +1103:3:4347 +1104:0:4401 +1105:1:8 +1106:0:4401 +1107:3:4346 +1108:0:4401 +1109:2:1245 +1110:0:4401 +1111:3:4347 +1112:0:4401 +1113:1:9 +1114:0:4401 +1115:3:4346 +1116:0:4401 +1117:2:1246 +1118:0:4401 +1119:3:4347 +1120:0:4401 +1121:1:10 +1122:0:4401 +1123:3:4346 +1124:0:4401 +1125:2:1245 +1126:0:4401 +1127:3:4347 +1128:0:4401 +1129:1:11 +1130:0:4401 +1131:3:4346 +1132:0:4401 +1133:2:1246 +1134:0:4401 +1135:3:4347 +1136:0:4401 +1137:1:14 +1138:0:4401 +1139:3:4346 +1140:0:4401 +1141:2:1245 +1142:0:4401 +1143:3:4347 +1144:0:4401 +1145:1:15 +1146:0:4401 +1147:3:4346 +1148:0:4401 +1149:2:1246 +1150:0:4401 +1151:3:4347 +1152:0:4401 +1153:1:16 +1154:1:20 +1155:1:21 +1156:1:29 +1157:1:30 +1158:1:34 +1159:1:35 +1160:1:43 +1161:1:48 +1162:1:52 +1163:1:53 +1164:1:60 +1165:1:61 +1166:1:72 +1167:1:73 +1168:1:74 +1169:1:85 +1170:1:90 +1171:1:91 +1172:0:4401 +1173:3:4346 +1174:0:4401 +1175:2:1245 +1176:0:4401 +1177:3:4347 +1178:0:4401 +1179:1:103 +1180:0:4401 +1181:3:4346 +1182:0:4401 +1183:2:1246 +1184:0:4401 +1185:3:4347 +1186:0:4401 +1187:2:1247 +1188:0:4401 +1189:3:4346 +1190:0:4401 +1191:2:1253 +1192:0:4401 +1193:3:4347 +1194:0:4401 +1195:2:1254 +1196:0:4399 +1197:3:4346 +1198:0:4405 +1199:3:4347 +1200:0:4405 +1201:2:1257 +1202:0:4405 +1203:3:4346 +1204:0:4405 +1205:2:1258 +1206:0:4405 +1207:3:4347 +1208:0:4405 +1209:2:1259 +1210:2:1263 +1211:2:1264 +1212:2:1272 +1213:2:1273 +1214:2:1277 +1215:2:1278 +1216:2:1286 +1217:2:1291 +1218:2:1295 +1219:2:1296 +1220:2:1303 +1221:2:1304 +1222:2:1315 +1223:2:1316 +1224:2:1317 +1225:2:1328 +1226:2:1333 +1227:2:1334 +1228:0:4405 +1229:3:4346 +1230:0:4405 +1231:2:1346 +1232:0:4405 +1233:3:4347 +1234:0:4405 +1235:2:1347 +1236:0:4405 +1237:3:4346 +1238:0:4405 +1239:1:104 +-1:-1:-1 +1240:0:4405 +1241:3:4347 +1242:0:4405 +1243:3:4346 +1244:0:4405 +1245:2:1348 +1246:0:4405 +1247:3:4347 +1248:0:4405 +1249:2:1347 +1250:0:4405 +1251:3:4346 +1252:0:4405 +1253:1:105 +1254:0:4405 +1255:3:4347 +1256:0:4405 +1257:3:4346 +1258:0:4405 +1259:2:1348 +1260:0:4405 +1261:3:4347 +1262:0:4405 +1263:2:1347 +1264:0:4405 +1265:3:4346 +1266:0:4405 +1267:1:104 diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer.define b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer.define new file mode 100644 index 0000000..1e4417f --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer.define @@ -0,0 +1 @@ +#define WRITER_PROGRESS diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer.log b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer.log new file mode 100644 index 0000000..be944b5 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer.log @@ -0,0 +1,264 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define > pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_progress_writer.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -f -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 744) +depth 15: Claim reached state 9 (line 749) +depth 205: Claim reached state 9 (line 748) +Depth= 2535 States= 1e+06 Transitions= 1.7e+07 Memory= 489.885 t= 14.4 R= 7e+04 +Depth= 2535 States= 2e+06 Transitions= 3.76e+07 Memory= 523.186 t= 32 R= 6e+04 +Depth= 2535 States= 3e+06 Transitions= 5.78e+07 Memory= 555.901 t= 49.6 R= 6e+04 +pan: resizing hashtable to -w22.. done + +(Spin Version 5.1.7 -- 23 December 2008) + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness enabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 2535, errors: 0 + 1687360 states, stored (3.30264e+06 visited) + 60975458 states, matched + 64278093 transitions (= visited+matched) +2.3918285e+08 atomic steps +hash conflicts: 20728375 (resolved) + +Stats on memory usage (in Megabytes): + 135.172 equivalent memory usage for states (stored*(State-vector + overhead)) + 110.532 actual memory usage for states (compression: 81.77%) + state-vector as stored = 41 byte + 28 byte overhead + 32.000 memory used for hash table (-w22) + 457.764 memory used for DFS stack (-m10000000) + 600.205 total actual memory usage + +unreached in proctype urcu_reader + line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 61, "(1)" + line 418, "pan.___", state 91, "(1)" + line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 151, "(1)" + line 418, "pan.___", state 181, "(1)" + line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 242, "(1)" + line 418, "pan.___", state 272, "(1)" + line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 360, "(1)" + line 418, "pan.___", state 390, "(1)" + line 540, "pan.___", state 414, "-end-" + (17 of 414 states) +unreached in proctype urcu_writer + line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 59, "(1)" + line 413, "pan.___", state 72, "(1)" + line 418, "pan.___", state 89, "(1)" + line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 153, "(1)" + line 413, "pan.___", state 166, "(1)" + line 652, "pan.___", state 199, "(1)" + line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 160, "pan.___", state 240, "(1)" + line 164, "pan.___", state 248, "(1)" + line 168, "pan.___", state 260, "(1)" + line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 927, "(1)" + line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 928, "else" + line 409, "pan.___", state 931, "(1)" + line 409, "pan.___", state 932, "(1)" + line 409, "pan.___", state 932, "(1)" + line 413, "pan.___", state 940, "(1)" + line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 941, "else" + line 413, "pan.___", state 944, "(1)" + line 413, "pan.___", state 945, "(1)" + line 413, "pan.___", state 945, "(1)" + line 411, "pan.___", state 950, "((i<1))" + line 411, "pan.___", state 950, "((i>=1))" + line 418, "pan.___", state 957, "(1)" + line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 958, "else" + line 418, "pan.___", state 961, "(1)" + line 418, "pan.___", state 962, "(1)" + line 418, "pan.___", state 962, "(1)" + line 420, "pan.___", state 965, "(1)" + line 420, "pan.___", state 965, "(1)" + line 403, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1040, "(1)" + line 418, "pan.___", state 1057, "(1)" + line 403, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1130, "(1)" + line 418, "pan.___", state 1147, "(1)" + line 399, "pan.___", state 1166, "(1)" + line 403, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1222, "(1)" + line 418, "pan.___", state 1239, "(1)" + line 403, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 408, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 413, "pan.___", state 1315, "(1)" + line 418, "pan.___", state 1332, "(1)" + line 179, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 183, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 160, "pan.___", state 1378, "(1)" + line 164, "pan.___", state 1386, "(1)" + line 168, "pan.___", state 1398, "(1)" + line 175, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 408, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 1595, "(1)" + line 409, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 409, "pan.___", state 1596, "else" + line 409, "pan.___", state 1599, "(1)" + line 409, "pan.___", state 1600, "(1)" + line 409, "pan.___", state 1600, "(1)" + line 413, "pan.___", state 1608, "(1)" + line 413, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 413, "pan.___", state 1609, "else" + line 413, "pan.___", state 1612, "(1)" + line 413, "pan.___", state 1613, "(1)" + line 413, "pan.___", state 1613, "(1)" + line 411, "pan.___", state 1618, "((i<1))" + line 411, "pan.___", state 1618, "((i>=1))" + line 418, "pan.___", state 1625, "(1)" + line 418, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 418, "pan.___", state 1626, "else" + line 418, "pan.___", state 1629, "(1)" + line 418, "pan.___", state 1630, "(1)" + line 418, "pan.___", state 1630, "(1)" + line 420, "pan.___", state 1633, "(1)" + line 420, "pan.___", state 1633, "(1)" + line 179, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 183, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 160, "pan.___", state 1681, "(1)" + line 164, "pan.___", state 1689, "(1)" + line 168, "pan.___", state 1701, "(1)" + line 175, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer.spin.input.trail b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer.spin.input.trail new file mode 100644 index 0000000..e65d663 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer.spin.input.trail @@ -0,0 +1,9 @@ +-2:3:-2 +-4:-4:-4 +1:0:2679 +2:1:2673 +3:1:2674 +4:1:2675 +5:1:2676 +6:0:2685 +7:5:1129 diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer_error.define b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer_error.define new file mode 100644 index 0000000..8d304f5 --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer_error.define @@ -0,0 +1,2 @@ +#define WRITER_PROGRESS +#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer_error.log b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer_error.log new file mode 100644 index 0000000..80c9c6d --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer_error.log @@ -0,0 +1,514 @@ +make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' +rm -f pan* trail.out .input.spin* *.spin.trail .input.define +touch .input.define +cat .input.define > pan.ltl +cat DEFINES >> pan.ltl +spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl +cp urcu_progress_writer_error.define .input.define +cat .input.define > .input.spin +cat DEFINES >> .input.spin +cat urcu.spin >> .input.spin +rm -f .input.spin.trail +spin -a -X -N pan.ltl .input.spin +Exit-Status 0 +gcc -O2 -w -DHASH64 -o pan pan.c +./pan -a -f -v -c1 -X -m10000000 -w20 +warning: for p.o. reduction to be valid the never claim must be stutter-invariant +(never claims generated from LTL formulae are stutter-invariant) +depth 0: Claim reached state 5 (line 745) +depth 15: Claim reached state 9 (line 750) +depth 205: Claim reached state 9 (line 749) +pan: acceptance cycle (at depth 1651) +pan: wrote .input.spin.trail + +(Spin Version 5.1.7 -- 23 December 2008) +Warning: Search not completed + + Partial Order Reduction + +Full statespace search for: + never claim + + assertion violations + (if within scope of claim) + acceptance cycles + (fairness enabled) + invalid end states - (disabled by never claim) + +State-vector 56 byte, depth reached 3006, errors: 1 + 19244 states, stored (53713 visited) + 704248 states, matched + 757961 transitions (= visited+matched) + 2831420 atomic steps +hash conflicts: 5063 (resolved) + +Stats on memory usage (in Megabytes): + 1.542 equivalent memory usage for states (stored*(State-vector + overhead)) + 1.605 actual memory usage for states (unsuccessful compression: 104.14%) + state-vector as stored = 59 byte + 28 byte overhead + 8.000 memory used for hash table (-w20) + 457.764 memory used for DFS stack (-m10000000) + 467.326 total actual memory usage + +unreached in proctype urcu_reader + line 400, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 61, "(1)" + line 419, "pan.___", state 91, "(1)" + line 400, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 151, "(1)" + line 419, "pan.___", state 181, "(1)" + line 400, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 242, "(1)" + line 419, "pan.___", state 272, "(1)" + line 400, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 360, "(1)" + line 419, "pan.___", state 390, "(1)" + line 541, "pan.___", state 414, "-end-" + (17 of 414 states) +unreached in proctype urcu_writer + line 400, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 20, "(1)" + line 404, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 34, "(1)" + line 404, "pan.___", state 35, "(1)" + line 404, "pan.___", state 35, "(1)" + line 402, "pan.___", state 40, "((i<1))" + line 402, "pan.___", state 40, "((i>=1))" + line 409, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 59, "(1)" + line 410, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 60, "else" + line 410, "pan.___", state 63, "(1)" + line 410, "pan.___", state 64, "(1)" + line 410, "pan.___", state 64, "(1)" + line 414, "pan.___", state 72, "(1)" + line 414, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 73, "else" + line 414, "pan.___", state 76, "(1)" + line 414, "pan.___", state 77, "(1)" + line 414, "pan.___", state 77, "(1)" + line 412, "pan.___", state 82, "((i<1))" + line 412, "pan.___", state 82, "((i>=1))" + line 419, "pan.___", state 89, "(1)" + line 419, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 90, "else" + line 419, "pan.___", state 93, "(1)" + line 419, "pan.___", state 94, "(1)" + line 419, "pan.___", state 94, "(1)" + line 370, "pan.___", state 99, "(1)" + line 640, "pan.___", state 103, "cached_generation_ptr.val[_pid] = (old_gen+1)" + line 638, "pan.___", state 104, "old_gen = cached_generation_ptr.val[_pid]" + line 400, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 114, "(1)" + line 404, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 128, "(1)" + line 404, "pan.___", state 129, "(1)" + line 404, "pan.___", state 129, "(1)" + line 402, "pan.___", state 134, "((i<1))" + line 402, "pan.___", state 134, "((i>=1))" + line 410, "pan.___", state 153, "(1)" + line 410, "pan.___", state 154, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 154, "else" + line 410, "pan.___", state 157, "(1)" + line 410, "pan.___", state 158, "(1)" + line 410, "pan.___", state 158, "(1)" + line 414, "pan.___", state 166, "(1)" + line 414, "pan.___", state 167, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 167, "else" + line 414, "pan.___", state 170, "(1)" + line 414, "pan.___", state 171, "(1)" + line 414, "pan.___", state 171, "(1)" + line 412, "pan.___", state 176, "((i<1))" + line 412, "pan.___", state 176, "((i>=1))" + line 419, "pan.___", state 183, "(1)" + line 419, "pan.___", state 184, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 184, "else" + line 419, "pan.___", state 187, "(1)" + line 419, "pan.___", state 188, "(1)" + line 419, "pan.___", state 188, "(1)" + line 421, "pan.___", state 191, "(1)" + line 421, "pan.___", state 191, "(1)" + line 370, "pan.___", state 193, "(1)" + line 653, "pan.___", state 199, "(1)" + line 647, "pan.___", state 202, "((write_lock==0))" + line 647, "pan.___", state 202, "else" + line 645, "pan.___", state 203, "(1)" + line 176, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 180, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 178, "pan.___", state 225, "((j<1))" + line 178, "pan.___", state 225, "((j>=1))" + line 184, "pan.___", state 230, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 161, "pan.___", state 240, "(1)" + line 165, "pan.___", state 248, "(1)" + line 165, "pan.___", state 249, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 165, "pan.___", state 249, "else" + line 163, "pan.___", state 254, "((j<1))" + line 163, "pan.___", state 254, "((j>=1))" + line 169, "pan.___", state 260, "(1)" + line 169, "pan.___", state 261, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 169, "pan.___", state 261, "else" + line 171, "pan.___", state 264, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 171, "pan.___", state 264, "else" + line 176, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" + line 184, "pan.___", state 293, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" + line 169, "pan.___", state 323, "(1)" + line 169, "pan.___", state 324, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" + line 176, "pan.___", state 338, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 180, "pan.___", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 178, "pan.___", state 355, "((j<1))" + line 178, "pan.___", state 355, "((j>=1))" + line 184, "pan.___", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 161, "pan.___", state 370, "(1)" + line 165, "pan.___", state 378, "(1)" + line 165, "pan.___", state 379, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 165, "pan.___", state 379, "else" + line 163, "pan.___", state 384, "((j<1))" + line 163, "pan.___", state 384, "((j>=1))" + line 169, "pan.___", state 390, "(1)" + line 169, "pan.___", state 391, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 169, "pan.___", state 391, "else" + line 171, "pan.___", state 394, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 171, "pan.___", state 394, "else" + line 400, "pan.___", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 410, "(1)" + line 404, "pan.___", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 424, "(1)" + line 404, "pan.___", state 425, "(1)" + line 404, "pan.___", state 425, "(1)" + line 402, "pan.___", state 430, "((i<1))" + line 402, "pan.___", state 430, "((i>=1))" + line 409, "pan.___", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 449, "(1)" + line 410, "pan.___", state 450, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 450, "else" + line 410, "pan.___", state 453, "(1)" + line 410, "pan.___", state 454, "(1)" + line 410, "pan.___", state 454, "(1)" + line 414, "pan.___", state 462, "(1)" + line 414, "pan.___", state 463, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 463, "else" + line 414, "pan.___", state 466, "(1)" + line 414, "pan.___", state 467, "(1)" + line 414, "pan.___", state 467, "(1)" + line 412, "pan.___", state 472, "((i<1))" + line 412, "pan.___", state 472, "((i>=1))" + line 419, "pan.___", state 479, "(1)" + line 419, "pan.___", state 480, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 480, "else" + line 419, "pan.___", state 483, "(1)" + line 419, "pan.___", state 484, "(1)" + line 419, "pan.___", state 484, "(1)" + line 421, "pan.___", state 487, "(1)" + line 421, "pan.___", state 487, "(1)" + line 370, "pan.___", state 489, "(1)" + line 662, "pan.___", state 492, "cached_urcu_gp_ctr.val[_pid] = (tmp^(1<<7))" + line 400, "pan.___", state 498, "(1)" + line 400, "pan.___", state 499, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 400, "pan.___", state 499, "else" + line 400, "pan.___", state 502, "(1)" + line 404, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 516, "(1)" + line 404, "pan.___", state 517, "(1)" + line 404, "pan.___", state 517, "(1)" + line 402, "pan.___", state 522, "((i<1))" + line 402, "pan.___", state 522, "((i>=1))" + line 409, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 541, "(1)" + line 410, "pan.___", state 542, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 542, "else" + line 410, "pan.___", state 545, "(1)" + line 410, "pan.___", state 546, "(1)" + line 410, "pan.___", state 546, "(1)" + line 414, "pan.___", state 554, "(1)" + line 414, "pan.___", state 555, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 555, "else" + line 414, "pan.___", state 558, "(1)" + line 414, "pan.___", state 559, "(1)" + line 414, "pan.___", state 559, "(1)" + line 412, "pan.___", state 564, "((i<1))" + line 412, "pan.___", state 564, "((i>=1))" + line 419, "pan.___", state 571, "(1)" + line 419, "pan.___", state 572, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 572, "else" + line 419, "pan.___", state 575, "(1)" + line 419, "pan.___", state 576, "(1)" + line 419, "pan.___", state 576, "(1)" + line 421, "pan.___", state 579, "(1)" + line 421, "pan.___", state 579, "(1)" + line 370, "pan.___", state 581, "(1)" + line 400, "pan.___", state 589, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 595, "(1)" + line 404, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 609, "(1)" + line 404, "pan.___", state 610, "(1)" + line 404, "pan.___", state 610, "(1)" + line 402, "pan.___", state 615, "((i<1))" + line 402, "pan.___", state 615, "((i>=1))" + line 409, "pan.___", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 634, "(1)" + line 410, "pan.___", state 635, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 635, "else" + line 410, "pan.___", state 638, "(1)" + line 410, "pan.___", state 639, "(1)" + line 410, "pan.___", state 639, "(1)" + line 414, "pan.___", state 647, "(1)" + line 414, "pan.___", state 648, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 648, "else" + line 414, "pan.___", state 651, "(1)" + line 414, "pan.___", state 652, "(1)" + line 414, "pan.___", state 652, "(1)" + line 412, "pan.___", state 657, "((i<1))" + line 412, "pan.___", state 657, "((i>=1))" + line 419, "pan.___", state 664, "(1)" + line 419, "pan.___", state 665, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 665, "else" + line 419, "pan.___", state 668, "(1)" + line 419, "pan.___", state 669, "(1)" + line 419, "pan.___", state 669, "(1)" + line 421, "pan.___", state 672, "(1)" + line 421, "pan.___", state 672, "(1)" + line 370, "pan.___", state 674, "(1)" + line 400, "pan.___", state 679, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 681, "(1)" + line 400, "pan.___", state 682, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 400, "pan.___", state 682, "else" + line 400, "pan.___", state 685, "(1)" + line 404, "pan.___", state 693, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 695, "(1)" + line 404, "pan.___", state 696, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 404, "pan.___", state 696, "else" + line 404, "pan.___", state 699, "(1)" + line 404, "pan.___", state 700, "(1)" + line 404, "pan.___", state 700, "(1)" + line 402, "pan.___", state 705, "((i<1))" + line 402, "pan.___", state 705, "((i>=1))" + line 409, "pan.___", state 711, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 724, "(1)" + line 410, "pan.___", state 725, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 725, "else" + line 410, "pan.___", state 728, "(1)" + line 410, "pan.___", state 729, "(1)" + line 410, "pan.___", state 729, "(1)" + line 414, "pan.___", state 737, "(1)" + line 414, "pan.___", state 738, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 738, "else" + line 414, "pan.___", state 741, "(1)" + line 414, "pan.___", state 742, "(1)" + line 414, "pan.___", state 742, "(1)" + line 412, "pan.___", state 747, "((i<1))" + line 412, "pan.___", state 747, "((i>=1))" + line 419, "pan.___", state 754, "(1)" + line 419, "pan.___", state 755, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 755, "else" + line 419, "pan.___", state 758, "(1)" + line 419, "pan.___", state 759, "(1)" + line 419, "pan.___", state 759, "(1)" + line 421, "pan.___", state 762, "(1)" + line 421, "pan.___", state 762, "(1)" + line 370, "pan.___", state 764, "(1)" + line 430, "pan.___", state 767, "(((tmp2&((1<<7)-1))&&((tmp2^cached_urcu_gp_ctr.val[_pid])&(1<<7))))" + line 430, "pan.___", state 767, "else" + line 400, "pan.___", state 777, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 779, "(1)" + line 400, "pan.___", state 780, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 400, "pan.___", state 780, "else" + line 400, "pan.___", state 783, "(1)" + line 404, "pan.___", state 791, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 793, "(1)" + line 404, "pan.___", state 794, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 404, "pan.___", state 794, "else" + line 404, "pan.___", state 797, "(1)" + line 404, "pan.___", state 798, "(1)" + line 404, "pan.___", state 798, "(1)" + line 402, "pan.___", state 803, "((i<1))" + line 402, "pan.___", state 803, "((i>=1))" + line 409, "pan.___", state 809, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 822, "(1)" + line 410, "pan.___", state 823, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 823, "else" + line 410, "pan.___", state 826, "(1)" + line 410, "pan.___", state 827, "(1)" + line 410, "pan.___", state 827, "(1)" + line 414, "pan.___", state 835, "(1)" + line 414, "pan.___", state 836, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 836, "else" + line 414, "pan.___", state 839, "(1)" + line 414, "pan.___", state 840, "(1)" + line 414, "pan.___", state 840, "(1)" + line 412, "pan.___", state 845, "((i<1))" + line 412, "pan.___", state 845, "((i>=1))" + line 419, "pan.___", state 852, "(1)" + line 419, "pan.___", state 853, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 853, "else" + line 419, "pan.___", state 856, "(1)" + line 419, "pan.___", state 857, "(1)" + line 419, "pan.___", state 857, "(1)" + line 421, "pan.___", state 860, "(1)" + line 421, "pan.___", state 860, "(1)" + line 370, "pan.___", state 862, "(1)" + line 449, "pan.___", state 870, "((tmp<1))" + line 449, "pan.___", state 870, "((tmp>=1))" + line 462, "pan.___", state 873, "tmp = 0" + line 400, "pan.___", state 877, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 883, "(1)" + line 404, "pan.___", state 891, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 897, "(1)" + line 404, "pan.___", state 898, "(1)" + line 404, "pan.___", state 898, "(1)" + line 402, "pan.___", state 903, "((i<1))" + line 402, "pan.___", state 903, "((i>=1))" + line 409, "pan.___", state 909, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 922, "(1)" + line 410, "pan.___", state 923, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 923, "else" + line 410, "pan.___", state 926, "(1)" + line 410, "pan.___", state 927, "(1)" + line 410, "pan.___", state 927, "(1)" + line 414, "pan.___", state 935, "(1)" + line 414, "pan.___", state 936, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 936, "else" + line 414, "pan.___", state 939, "(1)" + line 414, "pan.___", state 940, "(1)" + line 414, "pan.___", state 940, "(1)" + line 412, "pan.___", state 945, "((i<1))" + line 412, "pan.___", state 945, "((i>=1))" + line 419, "pan.___", state 952, "(1)" + line 419, "pan.___", state 953, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 953, "else" + line 419, "pan.___", state 956, "(1)" + line 419, "pan.___", state 957, "(1)" + line 419, "pan.___", state 957, "(1)" + line 421, "pan.___", state 960, "(1)" + line 421, "pan.___", state 960, "(1)" + line 370, "pan.___", state 962, "(1)" + line 671, "pan.___", state 963, "tmp = cached_urcu_gp_ctr.val[_pid]" + line 400, "pan.___", state 967, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 973, "(1)" + line 404, "pan.___", state 981, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 987, "(1)" + line 404, "pan.___", state 988, "(1)" + line 404, "pan.___", state 988, "(1)" + line 402, "pan.___", state 993, "((i<1))" + line 402, "pan.___", state 993, "((i>=1))" + line 409, "pan.___", state 999, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 1012, "(1)" + line 410, "pan.___", state 1013, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 1013, "else" + line 410, "pan.___", state 1016, "(1)" + line 410, "pan.___", state 1017, "(1)" + line 410, "pan.___", state 1017, "(1)" + line 414, "pan.___", state 1025, "(1)" + line 414, "pan.___", state 1026, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 1026, "else" + line 414, "pan.___", state 1029, "(1)" + line 414, "pan.___", state 1030, "(1)" + line 414, "pan.___", state 1030, "(1)" + line 412, "pan.___", state 1035, "((i<1))" + line 412, "pan.___", state 1035, "((i>=1))" + line 419, "pan.___", state 1042, "(1)" + line 419, "pan.___", state 1043, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 1043, "else" + line 419, "pan.___", state 1046, "(1)" + line 419, "pan.___", state 1047, "(1)" + line 419, "pan.___", state 1047, "(1)" + line 421, "pan.___", state 1050, "(1)" + line 421, "pan.___", state 1050, "(1)" + line 370, "pan.___", state 1052, "(1)" + line 400, "pan.___", state 1061, "(1)" + line 404, "pan.___", state 1073, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 1091, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 1117, "(1)" + line 419, "pan.___", state 1134, "(1)" + line 404, "pan.___", state 1166, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 1184, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 414, "pan.___", state 1210, "(1)" + line 419, "pan.___", state 1227, "(1)" + line 400, "pan.___", state 1242, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 1256, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 409, "pan.___", state 1274, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 1287, "(1)" + line 414, "pan.___", state 1300, "(1)" + line 419, "pan.___", state 1317, "(1)" + line 400, "pan.___", state 1340, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" + line 400, "pan.___", state 1342, "(1)" + line 400, "pan.___", state 1343, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" + line 400, "pan.___", state 1343, "else" + line 400, "pan.___", state 1346, "(1)" + line 404, "pan.___", state 1354, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 404, "pan.___", state 1356, "(1)" + line 404, "pan.___", state 1357, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" + line 404, "pan.___", state 1357, "else" + line 404, "pan.___", state 1360, "(1)" + line 404, "pan.___", state 1361, "(1)" + line 404, "pan.___", state 1361, "(1)" + line 402, "pan.___", state 1366, "((i<1))" + line 402, "pan.___", state 1366, "((i>=1))" + line 409, "pan.___", state 1372, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 410, "pan.___", state 1385, "(1)" + line 410, "pan.___", state 1386, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" + line 410, "pan.___", state 1386, "else" + line 410, "pan.___", state 1389, "(1)" + line 410, "pan.___", state 1390, "(1)" + line 410, "pan.___", state 1390, "(1)" + line 414, "pan.___", state 1398, "(1)" + line 414, "pan.___", state 1399, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" + line 414, "pan.___", state 1399, "else" + line 414, "pan.___", state 1402, "(1)" + line 414, "pan.___", state 1403, "(1)" + line 414, "pan.___", state 1403, "(1)" + line 412, "pan.___", state 1408, "((i<1))" + line 412, "pan.___", state 1408, "((i>=1))" + line 419, "pan.___", state 1415, "(1)" + line 419, "pan.___", state 1416, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" + line 419, "pan.___", state 1416, "else" + line 419, "pan.___", state 1419, "(1)" + line 419, "pan.___", state 1420, "(1)" + line 419, "pan.___", state 1420, "(1)" + line 421, "pan.___", state 1423, "(1)" + line 421, "pan.___", state 1423, "(1)" + line 180, "pan.___", state 1448, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" + line 184, "pan.___", state 1461, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" + line 161, "pan.___", state 1471, "(1)" + line 165, "pan.___", state 1479, "(1)" + line 169, "pan.___", state 1491, "(1)" + line 176, "pan.___", state 1502, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#else + +#define get_pid() (_pid) + +#define NR_READERS 1 +#define NR_WRITERS 1 + +#define NR_PROCS 2 + +#endif + +#define get_readerid() (get_pid()) + +/* + * Each process have its own data in cache. Caches are randomly updated. + * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces + * both. + */ + +typedef per_proc_byte { + byte val[NR_PROCS]; +}; + +/* Bitfield has a maximum of 8 procs */ +typedef per_proc_bit { + byte bitfield; +}; + +#define DECLARE_CACHED_VAR(type, x) \ + type mem_##x; \ + per_proc_##type cached_##x; \ + per_proc_bit cache_dirty_##x; + +#define INIT_CACHED_VAR(x, v, j) \ + mem_##x = v; \ + cache_dirty_##x.bitfield = 0; \ + j = 0; \ + do \ + :: j < NR_PROCS -> \ + cached_##x.val[j] = v; \ + j++ \ + :: j >= NR_PROCS -> break \ + od; + +#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) + +#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) + +#define WRITE_CACHED_VAR(x, v) \ + atomic { \ + cached_##x.val[get_pid()] = v; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield | (1 << get_pid()); \ + } + +#define CACHE_WRITE_TO_MEM(x, id) \ + if \ + :: IS_CACHE_DIRTY(x, id) -> \ + mem_##x = cached_##x.val[id]; \ + cache_dirty_##x.bitfield = \ + cache_dirty_##x.bitfield & (~(1 << id)); \ + :: else -> \ + skip \ + fi; + +#define CACHE_READ_FROM_MEM(x, id) \ + if \ + :: !IS_CACHE_DIRTY(x, id) -> \ + cached_##x.val[id] = mem_##x;\ + :: else -> \ + skip \ + fi; + +/* + * May update other caches if cache is dirty, or not. + */ +#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ + if \ + :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ + :: 1 -> skip \ + fi; + +#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ + if \ + :: 1 -> CACHE_READ_FROM_MEM(x, id); \ + :: 1 -> skip \ + fi; + +/* + * Remote barriers tests the scheme where a signal (or IPI) is sent to all + * reader threads to promote their compiler barrier to a smp_mb(). + */ +#ifdef REMOTE_BARRIERS + +inline smp_rmb_pid(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, i); + } +} + +inline smp_wmb_pid(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); + j = 0; + do + :: j < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); + j++ + :: j >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, i); + } +} + +inline smp_mb_pid(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb_pid(i, j); +#endif +#ifndef NO_RMB + smp_rmb_pid(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(j); +#endif +#endif + } +} + +/* + * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a + * signal or IPI to have all readers execute a smp_mb. + * We are not modeling the whole rendez-vous between readers and writers here, + * we just let the writer update each reader's caches remotely. + */ +inline smp_mb_writer(i, j) +{ + smp_mb_pid(get_pid(), j); + i = 0; + do + :: i < NR_READERS -> + smp_mb_pid(i, j); + i++; + :: i >= NR_READERS -> break + od; + smp_mb_pid(get_pid(), j); +} + +inline smp_mb_reader(i, j) +{ + skip; +} + +#else + +inline smp_rmb(i, j) +{ + atomic { + CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline smp_wmb(i, j) +{ + atomic { + CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); + i++ + :: i >= NR_READERS -> break + od; + CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + } +} + +inline smp_mb(i, j) +{ + atomic { +#ifndef NO_WMB + smp_wmb(i, j); +#endif +#ifndef NO_RMB + smp_rmb(i, j); +#endif +#ifdef NO_WMB +#ifdef NO_RMB + ooo_mem(i); +#endif +#endif + } +} + +inline smp_mb_writer(i, j) +{ + smp_mb(i, j); +} + +inline smp_mb_reader(i, j) +{ + smp_mb(i, j); +} + +#endif + +/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ +DECLARE_CACHED_VAR(byte, urcu_gp_ctr); +/* Note ! currently only two readers */ +DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); +/* pointer generation */ +DECLARE_CACHED_VAR(byte, generation_ptr); + +byte last_free_gen = 0; +bit free_done = 0; +byte read_generation[NR_READERS]; +bit data_access[NR_READERS]; + +bit write_lock = 0; + +bit init_done = 0; + +bit sighand_exec = 0; + +inline wait_init_done() +{ + do + :: init_done == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TEST_SIGNAL + +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> break; + od; +} + +#ifdef TOO_BIG_STATE_SPACE +inline wait_for_sighand_exec() +{ + sighand_exec = 0; + do + :: sighand_exec == 0 -> skip; + :: else -> + if + :: 1 -> break; + :: 1 -> sighand_exec = 0; + skip; + fi; + od; +} +#endif + +#else + +inline wait_for_sighand_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_WRITE +/* Block on signal handler execution */ +inline dispatch_sighand_write_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_write_exec() +{ + skip; +} + +#endif + +#ifdef TEST_SIGNAL_ON_READ +/* Block on signal handler execution */ +inline dispatch_sighand_read_exec() +{ + sighand_exec = 1; + do + :: sighand_exec == 1 -> + skip; + :: else -> + break; + od; +} + +#else + +inline dispatch_sighand_read_exec() +{ + skip; +} + +#endif + + +inline ooo_mem(i) +{ + atomic { + RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); + RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); + i = 0; + do + :: i < NR_READERS -> + RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], + get_pid()); + i++ + :: i >= NR_READERS -> break + od; + RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); + } +} + +inline wait_for_reader(tmp, tmp2, i, j) +{ + do + :: 1 -> + tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); + ooo_mem(i); + dispatch_sighand_write_exec(); + if + :: (tmp2 & RCU_GP_CTR_NEST_MASK) + && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) + & RCU_GP_CTR_BIT) -> +#ifndef GEN_ERROR_WRITER_PROGRESS + smp_mb_writer(i, j); +#else + ooo_mem(i); +#endif + dispatch_sighand_write_exec(); + :: else -> + break; + fi; + od; +} + +inline wait_for_quiescent_state(tmp, tmp2, i, j) +{ + tmp = 0; + do + :: tmp < NR_READERS -> + wait_for_reader(tmp, tmp2, i, j); + if + :: (NR_READERS > 1) && (tmp < NR_READERS - 1) + -> ooo_mem(i); + dispatch_sighand_write_exec(); + :: else + -> skip; + fi; + tmp++ + :: tmp >= NR_READERS -> break + od; +} + +/* Model the RCU read-side critical section. */ + +#ifndef TEST_SIGNAL_ON_WRITE + +inline urcu_one_read(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + dispatch_sighand_read_exec(); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + dispatch_sighand_read_exec(); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + dispatch_sighand_read_exec(); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //dispatch_sighand_read_exec(); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read(i, j, nest_i, tmp, tmp2); + od; +} + +#endif //!TEST_SIGNAL_ON_WRITE + +#ifdef TEST_SIGNAL +/* signal handler reader */ + +inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) +{ + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + ooo_mem(i); + tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + if + :: (!(tmp & RCU_GP_CTR_NEST_MASK)) + -> + tmp2 = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp2); + :: else -> + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], + tmp + 1); + fi; + smp_mb_reader(i, j); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + + read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); + data_access[get_readerid()] = 1; + data_access[get_readerid()] = 0; + + nest_i = 0; + do + :: nest_i < READER_NEST_LEVEL -> + smp_mb_reader(i, j); + tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); + ooo_mem(i); + WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); + nest_i++; + :: nest_i >= READER_NEST_LEVEL -> break; + od; + //ooo_mem(i); + //smp_mc(i); /* added */ +} + +active proctype urcu_reader_sig() +{ + byte i, j, nest_i; + byte tmp, tmp2; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + +end_reader: + do + :: 1 -> + wait_for_sighand_exec(); + /* + * We do not test reader's progress here, because we are mainly + * interested in writer's progress. The reader never blocks + * anyway. We have to test for reader/writer's progress + * separately, otherwise we could think the writer is doing + * progress when it's blocked by an always progressing reader. + */ +#ifdef READER_PROGRESS +progress_reader: +#endif + urcu_one_read_sig(i, j, nest_i, tmp, tmp2); + od; +} + +#endif + +/* Model the RCU update process. */ + +active proctype urcu_writer() +{ + byte i, j; + byte tmp, tmp2; + byte old_gen; + + wait_init_done(); + + assert(get_pid() < NR_PROCS); + + do + :: (READ_CACHED_VAR(generation_ptr) < 5) -> +#ifdef WRITER_PROGRESS +progress_writer1: +#endif + ooo_mem(i); + dispatch_sighand_write_exec(); + atomic { + old_gen = READ_CACHED_VAR(generation_ptr); + WRITE_CACHED_VAR(generation_ptr, old_gen + 1); + } + ooo_mem(i); + dispatch_sighand_write_exec(); + + do + :: 1 -> + atomic { + if + :: write_lock == 0 -> + write_lock = 1; + break; + :: else -> + skip; + fi; + } + od; + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + ooo_mem(i); + dispatch_sighand_write_exec(); + //smp_mc(i); + wait_for_quiescent_state(tmp, tmp2, i, j); + //smp_mc(i); +#ifndef SINGLE_FLIP + ooo_mem(i); + dispatch_sighand_write_exec(); + tmp = READ_CACHED_VAR(urcu_gp_ctr); + ooo_mem(i); + dispatch_sighand_write_exec(); + WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); + //smp_mc(i); + ooo_mem(i); + dispatch_sighand_write_exec(); + wait_for_quiescent_state(tmp, tmp2, i, j); +#endif + smp_mb_writer(i, j); + dispatch_sighand_write_exec(); + write_lock = 0; + /* free-up step, e.g., kfree(). */ + atomic { + last_free_gen = old_gen; + free_done = 1; + } + :: else -> break; + od; + /* + * Given the reader loops infinitely, let the writer also busy-loop + * with progress here so, with weak fairness, we can test the + * writer's progress. + */ +end_writer: + do + :: 1 -> +#ifdef WRITER_PROGRESS +progress_writer2: +#endif + dispatch_sighand_write_exec(); + od; +} + +/* Leave after the readers and writers so the pid count is ok. */ +init { + byte i, j; + + atomic { + INIT_CACHED_VAR(urcu_gp_ctr, 1, j); + INIT_CACHED_VAR(generation_ptr, 0, j); + + i = 0; + do + :: i < NR_READERS -> + INIT_CACHED_VAR(urcu_active_readers[i], 0, j); + read_generation[i] = 1; + data_access[i] = 0; + i++; + :: i >= NR_READERS -> break + od; + init_done = 1; + } +} diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer_error.spin.input.trail b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer_error.spin.input.trail new file mode 100644 index 0000000..e1188eb --- /dev/null +++ b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer_error.spin.input.trail @@ -0,0 +1,3010 @@ +-2:3:-2 +-4:-4:-4 +1:0:2108 +2:3:2060 +3:3:2063 +4:3:2063 +5:3:2066 +6:3:2074 +7:3:2074 +8:3:2077 +9:3:2083 +10:3:2087 +11:3:2087 +12:3:2090 +13:3:2098 +14:3:2102 +15:3:2103 +16:0:2108 +17:3:2105 +18:0:2108 +19:2:416 +20:0:2108 +21:2:422 +22:0:2108 +23:2:423 +24:0:2108 +25:2:424 +26:2:428 +27:2:429 +28:2:437 +29:2:438 +30:2:442 +31:2:443 +32:2:451 +33:2:456 +34:2:460 +35:2:461 +36:2:468 +37:2:469 +38:2:480 +39:2:481 +40:2:482 +41:2:493 +42:2:498 +43:2:499 +44:0:2106 +45:2:511 +46:0:2112 +47:2:513 +48:2:514 +49:0:2112 +50:2:518 +51:2:522 +52:2:523 +53:2:531 +54:2:532 +55:2:536 +56:2:537 +57:2:545 +58:2:550 +59:2:551 +60:2:562 +61:2:563 +62:2:574 +63:2:575 +64:2:576 +65:2:587 +66:2:592 +67:2:593 +68:0:2112 +69:2:605 +70:0:2112 +71:2:607 +72:0:2112 +73:2:608 +74:0:2112 +75:2:618 +76:0:2112 +77:2:622 +78:2:623 +79:2:627 +80:2:631 +81:2:632 +82:2:636 +83:2:644 +84:2:645 +85:2:650 +86:2:657 +87:2:658 +88:2:665 +89:2:670 +90:0:2112 +91:2:681 +92:0:2112 +93:2:685 +94:2:686 +95:2:690 +96:2:694 +97:2:695 +98:2:699 +99:2:707 +100:2:708 +101:2:713 +102:2:720 +103:2:721 +104:2:728 +105:2:733 +106:0:2112 +107:2:744 +108:0:2112 +109:2:752 +110:2:753 +111:2:757 +112:2:761 +113:2:762 +114:2:766 +115:2:774 +116:2:775 +117:2:780 +118:2:787 +119:2:788 +120:2:795 +121:2:800 +122:0:2112 +123:2:811 +124:0:2112 +125:2:813 +126:0:2112 +127:2:814 +128:2:818 +129:2:819 +130:2:827 +131:2:828 +132:2:832 +133:2:833 +134:2:841 +135:2:846 +136:2:850 +137:2:851 +138:2:858 +139:2:859 +140:2:870 +141:2:871 +142:2:872 +143:2:883 +144:2:888 +145:2:889 +146:0:2112 +147:2:901 +148:0:2112 +149:2:903 +150:0:2112 +151:2:906 +152:2:907 +153:2:919 +154:2:920 +155:2:924 +156:2:925 +157:2:933 +158:2:938 +159:2:942 +160:2:943 +161:2:950 +162:2:951 +163:2:962 +164:2:963 +165:2:964 +166:2:975 +167:2:980 +168:2:981 +169:0:2112 +170:2:993 +171:0:2112 +172:2:995 +173:0:2112 +174:2:996 +175:0:2112 +176:2:997 +177:0:2112 +178:2:998 +179:0:2112 +180:2:999 +181:2:1003 +182:2:1004 +183:2:1012 +184:2:1013 +185:2:1017 +186:2:1018 +187:2:1026 +188:2:1031 +189:2:1035 +190:2:1036 +191:2:1043 +192:2:1044 +193:2:1055 +194:2:1056 +195:2:1057 +196:2:1068 +197:2:1073 +198:2:1074 +199:0:2112 +200:2:1086 +201:0:2112 +202:2:1178 +203:0:2112 +204:2:1276 +205:0:2112 +206:2:1277 +207:0:2112 +208:2:1281 +209:0:2112 +210:2:1287 +211:2:1291 +212:2:1292 +213:2:1300 +214:2:1301 +215:2:1305 +216:2:1306 +217:2:1314 +218:2:1319 +219:2:1323 +220:2:1324 +221:2:1331 +222:2:1332 +223:2:1343 +224:2:1344 +225:2:1345 +226:2:1356 +227:2:1361 +228:2:1362 +229:0:2112 +230:2:1374 +231:0:2112 +232:2:1376 +233:0:2112 +234:2:1377 +235:2:1381 +236:2:1382 +237:2:1390 +238:2:1391 +239:2:1395 +240:2:1396 +241:2:1404 +242:2:1409 +243:2:1413 +244:2:1414 +245:2:1421 +246:2:1422 +247:2:1433 +248:2:1434 +249:2:1435 +250:2:1446 +251:2:1451 +252:2:1452 +253:0:2112 +254:2:1464 +255:0:2112 +256:2:1466 +257:0:2112 +258:1:2 +259:0:2112 +260:1:8 +261:0:2112 +262:1:9 +263:0:2112 +264:1:10 +265:0:2112 +266:1:11 +267:0:2112 +268:1:12 +269:1:16 +270:1:17 +271:1:25 +272:1:26 +273:1:30 +274:1:31 +275:1:39 +276:1:44 +277:1:48 +278:1:49 +279:1:56 +280:1:57 +281:1:68 +282:1:69 +283:1:70 +284:1:81 +285:1:86 +286:1:87 +287:0:2112 +288:1:99 +289:0:2112 +290:1:101 +291:0:2112 +292:1:102 +293:1:106 +294:1:107 +295:1:115 +296:1:116 +297:1:120 +298:1:121 +299:1:129 +300:1:134 +301:1:138 +302:1:139 +303:1:146 +304:1:147 +305:1:158 +306:1:159 +307:1:160 +308:1:171 +309:1:176 +310:1:177 +311:0:2112 +312:1:189 +313:0:2112 +314:1:191 +315:0:2112 +316:1:192 +317:0:2112 +318:1:193 +319:1:197 +320:1:198 +321:1:206 +322:1:207 +323:1:211 +324:1:212 +325:1:220 +326:1:225 +327:1:229 +328:1:230 +329:1:237 +330:1:238 +331:1:249 +332:1:250 +333:1:251 +334:1:262 +335:1:267 +336:1:268 +337:0:2112 +338:1:280 +339:0:2112 +340:1:282 +341:0:2112 +342:1:291 +343:0:2112 +344:1:293 +345:0:2112 +346:1:296 +347:0:2112 +348:1:301 +349:0:2112 +350:1:302 +351:0:2112 +352:1:303 +353:0:2112 +354:1:304 +355:0:2112 +356:1:305 +357:0:2112 +358:1:306 +359:0:2112 +360:1:308 +361:0:2112 +362:1:310 +363:0:2112 +364:1:311 +365:1:315 +366:1:316 +367:1:324 +368:1:325 +369:1:326 +370:1:338 +371:1:343 +372:1:347 +373:1:348 +374:1:355 +375:1:356 +376:1:367 +377:1:368 +378:1:369 +379:1:380 +380:1:385 +381:1:386 +382:0:2112 +383:1:398 +384:0:2112 +385:2:1469 +386:2:1470 +387:2:1482 +388:2:1483 +389:2:1487 +390:2:1488 +391:2:1496 +392:2:1501 +393:2:1505 +394:2:1506 +395:2:1513 +396:2:1514 +397:2:1525 +398:2:1526 +399:2:1527 +400:2:1538 +401:2:1543 +402:2:1544 +403:0:2112 +404:2:1556 +405:0:2112 +406:2:1558 +407:0:2112 +408:2:1559 +409:0:2112 +410:2:1560 +411:0:2112 +412:2:1561 +413:0:2112 +414:2:1562 +415:2:1566 +416:2:1567 +417:2:1575 +418:2:1576 +419:2:1580 +420:2:1581 +421:2:1589 +422:2:1594 +423:2:1598 +424:2:1599 +425:2:1606 +426:2:1607 +427:2:1618 +428:2:1619 +429:2:1620 +430:2:1631 +431:2:1636 +432:2:1637 +433:0:2112 +434:2:1649 +435:0:2112 +436:2:1651 +437:0:2112 +438:2:1652 +439:2:1656 +440:2:1657 +441:2:1665 +442:2:1666 +443:2:1670 +444:2:1671 +445:2:1679 +446:2:1684 +447:2:1688 +448:2:1689 +449:2:1696 +450:2:1697 +451:2:1708 +452:2:1709 +453:2:1710 +454:2:1721 +455:2:1726 +456:2:1727 +457:0:2112 +458:2:1739 +459:0:2112 +460:1:400 +461:0:2112 +462:2:1560 +463:0:2112 +464:1:404 +465:0:2112 +466:1:9 +467:0:2112 +468:1:10 +469:0:2112 +470:1:11 +471:0:2112 +472:2:1561 +473:0:2112 +474:2:1562 +475:2:1566 +476:2:1567 +477:2:1575 +478:2:1576 +479:2:1580 +480:2:1581 +481:2:1589 +482:2:1594 +483:2:1598 +484:2:1599 +485:2:1606 +486:2:1607 +487:2:1618 +488:2:1619 +489:2:1620 +490:2:1631 +491:2:1636 +492:2:1637 +493:0:2112 +494:2:1649 +495:0:2112 +496:2:1651 +497:0:2112 +498:2:1652 +499:2:1656 +500:2:1657 +501:2:1665 +502:2:1666 +503:2:1670 +504:2:1671 +505:2:1679 +506:2:1684 +507:2:1688 +508:2:1689 +509:2:1696 +510:2:1697 +511:2:1708 +512:2:1709 +513:2:1710 +514:2:1721 +515:2:1726 +516:2:1727 +517:0:2112 +518:2:1739 +519:0:2112 +520:2:1560 +521:0:2112 +522:1:12 +523:1:16 +524:1:17 +525:1:25 +526:1:26 +527:1:27 +528:1:39 +529:1:44 +530:1:48 +531:1:49 +532:1:56 +533:1:57 +534:1:68 +535:1:69 +536:1:70 +537:1:81 +538:1:86 +539:1:87 +540:0:2112 +541:1:99 +542:0:2112 +543:2:1561 +544:0:2112 +545:2:1562 +546:2:1566 +547:2:1567 +548:2:1575 +549:2:1576 +550:2:1580 +551:2:1581 +552:2:1589 +553:2:1594 +554:2:1598 +555:2:1599 +556:2:1606 +557:2:1607 +558:2:1618 +559:2:1626 +560:2:1627 +561:2:1631 +562:2:1636 +563:2:1637 +564:0:2112 +565:2:1649 +566:0:2112 +567:2:1651 +568:0:2112 +569:2:1652 +570:2:1656 +571:2:1657 +572:2:1665 +573:2:1666 +574:2:1670 +575:2:1671 +576:2:1679 +577:2:1684 +578:2:1688 +579:2:1689 +580:2:1696 +581:2:1697 +582:2:1708 +583:2:1716 +584:2:1717 +585:2:1721 +586:2:1726 +587:2:1727 +588:0:2112 +589:2:1739 +590:0:2112 +591:2:1560 +592:0:2112 +593:1:101 +594:0:2112 +595:2:1561 +596:0:2112 +597:2:1562 +598:2:1566 +599:2:1567 +600:2:1575 +601:2:1576 +602:2:1580 +603:2:1581 +604:2:1589 +605:2:1594 +606:2:1598 +607:2:1599 +608:2:1606 +609:2:1607 +610:2:1618 +611:2:1626 +612:2:1627 +613:2:1631 +614:2:1636 +615:2:1637 +616:0:2112 +617:2:1649 +618:0:2112 +619:2:1651 +620:0:2112 +621:2:1652 +622:2:1656 +623:2:1657 +624:2:1665 +625:2:1666 +626:2:1670 +627:2:1671 +628:2:1679 +629:2:1684 +630:2:1688 +631:2:1689 +632:2:1696 +633:2:1697 +634:2:1708 +635:2:1716 +636:2:1717 +637:2:1721 +638:2:1726 +639:2:1727 +640:0:2112 +641:2:1739 +642:0:2112 +643:2:1560 +644:0:2112 +645:1:102 +646:1:106 +647:1:107 +648:1:115 +649:1:116 +650:1:120 +651:1:121 +652:1:129 +653:1:134 +654:1:138 +655:1:139 +656:1:146 +657:1:147 +658:1:158 +659:1:159 +660:1:160 +661:1:171 +662:1:176 +663:1:177 +664:0:2112 +665:1:189 +666:0:2112 +667:1:191 +668:0:2112 +669:2:1561 +670:0:2112 +671:2:1562 +672:2:1566 +673:2:1567 +674:2:1575 +675:2:1576 +676:2:1580 +677:2:1581 +678:2:1589 +679:2:1594 +680:2:1598 +681:2:1599 +682:2:1606 +683:2:1607 +684:2:1618 +685:2:1626 +686:2:1627 +687:2:1631 +688:2:1636 +689:2:1637 +690:0:2112 +691:2:1649 +692:0:2112 +693:2:1651 +694:0:2112 +695:2:1652 +696:2:1656 +697:2:1657 +698:2:1665 +699:2:1666 +700:2:1670 +701:2:1671 +702:2:1679 +703:2:1684 +704:2:1688 +705:2:1689 +706:2:1696 +707:2:1697 +708:2:1708 +709:2:1716 +710:2:1717 +711:2:1721 +712:2:1726 +713:2:1727 +714:0:2112 +715:2:1739 +716:0:2112 +717:2:1560 +718:0:2112 +719:1:192 +720:0:2112 +721:2:1561 +722:0:2112 +723:2:1562 +724:2:1566 +725:2:1567 +726:2:1575 +727:2:1576 +728:2:1580 +729:2:1581 +730:2:1589 +731:2:1594 +732:2:1598 +733:2:1599 +734:2:1606 +735:2:1607 +736:2:1618 +737:2:1626 +738:2:1627 +739:2:1631 +740:2:1636 +741:2:1637 +742:0:2112 +743:2:1649 +744:0:2112 +745:2:1651 +746:0:2112 +747:2:1652 +748:2:1656 +749:2:1657 +750:2:1665 +751:2:1666 +752:2:1670 +753:2:1671 +754:2:1679 +755:2:1684 +756:2:1688 +757:2:1689 +758:2:1696 +759:2:1697 +760:2:1708 +761:2:1716 +762:2:1717 +763:2:1721 +764:2:1726 +765:2:1727 +766:0:2112 +767:2:1739 +768:0:2112 +769:2:1560 +770:0:2112 +771:1:193 +772:1:197 +773:1:198 +774:1:206 +775:1:207 +776:1:211 +777:1:212 +778:1:220 +779:1:225 +780:1:229 +781:1:230 +782:1:237 +783:1:238 +784:1:249 +785:1:250 +786:1:251 +787:1:262 +788:1:267 +789:1:268 +790:0:2112 +791:1:280 +792:0:2112 +793:2:1561 +794:0:2112 +795:2:1562 +796:2:1566 +797:2:1567 +798:2:1575 +799:2:1576 +800:2:1580 +801:2:1581 +802:2:1589 +803:2:1594 +804:2:1598 +805:2:1599 +806:2:1606 +807:2:1607 +808:2:1618 +809:2:1626 +810:2:1627 +811:2:1631 +812:2:1636 +813:2:1637 +814:0:2112 +815:2:1649 +816:0:2112 +817:2:1651 +818:0:2112 +819:2:1652 +820:2:1656 +821:2:1657 +822:2:1665 +823:2:1666 +824:2:1670 +825:2:1671 +826:2:1679 +827:2:1684 +828:2:1688 +829:2:1689 +830:2:1696 +831:2:1697 +832:2:1708 +833:2:1716 +834:2:1717 +835:2:1721 +836:2:1726 +837:2:1727 +838:0:2112 +839:2:1739 +840:0:2112 +841:2:1560 +842:0:2112 +843:1:282 +844:0:2112 +845:1:291 +846:0:2112 +847:1:293 +848:0:2112 +849:1:296 +850:0:2112 +851:2:1561 +852:0:2112 +853:2:1562 +854:2:1566 +855:2:1567 +856:2:1575 +857:2:1576 +858:2:1580 +859:2:1581 +860:2:1589 +861:2:1594 +862:2:1598 +863:2:1599 +864:2:1606 +865:2:1607 +866:2:1618 +867:2:1626 +868:2:1627 +869:2:1631 +870:2:1636 +871:2:1637 +872:0:2112 +873:2:1649 +874:0:2112 +875:2:1651 +876:0:2112 +877:2:1652 +878:2:1656 +879:2:1657 +880:2:1665 +881:2:1666 +882:2:1670 +883:2:1671 +884:2:1679 +885:2:1684 +886:2:1688 +887:2:1689 +888:2:1696 +889:2:1697 +890:2:1708 +891:2:1716 +892:2:1717 +893:2:1721 +894:2:1726 +895:2:1727 +896:0:2112 +897:2:1739 +898:0:2112 +899:2:1560 +900:0:2112 +901:1:301 +902:0:2112 +903:2:1561 +904:0:2112 +905:2:1562 +906:2:1566 +907:2:1567 +908:2:1575 +909:2:1576 +910:2:1580 +911:2:1581 +912:2:1589 +913:2:1594 +914:2:1598 +915:2:1599 +916:2:1606 +917:2:1607 +918:2:1618 +919:2:1626 +920:2:1627 +921:2:1631 +922:2:1636 +923:2:1637 +924:0:2112 +925:2:1649 +926:0:2112 +927:2:1651 +928:0:2112 +929:2:1652 +930:2:1656 +931:2:1657 +932:2:1665 +933:2:1666 +934:2:1670 +935:2:1671 +936:2:1679 +937:2:1684 +938:2:1688 +939:2:1689 +940:2:1696 +941:2:1697 +942:2:1708 +943:2:1716 +944:2:1717 +945:2:1721 +946:2:1726 +947:2:1727 +948:0:2112 +949:2:1739 +950:0:2112 +951:2:1560 +952:0:2112 +953:1:302 +954:0:2112 +955:2:1561 +956:0:2112 +957:2:1562 +958:2:1566 +959:2:1567 +960:2:1575 +961:2:1576 +962:2:1580 +963:2:1581 +964:2:1589 +965:2:1594 +966:2:1598 +967:2:1599 +968:2:1606 +969:2:1607 +970:2:1618 +971:2:1626 +972:2:1627 +973:2:1631 +974:2:1636 +975:2:1637 +976:0:2112 +977:2:1649 +978:0:2112 +979:2:1651 +980:0:2112 +981:2:1652 +982:2:1656 +983:2:1657 +984:2:1665 +985:2:1666 +986:2:1670 +987:2:1671 +988:2:1679 +989:2:1684 +990:2:1688 +991:2:1689 +992:2:1696 +993:2:1697 +994:2:1708 +995:2:1716 +996:2:1717 +997:2:1721 +998:2:1726 +999:2:1727 +1000:0:2112 +1001:2:1739 +1002:0:2112 +1003:2:1560 +1004:0:2112 +1005:1:303 +1006:0:2112 +1007:1:304 +1008:0:2112 +1009:1:305 +1010:0:2112 +1011:1:306 +1012:0:2112 +1013:1:308 +1014:0:2112 +1015:2:1561 +1016:0:2112 +1017:2:1562 +1018:2:1566 +1019:2:1567 +1020:2:1575 +1021:2:1576 +1022:2:1580 +1023:2:1581 +1024:2:1589 +1025:2:1594 +1026:2:1598 +1027:2:1599 +1028:2:1606 +1029:2:1607 +1030:2:1618 +1031:2:1626 +1032:2:1627 +1033:2:1631 +1034:2:1636 +1035:2:1637 +1036:0:2112 +1037:2:1649 +1038:0:2112 +1039:2:1651 +1040:0:2112 +1041:2:1652 +1042:2:1656 +1043:2:1657 +1044:2:1665 +1045:2:1666 +1046:2:1670 +1047:2:1671 +1048:2:1679 +1049:2:1684 +1050:2:1688 +1051:2:1689 +1052:2:1696 +1053:2:1697 +1054:2:1708 +1055:2:1716 +1056:2:1717 +1057:2:1721 +1058:2:1726 +1059:2:1727 +1060:0:2112 +1061:2:1739 +1062:0:2112 +1063:2:1560 +1064:0:2112 +1065:1:310 +1066:0:2112 +1067:2:1561 +1068:0:2112 +1069:2:1562 +1070:2:1566 +1071:2:1567 +1072:2:1575 +1073:2:1576 +1074:2:1580 +1075:2:1581 +1076:2:1589 +1077:2:1594 +1078:2:1598 +1079:2:1599 +1080:2:1606 +1081:2:1607 +1082:2:1618 +1083:2:1626 +1084:2:1627 +1085:2:1631 +1086:2:1636 +1087:2:1637 +1088:0:2112 +1089:2:1649 +1090:0:2112 +1091:2:1651 +1092:0:2112 +1093:2:1652 +1094:2:1656 +1095:2:1657 +1096:2:1665 +1097:2:1666 +1098:2:1670 +1099:2:1671 +1100:2:1679 +1101:2:1684 +1102:2:1688 +1103:2:1689 +1104:2:1696 +1105:2:1697 +1106:2:1708 +1107:2:1716 +1108:2:1717 +1109:2:1721 +1110:2:1726 +1111:2:1727 +1112:0:2112 +1113:2:1739 +1114:0:2112 +1115:2:1560 +1116:0:2112 +1117:1:311 +1118:1:315 +1119:1:316 +1120:1:324 +1121:1:325 +1122:1:326 +1123:1:338 +1124:1:343 +1125:1:347 +1126:1:348 +1127:1:355 +1128:1:356 +1129:1:367 +1130:1:368 +1131:1:369 +1132:1:380 +1133:1:385 +1134:1:386 +1135:0:2112 +1136:1:398 +1137:0:2112 +1138:2:1561 +1139:0:2112 +1140:2:1562 +1141:2:1566 +1142:2:1567 +1143:2:1575 +1144:2:1576 +1145:2:1580 +1146:2:1581 +1147:2:1589 +1148:2:1594 +1149:2:1598 +1150:2:1599 +1151:2:1606 +1152:2:1607 +1153:2:1618 +1154:2:1626 +1155:2:1627 +1156:2:1631 +1157:2:1636 +1158:2:1637 +1159:0:2112 +1160:2:1649 +1161:0:2112 +1162:2:1651 +1163:0:2112 +1164:2:1652 +1165:2:1656 +1166:2:1657 +1167:2:1665 +1168:2:1666 +1169:2:1670 +1170:2:1671 +1171:2:1679 +1172:2:1684 +1173:2:1688 +1174:2:1689 +1175:2:1696 +1176:2:1697 +1177:2:1708 +1178:2:1716 +1179:2:1717 +1180:2:1721 +1181:2:1726 +1182:2:1727 +1183:0:2112 +1184:2:1739 +1185:0:2112 +1186:2:1560 +1187:0:2112 +1188:1:400 +1189:0:2112 +1190:1:404 +1191:0:2112 +1192:1:9 +1193:0:2112 +1194:1:10 +1195:0:2112 +1196:1:11 +1197:0:2112 +1198:2:1561 +1199:0:2112 +1200:2:1562 +1201:2:1566 +1202:2:1567 +1203:2:1575 +1204:2:1576 +1205:2:1580 +1206:2:1581 +1207:2:1589 +1208:2:1594 +1209:2:1598 +1210:2:1599 +1211:2:1606 +1212:2:1607 +1213:2:1618 +1214:2:1626 +1215:2:1627 +1216:2:1631 +1217:2:1636 +1218:2:1637 +1219:0:2112 +1220:2:1649 +1221:0:2112 +1222:2:1651 +1223:0:2112 +1224:2:1652 +1225:2:1656 +1226:2:1657 +1227:2:1665 +1228:2:1666 +1229:2:1670 +1230:2:1671 +1231:2:1679 +1232:2:1684 +1233:2:1688 +1234:2:1689 +1235:2:1696 +1236:2:1697 +1237:2:1708 +1238:2:1716 +1239:2:1717 +1240:2:1721 +1241:2:1726 +1242:2:1727 +1243:0:2112 +1244:2:1739 +1245:0:2112 +1246:2:1560 +1247:0:2112 +1248:1:12 +1249:1:16 +1250:1:17 +1251:1:25 +1252:1:26 +1253:1:27 +1254:1:39 +1255:1:44 +1256:1:48 +1257:1:49 +1258:1:56 +1259:1:57 +1260:1:68 +1261:1:69 +1262:1:70 +1263:1:81 +1264:1:86 +1265:1:87 +1266:0:2112 +1267:1:99 +1268:0:2112 +1269:2:1561 +1270:0:2112 +1271:2:1562 +1272:2:1566 +1273:2:1567 +1274:2:1575 +1275:2:1576 +1276:2:1580 +1277:2:1581 +1278:2:1589 +1279:2:1594 +1280:2:1598 +1281:2:1599 +1282:2:1606 +1283:2:1607 +1284:2:1618 +1285:2:1626 +1286:2:1627 +1287:2:1631 +1288:2:1636 +1289:2:1637 +1290:0:2112 +1291:2:1649 +1292:0:2112 +1293:2:1651 +1294:0:2112 +1295:2:1652 +1296:2:1656 +1297:2:1657 +1298:2:1665 +1299:2:1666 +1300:2:1670 +1301:2:1671 +1302:2:1679 +1303:2:1684 +1304:2:1688 +1305:2:1689 +1306:2:1696 +1307:2:1697 +1308:2:1708 +1309:2:1716 +1310:2:1717 +1311:2:1721 +1312:2:1726 +1313:2:1727 +1314:0:2112 +1315:2:1739 +1316:0:2112 +1317:2:1560 +1318:0:2112 +1319:1:101 +1320:0:2112 +1321:2:1561 +1322:0:2112 +1323:2:1562 +1324:2:1566 +1325:2:1567 +1326:2:1575 +1327:2:1576 +1328:2:1580 +1329:2:1581 +1330:2:1589 +1331:2:1594 +1332:2:1598 +1333:2:1599 +1334:2:1606 +1335:2:1607 +1336:2:1618 +1337:2:1626 +1338:2:1627 +1339:2:1631 +1340:2:1636 +1341:2:1637 +1342:0:2112 +1343:2:1649 +1344:0:2112 +1345:2:1651 +1346:0:2112 +1347:2:1652 +1348:2:1656 +1349:2:1657 +1350:2:1665 +1351:2:1666 +1352:2:1670 +1353:2:1671 +1354:2:1679 +1355:2:1684 +1356:2:1688 +1357:2:1689 +1358:2:1696 +1359:2:1697 +1360:2:1708 +1361:2:1716 +1362:2:1717 +1363:2:1721 +1364:2:1726 +1365:2:1727 +1366:0:2112 +1367:2:1739 +1368:0:2112 +1369:2:1560 +1370:0:2112 +1371:1:102 +1372:1:106 +1373:1:107 +1374:1:115 +1375:1:116 +1376:1:120 +1377:1:121 +1378:1:129 +1379:1:134 +1380:1:138 +1381:1:139 +1382:1:146 +1383:1:147 +1384:1:158 +1385:1:159 +1386:1:160 +1387:1:171 +1388:1:176 +1389:1:177 +1390:0:2112 +1391:1:189 +1392:0:2112 +1393:1:191 +1394:0:2112 +1395:2:1561 +1396:0:2112 +1397:2:1562 +1398:2:1566 +1399:2:1567 +1400:2:1575 +1401:2:1576 +1402:2:1580 +1403:2:1581 +1404:2:1589 +1405:2:1594 +1406:2:1598 +1407:2:1599 +1408:2:1606 +1409:2:1607 +1410:2:1618 +1411:2:1626 +1412:2:1627 +1413:2:1631 +1414:2:1636 +1415:2:1637 +1416:0:2112 +1417:2:1649 +1418:0:2112 +1419:2:1651 +1420:0:2112 +1421:2:1652 +1422:2:1656 +1423:2:1657 +1424:2:1665 +1425:2:1666 +1426:2:1670 +1427:2:1671 +1428:2:1679 +1429:2:1684 +1430:2:1688 +1431:2:1689 +1432:2:1696 +1433:2:1697 +1434:2:1708 +1435:2:1716 +1436:2:1717 +1437:2:1721 +1438:2:1726 +1439:2:1727 +1440:0:2112 +1441:2:1739 +1442:0:2112 +1443:2:1560 +1444:0:2112 +1445:1:192 +1446:0:2112 +1447:2:1561 +1448:0:2112 +1449:2:1562 +1450:2:1566 +1451:2:1567 +1452:2:1575 +1453:2:1576 +1454:2:1580 +1455:2:1581 +1456:2:1589 +1457:2:1594 +1458:2:1598 +1459:2:1599 +1460:2:1606 +1461:2:1607 +1462:2:1618 +1463:2:1626 +1464:2:1627 +1465:2:1631 +1466:2:1636 +1467:2:1637 +1468:0:2112 +1469:2:1649 +1470:0:2112 +1471:2:1651 +1472:0:2112 +1473:2:1652 +1474:2:1656 +1475:2:1657 +1476:2:1665 +1477:2:1666 +1478:2:1670 +1479:2:1671 +1480:2:1679 +1481:2:1684 +1482:2:1688 +1483:2:1689 +1484:2:1696 +1485:2:1697 +1486:2:1708 +1487:2:1716 +1488:2:1717 +1489:2:1721 +1490:2:1726 +1491:2:1727 +1492:0:2112 +1493:2:1739 +1494:0:2112 +1495:2:1560 +1496:0:2112 +1497:1:193 +1498:1:197 +1499:1:198 +1500:1:206 +1501:1:207 +1502:1:211 +1503:1:212 +1504:1:220 +1505:1:225 +1506:1:229 +1507:1:230 +1508:1:237 +1509:1:238 +1510:1:249 +1511:1:250 +1512:1:251 +1513:1:262 +1514:1:267 +1515:1:268 +1516:0:2112 +1517:1:280 +1518:0:2112 +1519:2:1561 +1520:0:2112 +1521:2:1562 +1522:2:1566 +1523:2:1567 +1524:2:1575 +1525:2:1576 +1526:2:1580 +1527:2:1581 +1528:2:1589 +1529:2:1594 +1530:2:1598 +1531:2:1599 +1532:2:1606 +1533:2:1607 +1534:2:1618 +1535:2:1626 +1536:2:1627 +1537:2:1631 +1538:2:1636 +1539:2:1637 +1540:0:2112 +1541:2:1649 +1542:0:2112 +1543:2:1651 +1544:0:2112 +1545:2:1652 +1546:2:1656 +1547:2:1657 +1548:2:1665 +1549:2:1666 +1550:2:1670 +1551:2:1671 +1552:2:1679 +1553:2:1684 +1554:2:1688 +1555:2:1689 +1556:2:1696 +1557:2:1697 +1558:2:1708 +1559:2:1716 +1560:2:1717 +1561:2:1721 +1562:2:1726 +1563:2:1727 +1564:0:2112 +1565:2:1739 +1566:0:2112 +1567:2:1560 +1568:0:2112 +1569:1:282 +1570:0:2112 +1571:1:291 +1572:0:2112 +1573:1:293 +1574:0:2112 +1575:1:296 +1576:0:2112 +1577:2:1561 +1578:0:2112 +1579:2:1562 +1580:2:1566 +1581:2:1567 +1582:2:1575 +1583:2:1576 +1584:2:1580 +1585:2:1581 +1586:2:1589 +1587:2:1594 +1588:2:1598 +1589:2:1599 +1590:2:1606 +1591:2:1607 +1592:2:1618 +1593:2:1626 +1594:2:1627 +1595:2:1631 +1596:2:1636 +1597:2:1637 +1598:0:2112 +1599:2:1649 +1600:0:2112 +1601:2:1651 +1602:0:2112 +1603:2:1652 +1604:2:1656 +1605:2:1657 +1606:2:1665 +1607:2:1666 +1608:2:1670 +1609:2:1671 +1610:2:1679 +1611:2:1684 +1612:2:1688 +1613:2:1689 +1614:2:1696 +1615:2:1697 +1616:2:1708 +1617:2:1716 +1618:2:1717 +1619:2:1721 +1620:2:1726 +1621:2:1727 +1622:0:2112 +1623:2:1739 +1624:0:2112 +1625:2:1560 +1626:0:2112 +1627:1:301 +1628:0:2112 +1629:2:1561 +1630:0:2112 +1631:2:1562 +1632:2:1566 +1633:2:1567 +1634:2:1575 +1635:2:1576 +1636:2:1580 +1637:2:1581 +1638:2:1589 +1639:2:1594 +1640:2:1598 +1641:2:1599 +1642:2:1606 +1643:2:1607 +1644:2:1618 +1645:2:1626 +1646:2:1627 +1647:2:1631 +1648:2:1636 +1649:2:1637 +1650:0:2112 +1651:2:1649 +-1:-1:-1 +1652:0:2112 +1653:2:1651 +1654:0:2112 +1655:2:1652 +1656:2:1656 +1657:2:1657 +1658:2:1665 +1659:2:1666 +1660:2:1670 +1661:2:1671 +1662:2:1679 +1663:2:1684 +1664:2:1688 +1665:2:1689 +1666:2:1696 +1667:2:1697 +1668:2:1708 +1669:2:1716 +1670:2:1717 +1671:2:1721 +1672:2:1726 +1673:2:1727 +1674:0:2112 +1675:2:1739 +1676:0:2112 +1677:2:1560 +1678:0:2112 +1679:1:302 +1680:0:2112 +1681:2:1561 +1682:0:2112 +1683:2:1562 +1684:2:1566 +1685:2:1567 +1686:2:1575 +1687:2:1576 +1688:2:1580 +1689:2:1581 +1690:2:1589 +1691:2:1594 +1692:2:1598 +1693:2:1599 +1694:2:1606 +1695:2:1607 +1696:2:1618 +1697:2:1626 +1698:2:1627 +1699:2:1631 +1700:2:1636 +1701:2:1637 +1702:0:2112 +1703:2:1649 +1704:0:2112 +1705:2:1651 +1706:0:2112 +1707:2:1652 +1708:2:1656 +1709:2:1657 +1710:2:1665 +1711:2:1666 +1712:2:1670 +1713:2:1671 +1714:2:1679 +1715:2:1684 +1716:2:1688 +1717:2:1689 +1718:2:1696 +1719:2:1697 +1720:2:1708 +1721:2:1716 +1722:2:1717 +1723:2:1721 +1724:2:1726 +1725:2:1727 +1726:0:2112 +1727:2:1739 +1728:0:2112 +1729:2:1560 +1730:0:2112 +1731:1:303 +1732:0:2112 +1733:1:304 +1734:0:2112 +1735:1:305 +1736:0:2112 +1737:1:306 +1738:0:2112 +1739:1:308 +1740:0:2112 +1741:2:1561 +1742:0:2112 +1743:2:1562 +1744:2:1566 +1745:2:1567 +1746:2:1575 +1747:2:1576 +1748:2:1580 +1749:2:1581 +1750:2:1589 +1751:2:1594 +1752:2:1598 +1753:2:1599 +1754:2:1606 +1755:2:1607 +1756:2:1618 +1757:2:1626 +1758:2:1627 +1759:2:1631 +1760:2:1636 +1761:2:1637 +1762:0:2112 +1763:2:1649 +1764:0:2112 +1765:2:1651 +1766:0:2112 +1767:2:1652 +1768:2:1656 +1769:2:1657 +1770:2:1665 +1771:2:1666 +1772:2:1670 +1773:2:1671 +1774:2:1679 +1775:2:1684 +1776:2:1688 +1777:2:1689 +1778:2:1696 +1779:2:1697 +1780:2:1708 +1781:2:1716 +1782:2:1717 +1783:2:1721 +1784:2:1726 +1785:2:1727 +1786:0:2112 +1787:2:1739 +1788:0:2112 +1789:2:1560 +1790:0:2112 +1791:1:310 +1792:0:2112 +1793:2:1561 +1794:0:2112 +1795:2:1562 +1796:2:1566 +1797:2:1567 +1798:2:1575 +1799:2:1576 +1800:2:1580 +1801:2:1581 +1802:2:1589 +1803:2:1594 +1804:2:1598 +1805:2:1599 +1806:2:1606 +1807:2:1607 +1808:2:1618 +1809:2:1626 +1810:2:1627 +1811:2:1631 +1812:2:1636 +1813:2:1637 +1814:0:2112 +1815:2:1649 +1816:0:2112 +1817:2:1651 +1818:0:2112 +1819:2:1652 +1820:2:1656 +1821:2:1657 +1822:2:1665 +1823:2:1666 +1824:2:1670 +1825:2:1671 +1826:2:1679 +1827:2:1684 +1828:2:1688 +1829:2:1689 +1830:2:1696 +1831:2:1697 +1832:2:1708 +1833:2:1716 +1834:2:1717 +1835:2:1721 +1836:2:1726 +1837:2:1727 +1838:0:2112 +1839:2:1739 +1840:0:2112 +1841:2:1560 +1842:0:2112 +1843:1:311 +1844:1:315 +1845:1:316 +1846:1:324 +1847:1:333 +1848:1:334 +1849:1:338 +1850:1:343 +1851:1:347 +1852:1:348 +1853:1:355 +1854:1:356 +1855:1:367 +1856:1:368 +1857:1:371 +1858:1:372 +1859:1:380 +1860:1:385 +1861:1:386 +1862:0:2112 +1863:1:398 +1864:0:2112 +1865:2:1561 +1866:0:2112 +1867:2:1562 +1868:2:1566 +1869:2:1567 +1870:2:1575 +1871:2:1576 +1872:2:1580 +1873:2:1581 +1874:2:1589 +1875:2:1594 +1876:2:1598 +1877:2:1599 +1878:2:1606 +1879:2:1607 +1880:2:1618 +1881:2:1626 +1882:2:1627 +1883:2:1631 +1884:2:1636 +1885:2:1637 +1886:0:2112 +1887:2:1649 +1888:0:2112 +1889:2:1651 +1890:0:2112 +1891:2:1652 +1892:2:1656 +1893:2:1657 +1894:2:1665 +1895:2:1666 +1896:2:1670 +1897:2:1671 +1898:2:1679 +1899:2:1684 +1900:2:1688 +1901:2:1689 +1902:2:1696 +1903:2:1697 +1904:2:1708 +1905:2:1716 +1906:2:1717 +1907:2:1721 +1908:2:1726 +1909:2:1727 +1910:0:2112 +1911:2:1739 +1912:0:2112 +1913:2:1560 +1914:0:2112 +1915:1:400 +1916:0:2112 +1917:1:404 +1918:0:2112 +1919:1:9 +1920:0:2112 +1921:1:10 +1922:0:2112 +1923:1:11 +1924:0:2112 +1925:2:1561 +1926:0:2112 +1927:2:1562 +1928:2:1566 +1929:2:1567 +1930:2:1575 +1931:2:1576 +1932:2:1580 +1933:2:1581 +1934:2:1589 +1935:2:1594 +1936:2:1598 +1937:2:1599 +1938:2:1606 +1939:2:1607 +1940:2:1618 +1941:2:1626 +1942:2:1627 +1943:2:1631 +1944:2:1636 +1945:2:1637 +1946:0:2112 +1947:2:1649 +1948:0:2112 +1949:2:1651 +1950:0:2112 +1951:2:1652 +1952:2:1656 +1953:2:1657 +1954:2:1665 +1955:2:1666 +1956:2:1670 +1957:2:1671 +1958:2:1679 +1959:2:1684 +1960:2:1688 +1961:2:1689 +1962:2:1696 +1963:2:1697 +1964:2:1708 +1965:2:1716 +1966:2:1717 +1967:2:1721 +1968:2:1726 +1969:2:1727 +1970:0:2112 +1971:2:1739 +1972:0:2112 +1973:2:1560 +1974:0:2112 +1975:1:12 +1976:1:16 +1977:1:17 +1978:1:25 +1979:1:34 +1980:1:35 +1981:1:39 +1982:1:44 +1983:1:48 +1984:1:49 +1985:1:56 +1986:1:57 +1987:1:68 +1988:1:69 +1989:1:72 +1990:1:73 +1991:1:81 +1992:1:86 +1993:1:87 +1994:0:2112 +1995:1:99 +1996:0:2112 +1997:2:1561 +1998:0:2112 +1999:2:1562 +2000:2:1566 +2001:2:1567 +2002:2:1575 +2003:2:1576 +2004:2:1580 +2005:2:1581 +2006:2:1589 +2007:2:1594 +2008:2:1598 +2009:2:1599 +2010:2:1606 +2011:2:1607 +2012:2:1618 +2013:2:1626 +2014:2:1627 +2015:2:1631 +2016:2:1636 +2017:2:1637 +2018:0:2112 +2019:2:1649 +2020:0:2112 +2021:2:1651 +2022:0:2112 +2023:2:1652 +2024:2:1656 +2025:2:1657 +2026:2:1665 +2027:2:1666 +2028:2:1670 +2029:2:1671 +2030:2:1679 +2031:2:1684 +2032:2:1688 +2033:2:1689 +2034:2:1696 +2035:2:1697 +2036:2:1708 +2037:2:1716 +2038:2:1717 +2039:2:1721 +2040:2:1726 +2041:2:1727 +2042:0:2112 +2043:2:1739 +2044:0:2112 +2045:2:1560 +2046:0:2112 +2047:1:101 +2048:0:2112 +2049:2:1561 +2050:0:2112 +2051:2:1562 +2052:2:1566 +2053:2:1567 +2054:2:1575 +2055:2:1576 +2056:2:1580 +2057:2:1581 +2058:2:1589 +2059:2:1594 +2060:2:1598 +2061:2:1599 +2062:2:1606 +2063:2:1607 +2064:2:1618 +2065:2:1626 +2066:2:1627 +2067:2:1631 +2068:2:1636 +2069:2:1637 +2070:0:2112 +2071:2:1649 +2072:0:2112 +2073:2:1651 +2074:0:2112 +2075:2:1652 +2076:2:1656 +2077:2:1657 +2078:2:1665 +2079:2:1666 +2080:2:1670 +2081:2:1671 +2082:2:1679 +2083:2:1684 +2084:2:1688 +2085:2:1689 +2086:2:1696 +2087:2:1697 +2088:2:1708 +2089:2:1716 +2090:2:1717 +2091:2:1721 +2092:2:1726 +2093:2:1727 +2094:0:2112 +2095:2:1739 +2096:0:2112 +2097:2:1560 +2098:0:2112 +2099:1:102 +2100:1:106 +2101:1:107 +2102:1:115 +2103:1:124 +2104:1:125 +2105:1:129 +2106:1:134 +2107:1:138 +2108:1:139 +2109:1:146 +2110:1:147 +2111:1:158 +2112:1:159 +2113:1:162 +2114:1:163 +2115:1:171 +2116:1:176 +2117:1:177 +2118:0:2112 +2119:1:189 +2120:0:2112 +2121:1:191 +2122:0:2112 +2123:2:1561 +2124:0:2112 +2125:2:1562 +2126:2:1566 +2127:2:1567 +2128:2:1575 +2129:2:1576 +2130:2:1580 +2131:2:1581 +2132:2:1589 +2133:2:1594 +2134:2:1598 +2135:2:1599 +2136:2:1606 +2137:2:1607 +2138:2:1618 +2139:2:1626 +2140:2:1627 +2141:2:1631 +2142:2:1636 +2143:2:1637 +2144:0:2112 +2145:2:1649 +2146:0:2112 +2147:2:1651 +2148:0:2112 +2149:2:1652 +2150:2:1656 +2151:2:1657 +2152:2:1665 +2153:2:1666 +2154:2:1670 +2155:2:1671 +2156:2:1679 +2157:2:1684 +2158:2:1688 +2159:2:1689 +2160:2:1696 +2161:2:1697 +2162:2:1708 +2163:2:1716 +2164:2:1717 +2165:2:1721 +2166:2:1726 +2167:2:1727 +2168:0:2112 +2169:2:1739 +2170:0:2112 +2171:2:1560 +2172:0:2112 +2173:1:192 +2174:0:2112 +2175:2:1561 +2176:0:2112 +2177:2:1562 +2178:2:1566 +2179:2:1567 +2180:2:1575 +2181:2:1576 +2182:2:1580 +2183:2:1581 +2184:2:1589 +2185:2:1594 +2186:2:1598 +2187:2:1599 +2188:2:1606 +2189:2:1607 +2190:2:1618 +2191:2:1626 +2192:2:1627 +2193:2:1631 +2194:2:1636 +2195:2:1637 +2196:0:2112 +2197:2:1649 +2198:0:2112 +2199:2:1651 +2200:0:2112 +2201:2:1652 +2202:2:1656 +2203:2:1657 +2204:2:1665 +2205:2:1666 +2206:2:1670 +2207:2:1671 +2208:2:1679 +2209:2:1684 +2210:2:1688 +2211:2:1689 +2212:2:1696 +2213:2:1697 +2214:2:1708 +2215:2:1716 +2216:2:1717 +2217:2:1721 +2218:2:1726 +2219:2:1727 +2220:0:2112 +2221:2:1739 +2222:0:2112 +2223:2:1560 +2224:0:2112 +2225:1:193 +2226:1:197 +2227:1:198 +2228:1:206 +2229:1:215 +2230:1:216 +2231:1:220 +2232:1:225 +2233:1:229 +2234:1:230 +2235:1:237 +2236:1:238 +2237:1:249 +2238:1:250 +2239:1:253 +2240:1:254 +2241:1:262 +2242:1:267 +2243:1:268 +2244:0:2112 +2245:1:280 +2246:0:2112 +2247:2:1561 +2248:0:2112 +2249:2:1562 +2250:2:1566 +2251:2:1567 +2252:2:1575 +2253:2:1576 +2254:2:1580 +2255:2:1581 +2256:2:1589 +2257:2:1594 +2258:2:1598 +2259:2:1599 +2260:2:1606 +2261:2:1607 +2262:2:1618 +2263:2:1626 +2264:2:1627 +2265:2:1631 +2266:2:1636 +2267:2:1637 +2268:0:2112 +2269:2:1649 +2270:0:2112 +2271:2:1651 +2272:0:2112 +2273:1:282 +2274:0:2112 +2275:1:291 +2276:0:2112 +2277:1:293 +2278:0:2112 +2279:1:296 +2280:0:2112 +2281:1:301 +2282:0:2112 +2283:1:302 +2284:0:2112 +2285:1:303 +2286:0:2112 +2287:1:304 +2288:0:2112 +2289:1:305 +2290:0:2112 +2291:1:306 +2292:0:2112 +2293:1:308 +2294:0:2112 +2295:1:310 +2296:0:2112 +2297:1:311 +2298:1:315 +2299:1:316 +2300:1:324 +2301:1:325 +2302:1:326 +2303:1:338 +2304:1:343 +2305:1:347 +2306:1:348 +2307:1:355 +2308:1:356 +2309:1:367 +2310:1:368 +2311:1:369 +2312:1:380 +2313:1:385 +2314:1:386 +2315:0:2112 +2316:1:398 +2317:0:2112 +2318:1:400 +2319:0:2112 +2320:1:404 +2321:0:2112 +2322:1:9 +2323:0:2112 +2324:1:10 +2325:0:2112 +2326:1:11 +2327:0:2112 +2328:1:12 +2329:1:16 +2330:1:17 +2331:1:25 +2332:1:26 +2333:1:27 +2334:1:39 +2335:1:44 +2336:1:48 +2337:1:49 +2338:1:56 +2339:1:57 +2340:1:68 +2341:1:69 +2342:1:70 +2343:1:81 +2344:1:86 +2345:1:87 +2346:0:2112 +2347:1:99 +2348:0:2112 +2349:1:101 +2350:0:2112 +2351:1:102 +2352:1:106 +2353:1:107 +2354:1:115 +2355:1:116 +2356:1:120 +2357:1:121 +2358:1:129 +2359:1:134 +2360:1:138 +2361:1:139 +2362:1:146 +2363:1:147 +2364:1:158 +2365:1:159 +2366:1:160 +2367:1:171 +2368:1:176 +2369:1:177 +2370:0:2112 +2371:1:189 +2372:0:2112 +2373:1:191 +2374:0:2112 +2375:1:192 +2376:0:2112 +2377:1:193 +2378:1:197 +2379:1:198 +2380:1:206 +2381:1:207 +2382:1:211 +2383:1:212 +2384:1:220 +2385:1:225 +2386:1:229 +2387:1:230 +2388:1:237 +2389:1:238 +2390:1:249 +2391:1:250 +2392:1:251 +2393:1:262 +2394:1:267 +2395:1:268 +2396:0:2112 +2397:1:280 +2398:0:2112 +2399:1:282 +2400:0:2112 +2401:2:1652 +2402:2:1656 +2403:2:1657 +2404:2:1665 +2405:2:1666 +2406:2:1670 +2407:2:1671 +2408:2:1679 +2409:2:1684 +2410:2:1688 +2411:2:1689 +2412:2:1696 +2413:2:1697 +2414:2:1708 +2415:2:1716 +2416:2:1717 +2417:2:1721 +2418:2:1726 +2419:2:1727 +2420:0:2112 +2421:2:1739 +2422:0:2112 +2423:2:1560 +2424:0:2112 +2425:1:291 +2426:0:2112 +2427:2:1561 +2428:0:2112 +2429:1:293 +2430:0:2112 +2431:1:296 +2432:0:2112 +2433:1:301 +2434:0:2112 +2435:1:302 +2436:0:2112 +2437:1:303 +2438:0:2112 +2439:1:304 +2440:0:2112 +2441:1:305 +2442:0:2112 +2443:1:306 +2444:0:2112 +2445:1:308 +2446:0:2112 +2447:1:310 +2448:0:2112 +2449:1:311 +2450:1:315 +2451:1:316 +2452:1:324 +2453:1:325 +2454:1:326 +2455:1:338 +2456:1:343 +2457:1:347 +2458:1:348 +2459:1:355 +2460:1:356 +2461:1:367 +2462:1:368 +2463:1:369 +2464:1:380 +2465:1:385 +2466:1:386 +2467:0:2112 +2468:1:398 +2469:0:2112 +2470:1:400 +2471:0:2112 +2472:1:404 +2473:0:2112 +2474:1:9 +2475:0:2112 +2476:1:10 +2477:0:2112 +2478:1:11 +2479:0:2112 +2480:1:12 +2481:1:16 +2482:1:17 +2483:1:25 +2484:1:26 +2485:1:27 +2486:1:39 +2487:1:44 +2488:1:48 +2489:1:49 +2490:1:56 +2491:1:57 +2492:1:68 +2493:1:69 +2494:1:70 +2495:1:81 +2496:1:86 +2497:1:87 +2498:0:2112 +2499:1:99 +2500:0:2112 +2501:1:101 +2502:0:2112 +2503:1:102 +2504:1:106 +2505:1:107 +2506:1:115 +2507:1:116 +2508:1:120 +2509:1:121 +2510:1:129 +2511:1:134 +2512:1:138 +2513:1:139 +2514:1:146 +2515:1:147 +2516:1:158 +2517:1:159 +2518:1:160 +2519:1:171 +2520:1:176 +2521:1:177 +2522:0:2112 +2523:1:189 +2524:0:2112 +2525:1:191 +2526:0:2112 +2527:1:192 +2528:0:2112 +2529:1:193 +2530:1:197 +2531:1:198 +2532:1:206 +2533:1:207 +2534:1:211 +2535:1:212 +2536:1:220 +2537:1:225 +2538:1:229 +2539:1:230 +2540:1:237 +2541:1:238 +2542:1:249 +2543:1:250 +2544:1:251 +2545:1:262 +2546:1:267 +2547:1:268 +2548:0:2112 +2549:1:280 +2550:0:2112 +2551:1:282 +2552:0:2112 +2553:1:291 +2554:0:2112 +2555:1:293 +2556:0:2112 +2557:2:1562 +2558:2:1566 +2559:2:1567 +2560:2:1575 +2561:2:1576 +2562:2:1580 +2563:2:1581 +2564:2:1589 +2565:2:1594 +2566:2:1598 +2567:2:1599 +2568:2:1606 +2569:2:1607 +2570:2:1618 +2571:2:1626 +2572:2:1627 +2573:2:1631 +2574:2:1636 +2575:2:1637 +2576:0:2112 +2577:2:1649 +2578:0:2112 +2579:1:296 +2580:0:2112 +2581:1:301 +2582:0:2112 +2583:1:302 +2584:0:2112 +2585:1:303 +2586:0:2112 +2587:1:304 +2588:0:2112 +2589:1:305 +2590:0:2112 +2591:1:306 +2592:0:2112 +2593:1:308 +2594:0:2112 +2595:1:310 +2596:0:2112 +2597:1:311 +2598:1:315 +2599:1:316 +2600:1:324 +2601:1:325 +2602:1:326 +2603:1:338 +2604:1:343 +2605:1:347 +2606:1:348 +2607:1:355 +2608:1:356 +2609:1:367 +2610:1:368 +2611:1:369 +2612:1:380 +2613:1:385 +2614:1:386 +2615:0:2112 +2616:1:398 +2617:0:2112 +2618:1:400 +2619:0:2112 +2620:1:404 +2621:0:2112 +2622:1:9 +2623:0:2112 +2624:1:10 +2625:0:2112 +2626:1:11 +2627:0:2112 +2628:1:12 +2629:1:16 +2630:1:17 +2631:1:25 +2632:1:34 +2633:1:35 +2634:1:39 +2635:1:44 +2636:1:48 +2637:1:49 +2638:1:56 +2639:1:57 +2640:1:68 +2641:1:69 +2642:1:72 +2643:1:73 +2644:1:81 +2645:1:86 +2646:1:87 +2647:0:2112 +2648:1:99 +2649:0:2112 +2650:2:1651 +2651:0:2112 +2652:2:1652 +2653:2:1656 +2654:2:1657 +2655:2:1665 +2656:2:1666 +2657:2:1670 +2658:2:1671 +2659:2:1679 +2660:2:1684 +2661:2:1688 +2662:2:1689 +2663:2:1696 +2664:2:1697 +2665:2:1708 +2666:2:1716 +2667:2:1717 +2668:2:1721 +2669:2:1726 +2670:2:1727 +2671:0:2112 +2672:2:1739 +2673:0:2112 +2674:2:1560 +2675:0:2112 +2676:2:1561 +2677:0:2112 +2678:2:1562 +2679:2:1566 +2680:2:1567 +2681:2:1575 +2682:2:1576 +2683:2:1580 +2684:2:1581 +2685:2:1589 +2686:2:1594 +2687:2:1598 +2688:2:1599 +2689:2:1606 +2690:2:1607 +2691:2:1618 +2692:2:1626 +2693:2:1627 +2694:2:1631 +2695:2:1636 +2696:2:1637 +2697:0:2112 +2698:2:1649 +2699:0:2112 +2700:1:101 +2701:0:2112 +2702:2:1651 +2703:0:2112 +2704:2:1652 +2705:2:1656 +2706:2:1657 +2707:2:1665 +2708:2:1666 +2709:2:1670 +2710:2:1671 +2711:2:1679 +2712:2:1684 +2713:2:1688 +2714:2:1689 +2715:2:1696 +2716:2:1697 +2717:2:1708 +2718:2:1716 +2719:2:1717 +2720:2:1721 +2721:2:1726 +2722:2:1727 +2723:0:2112 +2724:2:1739 +2725:0:2112 +2726:2:1560 +2727:0:2112 +2728:2:1561 +2729:0:2112 +2730:2:1562 +2731:2:1566 +2732:2:1567 +2733:2:1575 +2734:2:1576 +2735:2:1580 +2736:2:1581 +2737:2:1589 +2738:2:1594 +2739:2:1598 +2740:2:1599 +2741:2:1606 +2742:2:1607 +2743:2:1618 +2744:2:1626 +2745:2:1627 +2746:2:1631 +2747:2:1636 +2748:2:1637 +2749:0:2112 +2750:2:1649 +2751:0:2112 +2752:1:102 +2753:1:106 +2754:1:107 +2755:1:115 +2756:1:116 +2757:1:117 +2758:1:129 +2759:1:134 +2760:1:138 +2761:1:139 +2762:1:146 +2763:1:147 +2764:1:158 +2765:1:159 +2766:1:160 +2767:1:171 +2768:1:176 +2769:1:177 +2770:0:2112 +2771:1:189 +2772:0:2112 +2773:1:191 +2774:0:2112 +2775:2:1651 +2776:0:2112 +2777:2:1652 +2778:2:1656 +2779:2:1657 +2780:2:1665 +2781:2:1666 +2782:2:1670 +2783:2:1671 +2784:2:1679 +2785:2:1684 +2786:2:1688 +2787:2:1689 +2788:2:1696 +2789:2:1697 +2790:2:1708 +2791:2:1716 +2792:2:1717 +2793:2:1721 +2794:2:1726 +2795:2:1727 +2796:0:2112 +2797:2:1739 +2798:0:2112 +2799:2:1560 +2800:0:2112 +2801:2:1561 +2802:0:2112 +2803:2:1562 +2804:2:1566 +2805:2:1567 +2806:2:1575 +2807:2:1576 +2808:2:1580 +2809:2:1581 +2810:2:1589 +2811:2:1594 +2812:2:1598 +2813:2:1599 +2814:2:1606 +2815:2:1607 +2816:2:1618 +2817:2:1626 +2818:2:1627 +2819:2:1631 +2820:2:1636 +2821:2:1637 +2822:0:2112 +2823:2:1649 +2824:0:2112 +2825:1:192 +2826:0:2112 +2827:2:1651 +2828:0:2112 +2829:2:1652 +2830:2:1656 +2831:2:1657 +2832:2:1665 +2833:2:1666 +2834:2:1670 +2835:2:1671 +2836:2:1679 +2837:2:1684 +2838:2:1688 +2839:2:1689 +2840:2:1696 +2841:2:1697 +2842:2:1708 +2843:2:1716 +2844:2:1717 +2845:2:1721 +2846:2:1726 +2847:2:1727 +2848:0:2112 +2849:2:1739 +2850:0:2112 +2851:2:1560 +2852:0:2112 +2853:2:1561 +2854:0:2112 +2855:2:1562 +2856:2:1566 +2857:2:1567 +2858:2:1575 +2859:2:1576 +2860:2:1580 +2861:2:1581 +2862:2:1589 +2863:2:1594 +2864:2:1598 +2865:2:1599 +2866:2:1606 +2867:2:1607 +2868:2:1618 +2869:2:1626 +2870:2:1627 +2871:2:1631 +2872:2:1636 +2873:2:1637 +2874:0:2112 +2875:2:1649 +2876:0:2112 +2877:1:193 +2878:1:197 +2879:1:198 +2880:1:206 +2881:1:207 +2882:1:211 +2883:1:212 +2884:1:220 +2885:1:225 +2886:1:229 +2887:1:230 +2888:1:237 +2889:1:238 +2890:1:249 +2891:1:250 +2892:1:251 +2893:1:262 +2894:1:267 +2895:1:268 +2896:0:2112 +2897:1:280 +2898:0:2112 +2899:2:1651 +2900:0:2112 +2901:2:1652 +2902:2:1656 +2903:2:1657 +2904:2:1665 +2905:2:1666 +2906:2:1670 +2907:2:1671 +2908:2:1679 +2909:2:1684 +2910:2:1688 +2911:2:1689 +2912:2:1696 +2913:2:1697 +2914:2:1708 +2915:2:1716 +2916:2:1717 +2917:2:1721 +2918:2:1726 +2919:2:1727 +2920:0:2112 +2921:2:1739 +2922:0:2112 +2923:2:1560 +2924:0:2112 +2925:2:1561 +2926:0:2112 +2927:2:1562 +2928:2:1566 +2929:2:1567 +2930:2:1575 +2931:2:1576 +2932:2:1580 +2933:2:1581 +2934:2:1589 +2935:2:1594 +2936:2:1598 +2937:2:1599 +2938:2:1606 +2939:2:1607 +2940:2:1618 +2941:2:1626 +2942:2:1627 +2943:2:1631 +2944:2:1636 +2945:2:1637 +2946:0:2112 +2947:2:1649 +2948:0:2112 +2949:1:282 +2950:0:2112 +2951:1:291 +2952:0:2112 +2953:1:293 +2954:0:2112 +2955:1:296 +2956:0:2112 +2957:2:1651 +2958:0:2112 +2959:2:1652 +2960:2:1656 +2961:2:1657 +2962:2:1665 +2963:2:1666 +2964:2:1670 +2965:2:1671 +2966:2:1679 +2967:2:1684 +2968:2:1688 +2969:2:1689 +2970:2:1696 +2971:2:1697 +2972:2:1708 +2973:2:1716 +2974:2:1717 +2975:2:1721 +2976:2:1726 +2977:2:1727 +2978:0:2112 +2979:2:1739 +2980:0:2112 +2981:2:1560 +2982:0:2112 +2983:2:1561 +2984:0:2112 +2985:2:1562 +2986:2:1566 +2987:2:1567 +2988:2:1575 +2989:2:1576 +2990:2:1580 +2991:2:1581 +2992:2:1589 +2993:2:1594 +2994:2:1598 +2995:2:1599 +2996:2:1606 +2997:2:1607 +2998:2:1618 +2999:2:1626 +3000:2:1627 +3001:2:1631 +3002:2:1636 +3003:2:1637 +3004:0:2112 +3005:2:1649 +3006:0:2112 +3007:1:301